0%

2020-04-11-修改DLL文件不脱壳爆破虚拟机强壳

声明:仅作研究目的,不牵扯相关产品信息。
整理下之前见到过的一些绕过强虚拟机壳破解的知识,最近又见到一个Enigma加壳的64位程序,小伙伴让看看好不好破解,这个程序的注册算法还使用了Enigma的SDK保护,最初简单看了看都打算放弃了,后来意外发现这个程序SDK保护的并不完全,依旧存在被破解的可能,所以在实现软件保护方案时需要注意可能一个很小的疏忽都可能导致产品被攻破的。

常用的方法

首先简单总结下我了解的不脱壳的情况下破解或者修改程序功能的相关技术。

  1. 传统的内存补丁
    常见的工具有Baymax、AT4RE、樱花内存补丁等,前面两个的功能都非常强大,可以看看具体介绍(之前见到这两个介绍还可以支持硬件断点patch等,这次情况因为有些反调试,情况特殊,也没来及尝试),这几个其实一直都没需求使用过,樱花的比较简单,大致原理好像是用DLL注入的形式,在程序运行稳定的状态下注入DLL完成代码的修改过程,樱花内存补丁工具还可以设置定时patch的功能,相对简单。
  2. 硬件断点HOOK法
    这种情况适用于程序的反调试比较弱或没有检查硬件断点的情况,当然如果出现这种情况也可以处理,就是稍微麻烦点,见之前破解某个木马配置端的博文:
    https://huhu0706.github.io/2018/01/10/2018-01-10-%E4%B8%8D%E8%84%B1%E5%A3%B3%E7%88%86%E7%A0%B4%E6%9F%90VMP%E5%8A%A0%E5%A3%B3%E7%A8%8B%E5%BA%8F/
  3. DLL修改或劫持法
    一般情况下程序加载自带的DLL时,壳的代码已经执行完毕,这个时候程序大部分字符串可在内存中搜索看到,可以将补丁代码设置在程序加载的DLL里,或是利用dll劫持新制作一个补丁dll,或是直接在程序dll里添加补丁功能。樱花补丁工具也有配置lpk.dll劫持补丁的选项,但我一直没有需求没使用过。

破解流程

这里只简单说下思路,就不提是什么软件具体怎么破解了。

  1. x64dbg运行程序,在一些关键API处下断,确保程序主功能已经运行完毕之后断下。
  2. 搜索主程序模块中字符串引用,设置硬件断点重新运行,注意如果程序有反硬件断点之类的话,可以找到一个不被检测的API断点(壳代码运行完毕且注册代码未运行的位置),运行中断后再设置硬件断点等,很多地方的引用可能无法追溯到关键跳,需要多尝试定位。
  3. 确定爆破点之后再测试程序所加载的DLL,dll加载时壳代码是否已经运行完毕,且需保证爆破点代码未执行,例如这次破解的QT类程序的QT库,修改其DLL代码加入对主程序爆破点的补丁代码即可。

这个程序虽然使用了SDK保护核心算法,但是对注册完成之后的结果结构体解析时候未进行保护,通过分析对该结构体的多处解析判断操作澄清其成员含义,最终patch该结构体完成破解,虽然看着简单点,其实还是需要大量分析尝试的,有一定的侥幸,要确保该结果结构体是第一次生成还未被其它代码解析,同时存在可能存在结构体格式校验复杂无法伪造等情况。