2022-06-29极速赛车平台app下载应用程序中有许多不同的方法来防止反向

.NET Reactor 保护器破解

在 .极速赛车平台app下载应用程序中有许多不同的方法来防止反向。其中包括压缩、加密和保护程序,如 Agile.极速赛车平台app下载和 Enigma。我们已经讨论过破解 Enigma 保护器今天我们将讨论 .极速赛车平台app下载Reactor 保护器黑客攻击。

有关此主题的更多信息:黑曜石保护器旁路

.极速赛车平台app下载反应堆保护器

假设我们有一个在启动时进行在线许可证检查的程序。使用DIE对应用程序的分析谈到了 .极速赛车平台app下载平台。将应用程序加载到 dnSpy 调试器后,我们会看到两件事:好的和坏的。

这篇文章是为了教育目的而写的。我们不呼吁对程序进行黑客攻击,但我们试图向开发人员展示并引起开发人员的注意,用于保护应用程序的流行工具是多么容易受到攻击。

坏消息是应用程序被可靠地混淆了,大多数方法已被重命名为无意义符号的组合,最重要的是,到处都是空存根,而不是它们的代码。

在 dnSpy 调试器中运行程序
在 dnSpy 调试器中运行程序

破解受 .极速赛车平台app下载Reactor 保护的应用程序

愚蠢的想法,但让我们尝试转储应用程序 - 这通常允许我们恢复隐藏的方法代码。不幸的是,在我们的例子中,这不起作用:模块转储是功能性的,但与原始转储没有太大区别。混淆仍然存在,方法体仍然是空的。

让我们回到 dnSpy 调试器并尝试跟踪正在运行的应用程序。现在好消息是:该程序没有反调试器,它可以完美地运行和跟踪,当在“调用堆栈”选项卡中跟踪“空”方法时,我们看到程序计数器在不可见的代码中移动并落入调用中。

盲目的在代码中徘徊,我们看到了另外一件好事:并不是所有的方法都被重命名了,有些名字很有意义,我们甚至可以感受到验证的过程(在上面的截图中——isValid)。该方法的主体是隐藏的,但名称和索引是已知的,这很好。

现在让我们尝试按照标准方案进行反混淆:开始时,我们将一个句子滑入 de4dot。唉,在我们的示例中,此方法不起作用,并且 de4dot 不会去混淆。早期版本立即出现错误:

较新的版本更简洁地表述了错误:

好吧,现在我们至少了解了我们正在处理的保护器 - 这是 .极速赛车平台app下载Reactor,大概是 4.8 版。这是一个旧版本,但即使是专门为 .极速赛车平台app下载Reactor 锐化的 de4dot 也无法处理它。同样的错误,我们再次被要求寻找更新的版本。

我们在 x32dbg 调试器中打开我们命运多舛的应用程序。加载cljit.dll库,为其调试符号,并在 CILJit :: compileMethod JIT编译器的输入处设置断点。

指定的方法有效,也就是说,每次调用 CORINFO_METHOD_INFO结构 的 ILCode 字段中的编译器我们都会看到每个方法的解码后的 IL 代码。原则上,可以分析代码,甚至可以在运行中进行补丁,但这是漫长而乏味的,此外,还有一个美中不足的地方在等待着我们。

让我提醒您,在上一篇文章中,我描述了一种略带欺诈性的方法来确定编译过程的索引。其本质是 ftn 句柄 (CORINFO_METHOD_INFO 结构中的第一个双字 如果用作指针,则指向单个字——EXE 模块的.极速赛车平台app下载元数据中的方法索引。

因此,这种 hacky 方法并不总是有效,我们对此感到失望。知道方法的索引是 Valid 25250 ( 0x62A2  ),我们在 CILJit : compileMethod 断点表达式 word : [ [ [ esp + 0xc ] ] ] == 0x62A2,但是断点不起作用,虽然在其他方法上以这种方式定义的索引看起来是正确的。出了点问题,我们需要寻找更正确的方法来识别方法。

换句话说,沿着这条路走下去,当然是充满希望的,但也充满荆棘,而这条路本身也在为我们准备很多类似的惊喜。幸运的是,对于我们来说,有更简单的方法可以解决问题,因为聪明的人像往常一样为我们想出了一切。

他们提出了一个名为NetReactorSlayer的项目。就像上面提到的 de4dot mod,它是为 .极速赛车平台app下载Reactor 的解码和反混淆而设计的,但与前一个不同的是,它不会因错误而崩溃,而是非常成功地创建了一个反混淆模块,其中方法不再隐藏在反汇编中在 dnSpy 中。

NetReactorSlayer 之后的模块
NetReactorSlayer 之后的模块

此外,可以控制反混淆:程序具有命令行开关。例如,当使用 --no - deob (Don't deobfuscate methods) 键时,我们得到原始的混淆方法字节码,因为它存储在文件中。

在没有此键的情况下,默认情况下,NetReactorSlayer 会尝试将代码从寄生指令过滤为混淆前的原始形式。例如,所需 isValid方法的混淆代码如下所示:

在去混淆之后,它折叠成一个简短的单行表达式:

也就是说,我们实际上实现了我们的目标——我们打开了代码,甚至对其进行了去混淆处理,但不幸的是,如此近距离的幸福再次让我们望而却步。反混淆模块完全不起作用:当程序启动时,错误出现在最意想不到的地方,没有任何 NetReactorSlayer 键的组合可以解决这个问题。

经过仔细研究,我们明白了它的本质:尽管它很有用,但 NetReactorSlayer 并不是一个神奇的按钮,而是一个正在开发的项目,不幸的是远非完美。在某些方法中,名称会丢失,代码永远不会打开,并且去混淆还有很多不足之处。

如果你有足够的时间和耐心,你可以深思熟虑地修复每一个有问题的方法,但我们会像往常一样尝试找到更短的方法。好在我们有 NetReactorSlayer 源码,我们试着分析一下。再次我不再赘述,有需要的可以打开项目详细了解。相反,我将专注于某些方面。

项目中的代码解密由 NecroBit模块处理cs,特别是 Execute方法。该方法从混淆模块中读取一个加密数据块,并分两步对其进行解密。行后:

methodsData 数组包含混淆模块的方法的解码代码。接下来让我们看看 NetReactorSlayer 对这个数组做了什么,并找出在其中存储数据的大致格式。读取和解析所有解码方法的循环如下所示:

在这个地方之后,我们已经知道我们需要的索引方法的解密 IL 代码的偏移量和解密代码本身。在我们的例子中, isValid方法的 IL 代码 如下所示:

要使任何许可证生效,我们只需将此代码中的前两个字节更改为以下内容:

在这个 RVA 的原始(未解码)模块中,两个字节的值分别等于 9E F4。幸运的是,数据加密方法是通常的密钥异或。

我们读取这两个字节的新值:

我们将这两个字节更改为新值,以防万一,我们通过再次激发已纠正的 NetReactorSlayer 模块来检查替换的正确性。

现在,确实,解码的方法体只包含 return true ,这确认了程序的启动 - 许可证是合适的!因此,我们不仅获得了一个有用的可扩展和改进的工具,用于逆向受 .极速赛车平台app下载Reactor 保护的应用程序(包括非标准应用程序),而且还获得了一种无需完全逆向和重建程序即可修补此类应用程序的快速方法。