Log.i53

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

デバッガ検出技術:Debugger Interrupts

 このテクニックは、デバッガがINT3(ブレークポイント)およびINT1(シングルステップ)割り込み命令を利用する仕様に基づくものです。一般的にデバッガはこれらの割り込みによって生成された例外を処理するため、デフォルトでは例外ハンドラが呼び出されません。したがって、パッカーは例外ハンドラ内でフラグを設定することで、これらのフラグがINT命令の後で設定されなかった場合には、そのプロセスがデバッグされていると判断することができます。また、kernel32!DebugBreak関数では内部でINT3を呼び出すため、一部のパッカーはこのAPIを代わりに使用することがあります。

 以下は、例外ハンドラが呼び出されているかどうかを検出するために、例外ハンドラ内部で(CONTEXTレコードを介して)EAXの値を0xFFFFFFFFに設定するサンプルコードです:
f:id:i53:20150609035154p:plain

解決策

 OllyDbgでは、ステッピングスルーまたはデバッガ割り込みによって実行が停止している時に、(View -> SHEチェインを介して)例外ハンドラのアドレスを識別した後で、例外ハンドラにブレークポイントを設定することができます。その後で、Shift+F9を押すことで、割り込み命令によって生成されるシングルステップ/ブレークポイント例外が例外ハンドラに渡されます。このブレークポイントに最終的にヒットすることになるため、例外ハンドラをトレースすることが可能となります。

 その他の解決策として、シングルステップ/ブレークポイント例外を自動的に例外ハンドラに渡すように設定することも可能です。これはOllyDbgのOptions -> Debugging Options -> Exceptions -> Ignore following exceptions において INT 3 breaksSingle-step breakチェックボックスをチェックすることで設定できます。
f:id:i53:20150609035348p:plain