由于该游戏是有微端的,这个游戏实际上和正常端游区别不大。
我们可以选择OD直接分析收发包。
正常我们知道可以分析 send(sendto WSASend) 和recv 等函数来分析收发包。
这个游戏也可以直接通过send 和recv 断下 但是发送的都是加密包,并且我们通过调用关系向上追溯发现无论做什么动作都是一样的 返回几层就到线程头了,无法继续返回到明文封包位置和功能函数里,那么这位置对于我们来说就是无用的。
那么这种情况说明什么呢?
说明这是线程发包,我们先来了解下线程发包的原理。
正常的发包是这样的,某个功能函数调用内层函数,内层函数对功能参数进行组包,然后加密等等操作,再去调用send等发包函数将封包发送出去,当然内层函数可能很多层,这里面忽略。
那么我们就可以通过这样的调用关系从send返回到明文封包甚至功能函数里去了。
那线程发包是什么情况呢?
线程发包前面的组包加密过程跟正常是一样的,只是他没有直接调用send发送,而是写入到某个指针地址里然后修改了某些发送封包标志位,让其他线程去发送。
那么于此同时有另外一条线程在不断的循环判断是否需要调用send发送封包,一旦判断到标志就会立刻发送。我们之前send返回的调用就是在这条线程里。
那么现在很明显了,我们在这条线程里怎么找也是找不到我们想要的明文封包和功能函数的,那么怎么办呢?
俩种办法,第一种封包内容上下写入断,因为内容是在线程外被写入的那么我们就可以跳出线程来到组包的位置了。
第二种办法在send附近找发送封包的标志,通过标志位跳出线程。
第一种方法为例,直接在send 的buffer 上下写入断 直接可以返回到 以下位置
发包函数以及HOOK位置
010372BB E8 092C0100 call 01049EC9 ; 01049EC9
010372C0 F20F1005 70E119>MOVSD XMM0, [119E170]
010372C8 F20F110424 MOVSD [ESP], XMM0
010372CD 53 push ebx
010372CE E8 C8250100 call 0104989B ; 0104989B
010372D3 83C4 0C add esp, 0C
010372D6 B8 01000000 mov eax, 1
010372DB 5F pop edi
010372DC 5E pop esi
010372DD 5B pop ebx
010372DE 8B4D FC mov ecx, dword ptr [ebp-4]
010372E1 33CD xor ecx, ebp
010372E3 E8 64261300 call 0116994C ; 0116994C
010372E8 8BE5 mov esp, ebp
010372EA 5D pop ebp
010372EB C3 retn
010372EC C685 FCFFFDFF 0>mov byte ptr [ebp+FFFDFFFC], 0
010372F3 66:8B47 28 mov ax, word ptr [edi+28]
010372F7 66:8985 FDFFFDF>mov word ptr [ebp+FFFDFFFD], ax
010372FE 8D85 FCFFFDFF lea eax, dword ptr [ebp+FFFDFFFC]
01037304 56 push esi ; Len
01037305 50 push eax ; pBuf
01037306 FF15 C0D52D02 call dword ptr [22DD5C0] ; 明文发包CALL以及HOOK位置
0103730C 83C4 08 add esp, 8
0103730F FFB5 F4FFFDFF push dword ptr [ebp+FFFDFFF4]
01037315 FFB5 F8FFFDFF push dword ptr [ebp+FFFDFFF8]
0103731B E8 A92B0100 call 01049EC9 ; 01049EC9
01037320 8B4D FC mov ecx, dword ptr [ebp-4]
01037323 83C4 08 add esp, 8
01037326 33CD xor ecx, ebp
01037328 33C0 xor eax, eax
0103732A 5F pop edi
0103732B 5E pop esi
0103732C 5B pop ebx
0103732D E8 1A261300 call 0116994C ; 0116994C
01037332 8BE5 mov esp, ebp
01037334 5D pop ebp
01037335 C3 retn
这个位置可以返回到所有的功能CALL了 当然也有特殊功能有另外线程
recv 也一样 不过不是写入断了 而是对包内容下访问断,因为他只是需要copy 而不是改写
断到以下位置
HOOK收包位置
62E888EC |> /8B4B 30 mov ecx, dword ptr [ebx+30]
62E888EF |. |89F2 mov edx, esi
62E888F1 |. |29C8 sub eax, ecx
62E888F3 |. |39F0 cmp eax, esi
62E888F5 |. |0F46D0 CMOVBE EDX, EAX
62E888F8 |. |89F8 mov eax, edi
62E888FA |. |034B 34 add ecx, dword ptr [ebx+34]
62E888FD |. |29F0 sub eax, esi
62E888FF |. |895424 08 mov dword ptr [esp+8], edx ; Len Edx
62E88903 |. |8955 E4 mov dword ptr [ebp-1C], edx
62E88906 |. |894424 04 mov dword ptr [esp+4], eax ; pBuf Eax
62E8890A |. |890C24 mov dword ptr [esp], ecx ; 在这里HOOK
62E8890D |. |E8 1EB40000 call 62E93D30 ; &msvcrt.memcpy>
62E88912 |. |8B55 E4 mov edx, dword ptr [ebp-1C] ; Hook EAX{pBuf} ESI{Len}
62E88915 |. |29D6 sub esi, edx
有了这2个位置 收发包明文显示 做什么都得心应手
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论