
Einige Skripte für IDA Pro zur Unterstützung beim Reverse Engineering von EFI-Binärdateien
Einige IDA-Skripte zur Unterstützung beim Reverse Engineering von EFI-Executables.
Dieses Paket enthält die folgenden Dateien:
efiutils.py - IDAPython-Modul mit einigen Hilfsfunktionen
efiguids.py - Eine Sammlung bekannter GUIDs für EFI-Protokolle
efiguids_ami.py - Eine Sammlung bekannter GUIDs für Protokolle, die im AMI-BIOS verwendet werden
behemoth.h - Ein riesiger Header mit einer Sammlung von Typ- und Strukturdefinitionen für EFI
structs.idc - Ein IDC-Skript mit einigen Strukturdefinitionen (durch behemoth.h ersetzt)
te_image.bt - Eine 010-Editor-Vorlage für TE-Binärbilder
te_loader.py - Ein IDA-Pro-Loader-Skript für TE-Binärbilder
Dies ist mein erster Versuch mit IDA-Skripting, also verzeiht mir bitte und lasst mich wissen, falls ich das Rad neu erfunden oder etwas Unsinniges getan habe.
Die wichtigsten nützlichen Funktionen werden unten beschrieben. Weitere Informationen zu anderen Funktionen finden Sie im Code und in den Docstrings.
rename_tables()Findet den ersten Einstiegspunkt der Binärdatei, versucht, die Parameter zu verfolgen, die an die Einstiegspunktfunktion übergeben wurden, und benennt globale Variablen um, in denen die wichtigsten EFI-Tabellen gespeichert sind. Die folgenden Umbenennungsvorgänge werden durchgeführt:
Die globale Variable, in der ImageHandle landet, wird in gImageHandle umbenannt.
Die globale Variable, in der SystemTable landet, wird in gSystemTable umbenannt.
Die globale Variable, in der SystemTable->BootServices landet, wird in gBootServices umbenannt.
Die globale Variable, in der SystemTable->RuntimeServices landet, wird in gRuntimeServices umbenannt.
Call-Anweisungen werden nur eine Ebene tief verfolgt, da die meisten Executables die Tabellenreferenzen im Einstiegspunkt oder in einer vom Einstiegspunkt aufgerufenen Funktion kopieren. Ändern Sie MAX_STACK_DEPTH, falls erforderlich.
update_structs()Findet Querverweise auf die oben umbenannten Tabellen und aktualisiert deren Namen, sodass sie Strukturoffsets der entsprechenden Strukturen sind. Wenn rename_tables() fehlgeschlagen ist, müssen Sie die Dinge wie oben manuell umbenennen, damit dies ordnungsgemäß funktioniert.
Zum Beispiel:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
Wird zu:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()Findet GUIDs in Datensegmenten und benennt sie um. 470 Protokoll-GUIDs wurden aus dem TianoCore-Quellcode extrahiert, und proprietäre Apple- (und andere Hersteller-) GUIDs werden hinzugefügt, sobald sie auftreten.
go()Bequeme Methode, die alle oben genannten Schritte ausführt.
Laden Sie Ihre EFI-Binärdatei in IDA Pro
Importieren Sie behemoth.h, um die erforderlichen Datenstrukturen zu definieren
Fügen Sie die Strukturen aus lokalen Typen zu Ihrer IDB hinzu
Führen Sie efiutils.py aus, um es zum Python-Pfad hinzuzufügen (oder tun Sie dies auf andere Weise)
Werfen Sie einen Blick auf den Code/die Docstrings, aber wahrscheinlich:
import efiutils; efiutils.go()
Um das te_loader.py-TE-Bild-Loader-Skript zu verwenden, installieren Sie es wie jeden anderen Loader. Unter OS X geschieht dies durch Kopieren oder Verlinken in den Loader-Ordner unter idaq.app/Contents/MacOS/loaders/.