作者:Tim Blazytko & Nicolò Altamura
分析和简化混淆代码
混淆分析 是一个 Binary Ninja 插件,可让您轻松应对高度保护的二进制文件。 它捆绑了一些专注的辅助工具,让您可以
一些示例用例可以在 examples 中找到。此外,REcon 演讲“Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications”展示了一些用例。幻灯片可以在这里找到。该插件补充了 Obfuscation Detection:一旦可疑函数被标记,混淆分析 可帮助您清理和理解它们。更多辅助工具将陆续添加。
该工具可以通过 Binary Ninja 的插件管理器安装。
如需手动安装,请在 Binary Ninja 的插件文件夹中执行以下步骤:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
如果您使用虚拟环境,则需要在 Binary Ninja 设置中手动设置 site-packages 路径。
该插件可从 Binary Ninja 的顶部菜单栏 Plugins -> Obfuscation Analysis 下访问。
要简化算术混淆,首先在反编译视图中高亮您想要简化的 HLIL 表达式。接下来,选择 Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify。插件会解析完整的计算过程,通过 msynth 运行,并将简化结果作为注释插入到同一行。下面的简短动画展示了整个工作流程:
MBA 简化依赖于 msynth。默认情况下,插件使用 msynth 的默认简化预言机,该预言机随插件一起提供并已预配置。如果您想使用更大或自定义的预言机,请手动设置 obfuscation_analysis.mba_oracle_path,或在 Binary Ninja 的设置窗口中浏览到该文件。
如果出现问题,插件会向日志窗格写入简洁的用户级消息;将日志视图切换为 Debug 以查看完整的回溯信息。
该插件提供专注的辅助工具,针对您在逆向受保护二进制文件时遇到的常见障碍,每个工具都可以从 UI 或无头脚本作为后台任务运行。以下是当前可用的功能。
损坏的函数是指反汇编显示未定义产物的函数——空的基本块、无效或重叠的指令等。此辅助工具遍历整个 BinaryView,标记具有这些症状的函数,并列出它们,以便分析师可以快速检查被错误解析或故意混淆的代码。可选的移除操作会擦除所有被标记的函数并强制重新分析,从而清理函数列表。它特别适用于定位
混合布尔算术 (MBA) 是一种混淆技术,将简单的计算埋藏在冗长的算术和布尔运算链中。此功能在反编译器中简化此类表达式。当您选择一条 HLIL 指令时,插件会收集其完整的计算链,使用限制在当前基本块内的 SSA 后向切片,将该切片转换为 Miasm IR,将其输入 msynth,最后将简化结果作为注释添加到反编译视图中。此功能允许您
对于当前选中的函数,此辅助工具在反编译视图中递归内联每个被调用者,为 Binary Ninja 提供单个自包含的 IL。所有边界消失后,反编译器可以跨函数传播数据,从而实现更深入的常量折叠、死代码消除以及更清晰的逻辑。使用它来
请注意,在非常大的函数或深层调用树上,HLIL 可能会变得非常庞大且渲染缓慢。此外,一旦所有内容合并为单个单元,某些反编译器优化可能会变得不那么有效。要控制这一点,您可以限制内联深度:将 Settings -> Obfuscation Analysis -> Max Function Inlining Depth 设置为上限 N(默认设置为 1)。设置深度限制后,仅内联前 N 个调用层级;更深的调用不会被内联。
该插件有一些您应该注意的注意事项,其中大部分与 MBA 简化流程相关:
Binary Ninja 缺陷:在 BN 5.0 稳定版上,后向切片步骤可能因缺少 HLIL 类型转换而失败:https://github.com/Vector35/binaryninja-api/issues/6371;该问题已在 5.1.7477-de 及更新版本中修复
切片限制在一个基本块内:位于前驱块中的变量定义被忽略(通常依赖于控制流),因此某些 MBA 项可能保持部分解析状态
HLIL 到 Miasm IR 的转换缺口:并非每个 HLIL 构造都有可靠的 Miasm 等价物;当转换失败时,表达式被跳过并记录错误
IL 覆盖范围:控制流节点和浮点运算目前尚未转换
继承的 msynth 约束:MBA 简化继承了所有 msynth 限制
如需更多信息,请联系 Tim Blazytko (@mr_phrazer) 或 Nicolò Altamura (@nicolodev)。