
Tenet は、実行トレースを探索するための IDA Pro プラグインです。このプラグインの目標は、特定のバイナリに対する実行トレースをナビゲートするための、より自然で人間的なコントロールを提供することです。この作業の基盤は、ソフトウェアにおける複雑な実行パターンを調査し、抽出するための新しいまたは革新的な方法を研究したいという願望に由来します。
このプロジェクトの詳細については、初回リリースに関するブログ記事をお読みください。
特に QIRA / geohot とその他の方々にインスピレーションを与えていただき感謝します。
Tenet はクロスプラットフォーム (Windows、macOS、Linux) の Python 3 プラグインです。サードパーティ製の依存関係は一切必要なく、コードは移植性が高く、インストールも簡単です。
逆アセンブラの Python コンソールから、以下のコマンドを実行してプラグインディレクトリを確認します:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")このリポジトリの /plugins/ フォルダの内容を、リストされたディレクトリにコピーします。
逆アセンブラを再起動します。
このプラグインは IDA 7.5 以降でのみサポートされています。
適切にインストールされると、逆アセンブラに新しいメニューエントリが追加されます。これを使用して、外部で収集した実行トレースを Tenet に読み込むことができます。
これは初回リリースのため、Tenet はシンプルな人間可読なテキストトレースのみを受け付けます。トレースのフォーマット、制限事項、参考トレーサーの詳細については、このリポジトリのtracing readmeを参照してください。
Tenet を使用すると、プラグインはアクティブな実行トレース内の現在位置から前方(青)と後方(赤)への実行フローを示すトレイルを「ペイント」します。
時間を前後に step するには、逆アセンブラの右側にあるタイムライン上にカーソルを置いて スクロール するだけです。関数呼び出しを step over するには、スクロール中に SHIFT を押したままにします。
トレースタイムラインは逆アセンブラの右側にドッキングされます。このウィジェットは、トレースタイムラインに沿ってさまざまな種類のイベントを可視化し、上記のような基本的なナビゲーションを実行するために使用されます。
タイムライン上をクリック&ドラッグすることで、実行トレースの特定のセクションをズームインできます。この操作は何度でも繰り返して、必要な粒度に到達できます。
レジスタウィンドウで命令ポインタをダブルクリックすると、赤くハイライト表示され、トレースタイムライン全体でその命令が実行されたすべての位置が明らかになります。
実行間をジャンプするには、ハイライトされた命令ポインタにカーソルを置いて上下にスクロールします。
さらに、逆アセンブリリストで右クリックし、ナビゲーションベースのメニューエントリのいずれかを選択して、目的の命令の実行にすばやくシークすることもできます。
IDA のネイティブの F2 ホットキーを使用して、任意の命令にブレークポイントを設定することもできます。
スタックビューまたはメモリビューのバイトをダブルクリックすると、そのアドレスへのすべての読み取り/書き込みがトレースタイムライン全体で可視化され、即座に表示されます。黄色はメモリの読み取り、青色はメモリの書き込みを示します。
メモリブレークポイントは、実行ブレークポイントについて説明したのと同じ手法でナビゲートできます。バイトをダブルクリックし、選択したバイトにカーソルを置いてスクロールすると、トレースを各アクセスにシークします。
目的のバイトを右クリックすると、特定のナビゲーションアクションを念頭に置いている場合、メモリ読み取り/書き込み/アクセス間をシークするオプションが表示されます。
メモリビューを任意のアドレスにナビゲートするには、メモリビューをクリックして G キーを押し、アドレスまたはデータベースシンボルを入力してビューをシークします。
メモリのブロックをハイライトし、それをダブルクリックしてアクセスブレークポイントを設定することで、メモリのリージョン全体にメモリブレークポイントを設定することが可能です。
通常のメモリブレークポイントと同様に、リージョンにカーソルを置いてスクロールすることで、選択したメモリリージョンへのアクセス間を移動できます。
リバースエンジニアリングでは、*「どの命令がこのレジスタを現在の値に設定したのか?」*と自問する状況によく遭遇します。
Tenet を使用すると、1回のクリックでその命令に後方シークできます。
後方シークは、レジスタの変更をナビゲートする方向としては圧倒的に一般的です... しかし、器用さのために、レジスタの右側にある青い矢印を使用して、次のレジスタ割り当てに前方シークすることもできます。
トレース内の特定のタイムスタンプにナビゲートするためのシンプルな 'シェル' が提供されています。シェルにタイムスタンプを(カンマの有無にかかわらず)貼り付ける(または入力する...)だけで十分です。
感嘆符を使用すると、トレース内の指定された 'パーセンテージ' にシークすることもできます。!100 と入力するとトレースの最後の命令にシークし、!50 と入力するとトレースの約 50% の位置にシークします。!last と入力すると、逆アセンブラで表示可能な最後のナビゲート可能な命令にシークします。
Tenet には、'ライト' テーマと 'ダーク' テーマの 2 つのデフォルトテーマが付属しています。逆アセンブラで現在使用されている色に応じて、Tenet は最も適切と思われるテーマを選択しようとします。
テーマファイルはディスク上にシンプルな JSON として保存され、高度に設定可能です。デフォルトのテーマや色に満足できない場合は、独自のテーマを作成し、ユーザーテーマディレクトリにドロップするだけです。
Tenet は、今後読み込む際にテーマの設定を記憶します。
時間と モチベーション 資金が許せば、将来の作業には以下が含まれる可能性があります:
外部からのコントリビューション、イシュー、機能リクエストを歓迎します。将来のリリースで検討してほしい場合は、このリポジトリの develop ブランチにプルリクエストを送ってください。
Markus Gaasedelen (@gaasedelen)