Dieses experimentelle Ghidra-Plugin ermöglicht Ihnen den einfachen Umgang mit der nativen Pcode-Emulation. Es sind keine Skripte mehr erforderlich, Sie können es einfach direkt von Ghidra aus verwenden. Dies kann besonders nützlich sein, wenn Sie mit einer Vielzahl exotischer Prozessoren arbeiten, die von gängigen Emulatoren nicht unterstützt werden.
Wenn der Prozessor/VM von Ghidra für Reverse Engineering unterstützt wird, kann er emuliert werden! Nachfolgend wird beispielsweise die Emulation von eBPF-Anweisungen demonstriert:
Im Wesentlichen handelt es sich bei dem Plugin um einen erweiterten Wrapper um die Klassen im ghidra.app.emulator
-Paket. Folgendes wurde umgesetzt:
Obwohl die PCode-Emulation idealerweise eine Vereinheitlichung impliziert, benötigen die meisten Prozessoren einen eigenen Ansatz. Fühlen Sie sich frei, alle Probleme zu melden, auf die Sie stoßen. Ich würde wirklich gerne alle Prozessoren testen, aber das ist kaum möglich.
Enthält alle Plugin-Fenster: Stapelansicht, Register, Haltepunktansicht und Hauptfenster.
Enthält Hotkeys zum Festlegen von Start und Ende der Emulation, Haltepunkten und zum Anwenden geänderter Bytes auf den Emulatorstatus.
Ändern Sie die Register nach Ihren Wünschen. Das Setzen des Link-Registers (grüner Pfeil) hilft dem Emulator zu verstehen, welches Register die Rücksprungadresse enthält. Das Plugin weiß über die Register Stack, lr-Register, AARCH64 und MIPS, wie es funktioniert. Wenn Sie ein exotisches Exemplar haben, wählen Sie das Linkregister aus und drücken Sie die Taste.
Wenn Sie Ihr Programm im CodeBrowser öffnen, ordnet GhidraEmu den Stapelspeicher automatisch zu. Der Stapelzeiger wird in die Mitte des Stapelbereichs gesetzt. Dadurch können Sie Werte oben oder unten in Stapelrahmen festlegen. Scrollen Sie weiter, wenn beim Aktualisieren oder Zurücksetzen ein Einfrieren auftritt. Wenn das Programm während des Emulationsprozesses mehr Speicherplatz für den Stapel benötigt, weist das Plugin diesen automatisch zu.
Sollten sich während der Emulation Bytes ändern, sehen Sie diese im klassischen ByteViewer. Keine Sorge, sie werden nach dem Drücken der Schaltfläche „Zurücksetzen“ auf ihre ursprünglichen Werte zurückgesetzt.
Wenn Sie Änderungen vorgenommen haben, teilen Sie dem Emulator die geänderten Bytes mit (Stack-Updates automatisch – keine Notwendigkeit). Wählen Sie sie nach der Änderung aus (sie werden grün) und drücken Sie diese Option (oder verwenden Sie den Hotkey „M“).
Hier druckt das Plugin Ausgabeinformationen. Beispielsweise Emulationsfehlermeldungen wie diese:
Mit der Funktion „Überspringen“ können Sie eine Anweisung weiterspringen, wenn Sie aus irgendeinem Grund die aktuelle Anweisung nicht emulieren möchten. Da der Emulationsprozess abgebrochen wird, wenn ein Versuch erkannt wird, nicht initialisierten Speicher zu lesen, können Sie ihn mit dieser Funktion umgehen. Schauen Sie sich ein Beispiel an. Hier ist eine der ersten Anweisungen in vielen x86_64-Programmen, Canary-Stack-Speicherung:
MOV RAX, qword ptr FS:[0x28]
Wir werden einfach versuchen, ein wenig zu schummeln und darüber hinwegzugehen, indem wir den PC-Wert erhöhen. Halten Sie dazu bei der Anweisung an, die Sie nicht emulieren möchten, und drücken Sie den Hotkey J
Andernfalls würde ein weiterer Schritt zu einem nicht initialisierten Speicherlesefehler führen.
Wenn Sie bei einer Anweisung anhalten, die zu einem Unterprogramm führt (interner Aufruf) und Sie alles bis zur nächsten Anweisung emulieren möchten (klassisches „Step Over“), drücken Sie den Hotkey F6
, und es wird mit Sicherheit passieren:
Ein paar wichtige Punkte, die es zu beachten gilt :
Verwenden Sie Gradle, um die Erweiterung zu erstellen: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
und verwenden Sie Ghidra, um sie zu installieren: File → Install Extensions...
Gehen Sie im CodeBrowser zu File → Configure → Miscellaneous
und aktivieren Sie das Kontrollkästchen für das GhidraEmu-Plugin.
Sind bei der Verwendung des Plugins Fehler aufgetreten oder haben Sie Verbesserungsvorschläge? Scheuen Sie sich nicht, eine neue Ausgabe zu eröffnen, und ich werde es herausfinden.
EmulatorHelper-Einschränkungen erlauben keine Verwendung von Programmspeicherplatz in einem anderen. So erfährt beispielsweise Ihre externe gemeinsam genutzte Bibliothek nie etwas über den Programmspeicherplatz und umgekehrt. Sie können es also nicht als einen Prozess mit einem Speicherplatz emulieren. Lassen Sie mich wissen, wenn mir hier etwas fehlt.