DLL Care v1.0 破解分析
软件基本信息
软件名称 | 软件版本 | 编程语言 | 加壳情况 | 难度 | 难度说明 | 练习日期 |
---|---|---|---|---|---|---|
DLL Care | 1.0 | Delphi | 无壳 | 简单 | 注册函数定位稍微麻烦了点 | 2023.02.13 |
功能:查找并修复丢失的系统DLL文件以提高速度和性能,软件已无网络支持,已无法使用,可用于练习软件验证的逆向
验证方式
重启验证:无,暗桩保护:无
启动时会进行一次校验
注册信息:界面有“激活(Activate)”按钮
破解过程
暂停窗口定位关键函数
在激活界面,随便输入激活码,然后点击激活,当出现提示框之后,在调试器里点击暂停,运行到用户代码,开始向上层调用追溯
这一层是处理窗口消息的,和验证无关,继续向上
这一层是下面就结束了,上面也没啥内容,感觉不像是验证部分,先继续向上看看
接下来是个(下下下上)循环,循环之外有消息函数,说明这里还是在处理窗口相关的内容,继续向上
发现程序跑飞了,会程序点掉提示框之后,在这个函数的ret处断了下来,没毛病,应该就是这条追溯路线了
再往上一层发现了注册相关信息,来自ebp+18,是参数,也就是说,这个函数就是弹窗显示内容的,再往上就是验证逻辑了
可以看到一堆判断跳转,这里每个里头都压入了错误许可证的字符串参数,应该就是这里了,这个函数就是弹窗函数
向上走,找寻能跳过该函数调用的跳转
上面有个jmp,也有个弹窗函数,这应该就是if-else的验证成功失败判断结构了
关键在于这个if的判断条件,也就是上面的这个关键跳转
可以看到,上面的三个分支,会执行一个,每个分支都压入了相同的参数调用了相同的函数,将返回结果保存到al里,然后进行验证成功与否的判断
修改验证函数返回值破解
既然是根据这个函数的返回值判断注册情况,那就修改这个函数的返回值即可完成破解(不修改关键跳转是因为不知道其他哪些地方还调用了验证函数,其他地方的验证函数绕不过去了就)
验证函数:
返回前的那个点,运行到那里的时候,ebx是0,所以把8bd8修改成4390即可(为了尽可能少的修改程序本身)
程序跑起来之后,注册成功:
再次打开:
API断点定位关键函数
给显示窗口相关的函数下断点(包括但不限于这些):
因为是在Windows上运行,最终的窗口显示还会基于Windows API去系统调用显示,所以一定有一个函数被这里用于显示窗口
这里根据不断点点点,发现显示窗口使用的函数是ShowWindow
不断往上追溯,就可以追到上面从暂停窗口追过的位置
Windows上,窗口都有自己的窗口循环,直到关闭窗口才会跳出循环拿到返回值,所以对于窗口的追溯过程中,一定有一层需要关闭窗口才能走到返回的地方,再往上就离目标不远了~