
Native Pcode emulator
Questo plugin sperimentale per Ghidra ti consente di gestire facilmente l'emulazione nativa di pcode. Non servono più script: puoi usarlo direttamente da Ghidra. Può essere particolarmente utile per lavorare con una varietà di processori esotici non supportati dai comuni emulatori.
Se il processore/vm è supportato da Ghidra per il reverse engineering, può essere emulato! Ad esempio, qui sotto è mostrata l'emulazione delle istruzioni eBPF:

In sostanza, il plugin è un wrapper esteso attorno alle classi contenute nel pacchetto ghidra.app.emulator. Ecco cosa è stato implementato:
Sebbene l'emulazione PCode ideale implichi l'unificazione, la maggior parte dei processori richiede un approccio specifico. Non esitare a segnalare qualsiasi problema incontri. Mi piacerebbe davvero testare tutti i processori, ma è difficilmente possibile.

Contiene tutte le finestre del plugin: vista Stack, Registri, vista Breakpoint e finestra principale.

Contiene i tasti di scelta rapida per impostare l'inizio e la fine dell'emulazione, i breakpoint e l'applicazione dei byte modificati allo stato dell'emulatore.
Modifica i registri come preferisci. Impostare il link register (freccia verde) aiuta l'emulatore a capire quale registro contiene l'indirizzo di ritorno. Il plugin sa come funziona tramite lo stack, il registro lr e i registri AARCH64 e MIPS. Se ne hai uno esotico, seleziona il link register e premi il pulsante.
Quando apri il tuo programma nel СodeBrowser, GhidraEmu mappa automaticamente lo spazio dello stack. Il puntatore allo stack verrà impostato al centro dell'intervallo dello stack. Questo ti consente di impostare valori all'inizio o alla fine dei frame dello stack. Scorrilo se noti blocchi durante l'aggiornamento o il ripristino. Durante il processo di emulazione, se il programma necessita di più spazio per lo stack, il plugin lo allocherà automaticamente.
Se durante l'emulazione alcuni byte cambiano, li vedrai nel classico ByteViewer. Non preoccuparti: verranno ripristinati ai valori originali dopo aver premuto il pulsante "Reset".
Se hai apportato modifiche, comunica all'emulatore i byte modificati (lo stack si aggiorna automaticamente: non serve farlo). Dopo la modifica, selezionali (diventeranno verdi) e premi questa opzione (oppure usa il tasto di scelta rapida "M").

Qui il plugin stampa le informazioni di output. Ad esempio, messaggi di errore di emulazione come questo:

La funzionalità "Jump Over" ti consente di saltare un'istruzione in avanti se per qualche motivo non vuoi emulare quella corrente. Poiché il processo di emulazione viene interrotto se viene rilevato un tentativo di lettura di memoria non inizializzata, questa funzionalità ti permette di bypassarlo. Guarda un esempio. Ecco una delle prime istruzioni in molti programmi x86_64, il salvataggio del canary dello stack:
MOV RAX, qword ptr FS:[0x28]
Proveremo a barare un po' e a saltarla incrementando il valore del PC. Per farlo, fermati sull'istruzione che non vuoi emulare e premi il tasto di scelta rapida J. Altrimenti, proseguendo si otterrebbe un errore di lettura di memoria non inizializzata.

Se ti fermi su un'istruzione che porta a una subroutine (chiamata interna) e vuoi emulare tutto fino all'istruzione successiva (classico "step over"), premi il tasto di scelta rapida F6 e accadrà di sicuro:

Alcuni punti importanti da considerare:
Usa gradle per compilare l'estensione: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle e usa Ghidra per installarla: File → Install Extensions...
Nel CodeBrowser, vai su File → Configure → Miscellaneous e seleziona la casella per il plugin GhidraEmu.
Hai incontrato bug durante l'uso del plugin o hai idee per miglioramenti? Non essere timido, apri una nuova issue e ci penso io.
Le restrizioni di EmulatorHelper non consentono di usare uno spazio del programma in un altro. Quindi, ad esempio, la tua libreria condivisa esterna non saprà mai dello spazio di memoria del programma e viceversa. Non puoi quindi emularla come un unico processo con un unico spazio di memoria. Fammi sapere se mi sfugge qualcosa qui.