
Qualcomm Hexagonベースバンド/モデムファームウェアをリバースエンジニアリングするためのスクリプト集
Qualcomm ベースバンド / モデムファームウェアをリバースエンジニアリングするためのスクリプト集
スクリプト内のすべてのオフセット/アドレスは Pixel 5 の 3 月ファームウェアに合わせて更新されています。別のバージョンを使用する場合は変更が必要です。
merge_modem_firmware.py は、すべての modem.b** (modem.b00、modem.b01 など) ファイルを modem.bin という単一のモノリシックバイナリにマージします。これにより、IDA や Ghidra へのロードがはるかに簡単になります。
clade_extractor と dlpage_extractor は、CLADE および Delta 圧縮セクションを解凍します。
clade_extractor は x86 (またはお使いのネイティブアーキテクチャ) 向けにコンパイルされ、解凍されたセクションをファイルに出力します。私の知る限り、Qualcomm CLADE 圧縮に関する公開情報や公開コードは、特許 以外には存在しません。CLADE は、ユーザーモードモジュールの主要な圧縮方式として q6zip に取って代わりました。また、その実装のほとんどがハードウェアで行われているため、リバースエンジニアリングが困難です。
dlpage_extractor は Hexagon 向けにコンパイルされ、QEMU でエミュレートされます (これまでの研究と同様です)。解凍されたメモリは、その後 GDB でダンプする必要があります。また、古い q6zip 圧縮方式のコードもありますが、これは新しいモデムバイナリではもはや使用されていません。Delta セクションには diag コマンドハンドラの構造体がいくつかあるだけなので、主要な内容のほとんどは CLADE 圧縮セクションにあります。新しいバイナリではこれに取り組む必要はないでしょう。これは古いバイナリのためだけにあります。
解凍された CLADE セクションを取得したら、add_decompressed_section_to_modem_bin.py を実行して modem.bin に追加できます。これは IDA や Ghidra で手動で行うこともできますが、このスクリプトを使うと最終バイナリのロードとバックアップが少し簡単になります。
qshrink4_qdb_ghidra_script.py は、msg_v4_send* へのすべての呼び出しをそれぞれのデバッグ文字列にデコードします。これを使用するすべての関数の先頭にコメントを追加します。これらのデバッグ文字列は、常にファイル名と関数に関するいくつかのコンテキストを提供するため、リバースエンジニアリングに非常に役立ちます。さらに、関数名、変数名などが含まれることもあります。開かれているファイルパスを確認して、Pixel 5 ファームウェアファイルから qdb ファイルを取得する方法を参照してください。必要なものが得られるまで binwalk で展開し続けてください。
diag_handler_locator_ghidra_script.py は、すべての diag コマンドハンドラ関数を検出し、Ghidra で検索しやすいように <op1>_<op2>_diag_cmd_handler という命名スキームにリネームします。
一部のスクリプトには、他のソースから取得したコードが含まれています。すべてに対してクレジットを記載するよう努めましたが、1 つか 2 つ忘れているかもしれません。あなたのコードを使用したのにクレジットを忘れていた場合は、お知らせください。
このリポジトリが役に立った場合は、⭐ をお願いします!