Log.i53

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

AntiDebug技術:ThreadHideFromDebugger

 このテクニックは一般的にスレッドの優先度を設定するために使われるntdll!NtSetInformationThread() APIを利用します。このAPIはデバッガに送信されるデバッグイベントを妨害するためにも使用できるのです。
 
 NtSetInformationThread()に渡されるパラメータは以下のとおりです。このテクニックでは、ThreadHideFromDebugger(0x11)がThreadInformationClassパラメータに渡され、ThreadHandleは現在のスレッドハンドル(0xfffffffe)に設定します:
f:id:i53:20150609045946p:plain

 内部的に、ThreadHideFromDebuggerはETHREADカーネル構造体のHideThreadFromDebuggerフィールドをセットします。これが一度セットされると、カーネル内部にあるデバッガにイベントを送信することを主目的とするDbgkpSendApiMessage()関数が呼び出されなくなります。

 NtSetInformationThread()呼び出しの典型的な例を示します:
f:id:i53:20150609050046p:plain

解決策

 ntdll!NtSetInformationThread()にブレークポイントを設定して、一度ヒットしたら、分析者はAPI呼び出しがカーネルに到達するのを防ぐために、EIPを操作することができます。この操作はollyscriptで自動化することができます。また、Olly Advancedプラグインには、このAPIにThreadInformationClassパラメータがHideThreadFromDebuggerに設定された場合、カーネルコード呼び出しの代わりに即座にリターンを実行するパッチを適用するオプションがあります。