课题:幻想春秋 1.83 内测版
作者:cigaiettes
日期:04-15-05
目的:跟出目标程序加密解密过程
工具:wpe od1.1
其他:本文纯粹作者学习使用.编辑和发表权利属于作者本人和GameRes.谢绝任何转载,如有任何需要,请联系作者QQ18013306
用wpe截取游戏封包.用帐号11111,密码11111登陆.截取到3个封包
1.recv
2.WSASend
3.WSARecv
故推测得到的第一个recv是从服务器得到加密解密字符串(其实是听高手说的)
启动CQ.exe.发现程序可以直接进服务器.故用od直接加载CQ.exe.加载好以后.F9运行.无错误加壳提示.
打算跟踪第一个recv
下命令 bp recv
帐号11111
密码11111
登陆游戏.断线.看堆栈
0012F60C 005455C3 /CALL 到 recv 来自 CQ.005455BD
0012F610 000002BC |Socket = 2BC
0012F614 0D7E01E4 |Buffer = 0D7E01E4
0012F618 0000002C |BufSize = 2C (44.)
0012F61C 00000000 \Flags = 0
在数据窗口找到0D7E01E4位置,然后取消recv断点,alt + F9 运行到程序代码位置处
此时数据窗口已经收到数据并显示出来.
0D16431C 2C 00 20 00 5B B2 AD BC 8F 16 F5 6C 47 94 95 04 ,. .[箔紡鮨G敃
0D16432C B7 9E E9 B0 4C 68 47 4C DF 26 51 D0 53 CA 65 94 窞榘LhGL?Q蠸蔱
0D16433C 07 AE B9 98 FB D2 4D DC 2F 36 21 60 CC 02 00 00 ?橕襇?6!`?..
在0D164320处下硬件访问断点.F9跑.程序没有断下来.运行了起来.显示帐号密码错误.故刚刚下的硬件断点位置不对.删除硬件断点重新登陆.断recv
这次把硬件断点断在0D164324上(重新登陆一次.可能导致堆栈数据跟刚刚不一样.这里的绝对地址只是为了说明方便)
还是没有断下来.重复上一步在0D164328上下硬件断点.
00545851 |. 8B85 E20100>mov eax,dword ptr ss:[ebp+1E2]
00545857 |. 8BC8 mov ecx,eax
断在上面一步.从00545851开始取出字符串并进行下面的操作.
00545859 |. 8BD0 mov edx,eax
0054585B |. 81F1 CF236D>xor ecx,2E6D23CF
00545861 |. 83F2 CF xor edx,FFFFFFCF
00545864 |. 81E9 99236D>sub ecx,2E6D2399
0054586A |. 83C2 67 add edx,67
0054586D |. 35 CF236D00 xor eax,6D23CF
00545872 |. F7D1 not ecx
00545874 |. F7D2 not edx
00545876 |. 2D 99236D00 sub eax,CQ.006D2399
0054587B |. C1E9 18 shr ecx,18
0054587E |. C1E2 18 shl edx,18
00545881 |. F7D0 not eax
00545883 |. 0BCA or ecx,edx
00545885 |. 25 00FFFF00 and eax,0FFFF00
0054588A |. 0BC8 or ecx,eax
0054588C |. B0 01 mov al,1
0054588E |. 898D D40100>mov dword ptr ss:[ebp+1D4],ecx
到上面一步操作完毕.并自动存到其他地方.0D7E01E0
00545894 \.^ E9 56FFFFFF jmp CQ.005457EF
数据区 d 0D7E01E0 看到刚刚操作好的数据转存到这里.对着0D7E01E2下硬件访问断点.F9跑
0D7E01E0 0A 4A 0C 80 .J.?/P>
断在这里.发现继续转存于 esp+10 这个位置.
0054ACBB |. 8B4424 0C mov eax,dword ptr ss:[esp+C]
0054ACBF |. 894C24 10 mov dword ptr ss:[esp+10],ecx
0054ACC3 |. 8B4C24 08 mov ecx,dword ptr ss:[esp+8]
数据去 d 0012F888 看到转存的数据.继续下硬件断点.
0012F888 0A 4A 0C 80 .J.?/P>
断在这里,已经开始加密或解密过程了.
0054AB90 |. 8B4D 00 mov ecx,dword ptr ss:[ebp]
0054AB93 |. 8BDE mov ebx,esi
0054AB95 |. C1EE 02 shr esi,2
0054AB98 |. 83E3 03 and ebx,3
0054AB9B |. 8BC6 mov eax,esi
0054AB9D |. 4E dec esi
0054AB9E |. 85C0 test eax,eax
0054ABA0 |. 76 29 jbe short CQ.0054ABCB
0054ABA2 |> 8D0431 /lea eax,dword ptr ds:[ecx+esi]
0054ABA5 |. 33D2 |xor edx,edx
0054ABA7 |. F735 A8E859>|div dword ptr ds:[59E8A8]
下面一步 读取要处理的封包进行操作.仔细看数据窗口.是明文.判断刚刚操作拦截到的是得到加密字符串过程
解密字符串得到过程重复前面几步.
0054ABAD |. 8B07 |mov eax,dword ptr ds:[edi]
0054ABAF |. 83C7 04 |add edi,4
这里开始到结束都是加密过程了.
0054ABB2 |. 8B0C95 EC8F>|mov ecx,dword ptr ds:[edx*4+598FEC]
0054ABB9 |. 8BD6 |mov edx,esi
0054ABBB |. 81C1 C1236D>|add ecx,2E6D23C1
0054ABC1 |. 33C1 |xor eax,ecx
0054ABC3 |. 4E |dec esi
0054ABC4 |. 8947 FC |mov dword ptr ds:[edi-4],eax
0054ABC7 |. 85D2 |test edx,edx
0054ABC9 |.^ 77 D7 \ja short CQ.0054ABA2
0054ABCB |> 8BC3 mov eax,ebx
0054ABCD |. 33D2 xor edx,edx
0054ABCF |. F735 A8E859>div dword ptr ds:[59E8A8]
0054ABD5 |. 8B0495 EC8F>mov eax,dword ptr ds:[edx*4+598FEC]
0054ABDC |. 33C8 xor ecx,eax
0054ABDE |. 8BC3 mov eax,ebx
0054ABE0 |. 4B dec ebx
0054ABE1 |. 85C0 test eax,eax
0054ABE3 |. 76 10 jbe short CQ.0054ABF5
0054ABE5 |. 8D43 01 lea eax,dword ptr ds:[ebx+1]
0054ABE8 |> 8A17 /mov dl,byte ptr ds:[edi]
0054ABEA |. 32D1 |xor dl,cl
0054ABEC |. 8817 |mov byte ptr ds:[edi],dl
0054ABEE |. 47 |inc edi
0054ABEF |. C1E9 08 |shr ecx,8
0054ABF2 |. 48 |dec eax
0054ABF3 |.^ 75 F3 \jnz short CQ.0054ABE8
0054ABF5 |> 8B45 00 mov eax,dword ptr ss:[ebp]
0054ABF8 |. 5F pop edi
0054ABF9 |. 8BC8 mov ecx,eax
0054ABFB |. 5E pop esi
0054ABFC |. C1E1 05 shl ecx,5
0054ABFF |. 2BC8 sub ecx,eax
0054AC01 |. B8 01000000 mov eax,1
0054AC06 |. 81C1 058408>add ecx,CQ.08088405
0054AC0C |. 894D 00 mov dword ptr ss:[ebp],ecx
0054AC0F |. 5D pop ebp
0054AC10 |. 5B pop ebx
0054AC11 \. C3 retn
加密过程为每四个字节跟操作过的加密匙进行操作.具体算法上面很清楚...
用跟到的东西写的脱机雏形.完全可以运行.
