《SuperDic32的破解》
【软件简介】:超级字典生成器是一个十分好用的字典生成工具,速度很快。不仅可以生成 用户自定义的字典,还可以对现有的字典进行修改等。
【软件限制】:不能定义特殊字符,同时还禁止了一些特殊功能。
【破解者】:ylw
【破解工具】:Ollydbg1.09,W32Dasm10,PEid,WinHex
【破解步骤】:
首先用PEid打开superdic.exe,分析软件是否加壳。“Microsoft Visual C++ 6.0”,没有加壳。
运行superdic.exe,选择注册页,在注册密码处填入“78787878787878787878”(习惯用法)。这时会弹出一对话框:“感谢您注册易优超级字典生成器!!!”,“请重启本程序,如果您输入的注册码正确,将能使用本软件的全部功能,并可享受后续版本的免费升级。”
好了,这就是我们要破解的软件。在动手之前先要分析问题,这一点很重要,大家别忙着一上来就设断、跟踪。从提示信息可以看出它并不是对输入的注册码立即进行比对,而是在重新启动软件时作比对,就象Flash Get的手法一样。当然它肯定先把申请号和注册密码放在某个地方,以便再次启动时进行读取。本软件是将注册码及申请号放在注册表HKEY_CURRENT_USERSoftwareEUsoftsuperdic中,这方面可以用FileMon和RegMon来跟踪,我是用Ollydbg跟踪得到的,跟踪过程就不写啦!大家可以自己试一下。
开始我认为它在启动时要读取注册表,于是就下断点在RegQueryValueExA和RegOpenKeyA,没想到这个软件对注册表的调用是如此频繁,以至于我不可能一个一个的进行筛选。参照破Flash Get的方法使用W32Dasm,在W32Dasm中查找字串:“user”和“password”,很快有了结果。0040197D (user)、0040199D(password)这两个地址是在你点击注册按钮后写入注册表时用到的,这是前面跟踪得到的结果。既然上面的代码是把注册码写入注册表中,那么它肯定还有一段代码是申请号和注册码从注册表中读出来的,于是我继续向下查找,果然又找到了00401A2B(user)和00401A5E(password)。
用Ollydbg载入superdic.exe,在00401A2B处设断,运行后,中断在00401A2B,按F8单步运行至004030B7,此处将申请号压入栈后调用Call,有点可疑应该查一下,跟进后运行至0040280D,此时EAX中为申请号,并压入栈,继续跟进,在0040273A处跟进,原因是分析这里的代码只有这个Call起主要作用。跟踪到0040276E,这个Call的作用是将从地址0012EFAC开始写入0123456789ABCDEFFEDCBA9876543210(不是字符串),可能是用来帮助生成注册码的,记下来。在00401C50处跟下去(跟踪的详细过程就不写了,只写主要的地方),你会发现EAX:67452301,EBX:98BADCFE,EBP:10325476,EDI:EFCDAB89,这正是前面见到的可疑串。接下来的Call 004025D0将地址0012EFC4开始的64个长的内容写到0012EEEC处(后面算注册码时用),从这个Call返回后(图五),从00401C7B—0040257F这一大段代码为注册码的生成过程,大家跟踪到这里可以看到有大量的逻辑运算和移位运算,我对加密算法了解很少,也许是软件作者自创的算法。限于篇幅在此不详细分析,大家在实践时要仔细分析。
Call 00402760将一串字符“a8f57789bf462d48b31fafb13347499e”写到以0012F031开始的地址,若想写注册机,就得跟进去仔细分析,这里将这一段省略。
继续走到00402818(这是跟进来的),在这里将会对上述字串进行处理,每隔一个取一个进行判断,若是数字,则减30存入EDI所指的地址;若非数字,则减56存入EDI所指的地址。EDI从0012F058开始以4递增,ESI每次递增1,结束循环条件是ESI不小于10(十进制为16)。
在接下来的0040286E处的循环及004028BC处的循环对数据进行处理,在0012F114处写入“LngNr9YXp4WPyryk”,代码如下:
0040286E |> 8BD1 MOV EDX,ECX
00402870 |. 81E2 0F000080 AND EDX,8000000F
00402876 |. 79 05 JNS SHORT superdic.0040287D
00402878 |. 4A DEC EDX
00402879 |. 83CA F0 OR EDX,FFFFFFF0
0040287C |. 42 INC EDX
0040287D |> 8BC7 MOV EAX,EDI
0040287F |. 83C1 5B ADD ECX,5B
00402882 |. 0FAF06 IMUL EAX,DWORD PTR DS:[ESI]
00402885 |. 83C6 04 ADD ESI,4
00402888 |. 8D1CC5 0000000> LEA EBX,DWORD PTR DS:[EAX*8]
0040288F |. 2BD8 SUB EBX,EAX
00402891 |. 8D1C98 LEA EBX,DWORD PTR DS:[EAX+EBX*4]
00402894 |. 8B4494 48 MOV EAX,DWORD PTR SS:[ESP+EDX*4+48]
00402898 |. 03C3 ADD EAX,EBX
0040289A |. BB 3D000000 MOV EBX,3D
0040289F |. 99 CDQ
004028A0 |. F7FB IDIV EBX
004028A2 |. 47 INC EDI
004028A3 |. 81F9 B0050000 CMP ECX,5B0
004028A9 |. 8956 FC MOV DWORD PTR DS:[ESI-4],EDX
004028AC |.^7C C0 JL SHORT superdic.0040286E
004028AE |. 8BB424 D400000> MOV ESI,DWORD PTR SS:[ESP+D4]
004028B5 |. 33C9 XOR ECX,ECX
004028B7 |. 8D5424 48 LEA EDX,DWORD PTR SS:[ESP+48]
004028BB |. 5B POP EBX
004028BC |> 8B02 MOV EAX,DWORD PTR DS:[EDX]
004028BE |. 83F8 19 CMP EAX,19
004028C1 |. 7F 08 JG SHORT superdic.004028CB
004028C3 |. 85C0 TEST EAX,EAX
004028C5 |. 7C 04 JL SHORT superdic.004028CB
004028C7 |. 04 41 ADD AL,41
004028C9 |. EB 1E JMP SHORT superdic.004028E9
004028CB |> 83F8 23 CMP EAX,23
004028CE |. 7F 0B JG SHORT superdic.004028DB
004028D0 |. 83F8 1A CMP EAX,1A
004028D3 |. 7C 06 JL SHORT superdic.004028DB
004028D5 |. 8A02 MOV AL,BYTE PTR DS:[EDX]
004028D7 |. 04 16 ADD AL,16
004028D9 |. EB 0E JMP SHORT superdic.004028E9
004028DB |> 83F8 3D CMP EAX,3D
004028DE |. 7D 0C JGE SHORT superdic.004028EC
004028E0 |. 83F8 24 CMP EAX,24
004028E3 |. 7C 07 JL SHORT superdic.004028EC
004028E5 |. 8A02 MOV AL,BYTE PTR DS:[EDX]
004028E7 |. 04 3D ADD AL,3D
004028E9 |> 880431 MOV BYTE PTR DS:[ECX+ESI],AL
004028EC |> 41 INC ECX
004028ED |. 83C2 04 ADD EDX,4
004028F0 |. 83F9 10 CMP ECX,10
004028F3 |.^7C C7 JL SHORT superdic.004028BC
进一步跟踪到00402935处,注意这里将是对输入的密码进行处理,此处有一比较操作:CMP ECX,14 所以我在输入注册码时输入了20(十六进制的14)位数。
00402935 |. 83F9 14 CMP ECX,14 <---------------------------------注册码最好为20位。
00402938 |. 74 03 JE SHORT superdic.0040293D
0040293A |. 8845 00 MOV BYTE PTR SS:[EBP],AL
0040293D |> 33D2 XOR EDX,EDX
0040293F |. 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8]
00402943 |> 8A042A MOV AL,BYTE PTR DS:[EDX+EBP]
00402946 |. 3C 39 CMP AL,39
00402948 |. 7F 0C JG SHORT superdic.00402956
0040294A |. 3C 30 CMP AL,30
0040294C |. 7C 08 JL SHORT superdic.00402956
0040294E |. 0FBEC0 MOVSX EAX,AL
00402951 |. 83E8 16 SUB EAX,16
00402954 |. EB 1E JMP SHORT superdic.00402974
00402956 |> 3C 7A CMP AL,7A
00402958 |. 7F 0C JG SHORT superdic.00402966
0040295A |. 3C 61 CMP AL,61
0040295C |. 7C 08 JL SHORT superdic.00402966
0040295E |. 0FBEC0 MOVSX EAX,AL
00402961 |. 83E8 3D SUB EAX,3D
00402964 |. EB 0E JMP SHORT superdic.00402974
00402966 |> 3C 5A CMP AL,5A
00402968 |. 7F 0C JG SHORT superdic.00402976
0040296A |. 3C 41 CMP AL,41
0040296C |. 7C 08 JL SHORT superdic.00402976
0040296E |. 0FBEC0 MOVSX EAX,AL
00402971 |. 83E8 41 SUB EAX,41
00402974 |> 8901 MOV DWORD PTR DS:[ECX],EAX
00402976 |> 42 INC EDX
00402977 |. 83C1 04 ADD ECX,4
0040297A |. 83FA 14 CMP EDX,14
0040297D |.^7C C4 JL SHORT superdic.00402943
仔细分析此处代码,若为数字,则减16,存入[ECX](表示ECX中的内容,此处为地址值);若为小写字母,则减3D,存入[ECX];若为大写字母,则减41,存入[ECX]。ECX从0012F088开始以4递增,EDX每循环一次加1,循环结束条件是EDX不小于14(十进制为20)。
运行到00402A13( 省略了一些中间过程)时,注册码的前16位已被处理为“78787s787CHKP8X0”,继续跟踪,此时将进入最后的比较阶段,胜利在望。
运行到004030C8,004030C8—00403124为比较过程,经实验跳向004031AC会失败,跳向00403130就会成功。看到这里,你肯定知道如何爆破了,我就不再多说了。其实通过对前面代码的分析,我们已经可以写出其注册机,前面有些步骤省略了,大家自己试一下吧!
“CRACKER最关心的是程序的保护方式和加密思想及其可能存在的漏洞。”虽然爆破比较简单,但不是最终目的。我觉得还是做出注册机好,那样不仅可以了解代码的运行以及学习软件作者的方法,而且对自己也是个很好的锻炼,可以积累编程经验。我刚学破解,经验不足,如有错误还请诸位指正,谢谢!