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

Log.i53

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

AntiDebug技術:Debugger Blocker

 Armadilloパッカーによって導入され始めてた機能がDebugger Blockerと呼ばれる機能です。これは保護プロセスへのデバッガのアタッチを妨ぐものです。この保護機構はWindowsによって提供されているデバッギング機能を使用して実装されています。

 具体的には、アンパッキングスタブがそれを生成したデバッガ(親プロセス)に作用して、アンパックされた実行ファイルを含む子プロセスをデバッグ/制御します。
f:id:i53:20150607031354p:plain

 保護プロセスが既にデバッグされていることから、kernel32!DebugActiveProcess()を介したデバッガのアタッチは失敗して対応するネイティブAPIであるntdll!NtDebugActiveProcess()がSTATUS_PORT_ALREADY_SETが返されます。内部的には、NtDebugActiveProcess()の失敗はEPROCESSカーネル構造体のDebugPortが既にセットされていることによって生じます。

 保護プロセスにデバッガをアタチするためには、親プロセスのコンテキスト内でkernel32!DebugActiveProcessStop()を呼び出す手法を含む、いくつかの対応策がリバーシングフォーラムに投稿されています。これは親プロセス上でデバッガをアタッチしてkernel32!WaitForDebugEvent()内部にブレークポイントを設定し、ブレークポイントがヒットしたらDebugActiveProcessStop(ChildProcessPID)を呼び出すコードを挿入・実行することで行われます。これが成功すれば、デバッガを保護プロセスにアタッチすることができます。