对于 C++ 中的机器代码,是否有这种“混淆”的名称?

逆向工程 艾达 C++ 安卓 混淆
2021-07-05 06:48:01

我试图在静态分析中使用 ida pro 对 android ndk(arm)进行逆向工程。但是,似乎有很多无用的跳转到同一个地方,并且随机值设置为 R1 以进行比较和再次跳转。像下图。几乎每个函数都在做类似的事情——首先初始化(比如推送寄存器之类的东西),然后它跳转到某个地方的代码(比如图片的右上角),将随机值加载到 R1 寄存器并将其与 R0 进行比较并执行跳转,但它总是会再次跳回到上角

代码图

这是另一种情况,似乎 loc_FFBA 和它的后续分支充当了一个大开关,但没有意义的是几乎每个分支最终都会再次跳回 loc_FFBA。可以有一个流程 red->green->blue->red, 但它甚至没有意义...你可以看到蓝色的跳转甚至没有用,因为如果它需要跳转到蓝色 (R0>0x6fe5e521),它肯定会跳到红色(R0>0x661cf941)......

在此处输入图片说明

我的问题是,这是作者故意这样做以防止逆向工程吗?如果是这样,它是如何实现的?对我来说,听起来作者在他的 C++ 代码中需要很多 if-else 和 goto 子句,但这也会减慢开发速度,因为他可能会混淆自己......而且似乎不是 .so ndk已打包,因为通过使用调试器,我发现它实际上所做的通常只是将资源文件解码为 apk 并动态加载它,但所有解密都是通过调用 JNI 函数进行 AES 解密以加载 APK 来完成的,而不是在 C++ 中进行,所以混乱的跳转似乎也与解密无关......

如果这真的是故意混淆,也许有某种编译器会生成垃圾?

2个回答

不幸的是,代码不足以准确说明它是什么,但是,正如@0xec 所说,它看起来非常像控制流扁平化。通常这种代码转换是使用混淆器自动完成的。

有一些混淆编译器,其中之一CFG flattening据我所知,这个编译器不是独一无二的,还有很多其他的。这个特定的混淆编译器基于LLVM 框架,如果您想了解它是如何实现的 - CFG 扁平化的代码在这里此外,您可以在此处找到有关如何对小程序进行反混淆的示例

这是一篇博客文章,更详细地描述了此技术以及有关如何撤消它的一些提示:

https://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html

编辑

2017 年的另一篇文章:

https://blog.rpis.ec/2017/12/dissection-llvm-obfuscator-p1.html