本文仅限于技术交流,文中所附数据纯属虚构,如有雷同,实在是巧合!
本文简单地探讨了一款游戏辅助程序的分析、制作方法,希望能对那些对此感兴趣的朋友们有些许帮助。
本人小菜鸟一只,水平有限,说得不对的地方,权当逗各位大虾一笑 ^_^
1、切入点
在WSASend函数上下断,移动一下人物,游戏会向服务器发送数据封包,程序断在0042DE13这个函数调用处!
根据栈中的返回地址,逐级返回分析相关代码如下:
00441991 |. E8 4AC3FEFF call Client.0042DCE0
// 该函数是一个公用函数,游戏中所有的数据包都经过这个函数 加密发送
{ //加密发送数据包
0042DCE0 /$ 55 push ebp
0042DCE1 |. 8BEC mov ebp,esp
0042DCE3 |. B8 0C240000 mov eax,240C
0042DCE8 |. E8 C3852F00 call Client.007262B0 //堆栈处理
{
007262B0 /$ 51 push ecx
007262B1 |. 3D 00100000 cmp eax,1000
007262B6 |. 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
007262BA |. 72 14 jb short Client.007262D0
007262BC |> 81E9 00100000 /sub ecx,1000
007262C2 |. 2D 00100000 |sub eax,1000
007262C7 |. 8501 |test dword ptr ds:[ecx],eax
007262C9 |. 3D 00100000 |cmp eax,1000
007262CE |.^ 73 EC /jnb short Client.007262BC
007262D0 |> 2BC8 sub ecx,eax
007262D2 |. 8BC4 mov eax,esp
007262D4 |. 8501 test dword ptr ds:[ecx],eax
007262D6 |. 8BE1 mov esp,ecx
007262D8 |. 8B08 mov ecx,dword ptr ds:[eax]
007262DA |. 8B40 04 mov eax,dword ptr ds:[eax+4]
007262DD |. 50 push eax
007262DE /. C3 retn
}
0042DCED |. 8B41 10 mov eax,dword ptr ds:[ecx+10]
0042DCF0 |. 53 push ebx
0042DCF1 |. 56 push esi
0042DCF2 |. 83F8 FF cmp eax,-1
0042DCF5 |. 57 push edi
0042DCF6 |. 894D FC mov dword ptr ss:[ebp-4],ecx
0042DCF9 |. 0F84 29010000 je Client.0042DE28
0042DCFF |. 8079 14 01 cmp byte ptr ds:[ecx+14],1
0042DD03 |. 0F85 1F010000 jnz Client.0042DE28
0042DD09 |. 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
0042DD0C |. 66:A1 F44B2F04 mov ax,word ptr ds:[42F4BF4] // 0x03A2
0042DD12 |. B9 00080000 mov ecx,800
0042DD17 |. 8DBD F4DBFFFF lea edi,dword ptr ss:[ebp-240C]
0042DD1D |. 66:8903 mov word ptr ds:[ebx],ax
0042DD20 |. 33C0 xor eax,eax
0042DD22 |. F3:AB rep stos dword ptr es:[edi] // edi 清零
0042DD24 |. 8B45 0C mov eax,dword ptr ss:[ebp+C]
0042DD27 |. 8BF3 mov esi,ebx
0042DD29 |. 8DBD F9DBFFFF lea edi,dword ptr ss:[ebp-2407] //数据开始地址
0042DD2F |. C685 F4DBFFFF AA mov byte ptr ss:[ebp-240C],0AA //数据开始标志
0042DD36 |. 8D48 09 lea ecx,dword ptr ds:[eax+9]
0042DD39 |. C685 F5DBFFFF 55 mov byte ptr ss:[ebp-240B],55 //数据结束标志
0042DD40 |. 888D F6DBFFFF mov byte ptr ss:[ebp-240A],cl //长度低8位
0042DD46 |. 8A0D A84D2F04 mov cl,byte ptr ds:[42F4DA8]
0042DD4C |. 88AD F7DBFFFF mov byte ptr ss:[ebp-2409],ch //长度高8位
0042DD52 |. 888D F8DBFFFF mov byte ptr ss:[ebp-2408],cl // 01 ? 什么东东
0042DD58 |. 8BC8 mov ecx,eax
0042DD5A |. C745 08 00000000 mov dword ptr ss:[ebp+8],0
0042DD61 |. 8BD1 mov edx,ecx
0042DD63 |. C1E9 02 shr ecx,2
0042DD66 |. F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
0042DD68 |. 8BCA mov ecx,edx
0042DD6A |. 83E1 03 and ecx,3
0042DD6D |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
0042DD6F |. 8D70 05 lea esi,dword ptr ds:[eax+5]
0042DD72 |. 33C0 xor eax,eax
0042DD74 |. 8D8D F4DBFFFF lea ecx,dword ptr ss:[ebp-240C]
0042DD7A |. 898435 F4DBFFFF mov dword ptr ss:[ebp+esi-240C],eax
0042DD81 |. 51 push ecx
0042DD82 |. 898435 F8DBFFFF mov dword ptr ss:[ebp+esi-2408],eax
0042DD89 |. 83C6 08 add esi,8
0042DD8C |. C68435 F4DBFFFF 55 mov byte ptr ss:[ebp+esi-240C],55
0042DD94 |. 46 inc esi
0042DD95 |. C68435 F4DBFFFF AA mov byte ptr ss:[ebp+esi-240C],0AA //数据结束标志
0042DD9D |. E8 7ED42D00 call Client.0070B220 //数据加密??
{
//加密数据包子函数
0070B220 $ 55 push ebp
0070B221 . 8BEC mov ebp,esp
0070B223 . 83C4 EC add esp,-14
0070B226 . 53 push ebx
0070B227 . 57 push edi
0070B228 . 56 push esi
0070B229 . E8 00000000 call Client.0070B22E
0070B22E $ 5B pop ebx
0070B22F . 81EB 4E154000 sub ebx,Client.0040154E
0070B235 . 837D 08 00 cmp dword ptr ss:[ebp+8],0
0070B239 . 75 0A jnz short Client.0070B245
0070B23B . B8 FEFFFFFF mov eax,-2
0070B240 . E9 D5000000 jmp Client.0070B31A
0070B245 > 8B7D 08 mov edi,dword ptr ss:[ebp+8]
0070B248 . 8A47 04 mov al,byte ptr ds:[edi+4]
0070B24B . 0AC0 or al,al
0070B24D . 75 07 jnz short Client.0070B256
0070B24F . 33C0 xor eax,eax
0070B251 . E9 C4000000 jmp Client.0070B31A
0070B256 > 8A83 CD1B4000 mov al,byte ptr ds:[ebx+401BCD]
0070B25C . 0AC0 or al,al
0070B25E . 75 0A jnz short Client.0070B26A
0070B260 . B8 FFFFFFFF mov eax,-1
0070B265 . E9 B0000000 jmp Client.0070B31A
0070B26A > 0FB757 02 movzx edx,word ptr ds:[edi+2] // 0x37 len
0070B26E . 83FA 0F cmp edx,0F
0070B271 . 73 0A jnb short Client.0070B27D
0070B273 . B8 FDFFFFFF mov eax,-3
0070B278 . E9 9D000000 jmp Client.0070B31A
0070B27D > 8B45 08 mov eax,dword ptr ss:[ebp+8] // 起始地址
0070B280 . 53 push ebx
0070B281 . 81C3 AF154000 add ebx,Client.004015AF
0070B287 . 53 push ebx
0070B288 . C3 retn
0070B289 . 68 6572653F push 3F657265
0070B28E . 48 dec eax
0070B28F . 5B pop ebx
0070B290 . 83C0 05 add eax,5 // ptr to first byte 0xb0
0070B293 . 8945 F0 mov dword ptr ss:[ebp-10],eax
0070B296 . 03C2 add eax,edx
0070B298 . 83E8 01 sub eax,1
0070B29B . 83E8 08 sub eax,8
0070B29E . 8945 EC mov dword ptr ss:[ebp-14],eax
0070B2A1 . 83EA 01 sub edx,1
0070B2A4 . 83EA 02 sub edx,2
0070B2A7 . 66:8955 F4 mov word ptr ss:[ebp-C],dx
0070B2AB . 66:8B8B F31B4000 mov cx,word ptr ds:[ebx+401BF3]
0070B2B2 . 66:894D F6 mov word ptr ss:[ebp-A],cx
0070B2B6 . 66:C1E9 03 shr cx,3
0070B2BA . 66:83E1 07 and cx,7
0070B2BE . 66:898B E71B4000 mov word ptr ds:[ebx+401BE7],cx
0070B2C5 . EB 65 jmp short Client.0070B32C
0070B2C7 > C745 FC 00000000 mov dword ptr ss:[ebp-4],0
0070B2CE . 8BB3 D31B4000 mov esi,dword ptr ds:[ebx+401BD3]
0070B2D4 . 8B7D F0 mov edi,dword ptr ss:[ebp-10]
0070B2D7 . 83C7 02 add edi,2
0070B2DA . 74 02 je short Client.0070B2DE
0070B2DC . 75 00 jnz short Client.0070B2DE
0070B2DE > 0FB755 F4 movzx edx,word ptr ss:[ebp-C]
0070B2E2 . 83EA 02 sub edx,2
0070B2E5 . EB 2C jmp short Client.0070B313
//第二次算法
0070B2E7 > 8B45 FC mov eax,dword ptr ss:[ebp-4]
0070B2EA . 83E0 1F and eax,1F
0070B2ED . 33C9 xor ecx,ecx
0070B2EF . 8A8C18 A71B4000 mov cl,byte ptr ds:[eax+ebx+401BA7] //0x0E ?
0070B2F6 . EB 03 jmp