自動アンパッカーについて

マルウェア/ウイルスの静的解析を困難にするために、難読化させることをパッキングといいます。そんでもってそれを解除することをアンパッキングといいます。
いろんな統計がありますが、出回っているマルウェアの70〜80%以上がパックされているらしいです。

アンパッキングは人力でもってデバッガでちまちまやれば可能なんですが、面倒ですしデバッガを検知して強制終了するような所謂Anti-Debugging対策されていることもあります。
そこで自動的なアンパッカー、それも未知のパッキング法にも対処でき、耐解析技術への対策を行えるものが求められているわけです。
今回は勉強がてら、既存の自動アンパッカーについてまとめてみます。
元ネタ:http://pferrie.tripod.com/papers/packerproblem.pdf


既存の手法

パッカーを識別

使用されているパッカーを識別し、それをもとにアンパックを行う。
例えばUPXなど、パッキング/アンパッキングのアルゴリズムが判明されているものなら、それに従ってアンパックしてやればいい。
ただしこの手法は未知のパッカーに対しては機能しない。

エミュレーターを使う

パックされたプログラムをエミュレーター上で動かして、メモリイメージなどをもとにアンパックを行う。
高い忠実性を確保するのは難しい。

ダーティメモリの実行

PolyUnpack, Renovo, OllyBone,Saffron, OmniUnpack, Justinなどのアンパッカーで使われている。


自動アンパッカー

PolyUnpack

http://indefinitestudies.files.wordpress.com/2008/09/polyunpack.pdf
アセンブルし、シングルステップごとに現在の命令シーケンスがオリジナルのプログラムに含まれているか判定。

OllyDbgのプラグインとして配布されている。

Renovo

http://bitblaze.cs.berkeley.edu/renovo.html
Instrument instructionsでメモリ書き込みとダーティメモリの実行を追跡。
Webサービスとして提供されてる。

OllyBoneとSaffron

http://www.joestewart.org/ollybone/
http://www.offensivecomputing.net/?q=node/492
x86のデータTLB,命令TLBを利用してダーティページの実行を追跡。
OllyBoneはOllyDbgのプラグインとして、Saffronはソースコードが配布されている(Intel PIN必須)。

OmniUnpack

http://www.acsac.org/2007/papers/151.pdf
OllyBoneに基づいている。
危険なシステムコールを呼び出したら、メモリページをスキャンする。

Justin

http://pferrie.tripod.com/papers/packerproblem.pdf
シマンテック製。
CPU NXと書込不能ページプロテクションを使ってダーティーページの実行を追跡。
Anti-Anti-Unpacking対策がされている。
アンパッキングの終了をヒューリスティックに検知。


まとめ
基本的にアンパッカーに求められていることは以下の4つに集約されます。

  1. 自動的かつ正確にアンパックできること
  2. 未知のパッキング手法にも対応できること
  3. オーバーヘッドが少ないこと
  4. 耐解析技術への対策があること

難しいですねえ。