新华字典词典破解手记
文/图 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所示,可以看到生成的注册码顺利注册成功了。
上一篇: 日本新超算想超天河2号:没钱掏电费认输
下一篇: 浅谈MD5加密算法中的加盐值(SALT)