
Sammlung von Skripten zum Reverse Engineering von Qualcomm-Hexagon-Basisband-/Modem-Firmware
Sammlung von Skripten zum Reverse Engineering der Qualcomm-Baseband-/Modem-Firmware
Alle Offsets/Adressen in den Skripten wurden auf die Pixel-5-März-Firmware aktualisiert und müssen geändert werden, wenn du eine andere Version verwendest.
merge_modem_firmware.py führt alle modem.b**-Dateien (modem.b00, modem.b01, usw.) zu einer einzigen monolithischen Binärdatei namens modem.bin zusammen. Das macht es viel einfacher, sie in IDA und Ghidra zu laden.
clade_extractor und dlpage_extractor dekomprimieren die mit CLADE und Delta komprimierten Abschnitte.
clade_extractor wird für x86 (oder deine native Architektur) kompiliert und gibt den dekomprimierten Abschnitt in eine Datei aus. Meines Wissens gibt es abgesehen vom Patent keine öffentlich verfügbaren Informationen oder veröffentlichten Code zur Qualcomm-CLADE-Kompression. CLADE hat q6zip als Hauptkomprimierungsmethode für Benutzermodule abgelöst und ist mühsam zu reversen, da es größtenteils in Hardware implementiert ist.
dlpage_extractor wird für Hexagon kompiliert und in QEMU emuliert (wie in früheren Arbeiten). Der dekomprimierte Speicher muss dann in GDB ausgedumpt werden. Es gibt hier auch Code für die alte q6zip-Komprimierungsmethode, die bei neueren Modem-Binärdateien allerdings nicht mehr verwendet wird. Der Delta-Abschnitt enthält nur ein paar Diag-Befehlshandler-Strukturen, daher steckt der meiste Inhalt im CLADE-komprimierten Abschnitt. Ich würde mir das bei neueren Binärdateien gar nicht erst antun; das ist nur für ältere gedacht.
Sobald du den dekomprimierten CLADE-Abschnitt hast, kannst du add_decompressed_section_to_modem_bin.py ausführen, um ihn zu modem.bin hinzuzufügen. Das kann manuell in IDA und Ghidra erledigt werden, aber dieses Skript erleichtert das Laden und Sichern der finalen Binärdateien.
qshrink4_qdb_ghidra_script.py dekodiert alle Aufrufe von msg_v4_send* in die jeweiligen Debug-Zeichenketten. Es fügt am Anfang jeder Funktion, die diese verwendet, einen Kommentar hinzu. Diese Debug-Zeichenketten sind beim Reverse Engineering unglaublich nützlich, da sie immer den Dateinamen und etwas Kontext für die Funktion liefern. Noch besser: Sie enthalten manchmal Funktionsnamen, Variablennamen und mehr. Sieh dir den Dateipfad an, der geöffnet wird, um Hilfe beim Abrufen der qdb-Datei aus der Pixel-5-Firmware-Datei zu erhalten. Extrahiere einfach weiter mit binwalk, bis du bekommst, was du brauchst.
diag_handler_locator_ghidra_script.py findet alle Diag-Befehlshandlerfunktionen und benennt sie nach dem Schema <op1>_<op2>_diag_cmd_handler um, damit sie in Ghidra leichter zu durchsuchen sind.
Einige der Skripte enthalten Code aus anderen Quellen. Ich habe versucht, alles zu würdigen, aber ich könnte das eine oder andere vergessen haben. Bitte lass es mich wissen, falls ich deinen Code verwendet und vergessen habe, dich zu erwähnen.
Falls dir dieses Repo geholfen hat, gib ihm bitte einen ⭐!