前天晚上我跟封包玩了一晚上,因才开始(第一次跟封包)说一下我一晚上的发现吧 我是直接用WPE截取的,因为金山游戏本身都有截取封包的保护措施(就像MM所说),直接用WPE截取我是截取不到的,后来用Ollydbg调试的时候才截取的到。 经过前面的准备,封报的明文准备已经OK,准备进行加密,加密方式是取一个4字节的数字,对封包进行Xor运算,运算完毕后就直接发送出去,我核对过用WPE截取封包的数据,和我看到的运算结果完全一致,这说明只要用那个4字节的数字对封包进行反Xor运算就可以得到明文的封包。 其实说白了那个4字节的数字就是每次加密的密匙,也就是服务器认可的,这个4字节怎么得出的我就没跟了,暂时只发现只要不更换场景,4字节密匙不会更变。 相同道理,服务返回的信息也是经过4字节Xor运算处理了的,客户端解密时候取服务端4字节密匙对封包进行解密就可以得到明文封包。 大体说下封神封包加密解密流程 Send: 1,制造明文封包 2,取4字节Send密匙 3,用4字节密匙对封包进行Xor运算(保留前2位),最后不足4字节进行单字节运算。 4,发送。 Revc: 1,收到封包 2,取4字节Revc密匙 3,用4字节密匙对封包进行Xor运算(保留前2位),最后不足4字节进行单字节运算。 4,对明文封包进行分析
-------------------------------------------------------------------------------------------------------------------------------------------------------- 以上的方法比较累人!下面说说本地制作吧(既是用大家熟悉的FPE等软件) 制作辅助外挂(自动加血,自动加蓝,免负重等等) HP的地址是不固定的,我使用金山游侠先找出当前的那个地址, 然后使用softice对该地址设置断点,softice应该会立刻断住, 你会看见MOV DWORD PTR DS:[EAX+ECX*8+EB4],EDI, 在客户端中,位置是0x4B2C74, 你可以修改游戏的进程, 把MOV DWORD PTR DS:[EAX+ECX*8+EB4], EDI改成一个E9 XX XX XX XX 90 90, JMP到进程中.rsrc和.data之间的空余地址, 把(XX XX XX XX) + 0x4B2C74 + 5处的代码修改成MOV Y, EDI, 下一条做原来的MOV DWORD PTR DS:[EAX+ECX*8+EB4],EDI, 再来个E9 ZZ ZZ ZZ ZZ, 设置好ZZ ZZ ZZ ZZ使其再跳到原来DWORD PTR DS:[EAX+ECX*8+EB4], EDI的下一句,就是0x4B2C7B处, 这样HP的地址就固定下来了,只要看Y就知道HP了。
--------------------------------------------------------------------------------------------------------------------------------------------------------
下面说说客服端的破解(小试牛刀!)有兴趣的朋友可以制作一个DLL 来实现加血锁定血量! .text:004E8EF0 sub_4E8EF0 proc near .text:004E8EF0 .text:004E8EF0 arg_0 = dword ptr 4 .text:004E8EF0 arg_4 = dword ptr 8 .text:004E8EF0 arg_8 = dword ptr 0Ch .text:004E8EF0 .text:004E8EF0 mov ecx, [esp+arg_0] ; 可能是长度LEN地址 .text:004E8EF4 push ebx .text:004E8EF5 mov eax, [esp+4+arg_4] ; 缓存地址 .text:004E8EF9 push esi .text:004E8EFA mov esi, ecx .text:004E8EFC push edi .text:004E8EFD mov edi, [esp+0Ch+arg_8] ; 加密KEY地址 .text:004E8F01 and esi, 3 ;相当于缓存长度除以4的余数 .text:004E8F04 shr ecx, 2 ;相当于缓存长度除以4的商 .text:004E8F07 mov edx, [edi] ;把加密KEY值放进edx .text:004E8F09 mov ebx, ecx ; .text:004E8F0B dec ecx ; .text:004E8F0C test ebx, ebx ; .text:004E8F0E jbe short loc_4E8F1E ;判断跳转 .text:004E8F10 inc ecx ; .text:004E8F11 .text:004E8F11 loc_4E8F11: .text:004E8F11 mov ebx, [eax] .text:004E8F13 add eax, 4 .text:004E8F16 xor ebx, edx ;异或运算,EDX=KEY的值,核心运算 .text:004E8F18 dec ecx .text:004E8F19 mov [eax-4], ebx .text:004E8F1C jnz short loc_4E8F11 ;相当于FOR循环运算 .text:004E8F1E .text:004E8F1E loc_4E8F1E: .text:004E8F1E mov ecx, esi .text:004E8F20 dec esi .text:004E8F21 test ecx, ecx .text:004E8F23 jbe short loc_4E8F35 .text:004E8F25 lea ecx, [esi+1] .text:004E8F28 .text:004E8F28 loc_4E8F28: .text:004E8F28 mov bl, [eax] .text:004E8F2A xor bl, dl ;异或运算 .text:004E8F2C mov [eax], bl .text:004E8F2E inc eax .text:004E8F2F shr edx, 8 .text:004E8F32 dec ecx .text:004E8F33 jnz short loc_4E8F28;相当于FOR循环运算 .text:004E8F35 .text:004E8F35 loc_4E8F35: KEY付值运算; .text:004E8F35 mov eax, [edi] .text:004E8F37 mov edx, eax .text:004E8F39 shl edx, 5 .text:004E8F3C sub edx, eax .text:004E8F3E mov eax, 1 .text:004E8F43 add edx, 8088405h .text:004E8F49 mov [edi], edx KEY付值 .text:004E8F4B pop edi .text:004E8F4C pop esi .text:004E8F4D pop ebx .text:004E8F4E retn .text:004E8F4E sub_4E8EF0 endp
-------------------------------------------------------------------------------------------------------------------------------------------------------- 今天就到这里 |