
Native Pcode emulator
Este plugin experimental de Ghidra te permite lidiar fácilmente con la emulación nativa de pcode. Ya no se necesitan scripts, úsalo directamente desde Ghidra. Puede ser especialmente útil para trabajar con una variedad de procesadores exóticos que no son compatibles con los emuladores comunes.
Si el procesador/vm es compatible con Ghidra para ingeniería inversa, ¡puede emularse! Por ejemplo, la emulación de instrucciones eBPF se demuestra a continuación:

En esencia, el plugin es un envoltorio extendido alrededor 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 dudes en informar de cualquier problema que encuentres. Me encantaría probar todos los procesadores, pero es casi imposible.

Contiene todas las ventanas del plugin: Vista de pila, Registros, Vista de puntos de interrupción y Ventana principal.

Contiene atajos de teclado para establecer el inicio y fin de la emulación, puntos de interrupción y aplicar bytes modificados al estado del emulador.
Cambia los registros como quieras. Establecer el registro de enlace (flecha verde) ayudará al emulador a entender qué registro contiene la dirección de retorno. El plugin 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 registro de enlace y pulsa el botón.
Cuando abres tu programa en el CodeBrowser, GhidraEmu mapeará el espacio de la pila automáticamente. El puntero de pila se establecerá en medio del rango de la pila. Esto te permite establecer valores en la parte superior o inferior de los marcos de pila. Desplázala si experimentas congelaciones al actualizar o restablecer. Durante el proceso de emulación, si el programa necesita más espacio para la pila, el plugin lo asignará automáticamente.
Si algún byte cambia durante la emulación, lo verás en el ByteViewer clásico. No te preocupes, se restablecerán a sus valores originales después de pulsar el botón "Reset".
Si hiciste cambios, haz que el emulador se entere de los bytes modificados (la pila se actualiza automáticamente, no es necesario). Después de cambiar, selecciónalos (se pondrán en verde) y pulsa esta opción (o usa el atajo de teclado "M").

Aquí el plugin imprime información de salida. Por ejemplo, mensajes de error de emulación como este:

La característica "Jump Over" te permite saltar una instrucción si no quieres emular la actual por alguna razón. Dado que el proceso de emulación se abortará si se detecta un intento de leer memoria no inicializada, esta característica te permite omitirlo. Mira un ejemplo. Esta es una de las primeras instrucciones en muchos programas x86_64, el guardado del canario en la pila:
MOV RAX, qword ptr FS:[0x28]
Solo intentaremos hacer un poco de trampa y saltarla incrementando el valor del PC. Para ello, detente en la instrucción que no quieres emular y pulsa el atajo J. De lo contrario, continuar 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 "step over"), pulsa el atajo F6 y ciertamente sucederá:

Algunos puntos importantes a considerar:
Usa gradle para compilar la extensión: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle y usa Ghidra para instalarla: File → Install Extensions...
En el CodeBrowser, ve a File → Configure → Miscellaneous y marca la casilla del plugin GhidraEmu.
¿Encontraste algún error al usar el plugin o tienes ideas para mejoras? No seas tímido, abre un nuevo issue y lo resolveré.
Las restricciones de EmulatorHelper no permiten usar el espacio de programa en otro. Por lo tanto, tu biblioteca compartida externa, por ejemplo, nunca sabrá del espacio de memoria del programa y viceversa. Así que no puedes emularla como un solo proceso con un solo espacio de memoria. Avísame si me estoy perdiendo algo aquí.