【破解工具】PEID,Ollydbg
【破解平台】WinXP SP2
【软件名称】易优超级字典生成器 V3.35
【软件大小】348KB
【作者声明】很早以前破的,最近闲下来了,就发上来,只为研究,没有其他目的。失误之处敬请诸位大侠赐教!
【保护方式】注册码,重启验证

------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------
用PEID查壳为 Microsoft Visual C++ 6.0,无壳。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
运行软件,切换到注册标签,看到申请号和注册密码两栏,随意输入注册密码,点注册提示“感谢使用…!请重启本程序,如果你输入的注册密码正确,将能使用本软件的全部功能,并享受后续版本的免费升级。”。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
用OD载入,入口点附近代码如下:

0041CE06 >/$  55            PUSH EBP
0041CE07  |.  8BEC          MOV EBP,ESP
0041CE09  |.  6A FF         PUSH -1
0041CE0B  |.  68 B0E34300   PUSH superdic.0043E3B0
纵观入口代码段的代码,可以判断出,程序流程清晰,而且没有出现MFC相关调用,那就应该是Win32编程编出来的。
由于是重启验证,那么注册密码应该是在窗口出现之前就算好了的。在字符串参考里,找到了如下字串:
超级字串参考+        , 条目 3
地址=0040264F
反汇编=PUSH superdic.00446128
文本字串=software\eusoft\superdic
超级字串参考+        , 条目 6
地址=004026E0
反汇编=PUSH superdic.00446128
文本字串=software\eusoft\superdic
那这个程序应该把申请号存在注册表里,在命令栏里下断点:“bpx RegQueryValueExA”,F9运行,中断在这里:
0040272C  |.  50            PUSH EAX                                 ; /pBufSize
0040272D  |.  8B4424 08     MOV EAX,DWORD PTR SS:[ESP+8]             ; |
00402731  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]             ; |
00402735  |.  51            PUSH ECX                                 ; |Buffer
00402736  |.  52            PUSH EDX                                 ; |pValueType
00402737  |.  6A 00         PUSH 0                                   ; |Reserved = NULL
00402739  |.  68 20614400   PUSH superdic.00446120                   ; |user
0040273E  |.  50            PUSH EAX                                 ; |hKey
0040273F  |.  FFD6          CALL ESI                                 ; \RegQueryValueExA
说明这里是获取申请号的语句,然后应该就是注册密码运算了,单步这个函数的时候,发现还有一个password注册表项,这里面应该主是用来存放注册密码了。函数单步完,来到这里:
00403AEA   .  8DB3 FC060000 LEA ESI,DWORD PTR DS:[EBX+6FC]
一直单步下去,直到步过这个call,发现堆栈里出现一串未知字符串,记下这个call和出现的字符串:
00403D50   .  E8 8BF7FFFF   CALL superdic.004034E0
继续往下,直到步过这句代码:
00403EB9   .  8D7C24 30     LEA EDI,DWORD PTR SS:[ESP+30]
发现后面是一段字符串比较的代码,而在ESI中存放的是我输入的假码、EDI中存放的是刚才记下的字符串:
00403EBD   > /8A16          MOV DL,BYTE PTR DS:[ESI]      ;将假码第1个字符的值移入DL寄存器中
00403EBF   . |8A0F          MOV CL,BYTE PTR DS:[EDI]      ;将EDI所存字符串中第1个字符的值移入CL寄存器中
00403EC1   . |8AC2          MOV AL,DL                     ;将DL寄存器的值移入AL
00403EC3   . |3AD1          CMP DL,CL                     ;CL和DL中的值进行比较
00403EC5   . |75 1E         JNZ SHORT superdic.00403EE5   ;若不等,则跳出循环
00403EC7   . |84C0          TEST AL,AL
00403EC9   . |74 16         JE SHORT superdic.00403EE1    ;(1)若AL为零则跳出循环
00403ECB   . |8A4E 01       MOV CL,BYTE PTR DS:[ESI+1]    ;将假码第2个字符的值移入CL寄存器中
00403ECE   . |8A57 01       MOV DL,BYTE PTR DS:[EDI+1]    ;将EDI所存字符串中第2个字符的值移入DL寄存器中
00403ED1   . |8AC1          MOV AL,CL                     ;将CL寄存器的值移入AL
00403ED3   . |3ACA          CMP CL,DL                     ;DL和CL中的值进行比较
00403ED5   . |75 0E         JNZ SHORT superdic.00403EE5   ;若不等,则跳出循环
00403ED7   . |83C6 02       ADD ESI,2                     ;ESI指向假码的第3个字符
00403EDA   . |83C7 02       ADD EDI,2                     ;EDI指向其所存字符串的第3个字符
00403EDD   . |84C0          TEST AL,AL
00403EDF   .^\75 DC         JNZ SHORT superdic.00403EBD   ;(2)若AL不为零则跳回循环开始处

通过对代码的简析,可以知道这段代码将ESI中所存的假码和EDI中所存的字符串逐个比较,若不同则跳出,若到达字符串末尾也跳出。那么这个字符串应该就是我们要找的注册密码了。将它输入到注册密码框中并重启软件,切换到注册标签,发现注册按钮已不可用,完成注册,破解成功。