
IDA Pro用のスクリプト集で、EFIバイナリのリバースエンジニアリングを支援します。
EFI実行可能ファイルのリバースエンジニアリングを支援するIDAスクリプト集です。
このパッケージには以下のファイルが含まれています:
efiutils.py - いくつかのヘルパー関数を含むIDAPythonモジュール
efiguids.py - EFIプロトコル用の既知のGUIDコレクション
efiguids_ami.py - AMI BIOSで使用されるプロトコル用の既知のGUIDコレクション
behemoth.h - EFI用の型定義と構造体定義のコレクションを含む巨大なヘッダー
structs.idc - いくつかの構造体定義を含むIDCスクリプト(behemoth.hに置き換えられました)
te_image.bt - TEバイナリイメージ用の010 Editorテンプレート
te_loader.py - TEバイナリイメージ用のIDA Proローダースクリプト
これは私のIDAスクリプト作成の初めての試みですので、車輪の再発明やおかしなことをしている場合はお許しください。お知らせいただければ幸いです。
主な便利な関数は以下に説明されています。他の関数の詳細については、コードとdocstringを参照してください。
rename_tables()バイナリの最初のエントリポイントを見つけ、エントリポイント関数に渡されたパラメータを追跡し、主要なEFIテーブルが格納されているグローバル変数の名前を変更しようとします。以下の名前変更操作が実行されます:
ImageHandleが格納されるグローバルはgImageHandleに名前変更されます。
SystemTableが格納されるグローバルはgSystemTableに名前変更されます。
SystemTable->BootServicesが格納されるグローバルはgBootServicesに名前変更されます。
SystemTable->RuntimeServicesが格納されるグローバルはgRuntimeServicesに名前変更されます。
ほとんどの実行可能ファイルはエントリポイントまたはエントリポイントから呼び出される関数でテーブル参照をコピーするため、呼び出し命令は1レベルの深さまでしか追跡されません。必要に応じてMAX_STACK_DEPTHを変更してください。
update_structs()上記で名前変更されたテーブルへのクロスリファレンスを見つけ、それらの名前を適切な構造体からの構造体オフセットに更新します。rename_tables()が失敗した場合は、これが正しく機能するように上記のように手動で名前を変更する必要があります。
例:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
次のようになります:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()データセグメント内のGUIDを見つけて名前を変更します。470個のプロトコルGUIDがTianoCoreソースから抽出され、独自のApple(および他のベンダー)GUIDは検出された際に追加されます。
go()上記のすべてを実行する便利なメソッドです。
IDA ProでEFIバイナリをロードします
behemoth.hをインポートして必要なデータ構造を定義します
ローカル型から構造体をIDBに追加します
efiutils.pyを実行してpythonのパスに追加します(または他の方法で行います)
コード/docstringを確認しますが、おそらく次のようにします:
import efiutils; efiutils.go()
te_loader.py TEイメージローダーを使用するには、他のローダーと同様にインストールします。OS Xでは、idaq.app/Contents/MacOS/loaders/内のloadersフォルダにコピーまたはシンボリックリンクすることで行います。