用于IDA Pro的交互式二进制修补插件

在恶意软件分析、软件逆向工程以及更广泛的安全研究领域中,通过修改汇编代码来改变现有程序的行为并不罕见。本项目扩展了流行的 IDA Pro 反汇编器,打造了一个更强大的交互式二进制补丁工作流,旨在支持快速迭代。
本项目目前基于普遍使用的 Keystone Engine 的一个小型 fork,支持 x86/x64 和 Arm/Arm64 架构的补丁,并计划在未来的版本中启用剩余的 Keystone 架构。
特别感谢 Hex-Rays 对本插件开发的支持。
本插件需要 IDA 7.6 和 Python 3。支持 Windows、Linux 和 macOS。
请注意,旧版本的 IDA(8.2 及以下)不兼容 Python 3.11 及以上版本。
在 IDA 控制台中运行以下行以自动安装插件:
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
或者,您可以从 发布页面 下载适用于您平台的分发包插件,解压到您的插件文件夹中进行手动安装。
强烈建议您将本插件安装到 IDA 的用户插件目录中:
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
本补丁插件会为支持的架构(x86/x64/Arm/Arm64)自动加载,并在 IDA 反汇编视图的右键上下文菜单中注入相关的补丁操作:

以下各节描述了完整的上下文补丁操作列表。
主要的补丁对话框可以通过右键上下文菜单中的“Assemble”操作启动。它模拟了一个基本的 IDA 反汇编视图,可用于快速连续编辑一条或多条指令。

汇编行是一个可编辑的字段,可用于实时修改指令。按下回车键将提交(修补)输入的指令到数据库中。
您当前的指针位置(即光标)将始终以绿色高亮显示。由于您的补丁/编辑而将被覆盖的指令将在提交补丁之前以红色高亮显示。

最后,当焦点仍在可编辑的汇编文本字段上时,可以使用 UP 和 DOWN 方向键快速在反汇编视图中上下移动光标,而无需使用鼠标。
最常见的补丁操作是将一条或多条指令 NOP 掉。因此,NOP 操作将始终在右键菜单中可见,以便快速访问。

可以 NOP 掉单个指令,也可以 NOP 掉选中的一段指令。
强制条件跳转始终执行“好”的路径是另一种常见的补丁操作。插件仅会在右键点击条件跳转指令时显示此操作。

如果您永远不希望条件跳转被采用,直接将其 NOP 掉即可!
补丁可以随时通过“Patching”子菜单保存(应用)到选定的可执行文件中。快速应用操作使得使用相同设置保存后续补丁更加快捷。

插件还会主动保留原始可执行文件的备份(.bak),在每次保存时用于“干净地”应用当前数据库中的补丁集。
最后,如果您对某个补丁不满意,可以右键点击已修补(黄色)的指令块,将其恢复到原始值。

虽然将字节恢复到原始值“容易”,但将分析状态恢复到先前状态可能“困难”。恢复补丁有时需要额外的人工修复。
时间和动力允许的情况下,未来的工作可能包括:
xor eax, eax; ret;)漂亮: mov [rsp+48h+dwCreationDisposition], 3
原始: mov [rsp+20h], 3
欢迎外部贡献、问题报告和功能请求。如果您希望未来版本考虑您的贡献,请将拉取请求发送到此仓库的 develop 分支。