分析仅仅是为了娱乐而已,游戏也不难。有错误就不好意思了。
这个游戏加了个TMD的壳,会关闭调试端口,在内核里面打个补丁就好了。
首先找到收报和发包明文的地址。如果游戏更新地址不对,请用特征码重新找:
收报HOOK地址:
009A6C60 /$ 56 push esi
009A6C61 |. 8BF1 mov esi, ecx
009A6C63 |. 8B46 10 mov eax, dword ptr [esi+10]
009A6C66 |. 8B80 DC000000 mov eax, dword ptr [eax+C4]
009A6C6C |. 57 push edi
009A6C6D |. 50 push eax ; 解秘数据buffer
009A6C6E |. E8 5DF2FFFF call 009A5ED0 ; ----hook recv这里
009A6C73 |. 84C0 test al, al
009A6C75 |. 74 47 je short 009A6CBE
009A6C77 |. 8B7C24 0C mov edi, dword ptr [esp+C]
009A6C7B |. EB 03 jmp short 009A6C80
009A6C7D | 8D49 00 lea ecx, dword ptr [ecx]
009A6C80 |> 8B4E 10 /mov ecx, dword ptr [esi+10]
009A6C83 |. 8B89 DC000000 |mov ecx, dword ptr [ecx+DC]
009A6C89 |. 57 |push edi
009A6C8A |. E8 C1DFFFFF |call 009A4C50
009A6C8F |. 8B56 10 |mov edx, dword ptr [esi+10]
009A6C92 |. 8B8A DC000000 |mov ecx, dword ptr [edx+DC]
009A6C98 |. E8 C3DEFFFF |call 009A4B60 ; lwgucky
009A6C9D |. 84C0 |test al, al
009A6C9F |. 74 24 |je short 009A6CC5
009A6CA1 |. 57 |push edi
009A6CA2 |. 8BCE |mov ecx, esi
009A6CA4 |. E8 27FAFFFF |call 009A66D0
009A6CA9 |. 8B46 10 |mov eax, dword ptr [esi+10]
009A6CAC |. 8B80 DC000000 |mov eax, dword ptr [eax+DC]
009A6CB2 |. 50 |push eax
009A6CB3 |. 8BCE |mov ecx, esi
009A6CB5 |. E8 16F2FFFF |call 009A5ED0
009A6CBA |. 84C0 |test al, al
009A6CBC |.^ 75 C2 jnz short 009A6C80
009A6CBE |> 5F pop edi
009A6CBF |. 32C0 xor al, al
009A6CC1 |. 5E pop esi
009A6CC2 |. C2 0400 retn 4
发包HOOK的地方:
009A65E0 /$ 56 push esi
009A65E1 |. 8BF1 mov esi, ecx
009A65E3 |. 83BE F0000000>cmp dword ptr [esi+F0], 3
009A65EA |. 74 06 je short 009A65F2
009A65EC |. 32C0 xor al, al
009A65EE |. 5E pop esi
009A65EF |. C2 0C00 retn 0C
009A65F2 |> 8B4424 08 mov eax, dword ptr [esp+8]
009A65F6 |. 8B4E 10 mov ecx, dword ptr [esi+10]
009A65F9 |. 8B89 D8000000 mov ecx, dword ptr [ecx+D8]
009A65FF |. 57 push edi
009A6600 |. 50 push eax ; [eax+010]=数据长度;d [eax+0c]=数据;
009A6601 |. E8 AAE5FFFF call 009A4BB0
009A6606 |. 807C24 14 00 cmp byte ptr [esp+14], 0
009A660B |. 8B56 10 mov edx, dword ptr [esi+10]
009A660E |. 8B82 D8000000 mov eax, dword ptr [edx+D8]
009A6614 |. 8B88 14FB0000 mov ecx, dword ptr [eax+FB14]
009A661A |. 66:8B96 56010>mov dx, word ptr [esi+156] ; 包序列号
009A6621 |. 66:8911 mov word ptr [ecx], dx
009A6624 |. 8B46 10 mov eax, dword ptr [esi+10]
009A6627 |. 8B88 D8000000 mov ecx, dword ptr [eax+D8]
009A662D |. 8BB9 0CFB0000 mov edi, dword ptr [ecx+FB0C]
009A6633 |. 74 07 je short 009A663C
009A6635 |. E8 16E5FFFF call 009A4B50
009A663A |. EB 30 jmp short 009A666C
009A663C |> 807E 0D 00 cmp byte ptr [esi+D], 0
009A6640 |. 74 05 je short 009A6647
009A6642 |. E8 19E4FFFF call 009A4A60
009A6647 |> 80BE 54010000>cmp byte ptr [esi+154], 0
009A664E |. 74 1C je short 009A666C
009A6650 |. 8B8E 4C010000 mov ecx, dword ptr [esi+14C]
009A6656 |. 8B46 10 mov eax, dword ptr [esi+10]
009A6659 |. 51 push ecx ; 加密长度
009A665A |. 8B88 D8000000 mov ecx, dword ptr [eax+D8] ; 加密数据
009A6660 |. 8D96 2C010000 lea edx, dword ptr [esi+12C] ; d [[0FC2CC0]+040]+012c;[[[0FC2CC0]+040]+064+4]=sockethandle
009A6666 |. 52 push edx ; 加密种子
009A6667 |. E8 44E3FFFF call 009A49B0 ; 加密 -----hook send这里
00A6F21C 8B4E 10 mov ecx, dword ptr [esi+10]
00A6F21F 8B81 C0000000 mov eax, dword ptr [ecx+C0]
00A6F225 8B88 0CFB0000 mov ecx, dword ptr [eax+FB0C]
009A667B |. 51 push ecx ; len
009A667C |. 83C0 04 add eax, 4
009A667F |. 50 push eax ; buffer
009A6680 |. 8BCE mov ecx, esi
009A6682 |. E8 19FDFFFF call 009A63A0 ; 发送加密
009A6687 |. 84C0 test al, al
009A6689 |. 75 05 jnz short 009A6690
009A668B |. 5F pop edi
009A668C |. 5E pop esi
通过 hook 这个两个函数,通过分析协议,已经能够做一个基于封包的内挂了。需要多说一嘴的是,如果你直接分析包,可能会发现找包的类型标示不容易,包标示是通过包的第二个WORD字节标示的,具体算法大概是就是第二个WORD % 8了。。(忘记了。)