作者:Tim Blazytko
自动检测混淆代码及其他有趣的代码结构
Obfuscation Detection 是一个 Binary Ninja 插件,用于检测二进制文件中的混淆代码和有趣的代码结构(例如状态机)。给定一个二进制文件,该插件通过识别在逆向工程中可能值得仔细查看的代码位置来简化分析。
基于各种启发式规则,该插件定位包含复杂或罕见代码结构的函数。此类代码结构可能实现:
以下博客文章提供了有关底层启发式规则的更多信息并展示了它们的用例:
一些用例示例可以在 examples 中找到。此外,REcon 讲座 "Unveiling Secrets in Binaries using Code Detection Strategies" 演示了一些用例。幻灯片可以在 这里 找到;录制视频可以在 这里 找到。
工具可通过 Binary Ninja 的插件管理器安装。
对于无头版本,请遵循以下步骤:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# 安装 obfuscation_detection
pip install .
插件可在用户界面和无头模式下使用。
选择 Plugins -> Obfuscation Detection 运行单个启发式规则,或选择 Plugins -> Obfuscation Detection -> Utils 运行单个工具检测。Plugins -> Obfuscation Detection -> All 命令同时运行所有启发式规则和所有工具。
结果会显示在日志窗口中:
通过点击已识别的函数地址,Binary Ninja 会导航到所选函数。
要在无头模式下使用插件,运行 scripts/detect_obfuscation.py:
$ python3 scripts/detect_obfuscation.py <binary>
这会运行所有启发式规则和所有工具。要获得机器可读的输出,请使用 --json:
$ python3 scripts/detect_obfuscation.py --json <binary>
JSON 负载包含 detections 键下的所有结果。每个检测都有一个稳定的 id 用于自动化,以及一个人类可读的 name。每个标记的函数发现包括 Binary Ninja 插件使用的标签类型和描述。
要仅运行无头模式下的状态机启发式规则,请使用 scripts/detect_state_machine.py:
$ python3 scripts/detect_state_machine.py [--json] <binary>
插件实现了多种检测启发式规则来检测不同的代码结构。下面,我们简要描述各个启发式规则并说明其用法。
大型基本块启发式规则识别每个基本块平均指令数最大的前 10% 函数。它可以检测:
复杂函数启发式规则识别控制流图最复杂的前 10% 函数(基于圈复杂度)。它可以识别:
状态机启发式规则使用图论属性来识别实现状态机的函数。通常,此类状态机可以表示为在循环中调度的 switch 语句。该启发式规则可以识别:
不常见指令序列启发式规则执行统计分析,以识别其代码模式与预计算基准偏离最大的前 10% 函数。这样,该启发式规则可以识别:
重叠指令启发式规则识别包含未对齐指令的函数(指令字节被两条不同的指令共享)。该启发式规则识别:
如果在 Binary Ninja 的用户界面中使用该启发式规则,重叠指令也会在图视图中高亮显示。
最常调用函数启发式规则识别被不同函数调用次数最多的前 10% 函数。这样,该启发式规则可以识别:
该启发式规则识别具有大量循环的函数。这类函数可能实现:
该启发式规则还有助于定位潜在的性能瓶颈。
该启发式规则识别具有罕见且复杂循环结构的函数,通常表明:
该启发式规则识别在循环内使用常量执行 XOR 操作的函数。这样,该启发式规则可以识别:
该启发式规则识别表达式中同时包含多个算术运算和布尔运算的函数。这样,该启发式规则可以识别:
该启发式规则使用迭代上下文哈希方法来检测每个函数控制流图内重复的多块结构。通过比较每个块的操作码签名及其后继签名,该启发式规则识别单个函数中重复或近似重复的子图。这有助于定位:
插件还包含针对有趣函数和代码区域的更窄用途的工具。它们仍然在 Utils 子菜单下可用;All 命令将它们与更广泛的启发式规则一起运行。
该助手识别没有已知调用者的函数。这些函数可能是:
该助手识别不调用其他函数的函数。这类函数可能是:
该助手识别递归函数——直接或间接调用自身的函数。递归函数可能表明:
该助手评估每个节的熵。熵是随机性的统计度量,值介于 0 和 8 之间。接近 8 的节的熵表明高度随机性,可能暗示:
该助手通过使用通常与 RC4 的密钥调度算法 (KSA) 和伪随机生成算法 (PRGA) 相关的启发式标记来检测潜在的 RC4 算法实现。RC4 在恶意软件中广泛用于以下目的:
更多信息请联系 @mr_phrazer。