3.本研究の提案
現在、コンピュータウイルス検出の主な方法はパターンマッチ法である。この方法はコンピュータウイルスとして特徴がある部分のコード(パターン)をデータとして登録し、それが検査対象のプログラムに含まれているかチェックすることでコンピュータウイルスを検出する方法である。特徴があるコードはコンピュータウイルス全体のうちのごく一部に過ぎない。単純にバイト列をデータとして持つ場合もあるが、正規表現のような形で保有する場合もある。
この方法の場合、未知のコンピュータウイルスを検出するのは偶然にも過去のコンピュータウイルスのパターンが新種のコンピュータウイルスに含まれていた場合に限られる。しかしコンピュータウイルス作者はパターンマッチ法での検出を避けるために、登録されているパターンが新しいコンピュータウイルスに含まれないように作る。
Troj/Agentdoc.CとTroj/PcClient.HP(またはTroj/PcClient.VM)とはコードは2箇所が異なるだけである。リスト3-1はTroj/Agentdoc.CのTroj/PcClient.HPと異なる部分、リスト3-2はTroj/PcClient.HPのTroj/Agentdoc.Cと異なる部分である。
リスト3-1
00401013 8B CE mov ecx, esi
00401015 C1 E7 02 shl edi, 2
00402079 89 75 F0 mov [ebp-10h], esi
0040207C 8B 46 60 mov eax, [esi+60h]
リスト3-2
00401013 C1 E7 02 shl edi, 2
00401016 8B CE mov ecx, esi
00402079 8B 46 60 mov eax, [esi+60h]
0040207C 89 75 F0 mov [ebp-10h], esi
リスト3-1とリスト3-2は命令の順番を入れ替えただけである。しかしこの程度の僅かな改変であってもこの部分をパターンとして登録しているならば、パターンマッチ法では検出できなくなる。
またコンパイラのオプションを変更しただけでも生成されるコードは大きく異なる。例えばリスト3-3のソースコードをコンパイラのオプションを変えてコンパイルした場合、
- 最適化なし
- 55 8B EC 83 EC 08 C7 45 FC 00 00 00 00 C7 45 F8 01 00 00 00 EB 09 8B 45 F8 83 C0 01 89 45 F8 83 7D F8 0A 7D 0B 8B 4D FC 03 4D F8 89 4D FC EB E6 33 C0 8B E5 5D C2 10 00
- サイズで最適化
- 6A 01 33 C9 58 03 C8 40 83 F8 0A 7C F8 33 C0 C2 10 00
- 速度で最適化
- 33 C9 B8 01 00 00 00 03 C8 40 83 F8 0A 7C F8 33 C0 C2 10 00
となる。生成されたコードを見るとコンパイラのオプションを変えただけで、まったく別のコードになってしまう。単純にコードを見るだけのパターンマッチ法では検出できない。
リスト3-3
#include <windows.h>
int WINAPI
WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
int i, s = 0;
for (i = 1; i < 10; i++)
s += i;
return 0;
}
一方、未知のコンピュータウイルスを検出する方法としてヒューリスティック法がある。ヒューリスティック法ではアンチウイルスプログラムは検査対象プログラムのコードを分析し、そのプログラムが行う動作を抽出する。その結果得られたプログラムの動作がコンピュータウイルスの動作と似ているか否かでコンピュータウイルスを検出する。単純なヒューリスティック法では1つの動作の一致で判定を行う。より発展したヒューリスティック法では複数の動作を比較し、動作の一致に対して得点を与え、一定の閾値を越えた場合にはヒューリスティックと判定する[1]。
しかしこの方法ではコンピュータウイルスと似ている動作をする正当なプログラムを誤認する可能性がある。従ってヒューリスティック法ではコンピュータウイルスとして判断する閾値を高く設定して、確実にコンピュータウイルスと言える場合にしか検出することはできない。よってヒューリスティック法で検出できるコンピュータウイルスには限界がある。
またヒューリスティック法ではアンチウイルスプログラムが作られたときに想定したコンピュータウイルスらしい動作とは異なる動作をするコンピュータウイルスが作られたときにはプログラムを更新する必要がある。
本研究では実行時ではなく事前にコンピュータウイルスを検出する方法を検討する。コードが変化しても本質的に同じコンピュータウイルスならば検出できることを目指す。また検出方法がコンピュータウイルスの作者側に知られたとしても、その検出方法が有効でなければならない。有効であるとは即ち、新規にコンピュータウイルスを作ることが困難ということである。
本研究ではプログラムを逆アセンブルしその構造からAPIを抽出し、既に解析済みのコンピュータウイルスと比較を行うことでコンピュータウイルスの検出を試みる。