MZHeader/obfuscation_detection_ida
GitHub: MZHeader/obfuscation_detection_ida
IDA Pro 混淆检测插件,通过多种启发式算法自动标记二进制中被混淆或值得关注的函数代码。
Stars: 3 | Forks: 0
# IDA Pro 的混淆检测
与原版的想法相同,但适用于 IDA Pro。该插件会标记那些
结构表明可能存在有趣情况的函数:混淆的
控制流、状态机与协议分发器、C2 通信、
字符串或代码解密 stub,以及手工编写的密码学实现。每种
启发式算法针对不同的信号进行评分;结果表会根据
有多少个独立的启发式算法命中同一函数来进行排名,因此真正的混淆
会浮现在一次性匹配之上。结果也会写入函数注释中,
并记录到 Output 窗口。
## 它寻找什么
启发式算法:
* 状态机 / 控制流平坦化
* 高圈复杂度
* 异常大的基本块
* 重叠指令(字节被解码为多条指令)
* 罕见的 3-gram opcode 序列(根据每个架构的参考表进行评分)
* 常用 helper(从许多地方调用的函数,通常是字符串解密器或 API-hash 解析器)
* 包含许多自然循环的函数
* 不可归约循环
* 循环内 XOR 常量
* 混合布尔算术
* 重复的 CFG 子图(克隆的混淆 stub、展开的循环)
* 基本块拆分(高的分支块比)
实用工具:
* Entry / leaf / 递归函数
* 节区熵
* RC4 KSA 和 PRGA 候选
## 安装
将 `obfuscation_detection.py` 和 `obfuscation_detection_ida/` 放入您的 IDA 插件目录。
### Linux / macOS
```
~/.idapro/plugins/obfuscation_detection.py
~/.idapro/plugins/obfuscation_detection_ida/
```
### Windows
```
%APPDATA%\Hex-Rays\IDA Pro\plugins\obfuscation_detection.py
%APPDATA%\Hex-Rays\IDA Pro\plugins\obfuscation_detection_ida\
```
重启 IDA。您应该会在 Output 窗口中看到
`[obfdet] Obfuscation Detection 1.0 loaded.`。
## 用法
该插件在 **Edit > Plugins > Obfuscation Detection** 下添加了一个条目。
启动它会打开可停靠的
结果表,并弹出一个列出所有启发式算法的菜单。选择一个运行,
其结果将填充到同一个表中。

结果表每个函数占一行,按触发的启发式算法数量进行排序。
双击某一行将跳转到该函数。选择器中的
**Configure: Findings Cap** 可以调整每个启发式算法的结果上限
(默认为 30)。

结果会作为注释添加:`[obfdet] Heuristic: State Machine: ...`。
可以通过选择 `Clear all [obfdet] comments` 选项来批量删除注释。
## 关于移植的说明
### 1. 调整后的默认值
评分公式与上游一致,但每个启发式算法都有一个最小
阈值,因此边缘命中不会显示在结果表中。上游
无条件报告每个启发式算法前约 10% 的结果;在这里您将获得
同时也超过底限的前 30 个结果。
* 圈复杂度:`>= 50` 且 `>= 20` 个块
* 每个块的平均指令数:`>= 40`
* 重复子图:`>= 4` 个副本
* 不常见的 3-gram 得分:在 `>= 30` 个序列上 `>= 0.85`
* 循环计数:`>= 5`
* MBA:`>= 5` 条混合指令,函数在 3-200 个块的范围内,
通过名称跳过会导致 `gen_microcode` 崩溃的 Go/Rust 运行时 shim
* 状态机:循环内 `>= 3` 路分发器,并为二进制比较平坦化级联
设置了单独的路径
* XOR-in-loop:跳过平凡常量(0, +/-1, 全 F,符号位
掩码,常量时间比较中使用的 25-31 位大数 limb 掩码);
在二进制文件中出现在 `>= 3` 个函数中的常量将被丢弃,
因为它们被视为编译期魔法值而不是解密密钥
* 常用 helper 只有在同时包含 XOR 解密
循环时才会出现,这针对的是字符串解密器和 API-hash 解析器,而不是
`printf` 形态的热调用
* 库和 thunk 函数在评分前被跳过
* RC4 KSA/PRGA 候选对象需要同时具有 `0x100` 初始化和
自然循环内的 S-box 字节查找,这可以消除大多数 AES、
HMAC 和 `memcmp` 的误报
### 2. SDK 差异
IDA 的 SDK 没有提供与 Binary Ninja 相同的基础组件,因此
有些事情的处理方式有所不同:
* IDA 没有一等标签类型。结果会写入函数和
指令注释中,带有 `[obfdet]` 前缀。
* Dominators、dominance frontiers 和后向边检测在
插件内部计算(Cooper-Harvey-Kennedy)。IDA 的 `FlowChart`
不提供这些功能。
* XOR-in-loop 和 RC4 PRGA 检测遍历的是汇编助记符,而不是
提升的 IL。IDA 没有在没有反编译器的情况下工作的
LLIL 等价物,因此可以捕获普通的 `xor` / `eor` 模式,但
隐藏在提升的算术恒等式中的任何内容都无法捕获。
* 混合布尔算术检测在 `MMAT_LVARS` 级别使用 Hex-Rays microcode。
如果没有 Hex-Rays,它会打印警告并跳过该
启发式算法。在测试期间,`gen_microcode` 在某些 Go 二进制文件上导致了 IDA 崩溃,
因此 MBA 被排除在 `run_all` 之外;当您需要时,请从
选择器中单独运行它。
* 不常见的指令序列仅在 x86、x86_64、ARM 和
AArch64 上运行。其他架构会收到“no n-gram table”消息,并且被
跳过,而不是落入毫无意义的结果中。
* 结果停靠窗口会依次尝试 PySide6、PySide2,然后是 PyQt5。如果它们都
无法导入,插件仍然会标记函数并记录到 Output
窗口;只是停靠窗口不可用。
标签:DAST, DNS 反向解析, IDA插件, 云资产清单, 安全, 恶意软件分析, 混淆检测, 超时处理, 逆向工具, 逆向工程