
KeyPatch Enhanced — Keystone Engineを活用した、シンボル対応のx86/x64アセンブリパッチング用IDA Proプラグイン。Keypatchのフォークで、自動IDAシンボル解決、RIP相対エンコーディング、_↔. の名前補正を備えています。
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 の位置で rc4_crypt へのジャンプを patch したい場合:
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 は、シンボルアドレスが 0x7FFFFFFF 以下(imm32 符号拡張)である必要があり、それ以外の場合は警告が出ます。lea reg, symbol + push reg への変更を推奨します。lea rcx, sym; call func 形式の複数文のシンボル解決は現在サポートされていません。1 つずつ patch してください。_ ↔ . 名前補正、x64 RIP-relative エンコーディング対応、強化されたエラー出力本改修版は MIT ライセンスで公開されています。詳細は LICENSE ファイルを参照してください。
オリジナルの Keypatch コードの著作権は原作者に帰属し、GPL v2 に基づいて公開されています。