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

Log.i53

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

Anti-Analysis技術:Garbage Code and Code Permutation

ガベージコード(Garbage Code)

 アンパッキング処理へのガベージコードの挿入は分析者を混乱させるための効果的な手法のうちの1つです。コードの真の目的を隠蔽することに焦点が当てられており、複号処理やデバッガ検出のような耐タンパー技術の上に適用されます。ガベージコードはデバッガ/ブレークポイント/パッチの検出技術の隠蔽にも効果的であり、実際には"何もしない"意味のない命令や紛らわしい命令を周囲に大量に配置することで分析者を混乱させます。さらに、効果的なガベージコードは正常な/動作するコードのように見えます。

 以下は、復号処理に挿入されるガベージコードのサンプルです:
f:id:i53:20150609042401p:plain

 上記のコードにおいて実際の復号処理に関係している命令を如何に示します:
f:id:i53:20150609042443p:plain

コード置換(Code Permutation)

 コード置換はより高度なパッカーによって利用される技術の1つです。コード置換では、簡単な命令が複雑な命令のセットに置き換えられます。パッカーには、命令の理解とその命令と同等の操作となる新しい命令のセットを生成する機能が求められます。

 簡単なコード置換の例について見てみましょう:
f:id:i53:20150609042550p:plain

 上記の命令をコード置換することによって得られる同等の命令を如何に示します:
f:id:i53:20150609043048p:plain

 コード置換とガベージコードを組み合わせることで、分析者による保護コードの分析を遅延させるためのより効果的な技術となるでしょう。

 以下のサンプルは、デバッガ検出処理に対してコード置換を適用して変換後のコード間にガベージコードを挿入したものです:
f:id:i53:20150609043202p:plain

 上記のコードの元となるコードが以下の簡単なデバッグ検出処理です:
f:id:i53:20150609043258p:plain

解決策

 ガベージコードと置換された命令は分析を退屈にさせるとともに分析の手間を取らせるための手法です。よって、これらの難読化技術とその間に隠された命令を理解することに価値があるかどうかを知ることは重要であると言えます。

 難読化された命令の無駄なトレースを回避するための1つの方法が、パッカーによってよく使用されるAPI(VirtualAlloc/VirtualProtect/LoadLibrary/GetProcAddressなど)に対してブレークポイントをセットするかAPIロギングツールを使用して、パッカートレース内の"トレースマーカー"としてこれらのAPIを扱うものです。これらのトレースマーカーの間で何かが失敗した(デバッガやブレークポイントが検出された)ならば、その周辺からコードの詳細なトレースを開始しましょう。また、on-access/writeブレークポイントの設定は、膨大なコードをトレースせずとも保護プロセスの興味深い部分を改変/アクセスしようとしている命令をピンポイントに見つけることを可能にします。結果として(うまくいけば)目的の処理を見つけることになります。

 最後に、VMWare内でOllyDbgを実行して定期的にデバッグセッションのスナップショットを記録することで、分析時の特定のトレースの状態に戻ることが可能となります。