selph
selph
发布于 2023-03-08 / 192 阅读
0
0

DLL Care v1.0 破解分析

DLL Care v1.0 破解分析

软件基本信息

软件名称软件版本编程语言加壳情况难度难度说明练习日期
DLL Care1.0Delphi无壳简单注册函数定位稍微麻烦了点2023.02.13

功能:查找并修复丢失的系统DLL文件以提高速度和性能,软件已无网络支持,已无法使用,可用于练习软件验证的逆向

image

验证方式

重启验证:无,暗桩保护:无

启动时会进行一次校验

注册信息:界面有“激活(Activate)”按钮

破解过程

暂停窗口定位关键函数

在激活界面,随便输入激活码,然后点击激活,当出现提示框之后,在调试器里点击暂停,运行到用户代码,开始向上层调用追溯

image

这一层是处理窗口消息的,和验证无关,继续向上

image

这一层是下面就结束了,上面也没啥内容,感觉不像是验证部分,先继续向上看看

image​​

接下来是个(下下下上)循环,循环之外有消息函数,说明这里还是在处理窗口相关的内容,继续向上

发现程序跑飞了,会程序点掉提示框之后,在这个函数的ret处断了下来,没毛病,应该就是这条追溯路线了

image

再往上一层发现了注册相关信息,来自ebp+18,是参数,也就是说,这个函数就是弹窗显示内容的,再往上就是验证逻辑了

image

可以看到一堆判断跳转,这里每个里头都压入了错误许可证的字符串参数,应该就是这里了,这个函数就是弹窗函数

向上走,找寻能跳过该函数调用的跳转

image

上面有个jmp,也有个弹窗函数,这应该就是if-else的验证成功失败判断结构了

关键在于这个if的判断条件,也就是上面的这个关键跳转

image

可以看到,上面的三个分支,会执行一个,每个分支都压入了相同的参数调用了相同的函数,将返回结果保存到al里,然后进行验证成功与否的判断

修改验证函数返回值破解

既然是根据这个函数的返回值判断注册情况,那就修改这个函数的返回值即可完成破解(不修改关键跳转是因为不知道其他哪些地方还调用了验证函数,其他地方的验证函数绕不过去了就)

验证函数:

image

返回前的那个点,运行到那里的时候,ebx是0,所以把8bd8修改成4390即可(为了尽可能少的修改程序本身)

image

程序跑起来之后,注册成功:

image

再次打开:

image

API断点定位关键函数

给显示窗口相关的函数下断点(包括但不限于这些):

image

因为是在Windows上运行,最终的窗口显示还会基于Windows API去系统调用显示,所以一定有一个函数被这里用于显示窗口

这里根据不断点点点,发现显示窗口使用的函数是ShowWindow

不断往上追溯,就可以追到上面从暂停窗口追过的位置

Windows上,窗口都有自己的窗口循环,直到关闭窗口才会跳出循环拿到返回值,所以对于窗口的追溯过程中,一定有一层需要关闭窗口才能走到返回的地方,再往上就离目标不远了~


评论