というわけで、ふたたびエアコンの故障したトレーニングルームの模様である。筆者の受講したトレーニングではTitanEngineというUnpackを自動化するためのフレームワークを使用した、このフレームワークを使用して、実際に取り組んだのが次のUnpackツールの開発である。

  • Static Unpacker
  • Dynamic Unpacker

それぞれについて次に説明しよう。

Static Unpackerというのは、実際にPackerによって圧縮されている本来のコード部分に対し、展開に相当する処理を適用して解凍を行うというものである。つまり、圧縮データそのものに操作を加えて抜き出す、ということを行うプログラムのことである。この課題をまる一日やっていたのであるが、コンパイラのエラー出力に対処しながらオフセットを調整したりと、微妙かつ地味なコーディング作業がとても辛かった(苦笑)

苦行のStatic Unpacker開発から解放された翌日からは、Dynamic Unpackerの開発である。Dynamic Unpackerというのは、手動でデバッガを操作し、Packerによる解凍コードを実際に実行させて解凍処理をすすめることを自動化するプログラムのことである。これは図の左側にあるような解凍処理を司るコードを実際に実行させて、右側にあるようなマルウェアの感染動作を司る本来のコードを抽出する、ということである。従来であればこの処理はマルウェア解析エンジニアが手動で行っていたのであるが、スクリプトやTitanEngineのようなフレームワークを使用することで自動化を行い、効率的な解析をすすめることができるというわけである。

Packerの解凍動作

Unpack自動化のキーは「シグネチャ」である。Packerによる解凍コードに一定のパターンを見いだし、そこでコード実行を一時停止(Break)させ、展開されたメモリデータをファイルに出力させる。こうすることで、マルウェア本来のコードだけを取り出し、感染動作の静的解析作業に取りかかることができる。

また、Unpacker作成の上で肝要となるのは、マルウェアの感染動作で使用されるWindows APIを収集することである。厳密に言うと、Windows APIの呼び出しに使用されるデータ構造の保存である。IAT再構築とも呼ばれるこの作業には、TitanEngineを使用して特定のDLLのロードと、Windows APIの関数ポインタ(先頭アドレス)を得るためのコードを事前にシグネチャ化しておくことで、これらのデータを保存させることができる。このようにすることで、静的解析作業を効率的に進めることができるのである。

と、文字にするといかにも効率的かつ先進的なことができそうな感触を得ることができるだろうが、実際のところは山のようにアセンブラコードを読みながらシグネチャを作らなくてはならない(苦笑)。そして、山のようなコードの大半がマルウェア解析者の時間を浪費させるための意味のないジャンクコードである。さらには、チェックサムを使ってデバッガによる解析を検知し、デバッガをクラッシュさせるコードが潜んでいる可能性もある。というわけで、Unpackに関する「銀の弾丸」を得ることはできず、とても地道な作業の上に成り立つものでしかないことをカナダ・モントリオールの地でも再び感じたのであった……。