読者です 読者をやめる 読者になる 読者になる

Log.i53

Themidaのアンパックを目指すブログ改め使い物になるえんじにゃを目指すブログ

デバッガ検出技術:Hardware Breakpoint Detection

Unpack Anti-Debug

 ソフトウェアブレークポイントの他にハードウェアブレークポイントというものがあります。ハードウェアブレークポイントデバッグレジスタを設定することによってセットできます。デバッグレジスタはDr0からDr7まで用意されており、Dr0からDr3が4以下のブレークポイントのアドレスを含み、Dr6は4つのうちのどのブレークポイントがトリガされたかを示すフラグを含んでいます。そしてDr7がブレークポイントの有効/無効や、リード/ライトブレークポイントのような4つのブレークポイントの制御フラグを含んでいます。

 デバッグレジスタがRing 3ではアクセスできないことから、ハードウェアブレークポイントの検出には少量のコードを実行するだけで済みます。パッカーは、デバッグレジスタの値を含むCONTEXT構造体を活用します。CONTEXT構造体は例外ハンドラによって渡されるContextRecordパラメータを介してアクセスすることができます。

 以下はデバッグレジスタを参照するサンプルコードになります:
f:id:i53:20150609041953p:plain

 パッカーによっては複号キーの一部としてデバッグレジスタを使用するものがあります。これらのレジスタは特定の値で初期化されるか、または0値を維持するように処理されます。したがって、これらのデバッグレジスタが改変された場合、アンパッキングスタブや保護された実行ファイルのコードの一部において複号が失敗して、無効な命令の実行による例外が発生します。

解決策

 分析者はソフトウェアブレークポイントがチェックされない場合にはソフトウェアブレークポイントを使用できます。また、OllyDbgのメモリブレークポイント機能を利用できます。APIブレークポイントを設定する必要がある場合に、通常の(ANSIバージョンの)APIの代わりにUNICODEバージョンのAPIや対応するネイティブAPI内部にブレークポイントを設定する方法もあります。