-
-
我的第一次追码
-
发表于:
2009-9-24 21:45
5812
-
【破解工具】PEID,Ollydbg
【破解平台】WinXP SP2
【软件名称】易优超级字典生成器 V3.35
【软件大小】348KB
【作者声明】很早以前破的,最近闲下来了,就发上来,只为研究,没有其他目的。失误之处敬请诸位大侠赐教!
【保护方式】注册码,重启验证
【软件简介】
一款字典制作工具,功能十分强大。
主要特征:
程序采用高度优化算法,制作字典速度极快
精确选择所需要的字符,针对性更强
自定义字符串采用了绝对长度匹配算法,使生成密码长度与你所选择的长度严格吻合
特殊位字符定义,可以满足用户的特殊要求,从而使字典长度更小
修改字典功能可将一本现成的字典按需求进行字符串的前插和后插
生日字典制作包含了十几种典型的生日模式,符合人们的一般习惯
利用特殊位设置(如:把前几位设置成6234)可实现电话密码的制作
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------
用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中所存的字符串逐个比较,若不同则跳出,若到达字符串末尾也跳出。那么这个字符串应该就是我们要找的注册密码了。将它输入到注册密码框中并重启软件,切换到注册标签,发现注册按钮已不可用,完成注册,破解成功。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)