Monday, September 7, 2009

对腾讯TT代理webacc.exe的简单分析

联盟上domi发帖问“有没有对TT的教育网加速有兴趣的”
不想装软件,所以只是留了个邮箱,但是一直都没有人回复。

下了个tt,直接7zip解压,对出来的资源里的 [0] 再次用7zip解压,于是二进制文件资源拿到了

PEiD看了看\bin\webacc.exe,没有查出任何信息,从图标看,先是一个vs03以后的二进制文件默认图标,而且目录下还有vs8的runtime

OllyDBG载入。刚才PEiD没有任何信息,同样,这里看也没有加壳,直接查找资源,找到了127.0.0.1的字样,两处。
domi帖子里提到开的端口也是8081,直接转成16进制,1F91,搜常量
就在两个127.0.0.1的下边,就有 1F91 和 1F92 ,8081和8082 。。。

帖子里还提到,“进程里面只要有个叫TTraveler.exe的就可以用webacc.exe”
hmm, 再次搜索字符串资源,找到一个ttraveler.exe的,然后还有个 edu_acc_userinfo.qq.com 的字样。
还有个 %d.%d.%d.%d 显然是拼接ip,下边有个sprintf,上边有个 gethostbyname, 猜测可能是本地解析域名,然后以传参或者直接host的方式走代理吧。

暂时不管运作原理,先搞定进程检测的问题。
进入ttraveler.exe的地方。
直接下了个断点,但是貌似有反调试的部分,刚才od挂起时间有点长。重启,杀掉了sogou的进程

从 00401aa0开始的地方,是取出了进程列表,然后逐个比较进程名,看看有没有tt主进程的名称。
00401B0C   .  8D8424 201000>LEA EAX,DWORD PTR SS:[ESP+1020]
00401B13 > 68 A8834000 PUSH webacc.004083A8 ; ttraveler.exe
00401B18 . 50 PUSH EAX
00401B19 . FFD3 CALL EBX

这里进行了比较
在call之前断下来,一个一个看进程,看看哪个好改,突然发现了tsvncache.exe,长度一致,方便
直接 d eax,然后改内存。

在 代码结束之后,返回到上一级
0040160B   > \E8 10030000   CALL webacc.00401920
00401610 . 85C0 TEST EAX,EAX
00401612 . 74 07 JE SHORT webacc.0040161B
00401614 . E8 17000000 CALL webacc.00401630
00401619 .^ EB D6 JMP SHORT webacc.004015F1
0040161B > 6A 00 PUSH 0 ; /ExitCode = 0
0040161D . FF15 04804000 CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; \ExitProcess

test eax, eax,然后je到了退出的地方。
于是测试一下00401612 : je -> jne
下个断点,重来。
上边的一个jmp回跳,应该是定时检查,没细看。
直接改动看看。
C:\Documents and Settings\Administrator>netstat -ano |find "8081"
TCP 127.0.0.1:8081 0.0.0.0:0 LISTENING 1028

C:\Documents and Settings\Administrator>netstat -ano |find "1028"
TCP 127.0.0.1:8081 0.0.0.0:0 LISTENING 1028
TCP 127.0.0.1:8082 0.0.0.0:0 LISTENING 1028


端口开了。基本可以认为进程检测过掉了,
测试浏览效果。
唔,不行,是一个squid的403页面。估计还是缺少什么头。
等啥时候弄一台机器有tt的,抓包试试吧。
基本改动的思路差不多了

不过,可以试试对刚才的进程检测的地方,直接把call改成mov eax, 1
再测试一下
C:\Documents and Settings\Administrator>netstat -ano |find "4136"
TCP 127.0.0.1:8081 0.0.0.0:0 LISTENING 4136
TCP 127.0.0.1:8082 0.0.0.0:0 LISTENING 4136


好吧,我试试改改端口。

我把 8081, 8082 改成 18081,18082,也就是46A1和46A2
0040559A  |.  66:C74424 48 >MOV WORD PTR SS:[ESP+48],1F91

004055B3  |.  66:C74424 48 >MOV WORD PTR SS:[ESP+48],1F92


C:\Documents and Settings\Administrator>netstat -ano |find "5192"
TCP 127.0.0.1:18081 0.0.0.0:0 LISTENING 5192
TCP 127.0.0.1:18082 0.0.0.0:0 LISTENING 5192



好吧,就这样吧
具体代理协议的验证细节,以后再说吧。

对端口的修改,请使用16进制编辑器,搜索 91 1f 和 92 1f,按你的需求改吧。(offset 0x559F, 0x55B8)

如果你愿意研究验证的部分,搜索 E8 10 03 00 00 改成 B8 01 00 00 00,就实现了刚才提到的call -> mov (offset 0x160a)
或者 je -> jnz 把紧下边的 74 07 改成 75 07 (offset 0x1612)

另外,我的webacc.exe 99656字节。

Tuesday, August 25, 2009

SinaMySQLClass 增加 mysqli 支持

重新封装了一个mysqli的操作类,只是为了希望从 php_mysql 到 php_mysqli 切换的时候,能够不影响前端代码的使用。
结果改来改去最终还是决定将两组类分开写,毕竟 mysqli 的很多方法没法在 php_mysql 上找到,不愿意为旧的应用放弃新的特性,例如直接可用的 autocommit/commit/rollback 等。
但是作为直接调用 sinamysql.class.php 或 sinamysql.multiservices.class.php 的代码,不会受到影响,毕竟这一层代码只是适应底层的改动稍作了修正,没有太多其他的东西。

不过,其实是不是可以考虑上边放一个专门的文件,给外部代码调用,这样就不用改include/require了

http://code.google.com/p/sinamysqlclass/source/checkout
代码依旧很乱
目的只是为了支持多组主从服务器对,不希望看到某代码几乎每执行一次查询就重建一个连接的2行为。

Saturday, August 22, 2009

定购了 The Lost Symbol

先去amazon.com看的,然后顺道瞅了眼amazon.cn,居然有,虽然说有货时间在9.20,比正式发布时间晚了5天,但是从amazon.com ship过来估计也不止那些天。。。

¥148.00

等吧。。。

Friday, August 21, 2009

不玩 t了,祝 Sina 微博好运

最后一篇发完了,留下个web版的数字截图
Image Hosted by ImageShack.us
By sskaje at 2009-08-21

就这样吧

曾在这里留下过足迹
足够了

Good luck to you all!

PS: 我应该还保留着找到XSS最多的记录吧。。。

Tuesday, August 18, 2009

【对比上篇】MySQLi 对于相同用户名密码连接不同库的结果

两个版本的代码,一个po,一个oo
都是连到同一个服务器,相同的用户密码,只是不同的库

代码1
<?php
$db_1 = mysqli_connect('localhost', 'root', '31343540');
mysqli_select_db($db_1, 'ftpunion');
$db_2 = mysqli_connect('localhost', 'root', '31343540');
mysqli_select_db($db_2, 'ftpunion_new');


var_dump(mysqli_fetch_assoc(mysqli_query($db_1, 'select database();')));


var_dump(mysqli_fetch_assoc(mysqli_query($db_2, 'select database();')));

#mysqli_select_db('ftpunion', $db_1);
var_dump(mysqli_fetch_assoc(mysqli_query($db_1, 'select database();')));


第二段代码
<?php
$db_1 = new mysqli('localhost', 'root', '31343540');
$db_1->select_db('ftpunion');

var_dump($db_1->query('select database();')->fetch_assoc());

$db_2 = new mysqli('localhost', 'root', '31343540');
$db_2->select_db('ftpunion_new');


var_dump($db_2->query('select database();')->fetch_assoc());

#$db_1->select_db('ftpunion');
var_dump($db_1->query('select database();')->fetch_assoc());


两个输出

G:\wwwroot\Test\mysql>php mysqli_select_db.php
array(1) {
["database()"]=>
string(8) "ftpunion"
}
array(1) {
["database()"]=>
string(12) "ftpunion_new"
}
array(1) {
["database()"]=>
string(8) "ftpunion"
}

G:\wwwroot\Test\mysql>php mysqli_select_db_oo.php
array(1) {
["database()"]=>
string(8) "ftpunion"
}
array(1) {
["database()"]=>
string(12) "ftpunion_new"
}
array(1) {
["database()"]=>
string(8) "ftpunion"
}


两次sleep的时候,netstat的结果

G:\Projects\sina\Slot>netstat -ano |find "368"
TCP 127.0.0.1:2538 127.0.0.1:3306 ESTABLISHED 3688
TCP 127.0.0.1:2539 127.0.0.1:3306 ESTABLISHED 3688

G:\Projects\sina\Slot>netstat -ano |find "283"
TCP 127.0.0.1:2618 127.0.0.1:3306 ESTABLISHED 2836
TCP 127.0.0.1:2619 127.0.0.1:3306 ESTABLISHED 2836


还有谁想说mysql_select_db 那个是个feature么 :x

php_mysql my_select_db 多库交叉使用的bug

<?php
$db_1 = mysql_connect('localhost', 'root', 'root');
mysql_select_db('ftpunion', $db_1);

var_dump(mysql_fetch_assoc(mysql_query('select database();', $db_1)));

$db_2 = mysql_connect('localhost', 'root', 'root');
mysql_select_db('ftpunion_new', $db_2);

var_dump(mysql_fetch_assoc(mysql_query('select database();', $db_2)));

#mysql_select_db('ftpunion', $db_1);
var_dump(mysql_fetch_assoc(mysql_query('select database();', $db_1)));


结果是。。。
array(1) {
["database()"]=>
string(8) "ftpunion"
}
array(1) {
["database()"]=>
string(12) "ftpunion_new"
}
array(1) {
["database()"]=>
string(12) "ftpunion_new"
}

一个页面使用 相同的用户名和密码 连接使用 相同服务器 不同的库 的时候,只能是在切换库查询的时候,先得对对应的mysql 连接资源进行一次 mysql_select_db 操作,然后再执行查询

要不然你只能得到一个 错误的库.正确的表 不存在 的提示。。。因为貌似这个过程 php_mysql 实际只创建了一个连接,查询的库以最近一次的mysql_select_db的操作为准。。。。

sleep了20秒,看看netstat出来的链接数。。。。只有这一个

G:\Projects\sina\Slot>netstat -ano | find "4320"
TCP 127.0.0.1:1244 127.0.0.1:3306 ESTABLISHED 4320



其实这算是一个无奈的选择,

去给php 报bugs去。。。只是不知道这算不算bug
或者说。。。。It's not a bug, it's a feature, not sure if it's expected or not.


昨晚这个折腾了好久
好不容易写的类,不可能有逻辑问题,结果发现是这个2问题。。。

Sunday, August 16, 2009

太冲动了。。。

2209WA。。。。