Este complemento experimental de Ghidra le permite manejar fácilmente la emulación de código p nativo. Ya no se necesitan scripts, solo úselos directamente desde Ghidra. Puede resultar particularmente útil para trabajar con una variedad de procesadores exóticos que no son compatibles con los emuladores comunes.
Si Ghidra admite el procesador/VM para ingeniería inversa, ¡se puede emular! Por ejemplo, la emulación de instrucciones eBPF se muestra a continuación:
En esencia, el complemento es un contenedor extendido de las clases dentro del paquete ghidra.app.emulator
. Esto es lo que se ha implementado:
Aunque la emulación de PCode idealmente implica unificación, la mayoría de los procesadores necesitan su propio enfoque. No dude en informar cualquier problema que encuentre. Realmente me gustaría probar todos los procesadores, pero es casi imposible.
Contiene todas las ventanas de complementos: vista de pila, registros, vista de puntos de interrupción y ventana principal.
Contiene teclas de acceso rápido para configurar el inicio y el final de la emulación, puntos de interrupción y aplicar bytes modificados al estado del emulador.
Cambia los registros como quieras. Configurar el registro de enlace (flecha verde) ayudará al emulador a comprender qué registro contiene la dirección del remitente. El complemento sabe cómo funciona a través de la pila, el registro lr, AARCH64 y los registros MIPS. Si tienes uno exótico, selecciona el enlace registrarse y presiona el botón.
Cuando abras tu programa en CodeBrowser, GhidraEmu asignará el espacio de la pila automáticamente. El puntero de la pila se establecerá en el medio del rango de la pila. Esto le permite establecer valores en la parte superior o inferior de los marcos de la pila. Desplácese si experimenta bloqueos al actualizar o restablecer. Durante el proceso de emulación, si el programa necesita más espacio para la pila, el complemento lo asignará automáticamente.
Si algún byte cambia durante la emulación, lo verá en el ByteViewer clásico. No te preocupes, se restablecerán a sus valores originales después de presionar el botón "Restablecer" .
Si realizó cambios, informe al emulador sobre los bytes modificados (la pila se actualiza automáticamente, no es necesario). Después de cambiar, selecciónelos (serán verdes) y presione esta opción (o use la tecla de acceso rápido "M").
Aquí el complemento imprime la información de salida. Por ejemplo, mensajes de error de emulación como este:
La función "Saltar" le permite avanzar una instrucción si no desea emular la actual por algún motivo. Dado que el proceso de emulación se cancelará si se detecta un intento de leer la memoria no inicializada, esta función le permite omitirlo. Mira un ejemplo. Aquí está una de las primeras instrucciones en muchos programas x86_64, guardar pila canary:
MOV RAX, qword ptr FS:[0x28]
Intentaremos hacer un poco de trampa y saltarlo aumentando el valor de PC. Para hacer esto, deténgase en la instrucción que no desea emular y presione la tecla de acceso rápido J
De lo contrario, dar un paso más provocaría un error de lectura de memoria no inicializada.
Si te detienes en una instrucción que conduce a una subrutina (llamada interna) y quieres emular todo hasta la siguiente instrucción (el clásico "pasar por encima"), presiona la tecla de acceso rápido F6
y seguramente sucederá:
Algunos puntos importantes a considerar :
Use gradle para construir la extensión: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
y use Ghidra para instalarlo: File → Install Extensions...
En CodeBrowser, vaya a File → Configure → Miscellaneous
y seleccione la casilla de verificación para el complemento GhidraEmu.
¿Encontró algún error al usar el complemento o tiene ideas para mejorarlo? No tengas vergüenza de abrir una nueva edición y lo descubriré.
Las restricciones de EmulatorHelper no permiten usar el espacio del programa en otro. Entonces, su biblioteca compartida externa, por ejemplo, nunca sabrá sobre el espacio de memoria del programa y viceversa. Por lo tanto, no puedes emularlo como un proceso con un espacio de memoria. Déjame saber si me falta algo aquí.