Log.i53

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

AntiDebug技術:API Redirection

APIリダイレクションは保護された実行ファイルのインポートテーブルの再構築を妨害するための手法です。一般的に、オリジナルのインポートテーブルは破壊され、APIは割り当てメモリ内に位置する実際のAPIに対応するルーチンにリダイレクトされます。

 以下にkernel32!CopyFileA() APIを呼び出すコードの例を示します:
f:id:i53:20150608175856p:plain

 この呼び出しはインポートテーブルから参照されるアドレスにJMPを実行するスタブとなっています:
f:id:i53:20150608180003p:plain

 しかし、ASProtectがkernel32!CopyFileA() APIをリダイレクトした時、上記のスタブは割り当てメモリ内にある最終的にはkernel32!CopyFileA()と同様の命令を実行するルーチンへのCALL命令に置き換えられます:
f:id:i53:20150608182642p:plain

 以下に、どのように置き換えが行われたかを図で示します。kernel32!CopyFileA()コードの最初の7命令がコピーされます。加えて、0x7C83005Eのコール命令が参照する先の命令もコピーされます。その後、kernel32!CopyFileA()ルーチンの途中で0x7C830063へのRETN命令によってkernel32.dll内部の処理に制御が遷移します:
f:id:i53:20150608185401p:plain

 パッカーによっては、割り当てメモリ内にDLLイメージ全体をロードして、そのDLLイメージコピーにAPIコールをリダイレクトさせます。このテクニックは、実際のAPIブレークポイントをセットすることをより困難にさせる上で効果的に作用します。