
リバースエンジニアのためのカバレッジエクスプローラー
Lighthouseは、IDA ProおよびBinary Ninja向けの強力なコードカバレッジエクスプローラーであり、シンボルやソースコードを必要とせずにネイティブアプリケーションの実行マップを調査するための、独自のインタラクティブな操作機能をソフトウェアリサーチャーに提供します。
本プロジェクトはIDAの2017 Plug-In Contestで2位に入賞し、その後、セキュリティリサーチ業界への貢献により2021年Pwnie Awardsにノミネートされました。
インスピレーションを与えてくれた@0vercl0kに特別な感謝を捧げます。
Lighthouseはクロスプラットフォーム(Windows、macOS、Linux)のPython 2/3プラグインです。サードパーティ依存関係が一切ないため、コードはポータブルでインストールも簡単です。
お使いのディスアセンブラに応じて、以下の手順に従ってください。
import idaapi, os; print(os.path.join(idaapi.get_user_idadir(), "plugins"))/plugins/フォルダの内容を、表示されたディレクトリにコピーします。LighthouseはBinary Ninjaのプラグインマネージャーを通じてインストールでき、v3.5以降をサポートしています。
Edit -> Preferences -> Manage PluginsEnableボタンをクリックします。正しくインストールされると、ディスアセンブラにいくつかの新しいメニュー項目が表示されます。これらは、ユーザーがカバレッジデータをロードしてLighthouseを使い始めるためのエントリポイントです。
Lighthouseは、いくつかの異なる「フレーバー」のカバレッジデータをロードできます。Lighthouseにロードできるカバレッジデータを生成するには、このリポジトリのcoverageディレクトリにあるREADMEを参照してください。
Lighthouseの使用中、ディスアセンブラで利用可能なすべてのコードビューアに、アクティブなカバレッジデータが「ペイント」されます。具体的には、リニアディスアセンブリ、グラフ、およびデコンパイラウィンドウに適用されます。
Binary Ninjaでは、リニアディスアセンブリ、グラフ、およびILビューのみがサポートされています。Binary Ninjaでのデコンパイラ出力のペインティングのサポートは、機能が安定した時点で近い将来Lighthouseに追加される予定です。
カバレッジ概要は、Lighthouseにカバレッジがロードされると開くドッキング可能なウィジェットです。
このインタラクティブなウィジェットは、ロードされたカバレッジデータの関数レベルのビューを提供します。また、ロードされたデータを管理し、より高度な形式のカバレッジ分析を実行するための多数のツールを備えています。
カバレッジ概要のテーブルを右クリックすると、テーブルから情報を抽出したり、リバースエンジニアリングプロセスの一環としてデータベースを操作するための、いくつかの基本的な機能を備えたコンテキストメニューが表示されます。
このコンテキストメニューに追加すると便利だと思われるアクションがあれば、issueを提出してください。Lighthouseの将来のリリースで検討されます。
ロードされたカバレッジおよびユーザーが構築したコンポジションは、カバレッジコンボボックスを通じて選択または削除できます。
Lighthouseは基本的なHTMLカバレッジレポートを生成できます。サンプルレポートはこちらで確認できます。
カバレッジ概要ウィンドウの下部にはカバレッジシェルがあります。このシェルは、ロードされたカバレッジセットを組み合わせたり操作したりするロジックベースの操作を実行するために使用できます。
この機能は、複数の実行にわたるプログラム実行の関係を調査する際に非常に便利です。言い換えれば、このシェルはカバレッジセット間の実行を「diff」し、個々の部分のノイズの中に隠れている、より深い意味を抽出するために使用できます。
カバレッジコンポジション、つまり上記で示した_Composing_は、コンポジションシェル上のシンプルな式文法と「省略形」のカバレッジ記号(AからZ)によって実現されます。
|, &, ^, -A, B, C, ..., Z, *(...)AとカバレッジBの間で共有される実行コード:A & B
Aのみに固有の実行コード:A - B
AまたはBに固有だが、Cには固有でない実行コード:(A | B) - C
式は任意の長さや複雑さにできますが、コンポジションの評価は右から左に行われる場合があります。そのため、曖昧になる可能性のある式には括弧の使用を推奨します。
さらに、ユーザーのコンポジションをリアルタイムで非同期に評価およびキャッシュする「ホットシェル」モードがあります。
ホットシェルは、コンポジションされた関係をガイドなしで探索するための自然な入り口として機能します。
シェルを使用して、クエリの先頭に/を付けることで、カバレッジテーブルにリストされた関数を検索およびフィルタリングできます。
シェルのヘッドには、残りの関数のみから計算された更新済みのカバレッジ%が表示されます。これは、特定の関数ファミリーのカバレッジを分析する際に便利です。
シェルにアドレスまたは関数名を入力すると、テーブル内の対応する関数エントリにジャンプできます。
Lighthouseの使用中、任意の基本ブロック(または命令)を右クリックし、「Coverage Xref」アクションを使用すると、選択したブロックを実行したカバレッジセットを確認できます。リストされたエントリのいずれかをダブルクリックすると、そのカバレッジセットに即座に切り替わります。
これは、「Coverage Batch」機能と相性が良く、何千ものカバレッジファイルをすばやくロードしてLighthouseに集約できます。ブロックをクロスリファレンスして「セット」を選択すると、その「原因」となったセットがディスクから新しいカバレッジセットとしてロードされ、バッチとは別に探索できます。
Lighthouseには2つのデフォルトテーマが同梱されています -- 「ライト」テーマと「ダーク」テーマです。ディスアセンブラで現在使用されている色に応じて、Lighthouseは最も適切と思われるテーマを選択しようとします。
テーマファイルはシンプルなJSONとしてディスクに保存され、高度に設定可能です。デフォルトのテーマや色に満足できない場合は、独自のテーマを作成し、ユーザーテーマディレクトリに配置するだけです。
Lighthouseは、今後のロードおよび使用のためにテーマの設定を記憶します。
時間とモチベーションが許せば、今後の作業には以下が含まれる可能性があります: