
Colección de scripts para realizar ingeniería inversa del firmware de banda base / módem Qualcomm Hexagon
Colección de scripts para la ingeniería inversa del firmware de banda base / módem de Qualcomm
Todos los offsets/direcciones en los scripts se han actualizado al firmware de marzo del Pixel 5 y deben cambiarse si se utiliza una versión diferente.
merge_modem_firmware.py fusiona todos los archivos modem.b** (modem.b00, modem.b01, etc.) en un único binario monolítico llamado modem.bin. Esto facilita mucho su carga en IDA y Ghidra.
clade_extractor y dlpage_extractor descomprimen las secciones comprimidas CLADE y Delta.
clade_extractor está compilado para x86 (o tu arquitectura nativa) y escribirá la sección descomprimida en un archivo. Por lo que sé, no hay información pública ni código publicado sobre la compresión CLADE de Qualcomm aparte de la patente. CLADE ha reemplazado a q6zip como el principal método de compresión para los módulos de modo usuario y es un dolor de cabeza para la ingeniería inversa porque está implementado principalmente en hardware.
dlpage_extractor está compilado para Hexagon y se emula en QEMU (como se ha hecho en trabajos anteriores). La memoria descomprimida deberá volcarse en GDB. También hay código aquí para el antiguo método de compresión q6zip, aunque ya no se usa en los binarios de módem más recientes. La sección delta solo tiene un par de estructuras de manejadores de comandos diag, así que la sección comprimida CLADE es donde se encuentra la mayor parte de la sustancia. Yo ni me molestaría con esto en binarios más nuevos; solo está aquí para los más antiguos.
Una vez que tengas la sección CLADE descomprimida, puedes ejecutar add_decompressed_section_to_modem_bin.py para añadirla a modem.bin. Esto se puede hacer manualmente en IDA y Ghidra, pero este script facilita un poco la carga y el respaldo de los binarios finales.
qshrink4_qdb_ghidra_script.py decodifica todas las llamadas a msg_v4_send* en sus correspondientes cadenas de depuración. Añadirá un comentario al principio de cada función que las utilice. Estas cadenas de depuración son increíblemente útiles para la ingeniería inversa, ya que siempre proporcionan el nombre del archivo y algo de contexto sobre la función. Para mejorarlo aún más, a veces contienen nombres de funciones, nombres de variables y más. Revisa la ruta de archivo que se abre para obtener ayuda sobre cómo conseguir el archivo qdb del firmware del Pixel 5. Sigue extrayendo con binwalk hasta que obtengas lo que necesitas.
diag_handler_locator_ghidra_script.py localiza y renombra todas las funciones de manejador de comandos diag con el esquema de nombres <op1>_<op2>_diag_cmd_handler para que sean más fáciles de buscar en Ghidra.
Un par de los scripts contienen código tomado de otras fuentes. He intentado dar crédito por todo, pero puede que haya olvidado alguno. Por favor, házmelo saber si usé tu código y olvidé mencionarte.
Si este repositorio te ayudó, ¡dale una ⭐!