コンピュータウイルスのコード静的解析による特徴抽出と分類

要旨

今日、コンピュータウイルスは主に利益目的で作成され、膨大な数の亜種が存在する。それらの亜種はアンチウイルスプログラムによる検出を避けるために、わずかに改変されている。その検出を避けるための改変は容易であり、安価で亜種を作ることができる。

一般的なコンピュータウイルスの検出方法としてパターンマッチ法がある[1]。パターンマッチ法では検査対象となるプログラムにバイト列が含まれているか調べるだけであり、この方法では既存のコンピュータウイルスしか発見できない。

一方、未知のコンピュータウイルスを検出する方法としてヒューリスティック法がある[1]。ヒューリスティック法では検査対象となるプログラムのコードを分析することで未知のコンピュータウイルスの検出が可能である。しかしヒューリスティック法では誤認という問題がある。

プログラムの実行時の動作からコンピュータウイルスを検出する方法がある[1]。この方法の問題点は、検査対象のプログラムがコンピュータウイルスとして動作するまで検出ができないことである。

また最近ではプログラムの構造からコンピュータウイルスを検出する方法が研究されている[2] [3] [4]

本研究ではわずかな改変では検出を回避できず、かつプログラムの実行前にコンピュータウイルスを検出する方法を検討する。具体的にはプログラムを逆アセンブルし、コード内の API 呼び出しや制御フローを静的解析することで特徴を抽出し、コンピュータウイルスの検出を行った。また特徴の共通部分グラフを比較することからもコンピュータウイルスの検出を試みた。

API 呼び出しを抽出する方法では、逆アセンブルした結果を関数の呼び出しに沿って解析し、呼び出されている API を抽出した。抽出した API の並びを 1 つの配列とみなし、各々のプログラムから求めたこの配列を比較した。結果として各プログラムの違いを数値化することができた。

制御フロー解析の結果は巨大なグラフとなるため、単純な比較はできなかった。ゆえに各プログラムの関数を 1 つの単位として関数内部の制御フローが完全に一致するか否かを比較した。一致した関数の比率から各プログラムが一致する割合を求めることができた。

制御フロー解析の結果からある API が呼び出されたときに、次に呼び出される可能性のある API を求めてグラフ化した。このグラフの一致するエッジの割合を求めることで各プログラムが一致する割合を求めることができた。

また前述のグラフから API 呼び出しが最多となるパス(最長パス)を求めた。この最長パスを API 呼び出しを抽出したときと同様に比較した。

実験の結果からは API 呼び出しや制御フローから特徴を抽出し分類することは可能であった。しかし最長パスを比較する方法では良い結果は得られなかった。最長パスに関しては制御フローを利用したりパスに重みを付けるなどの改良の可能性も検討できると思われる。