声明:
本文仅用于研究探索软件的漏洞和防御方法,从而开发出更安全可靠的正版软件,嘿嘿
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
废话不多说,开始吧,本次开刀的是Access数据库密码破解软件Access Password Unlocker.exe,可以从
这里下载,这款软件价值$19.95,看看它的介绍吧:
Access Password Unlocker is a powerful
Access password recovery which can
recover Access passwords for Microsoft Access 95/97/2000/2003 database (*.mdb). It allows you to recover password of protected MDB files in a minute even if the Access password is long and complicated.
开刀工具:
PEiD.exe 用于检查软件是否加壳
Ollydbg.exe 用于调试运行程序
IDA Pro.exe 用于反汇编静态分析
第1步:安装运行软件
下载安装后运行APU, 打开加密过的data.mdb,让其破解,弹出需要注册的提示,软件界面如下:
![](http://www.cnitblog.com/images/cnitblog_com/houcy/pojie.JPG)
第2步:获取注册信息
点击“Enter Registeration Code”,随便输入123,点确定,提示密码无效。
![](http://www.cnitblog.com/images/cnitblog_com/houcy/1.JPG)
有了注册提示信息就好办了。
第3步:检查软件是否加壳
软件没有加壳,正合我意,否则还要脱壳,说不定还要手动脱壳就麻烦了。
![](http://www.cnitblog.com/images/cnitblog_com/houcy/peid.JPG)
第4步:用Ollydbg调试运行APU.exe
运行Ollydbg,打开Access Password Unlocker.exe,按F9运行,弹出APU界面:
![](http://www.cnitblog.com/images/cnitblog_com/houcy/2.JPG)
在APU中打开加密过的数据库文件data.mdb,随便输入注册码123,点Ok,弹出密码无效框,此时先别点确定!
![](http://www.cnitblog.com/images/cnitblog_com/houcy/3.JPG)
第5步:在Ollydbg中查找注册提示信息
在汇编代码区点鼠标右键,点“搜索”--“所有参考的文本字符串”
![](http://www.cnitblog.com/images/cnitblog_com/houcy/4.JPG)
点击后弹出下面的窗口,再点击右键“搜索文本”,并输入注册提示信息“The code you've entered invalid”,定位到该字符串处,
![](http://www.cnitblog.com/images/cnitblog_com/houcy/5.JPG)
双击该字符串,则回到Olleydbg的主界面,在机器码处双击鼠标左键下断点:
![](http://www.cnitblog.com/images/cnitblog_com/houcy/6.JPG)
第6步:调试运行、分析程序
在地址0041002D处下断点,并进入函数调用,
0040D680函数是比较输入字符串和密码是否一致,比较的结果存在EAX中。
00410026 |> 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
0041002A |. 52 PUSH EDX
0041002B |. 6A 00 PUSH 0
0041002D |. E8 4ED6FFFF CALL Access_P.0040D680 ; function call to compare input and password
00410032 |. 83C4 08 ADD ESP,8
00410035 |. 85C0 TEST EAX,EAX ; test the comparison result
00410037 |. 75 0E JNZ SHORT Access_P.00410047
00410039 |. 6A 30 PUSH 30
0041003B |. 68 F0574500 PUSH Access_P.004557F0 ; UNICODE "Registration"
00410040 |. 68 48584500 PUSH Access_P.00455848 ; UNICODE "The code you've entered invalid!"
00410045 |.^EB B0 JMP SHORT Access_P.0040FFF7
00410047 |> 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10]
0041004B |. E8 90D7FFFF CALL Access_P.0040D7E0
00410050 |. 83F8 01 CMP EAX,1
00410053 |. 75 0E JNZ SHORT Access_P.00410063
00410055 |. 6A 40 PUSH 40
00410057 |. 68 F0574500 PUSH Access_P.004557F0 ; UNICODE "Registration"
0041005C |. 68 8C584500 PUSH Access_P.0045588C ; UNICODE "Register fail!"
00410061 |.^EB 94 JMP SHORT Access_P.0040FFF7
00410063 |> 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10]
00410067 |. E8 74D7FFFF CALL Access_P.0040D7E0
0040D680函数的汇编代码块结构如下所示(用IDA查看):
![](http://www.cnitblog.com/images/cnitblog_com/houcy/block.jpg)
该函数具体使用什么算法进行检查不是很容易反编译出来,但是我们可以绕过检查的结果。具体做法是把jnz指令替换成jz指令,嘿嘿,偷梁换柱。
下图是根据输入的注册信息进行的各种处理,汇编程序流程如下:
![](http://www.cnitblog.com/images/cnitblog_com/houcy/change.JPG)
修改完指令后重新在Olleydbg运行APU,随便输入注册码123,点Ok,此时提示注册成功!
![](http://www.cnitblog.com/images/cnitblog_com/houcy/success.JPG)
此种瞒天过海的手法几乎可以对付所有的注册软件,缺点是最终还是不知道注册码是多少,似乎有些遗憾,不过本人已经调试跟踪出注册码为dcae9fbfb63fdeecc8c25f56cae87411 ,这款价值近20刀的软件就这样被蹂躏了,而出于职业道德考虑,我等软件开发人员应该抵制软件破解,维护正版软件,不过知道了如何破解软件才能写出更好的反破解软件,比如加壳,使用花指令,二进制加密等等手法。