前言
先吐槽一下,悲催的3月11日,该游戏公司,居然停服了我分析了好几个月的游戏,那么多数据就没用了,哼,生气。
不过就当练技术了吧,哈哈。不过,忍一时越想越气,退一步越想越亏,下载该公司的另一款网游,使劲盘解解气!
正好今天注册吾爱成功,发发贴证明我是活人,嘻
开始分析明文call
游戏下好后,走起来,OD走起来,断点走起来,发现是使用WSASend函数发包,而且是线程循环发包。
好,我们去游戏里聊天,打上11111

此时断下后,堆栈如图所示

当然我们只需关心第2个参数:0A53095C,右键跟随到数据窗口看一看

第一个呢就是包长,第二个就是包的地址,我们看看这个包里面有什么东西,点击第二个,回车

嗨呀!居然是明文,老泪纵横呀。上一个游戏不仅是线程发包,而且加密了的,这次貌似要轻松一点。
运行起来,我又去游戏聊天,这次我打22222,发现包的地址变了
前一次是15152028,这一次是1514400c


em.....我又反复聊天试了几次,发现是两个地址交替使用,那么排队队吧,一个一个脖子伸出来
对 15152028地址下写入断点,走起,呃呃呃呃,游戏居然断线了,重连重试了几次还是会断线,情况不妙啊....
那对 1514400c地址下写入断点试试,结果不出所料,依然断线。看来这游戏把包的写入盯得死死的呀。
那我们换个思路吧,看上面我两次聊天,第一次发的11111,第二次发的22222,都是5个字符,两次包长都是0x23没变,而且存储包长的地址0A53095C也是不变的,好,我们下个写入断点试试(果然不断),那我们用CE监测吧:添加地址 0A53095C ,找写入

10050DD8 - 89 51 20 - mov [ecx+20],edx
10050D16 - C7 41 20 00000000 - mov [ecx+20],00000000
OK,去OD分析第一条,转到地址 10050DD8 ,分析后注释如下:

后来我继续追eax的来源,在上层下断后,老是断,无法去游戏里聊天,所以此路不通。

那就不往上追,既然edx是包长,而且edx = [eax+20],那么eax+20这个地址里的包长是哪里来的呢?
好,我们去游戏聊天,发固定长度的话,使包长也等于0x23。断下后,记下eax+20 == 0A5309CC,反复聊天几次发现这个值不变,好的,又祭出CE监测 0A5309CC,找写入
10050D87 - 89 7E 20 - mov [esi+20],edi
10050DCB - 89 78 20 - mov [eax+20],edi
好嘞,去OD分析 10050D87处的代码(累吧,OD和CE换来换去的用,,,,)

继续追上层

追到这层后,我试着又往上追ebx包长的来源,发现上层也是经常断,那么断了念想吧(同追妹子一样不好追)
纠结了一会,我开始分析上图的倒数第三行:1004FE6E 51 push ecx对倒数第三行下断,去游戏里聊天,发5个1,使包长等于0x23,然后看看ecx里面的值:

每次聊天断下发现ecx是不变的,只是里面的明文在变,那么我们试着对明文下写入断点(这次居然在OD里下写入断点不奔溃了,哈哈):断在下图中:

看到了吧,esi里也是明文,此处在写入明文包,我聊天时发的5个1,31就是1的ASCII码嘛。
断在这里时,删除内存断点,不要运行,去堆栈窗口找到返回地址,右键跟随到反汇编,返回到了1001E167处然后我分析这一层的代码,如下:

如注释所说,明文包地址时刻在变,无法分析,只有从包长入手对上图第一条代码下断,发现每次聊天esi也是不变的,
在数据窗口查看esi + 1C4,出出出出大事了,断下时+1C4处有值,运行时没值


那么又用CE监测0A531FC4吧,找写入
1001EB17 - 89 46 08 - mov [esi+08],eax
1001EB5D - 89 48 08 - mov [eax+08],ecx
啊啊啊啊,什么时候是个头啊,用OD分析1001EB17,哈哈哈哈哈哈,咸鱼翻身了,看看看,看到了啥,三个黄金大字:主线程!
看来我们终于跳出循环发包的子线程了哟

双击下断,去游戏里聊天、走路各自断下,记录栈回溯,就找到了明文call了。经过测试,用这个明文call一下子就找到跳跃call和选怪call


总结
不管发包函数发的包,是不是明文,都不重要,上一个停服的游戏,就是发的加密包。
从包的地址入手行不通的话,可以尝试追踪包长,毕竟它的变化范围小嘛。
OD下写入断点奔溃或者断不下的话,可以用CE监测。
em...最后,本人只是对逆向感兴趣,不会做那个的。。。
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |