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

Log.i53

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

AntiDebug技術:Blocking Input

Unpack Anti-Debug

 分析者によるデバッガの制御を防止するために、パッカーはメインのアンパッキング処理が実行されている間にuser32!BlockInput() APIを利用してキーボードやマウスの入力をブロックすることができます。ガベージコードやアンチ逆アセンブリ技術でこれを隠蔽されると、分析者によって識別されない限りは効果的に作用します。一度これが実行されるとシステムは応答なしになり、分析者の困惑だけが残ります。

 典型的な例は、分析者がGetProcAddress()内部にブレークポイントをセットして、ブレークポイントにヒットするまでアンパッキングコードを実行するものです。このとき、いくつかのガベージコードをスキップする過程で、パッカーはBlockInput()を呼び出します。そして、GetProcAddress()のブレークポイントにヒットしたとしても、分析者はすぐにデバッガ制御出来ないことに気づき、一体何が起こったのだろうと困惑します。

 BlockInput()はfBlockItという1つのBoolean型のパラメータを持ちます。これが真であればキーボードとマウスイベントがブロックされ、偽であればキーボードとマウスイベントのブロックが解除されます:
f:id:i53:20150609045629p:plain

解決策

 幸運なことに、BlockInput()が単にRETNを実行するようにパッチするだけの簡単な解決策があります。以下に示すのは、user32!BlockInput()のエントリにパッチをあてるollyscriptです:
f:id:i53:20150609045713p:plain

 OllyAdvancedプラグインもBlockInput()をパッチするオプションを持っています。また、CTRL+ALT+DELETEを押すことで手動でブロックの解除を行うこともできます。