99奇迹2.6B破解全攻略
作者:石力[51pywg]
网址:www.51pywg.com
说明:51PYWG网为了广大游戏爱好者利益推出了各种游戏辅助工具!让所有玩家不至于用不上游戏辅助工具,买不起游戏辅助工具!但网站因此遭受到DOS攻击,服务器端口数据堵塞无法服务,在此表示歉意!
同时攻击者还谎称本站提供的程序有木马,为了辩明是非,同时也是和各位解密爱好都共同探讨技术,特发表此文,希望大家喜欢并支持51pywg的发展。如果对破解解密感兴趣的朋友,也可以来我们的论坛一起探讨。
还是那句话:时时关注51pywg,更多精彩等着你!
至于软件的脱壳问题,在此不过多说明,无非就是ARM的壳。如果大家有这样的朋友,可以让他们代劳一下了;)
一、将远程验证改为本地验证。
软件脱壳后,用ultraedit(或其它32位)工具将文件打开,查收字符串210.17.189.108或210.17.189.111,将其改为本地验证,即127.0.0.1,不足的地方添加内码0
由于原软件采用的是随机端口9825-9809,所以我们也还固定端口
0042AC39 81C2 61260000 ADD EDX, 2661 //9825-9829
改为:
0042AC39 90 NOP
0042AC3A BA 61260000 MOV EDX,2661 //改为固定的端口9825
二、验证服务器的编写
注:所有说明均以验证服务器角度。
1、客户端发来第一次数据(定长13个字节)
例:
0000 21 21 22 23 30 00 00 00 00 27 30 30 30 !!"#0....'000
将第5位(0x30)依次异或6-13位,得到结果(内存的显示结果):
30 30 30 30 17 00 00 00
其中,后四位代表客户端版本编号,0x17为2.6A版,0x15为2.6版
2、服务器发回第一次验证值(定长24字节)
24字节分成两部分,前16个字节为第二次验证数据的加密密钥,后8个字节为本次验证的合法性校验值!
a、前16位生成原理:
随机生成四个值: 00000A18 00000F86 00007A1C 000027AC
内存显示结果:18 0A 00 00 86 0F 00 00 1C 7A 00 00 AC 27 00 00
b、后8位生成原理:
加密数据:
30 30 30 30 17 00 00 00
将数据合并为24位待加密数据:
18 0A 00 00 86 0F 00 00 1C 7A 00 00 AC 27 00 00
30 30 30 30 17 00 00 00
然后用加密密钥(固定,内存显示结果)
51 EA 98 26 FA 75 42 71 5E 72 FA 53 EC 43 AB 69
①2698EA51
②714275FA
③53FA725E
④69AB43EC
经过加密(具体加密原理,见三“加密函数”,分段加密,每次处理8位)
得到结果(内存显示结果):
97 BA DB A9 6A C7 62 15 3B AB 0E 10 DA 93 55 27
D1 F8 F5 63 C1 ED 9B 90
将此24位数据发送出去,第一次验证通过
3、客户端发来第二次验证数据(定长176位,包含帐号密码等信息)
其实这个数据也是用刚才随机生成四个值(00000A18 00000F86 00007A1C 000027AC)为密钥加密成的,
例:
0000 51 08 24 BC 97 2B AB C8 E2 C5 6E BA F6 2A 0E 4F Q.$..+....n..*.O
0010 97 D6 CD 8D 83 24 B2 D6 E2 C5 6E BA F6 2A 0E 4F .....$....n..*.O
0020 25 33 17 53 31 34 68 5E 5B 5F FB 06 B0 A9 1D 90 %3.S14h^[_......
0030 62 9E 41 1E 6B 68 06 C3 E2 C5 6E BA F6 2A 0E 4F b.A.kh....n..*.O
0040 E2 C5 6E BA F6 2A 0E 4F E2 C5 6E BA F6 2A 0E 4F ..n..*.O..n..*.O
0050 E2 C5 6E BA F6 2A 0E 4F E2 C5 6E BA F6 2A 0E 4F ..n..*.O..n..*.O
0060 E2 C5 6E BA F6 2A 0E 4F E2 C5 6E BA F6 2A 0E 4F ..n..*.O..n..*.O
0070 57 84 5A 57 A6 71 38 62 A8 97 0F 99 7B 0C 37 A5 W.ZW.q8b....{.7.
0080 E2 C5 6E BA F6 2A 0E 4F E2 C5 6E BA F6 2A 0E 4F ..n..*.O..n..*.O
0090 E2 C5 6E BA F6 2A 0E 4F E2 C5 6E BA F6 2A 0E 4F ..n..*.O..n..*.O
00A0 E2 C5 6E BA F6 2A 0E 4F E2 C5 6E BA F6 2A 0E 4F ..n..*.O..n..*.O
服务器解密这段数据,正好是“加密函数”的逆运算(具体解密原理,见四“解密函数”)。也是分段解密,每次处理8位
解密密钥就是(四个刚才生成的随机值)
18 0A 00 00 86 0F 00 00 1C 7A 00 00 AC 27 00 00
得到结果:
39 39 71 6A 00 00 00 00 00 00 00 00 00 00 00 00 99qj............
41 55 54 48 45 4E 00 00 00 00 00 00 00 00 00 00 AUTHEN..........
77 77 77 2E 39 39 71 6A 2E 63 6F 6D 00 00 00 00 www.99qj.com....
61 62 63 64 65 66 00 00 00 00 00 00 00 00 00 00 abcdef..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
63 6E 68 65 72 6F 30 30 37 00 00 00 00 00 00 00 51pywg..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
第一行为九九奇迹(外挂)的帐号
第二行为用于校验(固定)
第三行为九九奇迹(外挂)的密码
第四行为用于校验(固定)
第八行为奇迹(游戏)的帐号
4、服务器返回第二次验证数据(定长48位):
0000 A7 80 7E 44 AF E6 59 59 00 00 00 00 00 00 00 00 ..~D..YY........
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020 32 2E 36 61 00 00 00 00 00 00 00 00 B1 C4 FD 4B 2.6a...........K
这里只有前8位有效,其余均为固定(对于2.6A版本而言)
前8位生成原理:
加密数据(内存显示结果),即"SUCCESS"字符串
53 55 43 43 45 53 53 00
加密密钥(内存显示结果),还是刚才生成的4个随机值
18 0A 00 00 86 0F 00 00 1C 7A 00 00 AC 27 00 00
加密原理与第二步的相同(详见“加密函数”文章),但这里不同的是这8位数据,用同样的密钥加密了6次
各次结果如下(内存显示结果):
53 55 43 43 45 53 53 00 SUCCESS.
加密到
1F 02 83 77 0A 75 21 AC ?.u!?.
到
A1 7F ED 97 12 1B 45 64 ??Ed..
到
7E 56 E9 2E 08 03 79 71 ~V?
到
75 00 EA 55 76 87 A8 20 u.暾v? ..
到
52 6D E1 B8 17 35 DC 12 Rm岣5?
最后得到就是要的结果
A7 80 7E 44 AF E6 59 59
三、加密函数
举例:
加密数据(内存显示结果),第一次生成的4个随机数的前两个
18 0A 00 00 86 0F 00 00
⑴00000A18
⑵00000F86
加密密钥(内存显示结果),程序固定
51 EA 98 26 FA 75 42 71 5E 72 FA 53 EC 43 AB 69
①2698EA51
②714275FA
③53FA725E
④69AB43EC
程序代码段:
:0045099C 8B8640040000 mov eax, dword ptr [esi+00000440]
:004509A2 57 push edi //加密密钥
:004509A3 8D8CC63C020000 lea ecx, dword ptr [esi+8*eax+0000023C]
:004509AA 51 push ecx //加密数据
:004509AB E8803D0000 call 00454730 //加密函数(每次加密8个字节),F8跟进
-----------------F8跟进加密函数----------------------------
:00454730 83EC0C sub esp, 0000000C
:00454733 53 push ebx
:00454734 55 push ebp
:00454735 56 push esi
:00454736 8B742420 mov esi, dword ptr [esp+20]
:0045473A 8B4C241C mov ecx, dword ptr [esp+1C]
:0045473E 57 push edi
:0045473F 8B3E mov edi, dword ptr [esi] //①2698EA51
:00454741 33D2 xor edx, edx
:00454743 8B01 mov eax, dword ptr [ecx] //⑴00000A18
:00454745 8B4904 mov ecx, dword ptr [ecx+04]//⑵00000F86
:00454748 897C2410 mov dword ptr [esp+10], edi
:0045474C 8B7E04 mov edi, dword ptr [esi+04]//②714275FA
:0045474F 897C2424 mov dword ptr [esp+24], edi
:00454753 8B7E08 mov edi, dword ptr [esi+08]//③53FA725E
:00454756 8B760C mov esi, dword ptr [esi+0C]//④69AB43EC
:00454759 897C2418 mov dword ptr [esp+18], edi
:0045475D 89742414 mov dword ptr [esp+14], esi
:00454761 BF20000000 mov edi, 00000020 //计数器
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004547AB(C)
|
:00454766 8B5C2424 mov ebx, dword ptr [esp+24] //EBX=②714275FA
:0045476A 8B6C2410 mov ebp, dword ptr [esp+10] //EBP=①2698EA51
:0045476E 8BF1 mov esi, ecx //⑵00000F86
:00454770 81EA4786C861 sub edx, 61C88647 //0 - 61C88647 = 9E3779B9
:00454776 C1EE05 shr esi, 05 //⑵00000F86 SHR 5 = 0000007C
:00454779 03F3 add esi, ebx //0000007C + ②714275FA = 71427676
:0045477B 8BD9 mov ebx, ecx
:0045477D C1E304 shl ebx, 04 //⑵00000F86 SHL 4 = 0000F860
:00454780 03DD add ebx, ebp //0000F860 + ①2698EA51 = 2699E2B1
:00454782 8B6C2418 mov ebp, dword ptr [esp+18] //③53FA725E
:00454786 33F3 xor esi, ebx //71427676 XOR 2699E2B1 = 57DB94C7
:00454788 8D1C0A lea ebx, dword ptr [edx+ecx]//9E3779B9+00000F86=9E37893F
:0045478B 33F3 xor esi, ebx //57DB94C7 XOR 9E37893F = C9EC1DF8
:0045478D 8B5C2414 mov ebx, dword ptr [esp+14] //④69AB43EC
:00454791 03C6 add eax, esi //C9EC1DF8 + 00000A18 = C9EC2810
:00454793 8BF0 mov esi, eax
:00454795 C1EE05 shr esi, 05 //C9EC2810 SHR 5 = 064F6140
:00454798 03F3 add esi, ebx //064F6140 + ④69AB43EC = 6FFAA52C
:0045479A 8BD8 mov ebx, eax
:0045479C C1E304 shl ebx, 04 //C9EC2810 SHL 4 = 9EC28100
:0045479F 03DD add ebx, ebp //9EC28100 + ③53FA725E = F2BCF35E
:004547A1 33F3 xor esi, ebx //6FFAA52C XOR F2BCF35E = 9D465672
:004547A3 8D1C02 lea ebx, dword ptr [edx+eax]//9E3779B9 + C9EC2810 = 6823A1C9
:004547A6 33F3 xor esi, ebx //9D465672 XOR 6823A1C9 = F565F7BB
:004547A8 03CE add ecx, esi //00000F86 + F565F7BB = F5660741
:004547AA 4F dec edi
:004547AB 75B9 jne 00454766 //向上跳构成循环结构,共循环32(10进制)次
************************************************************
上面仅列出第一次循环时的结果,只需要的值,EAX=C9EC2810 ECX=F5660741
最后循环32次后。得到EAX=A9DBBA97 ECX=1562C76A
************************************************************
:004547AD 8B542420 mov edx, dword ptr [esp+20]
:004547B1 5F pop edi
:004547B2 5E pop esi
:004547B3 5D pop ebp
:004547B4 8902 mov dword ptr [edx], eax
:004547B6 894A04 mov dword ptr [edx+04], ecx //放入内存后的结果
**********************************************************************
0047B8AC 97 BA DB A9 6A C7 62 15 ?郓j氢...
**********************************************************************
:004547B9 5B pop ebx
:004547BA 83C40C add esp, 0000000C
:004547BD C3 ret
到此完成8个字节的加密
四、解密函数
基本上就是将上便过程进行逆推,如果不对的地方还请指正
呵呵,现在大家发现了吧。原来破解是这么简单。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)