Log.i53

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

デバッガ検出技術:Guard Pages

 このチェックはOllyDbg特有のものであり、これはOllyDbgのメモリブレークポイント機能に関係しています。

 ハードウェア/ソフトウェアブレークポイントを別として、OllyDbgはアクセス/ライトメモリブレークポイントを実装しています。このタイプのブレークポイントはガードページを使用して実装されています。簡単に言うと、ガードページはあるメモリがアクセスされたかどうかをアプリケーションに通知するために提供されています。

 ガードページはPAGE_GUARDページ保護修正子を使用して設定され、アクセスされたアドレスがガードページの一部であった場合、STATUS_GUARD_PAGE_VIOLATION(0x80000001)例外が発生します。プロセスがOllyDbg下でデバッグされていてガードページにアクセスがあった場合に、例外が発生せずにそのアクセスがメモリブレークポイントとして処理される挙動をパッカーが検出します。

 以下は、メモリを割り当て、割り当てたメモリにコードを格納した後でPAGE_GUARD属性を有効にするサンプルコードです。その後でそのマーカー(EAX)が0に初期化され、ページガードされた割り当てメモリを内のコードを実行することでSTATUS_GUARD_PAGE_VIOLATIONがトリガされます。このコードがOllyDbgによってデバッグされた場合、例外ハンドラが実行されないためマーカーの値は変更されません。
f:id:i53:20150609041227p:plain

解決策

 ガードページは例外を発生させるため、分析者は意図的に例外を発生させて例外ハンドラを呼び出させることができます。分析者はRET命令を"INT3"命令に置き換えて、その後でRET命令を実行させることができます。一度INT3命令が実行されると、Shift+F9を押すことで例外ハンドラの呼び出しをデバッガに強制させることができます。その後、例外ハンドラが呼び出された後でEAXは適切な値に設定され、RET命令が実行されます。

 例外ハンドラが発生した例外がSTATUS_GUARD_PAGE_VIOLATIONであるかをチェックするものであった場合、分析者は例外ハンドラ内にブレークポイントを設定して、その後で渡されたExceptionRecordをマニュアルでSTATUS_GUARD_PAGE_VIOLATIONに変更します。