
KeyPatch Enhanced — IDA Pro plugin for symbol-aware x86/x64 assembly patching, powered by Keystone Engine. Fork of Keypatch with automatic IDA symbol resolution, RIP-relative encoding, and _↔. name correction.
基于 Keypatch(by Nguyen Anh Quynh & Thanh Nguyen)的增强分支,由 Euarno 修改。
核心改进:在 x86/x64 汇编中直接使用 IDA 符号名,插件自动解析地址并生成正确的 RIP-relative / rel32 编码。
在 Keypatch 对话框中直接输入带符号名的指令,无需手动计算地址和偏移:
call rc4_crypt ; 自动计算 rel32 相对偏移
jmp main ; 同上
lea rcx, enc_0 ; x64: 自动生成 lea rcx, [rip + disp32]
lea rax, Format ; 同上
_ ↔ .)IDA 有时会将数据库中的 . 显示为 _(例如 enc.0 显示为 enc_0)。插件会自动尝试 _ → . 的变体查找,无需关心 IDA 内部存储格式。
| 类型 | 示例 | 处理方式 |
|---|---|---|
| CALL / JMP / Jcc | call func_name | 符号 → 绝对地址,Keystone 计算 rel32 |
| LEA(裸符号) | lea rcx, symbol | x64: → lea rcx, [rip + disp32]x86: → lea ecx, [addr] |
| LEA(复合操作数) | lea rcx, [rbp+0x120+Str] | 仅替换符号为地址值,保留表达式结构 |
| MOV offset | mov rax, offset symbol | x64: 转换为 lea rax, [rip + disp32]超出范围则用 mov rax, imm64 |
内存访问 [symbol] | mov rax, qword ptr [symbol] | [symbol] → [0xADDR],Keystone 自动编码 |
| 立即数符号 | push symbol | 符号 → 0xADDR |
汇编失败时,输出窗口会显示:
Keypatch: Keystone error: Invalid operand (KS_ERR_ASM_INVALIDOPERAND)
Keypatch: input asm : lea rcx, [rip + 0x176E3]
Keypatch: fixed asm : LEA RCX, [RIP + 0x176E3]
Keypatch: address : 0x140001966
pip install keystone-engine
将 keypatch.py 复制到 IDA 的插件目录:
| 系统 | 路径 |
|---|---|
| Windows | %APPDATA%\Hex-Rays\IDA Pro\plugins\ 或 <IDA安装目录>\plugins\ |
| macOS | ~/.idapro/plugins/ 或 <IDA安装目录>/plugins/ |
| Linux | ~/.idapro/plugins/ 或 <IDA安装目录>/plugins/ |
重启 IDA 即可。
假设你要在 0x140001966 处 patch 一条跳转到 rc4_crypt:
Assembly: call rc4_crypt
插件自动解析 rc4_crypt 的地址,计算 rel32 偏移,生成正确的 E8 xx xx xx xx 编码。
Assembly: lea rcx, enc_0
插件自动:
enc_0(内部名可能是 enc.0)→ 地址 0x140013050disp32 = 0x140013050 - (0x140001966 + 7)lea rcx, [rip + 0x176E3]nop),自动填充整个范围lea 和 [symbol] 的 RIP-relative 寻址范围为 ±2GB。如果符号超出范围,插件会报错提示。push symbol 在 x64 下,符号地址必须 ≤ 0x7FFFFFFF(imm32 符号扩展),否则会有警告。建议改用 lea reg, symbol + push reg。lea rcx, sym; call func 形式的多语句符号解析。请逐条 patch。_ ↔ . 名称修正、x64 RIP-relative 编码支持、增强错误输出本修改版以 MIT 许可证发布。详见 LICENSE 文件。
原始 Keypatch 代码版权归原作者所有,基于 GPL v2 发布。