Log.i53

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

デバッガ検出技術:Software Breakpoint Detection

 ソフトウェアブレークポイントはターゲットアドレスのコードを改編することによって設定するブレークポイントであり、例えば、0xCCのバイト値(INT3 / ブレークポイント割り込み)に置き換えられます。この場合、パッカーは保護コードやAPIコード内の0xCC値をスキャンすることによってソフトウェアブレークポイントの有無を判別します。

 以下に簡単なチェックの例を示します:
f:id:i53:20150609041457p:plain

 パッカーによっては、次のようなチェックのために比較するバイト値が明確とならない命令を適用するものもあります:
f:id:i53:20150609041634p:plain

解決策

 ソフトウェアブレークポイントが検出されてしまう場合、分析者は代わりにハードウェアブレークポイントを使用することができます。また、APIコード内部にブレークポイントを設定する必要がある場合に、パッカ-はAPIコード内部のブレークポイントを検索しようと試みますが、この時分析者が最終的にANSIバージョンによって呼び出されるAPIUNICODEバージョンの方にブレークポイントをセットする(例えば、LoadLibraryAの代わりにLoadLibraryExWの方にブレークポイントを設定する)ことも出来ます。さらに、対応するネイティブAPI(LoadLibraryAの代わりにntdll!LdrLoadDll)にブレークポイントを設定することも出来ます。