分析僅僅是為了娛樂而已,遊戲也不難。有錯誤就不好意思了。
這個遊戲加了個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了。。(忘記了。)