首页
社区
课程
招聘
关于99qj网络验正一文的一些遗留问题
发表于: 2004-10-26 13:33 4951

关于99qj网络验正一文的一些遗留问题

2004-10-26 13:33
4951
99奇迹2.6B破解全攻略[转贴]--关于网络验证...
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个字节的加密

四、解密函数
基本上就是将上便过程进行逆推,如果不对的地方还请指正

呵呵,现在大家发现了吧。原来破解是这么简单。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
以上基本看懂了
我的问题是:
验正服务器如何编写,菜鸟新来,希望大家多多指教。
是用汇编,还是C,我C还行,汇编可就差多了。
初次想编个东西,没有别的目的,只为学习交流,请指教!
2004-10-26 13:38
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
怎么没人自己DIY啊?
2004-10-26 15:29
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
反汇编的验正服务器
附件大于512K。地址如下:http://pickup.chinamofile.com/7128705056746082
2004-10-26 15:31
0
雪    币: 16
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢,慢慢研究
2004-10-26 18:28
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
晕啊!怎么没人出来说下呢
2004-10-26 21:25
0
游客
登录 | 注册 方可回帖
返回
//