マルウエアを詳しく解析するには、そのプログラムコードを読み解く必要がある。
一般の人にとっては、コードを解析するのはハードルが高いと思うだろう。実際、コードからマルウエアの挙動や特徴を解析するには、プログラミングやマルウエアに関する知識が不可欠だ。一朝一夕でできることではない。
だが、コード解析の概要を知るだけでも、マルウエアに関する理解を深めるのに役立つ。
今回はそうしたマルウエアのコード解析の概要を、具体例を用いて簡単に紹介しよう。
解析で注目すべき5つの領域
マルウエアのコードを見ていく際には、「実行ファイル」「CPU」「メモリー」の3つにまたがった5つの領域に注目する(図1)。1つ目は、「実行ファイルにおけるコード領域」だ。この領域には実行前のバイナリーデータが存在する。この領域の解析には、「逆アセンブラー▼」というツールを使う。逆アセンブラーで実行ファイルの機械語コードをアセンブリー言語に変換して読み解く。このようにファイル上のコードを解析することを「静的解析」という。
2つ目は「メモリーにおけるコード領域」だ。これは、マルウエアを実行したときにメモリー上に展開されるコードの領域である。この領域の解析では、コードを1命令ずつ動かしながら読み解く。このような解析方法は「動的解析」という。コードがファイルにあるかメモリーにあるかが違うだけで、アセンブリー言語を読み解く点では実行ファイルにおけるコード領域とほぼ同じ▼だ。
3つ目は「メモリーデータ」である。マルウエアが持つ文字列や接続先の情報など、マルウエアが動作しているときにメモリーに一時的に展開される揮発性の高いデータだ。
そして4つ目が「CPUが使用するメモリーのスタック領域▼」、5つ目が「レジスター▼」である。レジスターは、CPUの内部にある動作状態を記録する領域である。レジスターは数や容量があまり多くないので、プログラムの実行に必要な一時的な情報のすべては格納できない。
そこで、メモリーのスタック領域にデータを一時退避して、必要に応じて都度取り出しながら動作する。レジスターの中身は、CPUが命令を1つ実行するごとに変化していく。これとスタック領域に退避した値を組み合わせて、実行中のマルウエアの動作を読み解く。