• 标 题:SuperDic32的破解
  • 作 者:ylw
  • 时 间:2003年9月25日 11:43
  • 链 接:http://bbs.pediy.com

《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最关心的是程序的保护方式和加密思想及其可能存在的漏洞。”虽然爆破比较简单,但不是最终目的。我觉得还是做出注册机好,那样不仅可以了解代码的运行以及学习软件作者的方法,而且对自己也是个很好的锻炼,可以积累编程经验。我刚学破解,经验不足,如有错误还请诸位指正,谢谢!