欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

新华字典词典破解手记

程序员文章站 2022-08-12 18:18:33
文/图 KYO=================================== 由于女朋友要进修汉语言文学专业,因此她让我帮她找一个汉语字典的软件。我找了半天找到一个新华字典词典V200...

文/图 KYO
===================================
由于女朋友要进修汉语言文学专业,因此她让我帮她找一个汉语字典的软件。我找了半天找到一个新华字典词典V2007 build 05.15,正好符合我女朋友的要求,可是下载安装使用时才发现,这软件是需要注册的,不然会有一些限制。注册费30元,虽然不多,可我就是不想掏钱(我属于铁公鸡一类的人,呵呵),于是就有了下文。
废话不多说,开始进入正题。安装目录里的xhzd.exe就是程序主文件,还是先用PEiD查一下基本情况吧。得到壳是ASPack 2.12 -> Alexey Solodovnikov,是个压缩壳,用ESP定律或者工具都可以很方便脱掉。在这里我使用一个对于一般的压缩壳都有效的脱壳工具来脱,顺便把这个工具共享给大家吧,如图1所示。脱壳后的文件名自动改为New_xhzd.exe。再用PEiD查看可得知程序编写语言是Borland Delphi 6.0-7.0。
 
图1
之后直接用OD载入,我一般喜欢使用OD插件的万能断点来下断,在验证码框随便输入327(验证码只能是数字),注册码框输入123567,点击注册后,经过由系统领空返回到用户领空,就断在了00544536处,代码如下。

00544536 . 8B85 A8FEFFFF MOV EAX,DWORD PTR SS:[EBP-158]
0054453C . 50  PUSH EAX
0054453D . 8D95 A0FEFFFF LEA EDX,DWORD PTR SS:[EBP-160]
00544543 . 8B45 FC  MOV EAX,DWORD PTR SS:[EBP-4]
00544546 . 8B80 74040000 MOV EAX,DWORD PTR DS:[EAX+474]
0054454C . E8 CB30F0FF CALL New_xhzd.0044761C  
;取验证码
00544551 . 8B85 A0FEFFFF MOV EAX,DWORD PTR SS:[EBP-160]
00544557 . E8 6052ECFF CALL New_xhzd.004097BC    
;验证码转为16进制
0054455C . 05 83030000 ADD EAX,383 ;验证加383
00544561 . 8D95 A4FEFFFF LEA EDX,DWORD PTR SS:[EBP-15C]
00544567 . E8 9CFEFFFF CALL New_xhzd.00544408    
;关键CALL要F7进去
0054456C . 8B95 A4FEFFFF MOV EDX,DWORD PTR SS:[EBP-15C]
00544572 . 58  POP EAX
00544573 . E8 740AECFF CALL New_xhzd.00404FEC  
;输入的假注册码与验证码,经过CALL 00544408后得出的数比较
00544578 . 0F85 48010000 JNZ New_xhzd.005446C6
;如果不相等就跳向失败

从我上面的注释大家可以看出来,该程序的算法流程已经很明了了。设验证码为user,那么在进入call 0054408之前,user=user+383。现在F7进去00544408看代码。

00544425 |. 81F3 F1250B00 XOR EBX,0B25F1
;user=user xor 0B25F1
0054442B |. 8BC3  MOV EAX,EBX
0054442D |. 33D2  XOR EDX,EDX
0054442F |. 52     PUSH EDX
00544430 |. 50     PUSH EAX
00544431 |. 8D45 FC  LEA EAX,DWORD PTR SS:[EBP-4]
00544434 |. E8 4F53ECFF  CALL New_xhzd.00409788
;把user转为10进制
00544439 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]  
0054443C |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX]
0054443F |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00544442 |. 0FB652 01 MOVZX EDX,BYTE PTR DS:[EDX+1]
00544446 |. 03C2     ADD EAX,EDX
;取user第一位与user第二位相加=k1
00544448 |. B9 05000000  MOV ECX,5
0054444D |. 99      CDQ
0054444E |. F7F9    IDIV ECX
00544450 |. 80C2 34  ADD DL,34
;(k1 mod 5)+34=sn1
00544453 |. 8855 F8    MOV BYTE PTR SS:[EBP-8],DL
00544456 |. 8B45 FC   MOV EAX,DWORD PTR SS:[EBP-4]
00544459 |. 0FB640 02  MOVZX EAX,BYTE PTR DS:[EAX+2]
0054445D |. 8B55 FC  MOV EDX,DWORD PTR SS:[EBP-4]
00544460 |. 0FB652 03  MOVZX EDX,BYTE PTR DS:[EDX+3]
00544464 |. 03C2   ADD EAX,EDX
;取user第二位与user第三位相加=k2
00544466 |. B9 05000000  MOV ECX,5
0054446B |. 99  CDQ
0054446C |. F7F9  IDIV ECX
0054446E |. 8BDA  MOV EBX,EDX
00544470 |. 80C3 33  ADD BL,33
; (k2 mod 5)+33=sn2
00544473 |. 885D F9  MOV BYTE PTR SS:[EBP-7],BL
00544476 |. 8D45 F4  LEA EAX,DWORD PTR SS:[EBP-C]
00544479 |. 8A55 F8  MOV DL,BYTE PTR SS:[EBP-8]
0054447C |. E8 4F09ECFF  CALL New_xhzd.00404DD0
00544481 |. 8B45 F4  MOV EAX,DWORD PTR SS:[EBP-C]
00544484 |. 8D55 FC  LEA EDX,DWORD PTR SS:[EBP-4]
00544487 |. B9 1B000000  MOV ECX,1B
0054448C |. E8 F70CECFF  CALL New_xhzd.00405188
00544491 |. 8D45 F0  LEA EAX,DWORD PTR SS:[EBP-10]
00544494 |. 8BD3  MOV EDX,EBX
00544496 |. E8 3509ECFF  CALL New_xhzd.00404DD0
0054449B |. 8B45 F0  MOV EAX,DWORD PTR SS:[EBP-10]
0054449E |. 8D55 FC  LEA EDX,DWORD PTR SS:[EBP-4]
005444A1 |. B9 19000000  MOV ECX,19
005444A6 |. E8 DD0CECFF  CALL New_xhzd.00405188
;连接user、sn1、sn2即为注册码
005444AB |. 8BC6  MOV EAX,ESI
005444AD |. 8B55 FC  MOV EDX,DWORD PTR SS:[EBP-4]
005444B0 |. E8 8F07ECFF  CALL New_xhzd.00404C44

通过我上面的注释,想必大家都很明白了,这个算法非常简单,因此我就直接给出注册机代码了,用VB编写,代码如下。

Private Sub Command1_Click()
user1 = Text1.Text
i = (user1 +&H383) Xor &HB25F1
k = Chr(((Asc(Mid(i, 1, 1)) + Asc(Mid(i, 2, 1))) Mod 5) + &H34)
k1 = Chr(((Asc(Mid(i, 3, 1)) + Asc(Mid(i, 4, 1))) Mod 5) + &H33)
Text2.Text = i & k & k1
End Sub

现在分析完了,用编译好的注册机生成一个注册码试试吧,如图2所示,可以看到生成的注册码顺利注册成功了。