AntoineBlaud/TheCodexRebirth

GitHub: AntoineBlaud/TheCodexRebirth

基于IDA Pro的污点分析与追踪探索插件,通过前向污点传播和后向方程追溯帮助分析人员攻克代码混淆难题。

Stars: 54 | Forks: 3

# CodexRebirth:污点分析 + 逆向工程追踪探索方法 ## 简介 CodexRebirth 项目旨在通过引入一种专门设计用于简化**混淆代码**解析的污点分析方法,来革新逆向工程的过程。该方法涉及对所有汇编指令进行全面检查,并在此过程中对每个内存地址和寄存器进行污点标记。随后,当一条指令依赖于被污染的寄存器、内存或源自这些被污染元素的结果时,它将执行操作并更新相关的方程。这种方法使用户能够轻松追踪方程和数值的演变过程,并精确定位导致数值变化的指令。此外,能够根据 'taint_id' 或“块相似性”对指令进行颜色编码,为分析增加了额外的清晰度。 *非常感谢 Markus Gaasedelen (@gaasedelen),因为我使用他的 Tenet IDA 插件作为我项目的基础,我还从 frinet 项目中提取了部分代码。* !["IDA plugin"](https://raw.githubusercontent.com/AntoineBlaud/TheCodexRebirth/main/doc/imgs/plugin.gif) 该插件还包含额外的功能,其中一些改编自 Tenet 插件和 Frinet 项目,并进行了进一步增强 ![Features](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/027b3c92ce163607.png) 在步骤追踪期间,库调用也会被转储: !["Library Calls"](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6901d963cf163612.png) ## 污点分析的工作原理 污点分析基于以下原则: - 每条指令被执行,结果存储在一个变量中。 - 每个变量首先被赋予一个唯一的 id 进行污点标记。 - 当发生操作时,结果 id 是操作数 id 的拼接,并且变量用指令的结果进行更新。 通过遵循这些原则,我们可以轻松追踪污点的前向传播和方程的后向传播。 ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/196fc89bf9163615.png) 污点的前向传播由绿色单元格表示,方程的后向传播由粉色单元格表示。**简而言之,绿色单元格是使用当前操作结果的操作,而粉色单元格是被当前操作所使用的操作。** 然后,后向传播可以表示为一棵树。同一行上表示的是将 RealValue 作为操作数(例如:Imm 操作数)的操作。当在两个 SymValue 上发生操作时,结果是两个操作数树的合并。 ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/92a03b56c2163616.png) ## 更多功能 - **Step Tracer**:Step tracer 是一个独立的工具,可用于追踪程序的执行。它可用于任何可以用 IDA 调试的程序。Step tracer 能够追踪程序的执行并生成可以导入 CodexRebirth 的 trace 文件。`虽然我们可能认为步骤追踪太慢且效率低下,但它的优势在于能够 !! 退出代码循环 !!,因此即使是非常大的程序也可以被追踪。` 在调查 trace 时,显示循环的所有命中是不必要的,因此 Step tracer 是性能和效率之间的一个良好折衷。 ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/427996be13163618.png) - **Ultimap**:Ultimap 是一个功能强大的工具,旨在帮助用户精确定位程序中的特定动作,例如视频游戏中的跳跃。它通过在用户预定义或导出的函数上设置断点来运行。当程序执行期间触发断点时,Ultimap 会记录相关数据,从而允许对所需动作进行精确分析和跟踪。 ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/43ca08f9bc163621.png) ## 安装说明 **注意:对于 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探索, 二进制分析, 云安全运维, 云资产清单, 代码可视化, 代码混淆, 内存分析, 去混淆, 可配置连接, 寄存器追踪, 恶意代码分析, 汇编指令, 漏洞搜索, 程序分析, 符号执行, 逆向工程, 配置文件