步入call内寻找注册码

今天所用到的示例程序仍然是《Shark恒零基础百集VIP破解教程》中的示例程序:

打开软件,发现需要注册,输入假码后,弹出提示信息框:

先查壳:

无壳,Delphi的程序,直接载入OD,寻找关键call:

方法一:直接搜索字符串“注册失败”

找到MessageBoxA函数,发现有跳转跳过这一函数,向上溯源:

来源于两个跳转,发现第二个跳转后又有一个跳转来源,继续向上溯源:

发现该跳转前有比test较语句,找到关键Call位置。

方法二:利用API断点(MessageBoxA断点)

下断后F9运行程序,弹出软件界面,点击注册,输入假码:

发现程序在系统领空断下:

alt+F9,运行到程序领空。关闭软件弹出注册失败的提示框,来到MessageBoxA的地方:

接着向上溯源,步骤同方法一,找到关键call。

方法三:调用堆栈窗口中找到messageBoxA函数

F9运行程序,注册,输入假码,确定,但不要关闭提示框,F12暂停程序:

暂停程序后,来到调用堆栈窗口:

选中MessageBoxA右键-显示调用:

接着向上溯源,找到关键call,同方法一。

方法三:F12暂停法寻找关键call

OD载入程序后,F9运行程序,注册输入假码,确定,但不要关闭消息提示框:

程序暂停后,Alt+F9执行到用户代码,关闭消息提示框:

找到MessageBoxA函数,接着向上溯源,寻找关键call,同方法一。

在关键跳处下断,重新载入程序,尝试修改关键跳,达到破解目的:

打开修改后的文件:

发现提示注册成功,但重新打开软件还是提示未注册,说明虽然修改了关键跳使程序弹出注册成功的提示框,但程序启动前还是会判断输入的注册码是否真正确,进而判断是否注册,所以需要单步调试查找注册码,通过观察:

发现,call执行后,通过test比对EAX寄存器的al的值来决定je跳转是否实现,所以真正的注册码应该在关键call调用的函数里面,所以在call处下断,重新载入程序,F7步入call,单步调试寻找注册码:

进入call后单步调试,注意观察寄存器窗口、堆栈窗口和信息窗口:

信息窗口第一次出现假码。

寄存器窗口第一次出现假码。

堆栈窗口第一次出现假码。

堆栈窗口和寄存器窗口均出现机器码。

信息窗口出现可疑字符串。

寄存器窗口和堆栈窗口均出现相同的字符串,在堆栈窗口将该字符串复制下来,测试:

发现所找就是注册码,破解目的达到。


 
 
 

猜你喜欢

转载自blog.csdn.net/song_10/article/details/84593475