
KeyPatch Enhanced — Plugin IDA Pro per il patching assembly x86/x64 consapevole dei simboli, basato su Keystone Engine. Fork di Keypatch con risoluzione automatica dei simboli IDA, codifica RIP-relative e correzione dei nomi _↔.
Fork potenziato basato su Keypatch (di Nguyen Anh Quynh & Thanh Nguyen), modificato da Euarno.
Miglioramento principale: utilizzo diretto dei nomi dei simboli IDA nell'assembly x86/x64, il plugin risolve automaticamente gli indirizzi e genera la codifica corretta RIP-relative / rel32.
Nel dialogo di Keypatch è possibile inserire direttamente istruzioni con nomi di simboli, senza dover calcolare manualmente indirizzi e offset:
call rc4_crypt ; calcola automaticamente l'offset relativo rel32
jmp main ; idem
lea rcx, enc_0 ; x64: genera automaticamente lea rcx, [rip + disp32]
lea rax, Format ; idem
_ ↔ .)IDA a volte mostra i . nel database come _ (ad esempio enc.0 viene mostrato come enc_0). Il plugin tenta automaticamente la ricerca della variante _ → ., senza doversi preoccupare del formato di memorizzazione interno di IDA.
| Tipo | Esempio | Gestione |
|---|---|---|
| CALL / JMP / Jcc | call func_name | Simbolo → indirizzo assoluto, Keystone calcola rel32 |
| LEA (simbolo nudo) | lea rcx, symbol | x64: → lea rcx, [rip + disp32]x86: → lea ecx, [addr] |
| LEA (operando composto) | lea rcx, [rbp+0x120+Str] | Sostituisce solo il simbolo con il valore dell'indirizzo, mantenendo la struttura dell'espressione |
| MOV offset | mov rax, offset symbol | x64: converte in lea rax, [rip + disp32]se fuori range usa mov rax, imm64 |
Accesso alla memoria [symbol] | mov rax, qword ptr [symbol] | [symbol] → [0xADDR], Keystone codifica automaticamente |
| Simbolo come immediato | push symbol | Simbolo → 0xADDR |
In caso di fallimento dell'assemblaggio, la finestra di output mostra:
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
Copiare keypatch.py nella directory dei plugin di IDA:
| Sistema | Percorso |
|---|---|
| Windows | %APPDATA%\Hex-Rays\IDA Pro\plugins\ oppure <directory di installazione IDA>\plugins\ |
| macOS | ~/.idapro/plugins/ oppure <directory di installazione IDA>/plugins/ |
| Linux | ~/.idapro/plugins/ oppure <directory di installazione IDA>/plugins/ |
Riavviare IDA.
Supponiamo di voler applicare una patch in 0x140001966 con un salto a rc4_crypt:
Assembly: call rc4_crypt
Il plugin risolve automaticamente l'indirizzo di rc4_crypt, calcola l'offset rel32 e genera la codifica corretta E8 xx xx xx xx.
Assembly: lea rcx, enc_0
Il plugin automaticamente:
enc_0 (il nome interno potrebbe essere enc.0) → indirizzo 0x140013050disp32 = 0x140013050 - (0x140001966 + 7)lea rcx, [rip + 0x176E3]nop), l'intero intervallo verrà riempito automaticamentelea e [symbol] ha un range di ±2GB. Se il simbolo è fuori range, il plugin segnala un errore.push symbol in x64 richiede che l'indirizzo del simbolo sia ≤ 0x7FFFFFFF (estensione del segno di imm32), altrimenti viene emesso un avviso. Si consiglia di usare lea reg, symbol + push reg.lea rcx, sym; call func non è ancora supportata. Applicare le patch una alla volta._ ↔ ., supporto alla codifica RIP-relative x64, output di errori miglioratoQuesta versione modificata è rilasciata con licenza MIT. Vedere il file LICENSE per i dettagli.
Il copyright del codice originale di Keypatch appartiene agli autori originali ed è rilasciato sotto GPL v2.