AntoineBlaud/TheCodexRebirth
GitHub: AntoineBlaud/TheCodexRebirth
基于IDA Pro的污点分析与追踪探索插件,通过前向污点传播和后向方程追溯帮助分析人员攻克代码混淆难题。
Stars: 54 | Forks: 3
# CodexRebirth:污点分析 + 逆向工程追踪探索方法
## 简介
CodexRebirth 项目旨在通过引入一种专门设计用于简化**混淆代码**解析的污点分析方法,来革新逆向工程的过程。该方法涉及对所有汇编指令进行全面检查,并在此过程中对每个内存地址和寄存器进行污点标记。随后,当一条指令依赖于被污染的寄存器、内存或源自这些被污染元素的结果时,它将执行操作并更新相关的方程。这种方法使用户能够轻松追踪方程和数值的演变过程,并精确定位导致数值变化的指令。此外,能够根据 'taint_id' 或“块相似性”对指令进行颜色编码,为分析增加了额外的清晰度。
*非常感谢 Markus Gaasedelen (@gaasedelen),因为我使用他的 Tenet IDA 插件作为我项目的基础,我还从 frinet 项目中提取了部分代码。*

该插件还包含额外的功能,其中一些改编自 Tenet 插件和 Frinet 项目,并进行了进一步增强

在步骤追踪期间,库调用也会被转储:

## 污点分析的工作原理
污点分析基于以下原则:
- 每条指令被执行,结果存储在一个变量中。
- 每个变量首先被赋予一个唯一的 id 进行污点标记。
- 当发生操作时,结果 id 是操作数 id 的拼接,并且变量用指令的结果进行更新。
通过遵循这些原则,我们可以轻松追踪污点的前向传播和方程的后向传播。

污点的前向传播由绿色单元格表示,方程的后向传播由粉色单元格表示。**简而言之,绿色单元格是使用当前操作结果的操作,而粉色单元格是被当前操作所使用的操作。**
然后,后向传播可以表示为一棵树。同一行上表示的是将 RealValue 作为操作数(例如:Imm 操作数)的操作。当在两个 SymValue 上发生操作时,结果是两个操作数树的合并。

## 更多功能
- **Step Tracer**:Step tracer 是一个独立的工具,可用于追踪程序的执行。它可用于任何可以用 IDA 调试的程序。Step tracer 能够追踪程序的执行并生成可以导入 CodexRebirth 的 trace 文件。`虽然我们可能认为步骤追踪太慢且效率低下,但它的优势在于能够 !! 退出代码循环 !!,因此即使是非常大的程序也可以被追踪。` 在调查 trace 时,显示循环的所有命中是不必要的,因此 Step tracer 是性能和效率之间的一个良好折衷。

- **Ultimap**:Ultimap 是一个功能强大的工具,旨在帮助用户精确定位程序中的特定动作,例如视频游戏中的跳跃。它通过在用户预定义或导出的函数上设置断点来运行。当程序执行期间触发断点时,Ultimap 会记录相关数据,从而允许对所需动作进行精确分析和跟踪。

## 安装说明
**注意:对于 IDA 插件,你需要至少安装 python 3.8,并且 IDA 必须配置为使用它。**
```
# 要确定 IDA 使用的当前 Python 可执行文件,在 IDA 中运行以下命令:
import sys
print(sys.executable)
```
- 根据上述命令的输出,选择 IDA Python 3 的完整二进制路径。
- 通过运行以下命令安装所需的 python 包:
```
-m pip install -r requirements.txt
```
**然后将 'plugin' 文件夹的内容复制到 IDA 插件文件夹中。(例如:*C:\Program Files\IDA 7.6\plugins*)**
## 程序分析的基本用法
- 打开要分析的程序的 IDA 数据库。
- 使用步骤追踪来记录指令及其结果。
- 在 Tenet trace 文件中调整基址,因为它偶尔会计算错误。
- 将 trace 文件导入 CodexRebirth。
- 如果导入的 trace 文件加载失败,请更新 trace 文件中的基址并重新导入。你必须手动分析 trace 文件以确定要使用的正确基址。
- 通过在悬停时间轴时使用鼠标滚轮,或使用上一个/下一个按钮或快捷键进行探索。
## Shellcode 分析的基本用法
- 打开要分析的程序的 IDA 数据库。
- 使用步骤追踪来记录指令及其结果。
- 将 shellcode 区域导出到文件。
import idc
segm_start = 0xD487000
segm_end = 0xE86E000
size = end - start
filename = "D:\shellcode.bin"
idc.savefile(filename, 0, segm_start, segm_end)
- 启动一个新的 IDA 实例并打开 shellcode 文件。
- 运行此脚本以帮助 IDA 发现代码,你可以在运行脚本后调整结果。
import idautils
shellcode_start = 0x0D759C54
def get_segm(seg_ea):
for seg in idautils.Segments():
seg_start = idc.get_segm_start(seg)
seg_end = idc.get_segm_end(seg)
if seg_start <= seg_ea <= seg_end:
return seg
raise Exception("Segment not found")
def reset_code_segment(seg_ea, hard=True):
seg = get_segm(seg_ea)
seg_start = idc.get_segm_start(seg)
seg_end = idc.get_segm_end(seg)
seg_name = idaapi.get_segm_name(idaapi.getseg(seg))
for addr in range(seg_start, seg_end):
# undefined data DELIT_EXPAND del_items
idc.del_items(addr, idc.DELIT_EXPAND)
#print(f"Reset segment {seg_name} {hex(seg_start)}, {hex(seg_end)}")
# do not convert directly
if not hard:
return
curr_addr = seg_start
while curr_addr < seg_end:
idc.create_insn(curr_addr)
curr_addr += idaapi.get_item_size(curr_addr)
print(reset_code_segment(shellcode_start hard=True))
- 在 tenet trace 文件的开头,将 base=<0x..> 替换为 slide=<0x...>。slide 是 IDA 数据库中 shellcode 的基址与原始程序中 shellcode 的基址之间的差值。
- 最后将 Trace 文件加载到 CodexRebirth 中并开始分析。
## 关键使用注意事项
- 值得注意的是,CodexRebirth 目前仅实现了部分指令集。鼓励您通过创建 issue 或 pull request 来扩展此列表。
- 在调试程序时,您可以执行以下操作来提高性能:
- 在调试器选项中设置优化单步执行。
- 在调试器选项中设置使用硬件断点。
- 在附加调试器时禁用分析。
- 在 ida.cfg 文件中将 'ARM_REGTRACK_MAX_XREFS' 设置为 33072,以避免“too many xrefs”错误。
- 虽然操作分析很稳健,但也可能并非完美无缺。出于调试和验证目的,CodexRebirth 提供了一个有价值的参数:**symbolic_check**。启用时(设置为 True),此功能会交叉检查 Symbolic Engine 生成的结果。
## 性能洞察
Step tracer 的执行速度在本地机器上约为每秒 100 条指令,通过 adb 在远程机器上约为每秒 35 条指令,通过 windbg 在远程机器上约为每秒 25 条指令。然而,step tracer 的特殊性在于退出代码循环,因此每秒指令数并不能代表 tracer 的真实性能。
## 树状视图
**树状表示已从插件中移除,因为生成它的速度太慢。** 以前它是这样工作的:
- RealValue 与任何类型的值(SymValue 或 RealValue)之间的操作被字符串合并到同一个节点中
- SymValues 之间的操作进行树合并。
- 即使限制树副本的数量,性能仍然太慢。
## 未来工作
- 在 Tree view 中显示带有函数调用的 Thread ID
- 扩展 tenet 格式以在导入 trace 文件时包含 syscalls、Api 调用和线程元数据。
- 在 Tree view 中查看函数参数
- 重构文件加载器并为寄存器和内存创建快速缓存
- 从引擎读取子寄存器和父寄存器。例如 W8 -> X8 & 0xFFFFFFFF
- 重构所有内容并改进污点引擎指令覆盖率和实现 + 添加更多寄存器(如 Xmm)
- 切换到更高效的 ast 并重新启用方程
- 在输出窗口中打印当前指令的方程。
标签:CTF工具, Frieren, IDA插件, JARM, Tenet, Trace探索, 二进制分析, 云安全运维, 云资产清单, 代码可视化, 代码混淆, 内存分析, 去混淆, 可配置连接, 寄存器追踪, 恶意代码分析, 汇编指令, 漏洞搜索, 程序分析, 符号执行, 逆向工程, 配置文件