
IDA ProでC++仮想関数テーブルを自動生成するIDAPythonツール
Virtuailor は、Intelアーキテクチャ(32ビットおよび64ビットコード)およびAArch64(新機能!)向けに書かれたC++コードの仮想テーブルを再構築するIDAPythonツールです。 このツールは静的パートと動的パートの2つから構成されています。
最初の静的パートには以下の機能が含まれています:
2番目の動的パートには以下の機能が含まれています:
Virtuailor は現在、IDA バージョン 7.0 から最新バージョン (7.5) をサポートしています。IDA バージョン 7.4 より前のものを使用している場合は、beforeIDA-7.4 ブランチに切り替える必要があります。master ブランチは利用可能な最新バージョン (7.5) をサポートしています。
if __name__ == '__main__':
start_addr_range = idc.MinEA() # You can change the virtual calls address range
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
オプションですが(強く推奨)、idb のスナップショットを作成してください。ctrl+shift+t を押してスナップショットを作成します。
File->Run script... を選択し、Virtuailor フォルダに移動して Main.py を実行します。以下のGIFでより明確で視覚的な説明をご覧いただけます。

GUI は対象範囲を選択するオプションを提供します。バイナリ全体を対象とする場合は、開始アドレスと終了アドレスのデフォルト値のまま OK を押してください。
その後、ブレークポイントがコードに配置されます。あとは IDA デバッガでコードを実行し、任意の操作を行うだけで、仮想テーブルが構築される様子を確認できます。AArch64 の場合は、リモート gdb サーバーをセットアップして IDA デバッガでデバッグできます。
ブレークポイントが不要になった場合は、IDA のブレークポイントリストタブに移動して、好きなようにブレークポイントを削除してください。
このツールは32ビットと64ビットおよびaarch64をサポートする第2バージョンであることも重要です。おそらく一部の場合、少数のブレークポイントが見逃される可能性があります。その場合は、Issueを開いて私に連絡してください。コードを改善し、修正をお手伝いします。よろしくお願いします:)
Virtuailor がヒットした仮想呼び出しで使用された vtable から作成する構造体です。vtable 関数は、BP オペコードで使用された関連レジスタに基づいてメモリから抽出されます。

IDA の構造体とデータセクションの vtable の間に関連性を持たせたかったため、BP はデータセクションの vtable アドレス名を構造体の名前に変更します。次の画像で確認できます:

仮想関数の名前も変更されます。ただし、名前がデフォルトの IDA 名ではない場合(シンボルを持つ関数やユーザーが変更した関数)は、関数名はそのまま維持され、現在の名前で vtable 構造体に追加されます。
選択される名前は次のパターンで構成されます:
vtable 構造体には「Was called from offset: XXXX」というコメントも含まれています。このオフセットはセグメントの先頭からのオフセットです。
vtable を作成した後、Virtuailor は作成された構造体とアセンブリの間の接続も追加します。次の画像をご覧ください:

P.S: BPで使用される構造体オフセットは、最後に行われた呼び出しにのみ関連します。行われたすべての仮想呼び出しをよりよく理解するために、次のセクションで説明するように xref 機能が追加されました。
C++ を静的にリバースエンジニアリングする場合、誰が誰を呼び出したかを確認するのは容易ではありません。これはほとんどの呼び出しが間接呼び出しであるためです。しかし、Virtuailor を実行すると、間接的に呼び出されたすべての関数にそれらの場所への xref が追加されます。
次のGIFは、追加されたXrefとその間接関数呼び出しを示しています:

このツールはRECon Brussels、Troopers、Warconで発表されました。 プレゼンテーションは次のリンクでご覧いただけます:https://www.youtube.com/watch?v=Xk75TM7NmtA
REcon Brussels、Troopers、Warconのスタッフ、Nana、@tmr232、@matalaz、@oryandp、@talkain、@shiftreduce
このプラグインはGNU GPL v3ライセンスの下で提供されています。