| English | 中文 |
控制流平坦化还原
D810G 通过检测并逆转 OLLVM 和 Tigress 所施加的状态机变换,还原被混淆函数的原始控制流。
支持的模式
OLLVM Switch-Dispatch
OLLVM 将函数的基本块转化为一个巨大的 switch(state) 语句的各个分支。每个原始基本块会更新状态变量,然后跳回分发器。
原始代码: 经过 OLLVM CFF 后:
┌───────┐ ┌──────────────┐
│ entry │ │ dispatcher │◄────┐
└───┬───┘ │ switch(state) │ │
│ └┬──┬──┬──┬────┘ │
┌───▼───┐ ┌──▼┐┌▼─┐┌─▼┐┌──▼──┐ │
│ if() │ │0xA││0xB││0xC││ ret │ │
└─┬───┬─┘ │s= ││s= ││s= │└─────┘ │
│ │ │0xB││0xC││0xD│ │
▼ ▼ └─┬─┘└─┬─┘└─┬─┘ │
return └────┴────┴──────────────┘
D810G 的处理方式:
- 检测分发器块(高入度 + 高出度)
- 使用 Unicorn 模拟执行每个 case 块,追踪状态变量的写入
- 构建状态转移映射:state_value → next_block
- 使用 Keystone 汇编直接跳转指令
jmp,替换原来的状态更新 + 分发器跳转 - 用 NOP 填充死代码
Tigress 间接跳转表
Tigress 使用 jmp [table + state * 8] 代替 switch 语句。D810G 检测 .rodata 段中的跳转表并解析每个条目。
Tigress If-Chain
Tigress 也可能使用顺序的 if/else 比较来代替 switch。D810G 可以检测 3 个及以上比较块组成的链。
架构支持
| 架构 | 模拟执行 | 补丁修复 |
|---|---|---|
| x86_64 | Unicorn UC_ARCH_X86 | jmp rel32 |
| ARM64 | Unicorn UC_ARCH_ARM64 | b offset |
| ARM32 | Unicorn UC_ARCH_ARM | b offset |
API
# JSON-RPC
{"method": "deflat.run", "params": {"blocks": [...], "binary_hex": "...", "arch": "x86_64"}}
{"method": "deflat.tigress", "params": {"blocks": [...], "binary_hex": "..."}}