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

Log.i53

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

AntiDebug技術:Misdirection and Stopping Execution via Exceptions

Unpack Anti-Debug

 コードを直線的にトレースしていくことで、分析者はコードの目的を容易に理解し把握することができます。したがって、パッカーによっては線形でないコードによって分析に時間がかかるように仕向けるいくつかの技術を採用しています。

 一般的に使用される技術の1つに、アンパックの過程でいくつかの例外をスローする手法があります。キャッチされる例外をスローすることによって、分析者は例外時にEIPが指すアドレスと、例外ハンドラが実行された後にEIPが指すアドレスを把握する必要があります。

 また、例外はパッカーがアンパッキングコードの実行を繰り返し停止させるためにも利用されます。デバッガ下のプロセスで例外がスローされると、デバッガの仕様で一時的にアンパッキングコードの実行を停止するためです。

 パッカーは例外処理のメカニズムとして構造化例外ハンドラ(SEH)を一般的に利用します。しかし、最近のパッカーはベクタ例外処理(Vectoerd Exceptions)も利用し始めています。

 以下は、ループイテレーションの後でROL命令を実行する事によってオーバーフローフラグをセットし、(INTO命令によって)オーバーフロー例外をスローすることによってミスディレクションを引き起こすサンプルコードです。しかし、オーバーフロー例外はトラップ例外であり、EIPはJMP命令を指すことになります。分析者がOllyDbgを使用しており、(Shift+F7/F8/F9で)分析者がこの例外ハンドラをパスせずに継続的にステップ実行した場合、無限ループに陥ります。
f:id:i53:20150609045301p:plain

 パッカーは一般的にアクセスバイオレーション(0xC0000005)、ブレークポイント(0x80000003)、またはシングルステップ(0x80000004)の例外をスローします。

解決策

 コードの実行を意図的に遷移させる目的で例外を使用するパッカーのために、OllyDbgでは例外を自動的に例外ハンドラに渡すように構成することが可能です。この機能は【Options】➤【Debugging Options】➤【Exceptions】で設定できます。チェックボックスで選択する例外以外に、カスタム例外を追加することも可能です。
f:id:i53:20150609045433p:plain
 
 例外ハンドラ内部で重要な操作を実行するパッカーもあります。分析者は、OllyDbgで【View】➤【SEH Chain】を使用して表示された例外ハンドラのアドレスにブレークポイントを設定することもできます。その後で、Shift+F7/F8/F9を押して例外ハンドラにヒットするまで実行することができます。