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

Log.i53

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

Anti-Analysis技術:Encryption and Compression

Unpack Anti-Debug

 暗号化(Encryption)と圧縮(Compression)は耐タンパー技術において最も基本的なものです。これらは分析者が逆アセンブラによって保護された実行ファイルをロードして、何の支障もなしに分析を開始することを防止するための、最初の防御となります。

暗号化

 パッカーは基本的にプロテクタコードと保護された実行ファイルの両方を暗号化しています。暗号化アルゴリズムはパッカーによって大きく変化し、シンプルなXORのループで構成されているものから、いくつかの計算を実行する非常に複雑なループで構成されているものまで様々です。ポリモーフィック型のパッカー(Polymorphic Packer)では、暗号化アルゴリズムは生成される検体によって変化し、その復号コードも生成される各検体ごとに分析が困難になるように並び替えられています。これにより、パッカー識別ツールによってパッカーの種類を正確に特定することも防止されてしまう可能性があります。

 復号ルーチンはフェッチ、計算、データ操作の格納を実行するループとして簡単に認識することができます。以下は、暗号化されたDWORD値に対していくつかのXOR命令を実行する簡単な復号ルーチンのサンプルコードです:
f:id:i53:20150609030649p:plain

こちらはポリモーフィック型のパッカーによる複号処理のサンプルです:
f:id:i53:20150609030740p:plain

また、こちらも同じポリモーフィック型のパッカーによって生成された複号処理のサンプルです:
f:id:i53:20150609030859p:plain

 最後の2つのサンプルには分析者を混乱させるためのガベージコードが含まれていおり、ハイライトされている行がメインの復号ルーチンになります。復号ルーチンが2つのサンプルでどのように変化しているかに注目して下さい。

圧縮

 圧縮の主目的は実行ファイルのコードやそのデータのサイズを減らすことにあります。しかし、実行ファイルの圧縮によって、結果的に文字列データが難読化されてしまうという副作用があります。パッカーによって使用される圧縮エンジンの例として、UPXのNRV(Not Really Vanished)圧縮やUPXのLZMA(Lempel-Ziv-Markov chain-Algorithm)、FSGのaPLib、UpackのLZMA、yoda's ProtectorのLZOなどが挙げられます。これらの圧縮エンジンは商用利用でなければフリーで使用できますが、商用利用であればライセンス/レジストレーションが必要です。

対応策

 複号や解凍処理のループは簡単にバイパス可能であり、分析者は単にいつ複号/解凍ループが実行されるかを把握し、ループ後の命令にブレークポイントを設定するだけです。パッカーによっては複号処理のループ内にブレークポイント検出コードを持っている可能性があることに注意して下さい。