
KeyPatch Enhanced — Plugin de IDA Pro para el parcheo de ensamblado x86/x64 con reconocimiento de símbolos, impulsado por Keystone Engine. Fork de Keypatch con resolución automática de símbolos de IDA, codificación relativa a RIP y corrección de nombres _↔.
Basado en Keypatch (por Nguyen Anh Quynh & Thanh Nguyen), una bifurcación mejorada modificada por Euarno.
Mejora principal: usar directamente nombres de símbolos de IDA en ensamblado x86/x64, el plugin resuelve automáticamente las direcciones y genera la codificación correcta RIP-relative / rel32.
Introduce directamente instrucciones con nombres de símbolos en el diálogo de Keypatch, sin necesidad de calcular manualmente direcciones y desplazamientos:
call rc4_crypt ; calcula automáticamente el desplazamiento relativo rel32
jmp main ; igual que arriba
lea rcx, enc_0 ; x64: genera automáticamente lea rcx, [rip + disp32]
lea rax, Format ; igual que arriba
_ ↔ .)IDA a veces muestra . en la base de datos como _ (por ejemplo, enc.0 se muestra como enc_0). El plugin intentará automáticamente la variante _ → . en la búsqueda, sin necesidad de preocuparse por el formato de almacenamiento interno de IDA.
| Tipo | Ejemplo | Tratamiento |
|---|---|---|
| CALL / JMP / Jcc | call func_name | Símbolo → dirección absoluta, Keystone calcula rel32 |
| LEA (símbolo simple) | lea rcx, symbol | x64: → lea rcx, [rip + disp32]x86: → lea ecx, [addr] |
| LEA (operando compuesto) | lea rcx, [rbp+0x120+Str] | Solo reemplaza el símbolo por el valor de dirección, conserva la estructura de la expresión |
| MOV offset | mov rax, offset symbol | x64: se convierte en lea rax, [rip + disp32]si está fuera de rango se usa mov rax, imm64 |
Acceso a memoria [symbol] | mov rax, qword ptr [symbol] | [symbol] → [0xADDR], Keystone codifica automáticamente |
| Símbolo como inmediato | push symbol | Símbolo → 0xADDR |
Cuando falla el ensamblado, la ventana de salida mostrará:
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
Copia keypatch.py al directorio de plugins de IDA:
| Sistema | Ruta |
|---|---|
| Windows | %APPDATA%\Hex-Rays\IDA Pro\plugins\ o <directorio de instalación de IDA>\plugins\ |
| macOS | ~/.idapro/plugins/ o <directorio de instalación de IDA>/plugins/ |
| Linux | ~/.idapro/plugins/ o <directorio de instalación de IDA>/plugins/ |
Reinicia IDA y listo.
Supongamos que quieres parchear en 0x140001966 un salto a rc4_crypt:
Assembly: call rc4_crypt
El plugin resuelve automáticamente la dirección de rc4_crypt, calcula el desplazamiento rel32 y genera la codificación correcta E8 xx xx xx xx.
Assembly: lea rcx, enc_0
El plugin automáticamente:
enc_0 (el nombre interno puede ser enc.0) → dirección 0x140013050disp32 = 0x140013050 - (0x140001966 + 7)lea rcx, [rip + 0x176E3]nop), se rellenará automáticamente todo el rangolea y [symbol] tiene un rango de ±2GB. Si el símbolo está fuera de rango, el plugin mostrará un error.push symbol en x64 requiere que la dirección del símbolo sea ≤ 0x7FFFFFFF (extensión de signo de imm32), de lo contrario se emitirá una advertencia. Se recomienda usar lea reg, symbol + push reg.lea rcx, sym; call func. Parchea una por una._ ↔ ., soporte de codificación RIP-relative en x64, salida de errores mejoradaEsta versión modificada se publica bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.
Los derechos de autor del código original de Keypatch pertenecen a los autores originales, publicado bajo GPL v2.