Log.i53

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

デバッガ検出技術:PEB.BeingDebuggedFlag:IsDebuggerPresent()

 最も基本的なデバッガ検出技術としてProcess Environment Block(PEB)内にあるBeingDebuggedフラグを確認する方法があります。Kernel32!IsDebuggerPresentは、ユーザモードデバッガによってプロセスがデバッグされているかどうかをこのフラグの値によってチェックするAPIです。

 以下のコードはIsDebuggerPresentの実際の実装を示しています。このAPIはPEBのアドレスを取得するためにThread Environment Block(TEB)にアクセスし、その後でPEBのオフセット0x02からBeingDebuggedフラグをチェックしています:
f:id:i53:20150609032938p:plain

 一部のパッカーはIsDebuggerPresentを呼び出す代わりに、BeingDebuggedフラグをマニュアルでチェックします。この場合、分析者はブレークポイントをセットするか、または該当するAPIにパッチをあてることで対応できます。

 以下は、IsDebuggerPresentとPEB.BeingDebuggedフラグを使用してデバッガが存在しているかどうかを識別するためのコード例です:
f:id:i53:20150609032949p:plain

 これらのチェックは非常に簡単なものであるため、パッカーは基本的にガベージコードや複数のアンチ逆アセンブリ技術を使用することによってこれらを難読化します。

解決策

 この検出技術に対しては、PEB.BeingDebuggedフラグの値を0x00のバイト値でパッチすることで簡単に回避することができます。OllyDbgでPEBを表示するにはデータウインドウ内で”Ctrl+G (Goto Expression)”を押して、fs:[30]を入力します。

 また、OllyScriptコマンド”dph”でパッチを適用することができます:
f:id:i53:20150609033002p:plain

 なお、OllyAdvancedプラグインにはBeingDebuggedフィールドを0に設定するオプションが用意されています。