Un plugin interactivo de parcheo binario para IDA Pro

No es poco común en el análisis de malware, la ingeniería inversa de software y campos más amplios de investigación en seguridad, parchear código ensamblador para cambiar el comportamiento de un programa existente. Este proyecto extiende el popular desensamblador IDA Pro para crear un flujo de trabajo de parcheo binario interactivo más robusto, diseñado para iteración rápida.
Este proyecto actualmente está impulsado por un fork menor del omnipresente Keystone Engine, compatible con parcheo x86/x64 y Arm/Arm64, con planes de habilitar las arquitecturas restantes de Keystone en una versión futura.
Agradecimientos especiales a Hex-Rays por apoyar el desarrollo de este plugin.
Este plugin requiere IDA 7.6 y Python 3. Es compatible con Windows, Linux y macOS.
Tenga en cuenta que las versiones antiguas de IDA (8.2 y anteriores) no son compatibles con Python 3.11 y superiores.
Ejecute la siguiente línea en la consola de IDA para instalar automáticamente el plugin:
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
Alternativamente, el plugin se puede instalar manualmente descargando el paquete de plugin distribuible para su plataforma respectiva desde la página de lanzamientos y descomprimiéndolo en su carpeta de plugins.
Se recomienda encarecidamente instalar este plugin en el directorio de plugins de usuario de IDA:
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
El plugin de parcheo se cargará automáticamente para arquitecturas compatibles (x86/x64/Arm/Arm64) e inyectará acciones de parcheo relevantes en el menú contextual de clic derecho de las vistas de desensamblado de IDA:

Una lista completa de las acciones de parcheo contextual se describen en las siguientes secciones.
El diálogo principal de parcheo se puede lanzar mediante la acción Assemble en el menú contextual de clic derecho. Simula una vista básica de desensamblado de IDA que se puede usar para editar una o varias instrucciones en rápida sucesión.

La línea de ensamblaje es un campo editable que se puede usar para modificar instrucciones en tiempo real. Presionar Enter confirmará (parcheará) la instrucción ingresada en la base de datos.
Su ubicación actual (también conocido como su cursor) siempre se resaltará en verde. Las instrucciones que serán sobrescritas como resultado de su parche/edición se resaltarán en rojo antes de confirmar el parche.

Finalmente, las teclas de flecha UP y DOWN se pueden usar mientras aún se está enfocado en el campo de texto de ensamblaje editable para mover rápidamente el cursor hacia arriba y hacia abajo en la vista de desensamblado sin usar el mouse.
La acción de parcheo más común es poner NOP a una o más instrucciones. Por esta razón, la acción NOP siempre será visible en el menú de clic derecho para acceso rápido.

Se pueden poner NOP a instrucciones individuales, así como a un rango seleccionado de instrucciones.
Forzar un salto condicional para que siempre ejecute una ruta 'buena' es otra acción de parcheo común. El plugin solo mostrará esta acción al hacer clic derecho en una instrucción de salto condicional.

Si nunca desea que se tome un salto condicional, ¡puede simplemente ponerle NOP!
Los parches se pueden guardar (aplicar) a un ejecutable seleccionado a través del submenú de parcheo en cualquier momento. La acción de aplicación rápida hace que sea aún más rápido guardar parches posteriores usando la misma configuración.

El plugin también hará un esfuerzo activo para retener una copia de seguridad (.bak) del ejecutable original que utiliza para aplicar 'limpiamente' el conjunto actual de parches de la base de datos durante cada guardado.
Finalmente, si alguna vez no está satisfecho con un parche, simplemente puede hacer clic derecho en bloques de instrucciones parcheados (amarillos) para revertirlos a su valor original.

Si bien es 'fácil' revertir los bytes a su valor original, puede ser 'difícil' restaurar el análisis a su estado anterior. Revertir un parche puede ocasionalmente requerir ajustes humanos adicionales.
Si el tiempo y la motivación lo permiten, el trabajo futuro puede incluir:
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
Doy la bienvenida a contribuciones externas, problemas y solicitudes de funciones. Por favor, haga cualquier pull request a la rama develop de este repositorio si desea que sean considerados para una versión futura.