
KeyPatch Enhanced — Plugin IDA Pro pour le patch d'assembleur x86/x64 sensible aux symboles, propulsé par Keystone Engine. Fork de Keypatch avec résolution automatique des symboles IDA, encodage relatif à RIP et correction des noms _↔.
Basé sur Keypatch (par Nguyen Anh Quynh & Thanh Nguyen), branche améliorée modifiée par Euarno.
Amélioration principale : utiliser directement les noms de symboles IDA dans l'assemblage x86/x64, le plugin résout automatiquement les adresses et génère un encodage RIP-relative / rel32 correct.
Saisissez directement des instructions avec noms de symboles dans la boîte de dialogue Keypatch, sans calculer manuellement les adresses et les offsets :
call rc4_crypt ; calcule automatiquement l'offset relatif rel32
jmp main ; idem
lea rcx, enc_0 ; x64: génère automatiquement lea rcx, [rip + disp32]
lea rax, Format ; idem
_ ↔ .)IDA affiche parfois les . de la base de données sous forme de _ (par exemple enc.0 affiché comme enc_0). Le plugin essaie automatiquement la variante _ → . lors de la recherche, sans se soucier du format de stockage interne d'IDA.
| Type | Exemple | Traitement |
|---|---|---|
| CALL / JMP / Jcc | call func_name | Symbole → adresse absolue, Keystone calcule rel32 |
| LEA (symbole nu) | lea rcx, symbol | x64: → lea rcx, [rip + disp32]x86: → lea ecx, [addr] |
| LEA (opérande composé) | lea rcx, [rbp+0x120+Str] | Remplace uniquement le symbole par la valeur d'adresse, conserve la structure de l'expression |
| MOV offset | mov rax, offset symbol | x64: converti en lea rax, [rip + disp32]hors plage, utilise mov rax, imm64 |
Accès mémoire [symbol] | mov rax, qword ptr [symbol] | [symbol] → [0xADDR], Keystone encode automatiquement |
| Symbole en immédiat | push symbol | Symbole → 0xADDR |
En cas d'échec de l'assemblage, la fenêtre de sortie affiche :
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
Copiez keypatch.py dans le répertoire des plugins d'IDA :
| Système | Chemin |
|---|---|
| Windows | %APPDATA%\Hex-Rays\IDA Pro\plugins\ ou <répertoire d'installation IDA>\plugins\ |
| macOS | ~/.idapro/plugins/ ou <répertoire d'installation IDA>/plugins/ |
| Linux | ~/.idapro/plugins/ ou <répertoire d'installation IDA>/plugins/ |
Redémarrez IDA.
Supposons que vous souhaitiez patcher à l'adresse 0x140001966 un saut vers rc4_crypt :
Assembly: call rc4_crypt
Le plugin résout automatiquement l'adresse de rc4_crypt, calcule l'offset rel32 et génère l'encodage correct E8 xx xx xx xx.
Assembly: lea rcx, enc_0
Le plugin automatiquement :
enc_0 (nom interne possiblement enc.0) → adresse 0x140013050disp32 = 0x140013050 - (0x140001966 + 7)lea rcx, [rip + 0x176E3]nop), la plage entière est remplie automatiquementlea et [symbol] est de ±2GB. Si le symbole dépasse la portée, le plugin signale une erreur.push symbol en x64, l'adresse du symbole doit être ≤ 0x7FFFFFFF (extension de signe imm32), sinon un avertissement apparaît. Il est recommandé d'utiliser lea reg, symbol + push reg.lea rcx, sym; call func n'est pas encore prise en charge. Veuillez patcher instruction par instruction._ ↔ ., prise en charge de l'encodage RIP-relative en x64, sortie d'erreurs amélioréeCette version modifiée est publiée sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Le code original de Keypatch est la propriété de ses auteurs originaux et est publié sous GPL v2.