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

Log.i53

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

AntiDebug技術:TLS Callbacks

Unpack Anti-Debug

 パッカーによって使用されるその他のテクニックに、実際のエントリポイントが実行される前にコードを実行する手法があります。これはThread Local Storage(TLS)コールバック関数を使用することで実現できます。パッカーはそのデバッガ検出や復号ルーチンをこれらのコールバック関数を介して実行することで、これらのルーチンが分析者によってトレースされないようにすることができます。

 TLSコールバックはpedumpなどのPEファイル分析ツールを使用して確認することができます。pedumpでは、実行ファイル内にTLSディレクトリが存在する場合にData Directoryエントリにそれが表示されます:
f:id:i53:20150608143320p:plain

 その後、TLSディレクトリ内の実際のコンテンツが表示されます。AddressOfCallBacksフィールドがコールバック関数の配列を参照しており、これはnull値で終了します:
f:id:i53:20150608143549p:plain

 この例では、RVA 0x4610fcがコールバック関数のポインタ(0x490f43と0x44654e)を指します:
f:id:i53:20150608143732p:plain

 デフォルトでは、OllyDbgは検体をロードした後にエントリポイントで一時停止します。TLSコールバックは実際のエントリポイントの前に呼び出されるため、OllyDbgであればTLSコールバックが呼び出される前のローダー上でブレークするように設定する必要があります。

 ntdll.dll内部のローダーコードでブレークさせるためには、【Options】➤【Debugging Options】➤【Events】➤【Make first pause at】➤【System breakpoint】を選択します:
f:id:i53:20150608144254p:plain

 一度設定されれば、OllyDbgはntdll!_LdrpRunInitializeRoutines()がTLSコールバックを実行する前のntdll!_LdrpInitializeProcess()内部でブレークするようになります。これにより、目的のコールバックルーチンにブレークポイントをセットすることでトレースが可能となります。

 pedumpのバイナリ/ソースを含むPEファイルフォーマットのより詳細な情報については、以下のリンクを参照して下さい。

Matt Pietrek氏によるWin32 PEファイルフォーマットの詳細:
Inside Windows: Win32 Portable Executable File Format in Detail

Matt Pietrek氏によるWin32 PEファイルフォーマットの詳細(パート2):
Inside Windows: An In-Depth Look into the Win32 Portable Executable File Format, Part 2

マイクロソフトからPEファイルフォーマットの最終バージョンを確認することが出来ます:msdn.microsoft.com