(57)【要約】本発明は、悪意のあるプログラムやコンピュータウィルスが実行されることによるデータ改ざん、情報漏洩などのリスクからコンピュータを保護することに関する。コンピュータウィルスなどの検出技術としては、従来、パターンマッチングを用いる技術が主流である。一方、本発明においては、アプリケーションプログラムの実行中の振る舞いをチェックすることにより、コンピュータウィルスなど、悪意のあるプログラムの検出を行なう。すなわち、コンピュータ上で新規に生成されたプロセスや実行中のプロセスにアタッチを行ない、ブレークポイントを設定し、コンピュータに重要な変更を加えることができるシステムコールの呼び出しを監視することにより、監視対象プロセスの振る舞いと、過去のコンピュータウィルスの特徴的な振る舞いを比較する。
2004075060.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置を示す情報であるブレークポイント位置情報と、そのアプリケーションプログラムの実行が前記ブレークポイントに到達したときに、そのアプリケーションプログラムの実行で参照されるスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なうための判断プログラムと、を含む情報であるブレークポイント情報を保持するブレークポイント情報保持部と、
アプリケーションプログラムに、前記ブレークポイント情報保持部で保持されたブレークポイント情報に基づいて、ブレークポイントを設定するためのブレークポイント設定部と、
前記アプリケーションプログラムの実行が、前記ブレークポイント設定部で設定されたブレークポイントに到達したとき、前記ブレークポイント情報に含まれる判断プログラムを実行する判断プログラム実行部と、
を有するコンピュータウィルス検出装置。
【請求項２】
アプリケーションプログラムを保持するアプリケーションプログラム保持部と、
アプリケーションプログラム保持部で保持されたアプリケーションプログラムの実行を開始するプログラム実行開始部と、
前記プログラム実行開始部で実行が開始されるアプリケーションプログラムに対して、前記ブレークポイント設定部にプレークポイントの設定を命令するブレークポイント設定命令部と、
を有する請求の範囲第１項に記載のコンピュータウィルス検出装置。
【請求項３】
前記ブレークポイント情報保持部が保持する前記ブレークポイント位置情報は、前記アプリケーションプログラムのシステムコールＡＰＩ関数に基づいて定められる請求の範囲第１項に記載のコンピュータウィルス検出装置。
【請求項４】
前記判断プログラムは、そのアプリケーションプログラムのシステムコールＡＰＩ関数の引数の検査に基づいてそのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断をするためのシステムコール検査プログラムを含む請求の範囲第３項に記載のコンピュータウィルス検出装置
【請求項５】
前記システムコール検査プログラムによって検査される引数は、前記ブレークポイント情報保持部が保持するブレークポイント位置情報で定められるシステムコールＡＰＩ関数の引数である請求の範囲第４項に記載のコンピュータウィルス検出装置。
【請求項６】
前記判断プログラムは、
そのアプリケーションプログラムのシステムコールＡＰＩ関数の実行によりシステムリソースが変更される場合に、その変更されるシステムリソースの複製を作成する複製作成プログラムを含む請求の範囲第４項または請求の範囲第５項に記載のコンピュータウィルス検出装置。
【請求項７】
前記判断プログラム実行部による判断の結果、判断の対象となったアプリケーションプログラムがコンピュータウィルス性を有すると判断された場合に、コンピュータウィルス性を有すると判断されたアプリケーションプログラムのシステムコールＡＰＩ関数の実行をさせないための実行阻止部を有する請求の範囲第４項または請求の範囲第５項に記載のコンピュータウィルス検出装置。
【請求項８】
前記判断プログラム実行部による判断の結果、判断の対象となったアプリケーションプログラムがコンピュータウィルス性を有すると判断された場合に、アプリケーションプログラムが通信を行なう通信システムコールＡＰＩ関数を実行するときに、外部の通信機器に対してアプリケーションプログラムが実行する通信システムコールＡＰＩ関数による通信を失敗させるための命令である通信阻止命令を出力する通信阻止命令出力部を有する請求の範囲第４項に記載のコンピュータウィルス検出装置。
【請求項９】
前記ブレークポイント設定部で設定されたブレークポイントに前記アプリケーションプログラムが到達した履歴を保持する履歴保持部を有し、
前記判断プログラムは、前記履歴保持部で保持された履歴に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する履歴検査プログラムを有する請求の範囲第１項に記載のコンピュータウィルス検出装置。
【請求項１０】
前記アプリケーションプログラムは、バーチャルマシンである請求の範囲第１項に記載のコンピュータウィルス検出装置。
【請求項１１】
前記バーチャルマシンは、携帯電話内で動作する請求の範囲第１０項に記載のコンピュータウィルス検出装置。
【請求項１２】
前記通信阻止命令を受信する通信阻止命令受信部と、
前記通信阻止命令受信部で受信された通信阻止命令に基づいて、通信を阻止する通信阻止部を有する通信機器。
【請求項１３】
アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置を示す情報であるブレークポイント位置情報と、そのアプリケーションプログラムの実行が前記ブレークポイントに到達したときに、前記アプリケーションプログラムの実行で参照されるスタックの内容に基づいて、前記アプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なうための判断プログラムと、を含む情報であるブレークポイント情報を保持するブレークポイント情報保持ステップと、
アプリケーションプログラムに、前記ブレークポイント情報保持ステップにより保持されたブレークポイント情報に基づいて、ブレークポイントを設定するためのブレークポイント設定ステップと、
前記アプリケーションプログラムの実行が、前記ブレークポイント設定ステップにて設定されたブレークポイントに到達したとき、前記ブレークポイント情報に含まれる判断プログラムを実行する判断プログラム実行ステップと、
をコンピュータに実行させるためのコンピュータウィルス検出プログラム。
【請求項１４】
アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置を示す情報であるブレークポイント位置情報と、そのアプリケーションプログラムの実行が前記ブレークポイントに到達したときに、前記アプリケーションプログラムの実行で参照されるスタックの内容に基づいて、前記アプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なうための判断プログラムと、を含む情報であるブレークポイント情報を保持するブレークポイント情報保持ステップと、
アプリケーションプログラムに、前記ブレークポイント情報保持ステップにより保持されたブレークポイント情報に基づいて、ブレークポイントを設定するためのブレークポイント設定ステップと、
前記アプリケーションプログラムの実行が、前記ブレークポイント設定ステップにて設定されたブレークポイントに到達したとき、前記ブレークポイント情報に含まれる判断プログラムを実行する判断プログラム実行ステップと、
を含むコンピュータウィルス検出方法。
【発明の詳細な説明】
【技術分野】  この発明は、電子メール、ＷＥＢ、ピア・ツー・ピアのファイル交換ソフトウェア等により、インターネットなどコンピュータの外部から導入されるなどして実行可能となったプログラムの実行をモニタリングして、コンピュータウィルスの振る舞い、若しくは、コンピュータウィルスに類似した振る舞いを検出し、プログラムの実行停止等の対応をすることに関する。
【背景技術】  現在、コンピュータウィルス（以下、単に「ウィルス」という場合がある。）の検出技術は、パターンマッチングを用いるものが主流である。この技術は、例えば、特開２００３−２１６４４４、特開２００２−１９６９４２、ＷＯ  ０２／０８６７１７  Ａ１などにより開示されている。パターンマッチングは、コンピュータのメモリや、ハードディスク上のファイルに着目し、過去に発見されたウィルスの特徴的なシグネチャと比較してウィルスを検出する。パターンマッチングは誤検出が少ない技術であるが、既知のウィルスしか検出できない。
現在、一日に、約１０〜２０種類の新しいウィルスが見つかっている。一般ユーザが使用するコンピュータが、そのような新しいウィルスを検出し、対処することができるようにするためには、頻繁にアップデートされるウィルス・シグネチャ・ファイルを速やかにアンチウィルス会社から入手して、コンピュータにインストールしなければいけない。ところで、新しいウィルスは、過去のウィルスをほんの少し変えたものが多い。このため、実際のウィルスの振る舞いは、どれも非常に似ているという特徴がある。それにもかかわらず、ウィルスのプログラムという情報としてのパターンは異なるので、ウィルスが発見されるごとに、ウィルス・シグネチャ・ファイルをインストールする必要がある。
ウィルスの検出技術には、パターンマッチングの他に、ヒューリスティックスキャンがある。ヒューリスティックスキャンは、擬似的にコードを実行し、ウィルスに似た挙動をしないかを、エミュレーションに基づいて判断を行なう。しかし、実行ファイルのインストラクションを全てエミュレーションできるとは限らない。また、プログラムサイズが大きく、又は／及び、複雑に暗号化されたウィルスのエミュレーションには、非常に時間がかかる。
【発明の開示】
本発明では、コンピュータ上で、新規にプロセスを生成するか、または実行中のプロセスにアタッチ（Ａｔｔａｃｈ）して、プロセスを監視対象とし、コンピュータに重要な変更を加えることができるシステムコールなどの呼び出しを監視することで、振る舞いを監視する。そして、監視対象であるプロセスの振る舞いと、過去のコンピュータウィルスの特徴的な振る舞いと、を比較する。ウィルスの特徴的な振る舞いが検出されると、監視対象であるプロセスを中止できるように、ユーザに通知などをする。ここで、監視対象プロセスは、主に、インターネットに接続するプロセスを指す。
図１は、コンピュータでのプロセスの実行を概念的に説明する図である。上位の層にアプリケーション１０１、１０２、電子メールソフトウェア１０３、ＷＥＢブラウザ１０４が動作する。このうち、アプリケーション１０２、電子メールソフトウェア１０３、ＷＥＢブラウザ１０４が、インターネットに接続などして、コンピュータの外部からプログラムを導入するプログラムを実行するプロセスであるとする。本発明では、それらのプロセスと、システムコールＡＰＩ層１０５と、の間に、本発明によるセキュリティ層を設ける。このセキュリティ層は、システムコールの呼び出しを監視する層である。
システムコールＡＰＩ層１０５の下には、オペレーティングシステム（以下では、「ＯＳ」と略記する場合がある。）を実現するカーネル層１０６があり、その下層に、デバイスドライバ／ハードウェア１０７の層がある。
通常のコンピュータにおけるＯＳにおいては、カーネルモードと、ユーザモードと、に分かれて処理が行なわれる。システムコールＡＰＩ層１０５より上の部分１０８は、ユーザモードで処理が行なわれる部分であり、システムコールＡＰＩ層１０５より下の部分１０９は、カーネルモードで処理が行なわれる部分である。
ユーザモードで実行するプロセスは、個別のコンテキストと、仮想アドレス空間を持っている。そのため、同じユーザモードで実行するプロセス同士が、他のプロセスのメモリをアクセスできないようになっている。
本発明は、アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置と、そのアプリケーションプログラムの実行がそのブレークポイントに到達したときに、そのアプリケーションプログラムのスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する判断プログラムとを関連付けて保持し、アプリケーションプログラムにブレークポイントを設定し、アプリケーションプログラムの実行がブレークポイントに到達した時には、そのブレークポイントの位置と関連付けて保持された判断プログラムを実行するコンピュータウィルス検出装置を提供する。
また、コンピュータウィルス検出装置は、アプリケーションプログラムを保持し、保持されたアプリケーションプログラムを実行するときに、ブレークポイントをアプリケーションプログラムに設定するようになっていてもよい。
また、ブレークポイントの位置は、システムコールＡＰＩ関数に基づいて定められていてもよい。このようにすることにより、図１のセキュリティ層が実現される。
また、アプリケーションプログラムの実行が、ブレークポイントに到達したときには、システムコールＡＰＩ関数の引数を検査してもよい。
さらに、システムコールＡＰＩ関数が、システムリソースを変更するものである場合には、システムコールの実行の前に、コンピュータウィルス検出装置がシステムリソースの複製が生成されるようになっていてもよい。
また、コンピュータウィルス検出装置は、アプリケーションプログラムがコンピュータウィルス性を有すると判断された際には、システムコールＡＰＩ関数の実行を阻止するようになっていてもよい。
また、システムコールＡＰＩ関数が通信を行なうものである場合には、コンピュータウィルス検出装置は、その通信を失敗させるよう外部の通信機器（例えば、ルータ）に命令を出力するようになっていてもよい。
また、アプリケーションプログラムがコンピュータウィルス性を有するかどうかは、アプリケーションプログラムが到達したブレークポイントの履歴に基づいて判断されるようになっていてもよい。
また、本発明において、アプリケーションプログラムは、Ｊａｖａ（登録商標）などの言語で記述されたプログラムを実行するためのバーチャルマシンであってもよい。また、そのバーチャルマシンは、携帯電話で動作するものであってもよい。
ＷＩＮＤＯＷＳ（登録商標）を含めたＯＳにおいては、プロセスの振る舞いをコントロールする方法として、カーネルドライバを書き、システムコールをフックする方法がある（例えば、コンピュータアソシエイツ社のｅＴｒｕｓｔ  Ａｃｃｅｓｓ  Ｃｏｎｔｒｏｌ  “Ｓｏｆｔ  ｈｏｏｋ”で用いられている方法）。一方、本発明によるプロセスの振る舞いの監視は、デバッガというソフトウェア開発で使われる機能を使用して行なわれる。
本発明における振る舞いの監視は、全てユーザモード、つまりアプリケーション層で行なわれるという特徴を有する。これにより、カーネルドライバを用いる場合にしばしば引き起こされるシステムダウンなどの致命的なエラーの発生が無い。
以下では、本発明の理解を助けるために、従来におけるデバッガの機能について概説を行なう。
図２は、アプリケーションプログラムを実行するプロセス２０１と、デバッガ２０２と、の関係を例示する。（１）まず、デバッガ２０２が、プロセス２０１にアタッチする。アタッチにより、プロセス２０１とデバッガ２０２との関係がＯＳにより管理されるようになる。すなわち、ＯＳは、デバッガ２０２にプロセス２０１を関連付け、例えば、プロセス２０１の状態に変化が発生すると、デバッガ２０２に通知が行なわれるようになる。（２）次に、デバッガ２０２は、プロセス２０１にブレークポイントを設定する。「ブレークポイント」は、プロセス２０１のプログラムカウンタが所定の値になった場合に、ＣＰＵの実行を停止させるメモリアドレスを示す。そのようなメモリアドレスを指定することを、ブレークポイントの設定という。ブレークポイントの設定を行なう方法としては、ブレークポイントが示すメモリアドレス値をＣＰＵに設定したり、ブレークポイントのプログラムカウンタ値が示すメモリアドレスの命令を特殊な命令に置換したりすることにより実現される（例えば、Ｊｏｎａｔｈａｎ  Ｂ．Ｒｏｓｅｎｂｅｒｇ著、″Ｈｏｗ  Ｄｅｂｕｇｇｅｒｓ  Ｗｏｒｋ、Ａｌｇｏｒｉｔｈｍｓ，Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅｓ，  ａｎｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ″、Ｗｉｌｅｙ  Ｃｏｍｐｕｔｅｒ  Ｐｕｂｌｉｓｈｉｎｇ、１９９７年参照。）。その後、プロセス２０１が実行を開始し、ブレークポイントに到達すると、（２）実行が停止したことがＯＳに通知される。この通知は、プロセス２０１が行なうというよりも、プロセスの実行がブレークポイントに到達することによりＣＰＵに割り込みが発生し、その割り込みを処理するための処理ルーチンにより行なわれる。なお、処理ルーチンは、ＯＳの初期化などにより適宜設定されている。ＯＳが通知を受けると、（４）デバッガ２０２に通知が行き、デバッガ２０２はプロセス２０１の実行がブレークポイントに到達したことを知る。その後、デバッガ２０２の利用者の操作により、（５）プロセス２０１のデバッグの操作が行なわれる。デバッグ操作の代表的なものとしては、プロセスのスタックの内容を読み、関数や手続きが呼ばれたシーケンスを調べたり、引数や変数の値などを調べたりする。
なお、ブレークポイントはプロセスごとに設定されるものである。したがって、「アプリケーションプログラムを実行するプロセスにブレークポイントを設定する」という記述が正確であるが、記述が長くなるので、以降では、アプリケーションプログラムと、アプリケーションプログラムを実行するプロセスと、を同一視して、「アプリケーションプログラムにブレークポイントを設定する」などと記述する場合がある。
図３は、従来技術において、高級言語での関数や手続きの呼び出しがどのようにコンパイルされるかを例示する。高級言語において、符号３０１に示すような「ｆ（引数１，引数２，…，引数ｎ）；」という関数ないし手続き（以後、「関数」と省略する。）の呼び出しが記述されているとする。これをコンパイルすると、符号３０２に示すようなマシンインストラクションに変換される。すなわち、ｐｕｓｈ命令により引数をスタックに積み、最後に、「ｃａｌｌ  ｆ」により、ｆを呼び出す。多くのＣＰＵでは、ｃａｌｌ  ｆのような、関数を呼び出すマシンインストラクションの実行により、呼び出された関数の処理から戻る際にプログラムカウンタへ設定される値がスタックに積まれる。
図４は、関数ｆのコンパイル結果を例示する。ｆの呼び出しが行なわれると、まず、「ｐｕｓｈ  ｆｐ」というマシンインストラクションにより、ｆの呼び出しの前のフレームポインタ（ｆｐ）の値がスタックに積まれる。「フレームポインタ」は、関数呼び出しのためのスタックの部分を示すためのＣＰＵのレジスタである。フレームポインタは、後述するように、関数の呼び出し列（コールシーケンス）を得るために重要な役割をする。次に、「ｍｏｖｅ  ｓｐ→ｆｐ」によりスタックポインタ（ｓｐ）の値をフレームポインタ（ｆｐ）にセットする。これにより、現在呼び出されているｆのスタックの部分をフレームポインタ（ｆｐ）が指すようになる。その後、ｆの処理が行なわれる。ｆの呼び出しから復帰する際には、「ｐｏｐ  ｆｐ」により、ｆの呼び出しの前のフレームポインタ（ｆｐ）の値が設定され、「ｒｅｔ」により、ｆの呼び出しから復帰する。例えば、スタックに積まれているプログラムカウンタの値が、プログラムカウンタに設定される。
図５は、スタックに値が積まれた状態を例示する。スタック５０１の一番上の部分に積まれている値（すなわち、スタックの一番上の部分に格納されている値）が、現在実行中の関数に係るものであり、エリア５０１の部分には、引数の値が積まれている。エリア５０３には、関数呼び出し後のプログラムカウンタが積まれている。エリア５０４には、関数呼び出し前のフレームポインタ（ｆｐ）の値が積まれている。エリア５０５には、関数の中で定義されている自動変数の値などが格納されている。フレームポインタ（ｆｐ）は、エリア５０４の上部を指しており、エリア５０４に積まれている値は、前の関数呼び出しの時にスタック５０１に積まれたフレームポインタ（ｆｐ）が格納されている位置の上を指している。したがって、フレームポインタの値をたどることにより、どのような呼び出し列を経て、関数が呼び出されたかを知ることができる。また、スタックに積まれたプログラムカウンタの値を調べることにより、関数がプログラムのどの位置から呼ばれたかを知ることができる。また、スタックに積まれた引数を調べることにより、関数にどのような値が与えられたかを知ることができる。
本発明に係るコンピュータウィルス検出装置は、このようなデバッガの機能を利用することにより、プロセスの振る舞いを監視する。ただし、従来技術におけるデバッガにおいては、人間がデバッガを操作してデバッグ対象のプロセスを調査するのに対して、本発明に係るコンピュータウィルス検出装置によるプロセスの振る舞いの監視は、自動的に行なわれる。
また、本発明は、商用ソフトウェアにまつわる課題を解決するものである。以下、スパイウェアを例に用いて説明する。スパイウェアは、インターネット経由でその作成者または発信者に情報を送信するアプリケーションプログラムである。スパイウェアは、バックドア・ウィルスと似た振る舞いをする。悪質なスパイウェアは、ユーザ情報や、キーストロークを盗み、特定の通信チャネルを通して、他のマシンへ情報を送信する。
しかし、アンチウィルス企業の多くは、そのポリシーとしてスパイウェアなどの商用ソフトウェアを検出しない。ハードディスクを破棄する際に使用するデータを消去する商用ソフトウェアがあり、それが友人から電子メールとして送られてくるかも知れないからである。ユーザの意図通りにデータを消去するプログラムは、アンチウィルスでは検出しない。
したがって、プログラムを実行した結果が、コンピュータや、ユーザのビジネスにインパクトを与えるものであっても、現在のアンチウィルス技術では、それらの脅威を完全に防ぐことは不可能である。
現在のウィルスは、わずかにＬｉｎｕｘ（登録商標）で活動するものがあるが、圧倒的にＷＩＮＤＯＷＳ（登録商標）で活動する。その一つの原因として、ＷＩＮＤＯＷＳ（登録商標）を使うほとんどの人々は、アドミニストレータ権限をログオン・ユーザに加えていることが挙げられる。アドミニストレータ権限は、アプリケーションをインストールする際に必要だが、ＵＮＩＸ（登録商標）のようにシステム管理者のために一時的に、ｒｏｏｔ（特権ユーザ）になる習慣がＷＩＮＤＯＷＳ（登録商標）にはない。ＷＩＮＤＯＷＳ（登録商標）では、アドミニストレータのような特権ユーザのまま、メールで送られてきた不審なファイルがしばしば実行される。
アドミニストレータ権限は、システムの全ての資源にアクセスできる。つまりはシステムが稼動するために必要な重要なファイルを改ざんできる。こういった環境で、ウィルスを実行すると、コンピュータの重要なファイルが改ざんされ、さらにはインターネットを通して、世界中のコンピュータがウィルスに感染することがある。プログラムの実行環境は、ユーザのためにもっと適切に保護されるべきである。
【図面の簡単な説明】  図１は、従来技術における、コンピュータでのプロセスの実行を概念的に説明する図である。
図２は、従来技術における、アプリケーションプログラムを実行するプロセスと、デバッガと、の関係を例示する。
図３は、従来技術において、高級言語での関数や手続きの呼び出しがどのようにコンパイルされるかを例示する。
図４は、従来技術における関数のコンパイル結果を例示する。
図５は、従来技術において、スタックに値が積まれた状態を例示する。
図６は、従来技術において、仮想プロセス空間にＤＬＬファイルがマッピングされた状態を例示する。
図７は、従来技術におけるプロセスの仮想メモリ空間を示す。
図８は、本発明における処理のフローチャートを例示する。
図９は、本発明の実施形態１に係るコンピュータウィルス検出装置の機能ブロック図を例示する。
図１０は、ブレークポイント情報が保持されている状態の一例を示す。
図１１は、アプリケーションプログラムごとにブレークポイント情報が提供されている様子を例示する。
図１２は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
図１３は、本発明の実施形態２に係るコンピュータウィルス検出装置による表示画面を例示する。
図１４は、本発明の実施形態２に係るコンピュータウィルス検出装置の機能ブロック図を例示する。
図１５は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
図１６は、本発明の実施形態３におけるブレークポイント情報を例示する。
図１７は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
図１８は、本発明の実施形態７に係るコンピュータウィルス検出装置の機能ブロック図を例示する。
図１９は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
図２０は、本発明の実施形態８の概要を例示する。
図２１は、本発明の実施形態８に係るコンピュータウィルス検出装置の機能ブロック図を例示する。
図２２は、通信阻止命令の一例を示す。
図２３は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
図２４は、本発明の実施形態８に係る通信機器の機能ブロック図を例示する。
図２５は、通信機器の処理のフローチャートである。
図２６は、本発明の実施形態９に係るコンピュータウィルス検出装置の機能ブロック図を例示する。
図２７は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
図２８は、本発明の実施形態１０に係るコンピュータウィルス検出装置の使用の形態を例示する。
図２９は、本発明の実施形態１１に係るコンピュータウィルス検出装置の使用の形態を例示する。
【発明を実施するための最良の形態】  以下、本発明を実施するための最良の形態について、図を用いて実施形態として説明する。なお、本発明は、これら実施形態に何ら限定されるものではなく、その要旨を逸脱しない範囲において、種々なる態様で実施し得る。
（本発明の概要）
本発明は、プログラムの振る舞いに着目し、プログラムがウィルスかどうかを判断する。本発明を具現化したプロセスと、監視対象のプロセスは、デバッガ（Ｄｅｂｕｇｇｅｒ）と、デバッギ（Ｄｅｂｕｇｇｅｅ）の関係に類似した関係を持つ。デバッガは、本発明を具現化したプロセスに対応し、デバッギは、監視対象のプロセスに対応する。
デバッグされるプロセスをデバッギという。本発明は、監視対象プロセスをデバッギとして実行する。実行中のプロセスを監視する場合には、実行中のプロセスにアタッチする。
本発明を具現化するプロセスは、監視対象プロセスの振る舞いをチェックするため、システムに重要な変更を加えるシステムコール（またはＡＰＩ関数）にブレークポイント（Ｂｒｅａｋｐｏｉｎｔｓ）を設定する。
ブレークポイントは、Ｉｎｔｅｌ（登録商標）ＣＰＵの場合には、Ｉｎｔ３のハードウェア割り込みインストラクションを、ブレークポイントが示すメモリアドレスに配置することにより実現できる。プロセスの実行がブレークポイントに到達すると、そのプロセスの実行は停止し、本発明に係るコンピュータウィルス検出装置が、そのプロセスのスタックの内容などを調査して、監視対象のプロセスの振る舞いと、過去のコンピュータウィルスの特徴的な振る舞いを比較する。
ウィルスの特徴的な振る舞いとしては、以下のものを挙げることができる。
・自分自身をシステムフォルダにコピーする。
・ネットワークで共有されたディレクトリを探す。そして、自分自身をコピーする。
・メールのアドレス帳にアクセスし、ウィルスを添付したメールを大量に送信する。
・ファイル交換ソフトウェアがインストールされていれば、それを使って自分自身をばらまく。
・重要なシステムファイルを消す。または改ざんする。
・再起動しても、自分自身が実行されるように、システムを変更する。
本発明は、監視対象プロセスのＡＰＩ呼び出しを過去のコンピュータウィルスの振る舞いなどと比較し、監視対象プロセスの停止や、ユーザへの警告を発する。
以下、ＷＩＮＤＯＷＳ（登録商標）を例に具体的に述べる。ＷＩＮＤＯＷＳ（登録商標）では、ファイルやディレクトリを操作するＡＰＩは、ＫＥＲＮＥＬ３２．ＤＬＬというファイルに含まれている。レジストリに関連するＡＰＩは、ＡＤＶＡＰＩ３２．ＤＬＬに含まれている。ネットワークの共有ドライブを操作するＡＰＩは、ＭＰＲ．ＤＬＬに含まれている。以下、これらをＤＬＬファイルと呼ぶ。
監視対象のプロセスがどのＡＰＩを呼び出そうとしているか判断する方法を以下に述べる。監視対象プロセスが実行を開始するときに、ＤＬＬファイルは、仮想プロセス空間にマッピングされる。
図６は、仮想プロセス空間６０１に、Ｋｅｒｎｅｌ３２．Ｄｌｌ、ＭＲＰ．Ｄｌｌ、Ａｄｖａｐｉ３２．Ｄｌｌがマッピングされた状態を例示する。このようにマッピングが行なわれることにより、監視対象プロセスは、例えば、Ａｄｖａｐｉ３２．Ｄｌｌで定義されているＲｅｇＣｒｅａｔｅＫｅｙＥｘなどの関数を呼び出すことができる。
図７は、プロセスの仮想メモリ空間を示す。仮想メモリ空間７００は、メモリアドレスの小さい方から、インストラクションの部分７０１、ヒープの部分７０２、ＤＬＬファイルがマッピングされる部分７０３、スタックの部分７０４を有する。部分７０３は、ヒープの部分７０２とスタックの部分７０４との間に位置し、ＤＬＬファイルがマッピングされる。すなわち、部分７０３のメモリアドレスに対して参照を行なうと、ファイルとして格納されているＤＬＬファイルの内容が得られる。
ＤＬＬファイルのマップアドレス（ＤＬＬファイルが仮想メモリ空間へマッピングされた部分の最初のアドレス）は、イメージベースと呼ばれ、各ＤＬＬでユニークに、他と重複しないよう決められている。
例えば、レジストリを操作するＲｅｇＯｐｅｎＫｅｙＥｘＡというＡＰＩは、ＡＤＶＡＰＩ３２．ＤＬＬに含まれている。
ＲｅｇＯｐｅｎＫｅｙＥｘＡのアドレスを、「ＡＤＶＡＰＩ３２．ＤＬＬのイメージベース」＋「ＲｅｇＯｐｅｎＫｅｙＥｘＡのＲＶＡ」により求める。なお、「ＲＶＡ」とは、Ｒｅｌａｔｉｖｅ  Ｖｉｒｔｕａｌ  Ａｄｄｒｅｓｓの略である。すなわち、ＤＬＬファイルの中に、ＡＰＩの定義が現れる相対的な位置である。
アドレスが求められたら、デバッガ用ＡＰＩなどを使用してブレークポイントを設定する。
監視対象プロセスの実行が、ブレークポイントにヒットしたら、ＡＰＩの引数などを解析する。
監視対象プロセスが、レジストリやシステムファイルに変更を加えるＡＰＩを呼び出した場合、このステップで、バックアップを作成する。
ウィルスの特徴を検出したらプロセスの停止、またはユーザにレポートする。検出しなければ処理を続ける。
具体例を説明する。多くのＷＩＮＤＯＷＳ（登録商標）ウィルスは実行すると再起動時に、システムに常駐するために、以下のレジストリへ値を追加する。
ＨＫＥＹ＿ＬＯＣＡＬ＿ＡＣＨＩＮＥ￥ＳＯＦＴＷＡＲＥ￥ＭＩＣＲＯＳＯＦＴ￥Ｗｉｎｄｏｗｓ￥ＣｕｒｒｅｎｔＶｅｒｓｉｏｎ￥Ｒｕｎ
参考として、このキーに値を追加するメジャーなウィルスを以下に挙げる。
ＮＩＭＤＡ，ＬＯＶＥＬＡＴＴＥＲ，ＴＲＯＪ＿ＭＡＴＲＩＸ，Ｗ３２＿ＭＡＧＩＳＴＲ，ＴＲＯＪ＿ＨＹＢＲＩＳ，ＷＯＲＭ＿ＫＬＥＺ，ＷＯＲＭ＿ＢＵＧＢＥＡＲ，ＷＯＲＭ＿ＢＡＤＴＲＡＮＳ，ＪＳ＿ＥＸＣＥＰＴＩＯＮ，ＷＯＲＭ＿ＬＩＲＢＡ
メールで受け取った不明なプログラムがシステムに常駐する必要はないと考えられる。
上記レジストリを追加するには、次の２ステップのＡＰＩ呼び出しが必要である。
ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡ  …  Ｒｕｎの下に新しいキーを作る。
ＲｅｇＳｅｔＶａｌｕｅＥｘＡ    …  値をセットする。
上の２つのＡＰＩは、ＡＤＶＡＰＩ３２．ＤＬＬに含まれている。ここでは、ＡＤＶＡＰＩ３２．ＤＬＬのイメージベースが０ｘ７７Ｄ８００００であるとする。数字の０ｘは、１６進数であることを示す。また、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡのＲＶＡが０ｘ２９４２７、ＲｅｇＳｅｔＶａｌｕｅＥｘＡのＲＶＡが０ｘ２Ｃ５８Ｄであるとする。
ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡのアドレスは、
０ｘ７７Ｄ８００００＋０ｘ２９４２７＝０ｘ７７ＤＡ９４２７
ＲｅｇＳｅｔＶａｌｕｅＥｘＡのアドレスは、
０ｘ７７Ｄ８００００＋０ｘ２Ｃ５８Ｄ＝０ｘ７７ＤＡＣ５８Ｄ
で求められる。これらは仮想アドレス空間であるから同時に複数のプロセスが実行されていても、同じ仮想アドレスでＤＬＬファイルがマップされる。
アドレスを求めたら、それらへブレークポイントを設定する。
もし、監視対象のプロセスが、ＷＩＮＤＯＷＳ（登録商標）起動時に自動実行するプログラムであれば、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡのブレークポイントがヒットする。次にスタックを解析する。Ｃ言語などのコンパイラでは、スタックを介して引数が受け渡されるようなマシンインストラクションが生成されるためである。
８００００００２  ００４１ｆ０２８  ＡＤＶＡＰＩ３２！ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡ
例えば、上記の数値が得られたとする。ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡを呼ぶ際には、２番目の引数はレジストリの位置である。この例では、メモリアドレス４１ｆ０２８へレジストリの位置が入っている。そこで、メモリアドレス４１ｆ０２８をチェックする。
＞４１ｆ０２８
４１ｆ０２８      ＳＯＦＴＷＡＲＥ￥Ｍｉｃｒｏｓｏ
４１ｆ０３８      ｆｔ￥Ｗｉｎｄｏｗｓ￥Ｃｕｒｒｅ
４１ｆ０４８      ｎｔＶｅｒｓｉｏｎ￥Ｒｕｎ￥Ｖｉ
４１ｆ０５８      ｒｕｓ
ＡＰＩと引数から、監視プロセスは、Ｒｕｎの下にＶｉｒｕｓというキーを作ろうとしていることが分かる。
プログラム実行前の状態に復帰する場合には、Ｖｉｒｕｓキーを削除すればよい。そこで、システムコールの実行の前にレジストリなどのシステムリソースの変更の履歴や、システムリソースの複製、などを保持するようにしてもよい。
同様に、プログラムの振る舞いを把握するために必要なＡＰＩをチェックし、その呼び出しの傾向を解析する。
呼び出しを監視するＡＰＩと、引数の対応（以下これを検出ルールと呼ぶ）は、ハードコーディングではなく、検出ルールを記したファイルを外部、例えばインターネットから読み込むことで追加、変更できることが望ましい。
この方法では、ファイルをスキャンするオーバーヘッドは、一切無い。ウィルスの特徴的な振る舞いを検出したら、監視対象のプロセスをユーザの意思により、中止させられるように、ダイアログボックス等を表示するのが好適である。
または、プログラムを中止せずに、続けて実行する。フローチャートを図８に例示する。
（実施形態１）
本発明の実施形態１として、ブレークポイント位置情報と、アプリケーションプログラムがそのブレークポイント位置情報で示すブレークポイントに到達した場合に実行する判断プログラムと、を関連付けて保持し、ブレークポイントをアプリケーションプログラムに設定して、判断プログラムを実行するコンピュータウィルス検出装置について説明する。
（実施形態１：構成）
図９は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。コンピュータウィルス検出装置９００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、を有する。
なお、以下の説明から明らかになるように、これらの部を有するコンピュータウィルス検出装置は、コンピュータで動作するプログラムとして実現が可能である。したがって、図９は、そのようなプログラムのモジュール構成を示す図であると解釈することもできる。すなわち、そのようなプログラムは、ブレークポイント情報保持部をプログラムにより実現するプレークポイント情報保持ステップと、ブレークポイント設定部をプログラムにより実現するブレークポイント設定ステップと、判断プログラム実行部をプログラムにより実現する判断プログラム実行ステップと、をコンピュータに実行させるためのプログラムである。
「ブレークポイント情報保持部」９０１は、ブレークポイント情報を保持する。例えば、ハードディスクや半導体メモリなどに、ブレークポイント情報を保持する。「ブレークポイント情報」とは、ブレークポイント位置情報と、判断プログラムと、を含む情報である。「含む」とあるので、ブレークポイント情報の成分は、ブレークポイント位置情報と判断プログラムとに限られない場合がある。
「ブレークポイント位置情報」とは、アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置を示す情報である。ブレークポイントの位置は、例えば、アプリケーションプログラムのメモリアドレスによって示される。また、アプリケーションプログラムが呼び出す関数、手続き、メソッド（以下、「関数など」という。）の名前によっても示される場合がある。
「判断プログラム」とは、そのアプリケーションプログラムの実行が前記ブレークポイントに到達したときに、そのアプリケーションプログラムの実行で参照されるスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なうためのプログラムである。「そのアプリケーションプログラム」とは、後で説明されるブレークポイント設定部９０２によりブレークポイント位置情報で示される位置にブレークポイントが設定されるアプリケーションプログラムを意味する。「前記ブレークポイント」とは、ブレークポイント位置情報が示す位置に設定されたブレークポイントを意味する。
「アプリケーションプログラムがコンピュータウィルス性を有する」場合とは、アプリケーションプログラム自身がコンピュータウィルスである場合のみならず、アプリケーションプログラムがコンピュータウィルスに感染した場合、アプリケーションプログラムのバグやセキュリティホールなどが利用されて設計時には想定されていなかった動作をする場合、などを含む。例えば、ウェブサーバプログラムのバグを利用して、悪意を持った人間が、通常の操作では得ることができないファイルの内容を得るなどの動作をする場合である。
そのアプリケーションプログラムの実行で参照されるスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なう方法としては、種々のものがある。例えば、そのアプリケーションプログラムの実行で参照されるスタックを、スタックの上部からフレームポインタをたどってスタックの下部までたどることができるかどうかを判断する。コンピュータウィルスの中には、スタックの内容を破壊することにより、アプリケーションプログラムが正常に動作するならば呼び出さない態様でシステムコールなどを呼び出す。そこで、スタックの内容が破壊されていないかどうかを判断する。その判断の一つとして、フレームポインタをたどり、プログラムの実行において最初に呼ばれる関数など（例えば、＿ｓｔａｒｔｕｐという名前の関数など）の呼び出しまでたどることができるかどうかにより、アプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なう。
また、アプリケーションプログラムが、ブレークポイントに到達した際、どのような関数などの呼び出し系列を経て到達したかを調べることで、コンピュータウィルス性を有するかどうかの判断を行なってもよい。もし、想定されない関数などの呼び出しの系列の後にブレークポイントに到達している場合には、コンピュータウィルス性を有することが疑われる。
また、ブレークポイントが設定された関数などの引数を調べることにより、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断してもよい。例えば、電子メールを用いて他のコンピュータに自らを感染させるコンピュータウィルスは、電子メールアドレスを取得するために電子メールアドレスのアドレス帳をアクセスする。そこで、アドレス帳へのアクセスを行なうための引数が指定されているかどうかに基づいて、判断を行なうようになっていてもよい。
なお、多くの場合、コンピュータウィルス検出装置を実現するプログラムを実行するプロセスと、アプリケーションプログラムを実行するプロセスとは、異なるプロセスであり、通常は、コンピュータウィルス検出装置を実現するプログラムが、アプリケーションプログラムを実行するプロセスのメモリ空間の内容、特にスタックの内容を読むことはできない。しかし、オペレーティングシステムは、特定の関係にあるプロセス間であれば、あるプロセスが他のプロセスのメモリ空間やレジスタの内容を読んだり、変更したりすることを許可する機能を有しているのが通常である。ここでいう「特定の関係」の例としては、親子関係や、同じユーザが実行しているプロセスであり、他のプロセスに対して所定のシステムコール（例えば、ａｔｔａｃｈなど）を実行したという関係、などがある。したがって、コンピュータウィルス検出装置をプログラムにより実現する場合には、そのプログラムを実行するプロセスと、アプリケーションプログラムを実行するプロセスと、は特定の関係になっている必要がある。
なお、ほとんどのオペレーティングシステムでは、他のプロセスのメモリ空間やレジスタの内容を読んだり、変更したりするためのシステムコールが提供されている。あるいは、／ｄｅｖ／ｐｒｏｃというスペシャルデバイスを用いて、他のプロセスのメモリ空間やレジスタの内容を読んだり、変更したりすることができるようになっている場合もある。
判断プログラムは、例えば、インタープリタによって実行されるものであってもよい。例えば、判断プログラムがＬｉｓｐ、Ｐｅｒｌ、Ｒｕｂｙなどの言語により記述されていてもよい。また、判断プログラムは、コンピュータが直接実行できるマシンインストラクションの列からなっていてもよい。この場合には、コンピュータウィルス検出装置を実現するプログラムの一部として、判断プログラムが組み込まれていてもよい。あるいは、判断プログラムが、例えば、動的ライブラリなどとして、動的にコンピュータウィルス検出装置を実現するプログラムにロードされるようになっていてもよい。なお、判断プログラムが、インタープリタで実行されるものであったり、動的にロードされるものであったりする場合には、判断プログラムを差し替えることが容易に行なえる。
図１０は、ブレークポイント情報がブレークポイント情報保持部９０１により保持されている状態の一例を示す。図１０（ａ）においては、ブレークポイント情報がテーブルに保持されている。列１００１には、ブレークポイント位置情報が格納され、列１００２には、判断プログラムが格納される。図１０（ｂ）は、判断プログラムへのポインタがテーブルに格納されている状態の一例を示す。そのポインタは、コンピュータウィルス検出装置を実現するプログラムを実行するプロセスのメモリ空間内部における特定の場所を指す。
図１１は、アプリケーションプログラムごとにブレークポイント情報が提供されている様子を例示する。ブレークポイント情報保持部９０１は、このように、アプリケーションプログラムごとにブレークポイント情報を保持していてもよい。
「ブレークポイント設定部」９０２は、アプリケーションプログラムに、ブレークポイント情報保持部９０１で保持されたブレークポイント情報に基づいて、ブレークポイント情報を設定する。すなわち、ブレークポイント情報に含まれるブレークポイント位置情報が示す位置にブレークポイントを設定する。この設定は、オペレーティングシステムが提供するシステムコールやスペシャルデバイスを用いて行なう。「基づいて」とは、例えば、ブレークポイント位置情報が関数などの名前を用いて表現されている場合には、関数などの名前から、その関数などのアドレスを得ることを意味する。関数などの名前と、そのアドレスと、の対応付けは、アプリケーションプログラムのシンボルテーブルを読むことなどによって得ることができる。
「判断プログラム実行部」９０３は、前記アプリケーションプログラムの実行が、ブレークポイント設定部９０２で設定されたブレークポイントに到達したとき、前記ブレークポイント情報に含まれる判断プログラムを実行する。「前記アプリケーションプログラム」とは、ブレークポイント設定部９０２によりブレークポイントが設定されたアプリケーションプログラムである。コンピュータウィルス検出装置は、ブレークポイントが設定されたアプリケーションプログラムの実行がブレークポイントに到達するまで待つことを行なう。このためには、例えば、ｗａｉｔシステムコールが呼び出される。アプリケーションプログラムの実行がブレークポイントに到達すると、（１）ｗａｉｔシステムコールからコンピュータウィルス検出装置の処理が再開し、（２）どのブレークポイントに到達したかを判断し、（３）判断プログラム実行部９０３に、判断プログラムを実行させる。アプリケーションプログラムがどのブレークポイントに到達したかを判断するには、アプリケーションプログラムを実行するプロセスのレジスタに保持されているプログラムカウンタの値を取得することにより判断する。
（実施形態１：処理）
図１２は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
ステップＳ１２０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。例えば、この処理はブレークポイント設定部９０２により行なわれる。
ステップＳ１２０２において、アプリケーションプログラムの実行が、ブレークポイントに到達するまで待つ。この処理は、例えば、ｗａｉｔシステムコールを実行することにより、実現される。
ステップＳ１２０３において、アプリケーションプログラムの実行が到達したブレークポイントに対応する判断プログラムを実行する。例えば、この処理は判断プログラム実行部９０３により行なう。
ステップＳ１２０４において、処理を終了するかどうかを判断する。例えば、ステップＳ１２０３における判断プログラムの実行により、アプリケーションプログラムがコンピュータウィルス性を有すると判断された場合には、処理を終了する。もし、処理を終了しないと判断された場合には、ステップＳ１２０５へ処理を移行する。
ステップＳ１２０５において、アプリケーションプログラムの実行を続ける。アプリケーションプログラムがブレークポイントに到達すると、アプリケーションプログラムの実行が停止するので、停止したところから処理を再開させる。例えば、アプリケーションプログラムを実行するプロセスにシグナル（例えば、ＳＩＧ＿ＣＯＮＴ）を送る。その後、ステップＳ１２０２へ処理を移行する。
なお、コンピュータウィルス検出装置は、ブレークポイント情報保持ステップと、ブレークポイント設定ステップと、判断プログラム実行ステップと、を含むコンピュータウィルス検出方法を使用するための装置と考えることができる。「ブレークポイント情報保持ステップ」は、ブレークポイント情報を保持するステップであり、「ブレークポイント設定ステップ」は、アプリケーションプログラムに、ブレークポイント情報保持ステップで保持されたブレークポイント情報に基づいて、ブレークポイントを設定するステップであり、「判断プログラム実行ステップ」とは、アプリケーションプログラムの実行が、ブレークポイント設定ステップで設定されたブレークポイントに到達したとき、ブレークポイント情報に含まれる判断プログラムを実行するステップである。すなわち、ブレークポイント情報保持ステップは、ブレークポイント情報保持部を動作するステップであり、ブレークポイント設定ステップは、ブレークポイント設定部を動作するステップであり、判断プログラム実行ステップは判断プログラム実行部を実行するステップである。なお、本発明に係るコンピュータウィルス検出方法の使用は、本発明に係るコンピュータウィルス検出装置に限定されることはない。
（実施形態１：主な効果）
本実施形態により、オペレーティングシステムのカーネル内部に修正を加えることなく、アプリケーションプログラムを実行するプロセスの振る舞いを、コンピュータウィルス検出装置により監視することができるので、システムダウンの発生を回避することが可能となる。また、コンピュータウィルスの振る舞いは非常に似ている場合が多いので、従来のアンチウィルスソフトウェアにおいて必要であった、パターンファイルを最新のものに更新し続けることの必要性が低くなったり、パターンファイルの更新が不要となったりする。
（実施形態２）
本発明の実施形態２として、アプリケーションプログラムを保持するコンピュータウィルス検出装置を説明する。
図１３は、本実施形態に係るコンピュータウィルス検出装置による表示画面を例示する。ウィンドウ１３０１は、本実施形態に係るコンピュータウィルス検出装置が表示するウィンドウである。そのウィンドウのサブウィンドウ１３０２に、アプリケーションプログラムのアイコンが表示されている。必要に応じて、ウィンドウ１３０１の外に表示されているアイコン（例えば、アイコン１３０４）をドラッグして、サブウィンドウ１３０２の内部に移動させることができる。サブウィンドウ１３０２の内部に表示されたアイコン（例えば、アイコン１３０３）をダブルクリックなどすることにより、アプリケーションプログラムを実行するプロセスが、コンピュータウィルス検出装置を実行するプロセスの子プロセスとして生成され、その振る舞いが監視される。
（実施形態２：構成）
図１４は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。コンピュータウィルス検出装置１４００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、アプリケーションプログラム保持部１４０１と、プログラム実行開始部１４０２と、ブレークポイント設定命令部１４０３と、を有する。
したがって、本実施形態に係るコンピュータウィルス検出装置は、実施形態１に係るコンピュータウィルス検出装置が、さらに、アプリケーションプログラム保持部１４０１と、プログラム実行開始部１４０２と、ブレークポイント設定命令部１４０３と、を有する構成となっている。なお、本明細書においては、同じ定義が適用される部には、できるだけ同じ符号を割り当てることにする。なお、同じ符号が割り当てられていることは、実際の製造などにおいて、同一の構成などになることを意味するものではない。
「アプリケーションプログラム保持部」１４０１は、アプリケーションプログラムを保持する。保持には、種々の形態がある。例えば、アプリケーションプログラム全体を格納する形態がある。また、アプリケーションプログラムが格納されている場所、例えばファイルシステムにおけるパスなどで表現される、を格納する形態もあり得る。
「プログラム実行開始部」１４０２は、アプリケーションプログラム保持部１４０１で保持されたアプリケーションプログラムの実行を開始する。例えば、コンピュータウィルス検出装置を実現するプログラムを実行するプロセスの子プロセスとして、アプリケーションプログラムの実行を開始する。
「ブレークポイント設定命令部」１４０３は、プログラム実行開始部１４０２で実行が開始されるアプリケーションプログラムに対して、ブレークポイント設定部９０２に、ブレークポイントの設定を命令する。例えば、ブレークポイント設定部９０２を実現する関数などの呼び出しを行なう。
（実施形態２：処理）
図１５は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
ステップＳ１５０１において、アプリケーションプログラムを保持する。この処理は、アプリケーションプログラム保持部１４０１により行なわれる。例えば、図１３において、アイコン１３０４をサブウィンドウ１３０２の内部にドラッグされたことを検出し、アイコン１３０４が表わすアプリケーションプログラムを保持する。
ステップＳ１５０２において、アプリケーションプログラムが選択されるまで待つ。例えば、図１３において、サブウィンドウ１３０２の内部のアイコンがダブルクリックされるまで待つ。
ステップＳ１５０３において、ブレークポイント位置情報が示す位置に、ブレークポイントを、選択されたアプリケーションに設定することを命ずる。この処理は、ブレークポイント設定命令部１４０３により行なわれる。
ステップＳ１５０４において、ブレークポイントの設定の完了を待つ。例えば、ブレークポイント設定部９０２を実現する関数などの呼び出しから戻るまで待つ。
ステップＳ１５０５において、選択されたアプリケーションプログラムを実行する。より正確に述べると、選択されたアプリケーションプログラムを実行するためのプロセスを実行させる。ステップＳ１５０５の後は、図１２のフローチャートのステップＳ１２０２、ステップＳ１２０３、ステップＳ１２０４、ステップＳ１２０５を実行することとなる。最近のオペレーティングシステムにおいては、一つのプロセスの中で複数のスレッドを並列／平行に動作させることが可能となっている。そこで、ステップＳ１２０２、ステップＳ１２０３、ステップＳ１２０４、ステップＳ１２０５の実行は、図１５のフローチャートを実行するスレッドとは別のスレッドにより行なわれてもよい。
ステップＳ１５０６により、処理を終了するかどうかを判断する。例えば、コンピュータウィルス検出装置の操作者が、終了ボタンを押したかどうかにより判断する。もし、終了でなければ、ステップＳ１５０２へ戻る。
（実施形態２：主な効果）
本実施形態により、振る舞いを監視するべきアプリケーションプログラムを実行するプロセスを容易に生成することが可能となる。また、コンピュータウィルスを外部から導入する虞が無いアプリケーションプログラムは、監視の対象としないようにすることができるので、ブレークポイントの設定により、そのようなアプリケーションプログラムを実行するスピードを低下させることがない。
（実施形態３）
本発明の実施形態３として、システムコールＡＰＩ関数にブレークポイントを設定し、プロセスの振る舞いを監視するコンピュータウィルス検出装置について説明する。
（実施形態３：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態１又は２のコンピュータウィルス検出装置のブレークポイント情報保持部９０１が保持するブレークポイント情報を、アプリケーションプログラムのシステムコールＡＰＩ関数に基づいて定められるようにしたものである。
「システムコールＡＰＩ関数」とは、システムコールを呼び出すためのライブラリ関数などを意味する。そのようなライブラリ関数などは、通常は、システムコールに対する引数をスタックに積み、トラップ命令を実行するようになっている。トラップ命令の実行により、オペレーティングシステムによりＣＰＵに設定された割り込みルーチンが起動され、オペレーティングシステム内部の処理が開始される。スタックに引数を積み、トラップ命令を実行する処理を、直接に高級言語で表現することは困難であるので、そのような処理を行なうライブラリ関数などが用意されている。
図１６は、本実施形態におけるブレークポイント情報を例示する。図１６において、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡがシステムコールＡＰＩ関数の名前となっている。したがって、ブレークポイント設定部がブレークポイントを設定する場合には、システムコールＡＰＩ関数の名前をアドレスに変換する必要がある。その変換の処理については、概要の項で説明した通りである。
（実施形態３：主な効果）
コンピュータウィルスは、システムコールＡＰＩ関数を用いて、自身をコンピュータに感染させることが多いので、システムコールＡＰＩ関数の呼び出しを検出して、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断することで、少ないブレークポイントの設定で的確に判断することが可能となる。
（実施形態４）
本発明の実施形態４として、システムコールＡＰＩ関数の引数の検査に基づいて、判断を行なうコンピュータウィルス検出装置について説明する。
（実施形態４：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態３に係るコンピュータウィルス検出装置において、判断プログラムに、システムコール検査プログラムを含ませた構成となっている。「システムコール検査プログラム」とは、そのアプリケーションプログラムが呼び出すシステムコールＡＰＩ関数の引数の検査に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断をするためのプログラムである。「そのアプリケーションプログラム」とは、ブレークポイント設定部９０２によりプレークポイントが設定されたアプリケーションプログラムを意味する。
したがって、本実施形態においては、アプリケーションプログラムの実行がブレークポイントに到達すると、アプリケーションプログラムのシステムコールＡＰＩ関数の引数が検査されることになる。この検査の結果に基づいて、アプリケーションプログラムがコンピュータウィルス性を有するかどうかが判断される。
なお、本実施形態において、引数が検査されるシステムコールＡＰＩ関数は、ブレークポイントが設定されたものに限定はされない。例えば、アプリケーションプログラムのマシンインストラクションを全て調べて、全てのシステムコールＡＰＩ関数の引数が検査されるようになっていてもよい。また、到達したブレークポイントでのシステムコールＡＰＩ関数の引数を記憶しておき、後にブレークポイントに到達したときに、記憶されたシステムコールＡＰＩ関数に引数を検査するようになっていてもよい。
（実施形態４：主な効果）
本実施形態では、システムコールＡＰＩ関数の引数の検査に基づいて、コンピュータウィルス性が判断されるので、より的確に判断を行なうことが可能となる。
（実施形態５）
本発明の実施形態５として、到達したブレークポイントにおけるシステムコールＡＰＩ関数の引数を検査するコンピュータウィルス検出装置について説明する。
（実施形態５：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態４に係るコンピュータウィルス検出装置において、システムコール検査プログラムによって検査される引数を、ブレークポイント情報保持部９０１が保持するブレークポイント位置情報で定められるシステムコールＡＰＩ関数の引数としたものである。
例えば、図１６に例示されるように、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡというシステムコールＡＰＩ関数にブレークポイントが設定され、アプリケーションプログラムの実行がそのブレークポイントに到達した場合には、システムコール検査プログラムは、そのＲｅｇＣｒｅａｔｅＫｅｙＥｘＡの引数を検査する。その検査の例は、本発明の概要の項で述べたとおりである。
（実施形態５：主な効果）
本実施形態により、呼び出されたシステムコールＡＰＩ関数の引数の検査に基づいてコンピュータウィルス性の判断がされるので、より的確に判断を行なえる。
（実施形態６）
本発明の実施形態６として、システムリソースを変更するシステムコールＡＰＩ関数が呼ばれた場合、変更されるシステムリソースの複製を生成するコンピュータウィルス検出装置について説明する。
（実施形態６：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態４または５のコンピュータウィルス検出装置において、判断プログラムに、複製作成プログラムを含ませた構成となっている。「複製作成プログラム」は、そのアプリケーションプログラムのシステムコールＡＰＩ関数によりシステムリソースが変更される場合に、その変更されるシステムリソースの複製を生成する。「そのアプリケーションプログラム」とは、ブレークポイント設定部９０２によりブレークポイントの設定が行なわれたアプリケーションプログラムである。
したがって、本実施形態においては、ブレークポイント位置情報は、システムリソースを変更するシステムコールＡＰＩ関数の位置を示すこととなる。ここでいうシステムリソースとは、例えば、レジストリ、ファイルなど、コンピュータが使用するリソースのうち、複製が可能なリソースを意味する。
例えば、レジストリを変更するシステムコールＡＰＩ関数にブレークポイントを設定しておき、アプリケーションプログラムの実行が、そのブレークポイントに到達した場合には、レジストリの複製をする複製作成プログラムが実行される。複製が作成されると、システムコールによりレジストリの変更が行なわれる。レジストリの複製するにあったては、レジストリ全体を複製してもよいし、変更される部分だけを複製してもよい。レジストリの変更される部分は、システムコールＡＰＩ関数の引数により判断することができる。
なお、本実施形態において、複製作成プログラムの実行は、アプリケーションプログラムがコンピュータウィルス性を有すると判断される場合に行なうようにしてもよい。これにより、作成される複製の量を減らすことができる。
（実施形態６：処理）
図１７は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
ステップＳ１７０１において、ブレークポイント位置情報が示す位置に、ブレークポイントをアプリケーションプログラムに設定する。
ステップＳ１７０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
ステップＳ１７０３において、判断プログラムを実行する。
ステップＳ１７０４において、判断プログラムの実行の結果が、アプリケーションプログラムがコンピュータウィルス性を有するものであるかどうかを判定する。もし、コンピュータウィルス性を有するものであれば、ステップＳ１７０５へ処理を移行させ、そうでなければ、ステップＳ１７０７へ処理をスキップさせる。
ステップＳ１７０５において、アプリケーションプログラムがシステムリソースを変更しようとしているかどうかを判定する。この判定は、到達したブレークポイントに係るシステムコールＡＰＩ関数の種類、その引数を調べることにより行なうことができる。もし、システムリソースを変更しようとしている場合には、ステップＳ１７０６へ処理を移行させ、そうでなければ、ステップＳ１７０７へ処理をスキップさせる。
ステップＳ１７０６において、複製作成プログラムにより、システムリソースの複製を作成する。
ステップＳ１７０７において、全体の処理を終了するかどうかを判断する。もし、終了しないと判断されると、ステップＳ１７０８へ処理を移行させる。
ステップＳ１７０８において、アプリケーションプログラムの実行を続け、ステップＳ１７０２へ処理を移行させる。もし、アプリケーションプログラムがコンピュータウィルスであり、システムリソースが不正なものに変更されても、ステップＳ１７０６で作成された複製によりシステムを復元することができる。
（実施形態６：主な効果）
本実施形態においては、変更されるシステムリソースの複製が作成されるので、アプリケーションプログラムがコンピュータウィルスでありコンピュータが感染したとしても、システムリソースの複製を用いてシステムの復旧が可能となる。
（実施形態７）
本発明の実施形態７として、アプリケーションプログラムがコンピュータウィルス性を有すると判断された場合に、システムコールＡＰＩ関数の実行をさせないコンピュータウィルス検出装置について説明する。
（実施形態７：構成）
図１８は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。本実施形態に係るコンピュータウィルス検出装置の構成は、実施形態１から６のいずれかのコンピュータウィルス検出装置が、実行阻止部を有する構成となっている。したがって、例えば、コンピュータウィルス検出装置１８００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、実行阻止部１８０１と、を有する。コンピュータウィルス検出装置１８００は、このほかに、アプリケーションプログラム保持部、プログラム実行開始部、ブレークポイント設定命令部を有していてもよい。
「実行阻止部」１８０１は、判断プログラム実行部９０３による判断の結果、判断の対象となったアプリケーションプログラムがコンピュータウィルス性を有すると判断された場合に、アプリケーションプログラムのシステムコールＡＰＩ関数の実行をさせないための部である。
スタックの使用が図５に例示されたものである場合には、実行阻止部１８０１は、フレームポインタ（ｆｐ）の値を用いて、部分５０４に格納されている関数呼び出し前のフレームポインタの値を取得してフレームポインタ（ｆｐ）に設定し、プログラムカウンタの値を部分５０３に格納されている値にして、システムコールＡＰＩ関数の実行をさせないようにする。
（実施形態７：処理）
図１９は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
ステップＳ１９０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。
ステップＳ１９０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
ステップＳ１９０３において、判断プログラムを実行する。
ステップＳ１９０４において、判断プログラムの結果、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判定する。もし、コンピュータウィルス性を有するのであれば、ステップＳ１９０５へ処理を移行させ、そうでなければ、ステップＳ１９０６へ処理をスキップさせる。
ステップＳ１９０５において、システムコールＡＰＩ関数の実行をさせないようにする。この処理において、実行阻止部１８０１を用いる。
ステップＳ１９０６において、全体の処理を終了させるかどうかを判断する。もし、終了させないのであれば、ステップＳ１９０７へ処理を移行させる。
ステップＳ１９０７において、アプリケーションプログラムの実行を続ける。その後、ステップＳ１９０２へ処理を移行させる。
（実施形態７：主な効果）
本実施形態においては、危険なシステムコールの実行が阻止されるので、例えば、特定のワードプロセッサのマクロプログラムがコンピュータウィルス性を有する場合に、ワードプロセッサの機能を停止させることなく、危険なマクロプログラムの実行を阻止することが可能となり、危険なシステムコールの実行を阻止しつつ、アプリケーションプログラムの実行を継続することができる。
（実施形態８）
本発明の実施形態８として、コンピュータウィルス性を有するアプリケーションプログラムの通信を阻止するコンピュータウィルス検出装置と、通信機器と、について説明する。
図２０は、本実施形態の概要を例示する。コンピュータ２００１が、通信機器２００２を介して外部の通信網２００３に接続されている。通信機器２００２の代表的な例としては、ルータがある。コンピュータ２００１の内部では、アプリケーションプログラムを実行するプロセス２００４と、コンピュータウィルス検出装置を実現するプロセス２００５が動作し、プロセス２００５は、プロセス２００４の振る舞いを監視している。もし、プロセス２００４が実行するアプリケーションプログラムがコンピュータウィルス性を有し、外部に対して通信２００６を行なおうとしたとする。この場合、プロセス２００５は、プロセス２００４が外部に対して有害な通信を行なうとしているとみなして、その有害な通信を阻止するために、通信機器２００２に対して通信阻止命令２００７を出力する。通信機器２００２は、通信阻止命令２００７に基づいて、プロセス２００４が行なおうとする通信のパケットを中継しないなどして、通信を阻止する。
（実施形態８：コンピュータウィルス検出装置の構成）
図２１は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。本実施形態に係るコンピュータウィルス検出装置の構成は、実施形態１ないし７のいずれか一におけるコンピュータウィルス検出装置が、通信阻止命令出力部を有する構成となっている。例えば、コンピュータウィルス検出装置２１００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、通信阻止命令出力部２１０１と、を有する。
「通信阻止命令出力部」２１０１は、判断プログラム実行部９０３による判断の結果、判断の対象となったアプリケーションプログラムがコンピュータウィルス性を有すると判断された場合、そのアプリケーションプログラムが通信システムコールＡＰＩ関数を実行するときに、通信阻止命令を出力する。「通信阻止命令」とは、外部の通信機器に対して、アプリケーションプログラムが実行する通信システムコールＡＰＩ関数による通信を失敗させるための命令である。
例えば、コンピュータウィルス性を持つと判断されたアプリケーションプログラムが、コンピュータの外部に対してデータを送信しようとしたり、コンピュータの外部からデータを受信しようとしたりするために、通信のためのシステムコールＡＰＩ関数を実行すると、外部の通信機器、例えばルータ、に対して、その通信を失敗させる命令が出力される。
図２２は、通信阻止命令の一例を示す。この例では、通信阻止命令はＸＭＬなどの構造化文書として記述されている。図２２は、例えば図２０において、コンピュータ２００１のＩＰアドレスが１９２．１６８．１９３．０６３であり、プロセス２００４が、ＩＰアドレスが１０．１３９．２１０．２５４であり、ポートが２５番である通信を行なおうとした場合に出力される通信阻止命令を示している。このような通信阻止命令は、例えば、ＳＯＡＰ（Ｓｉｍｐｌｅ  Ｏｂｊｅｃｔ  Ａｃｃｅｓｓ  Ｐｒｏｔｏｃｏｌ）により、このような通信阻止命令が外部の通信機器に出力されるようになっていてもよい。
（実施形態８：コンピュータウィルス検出装置の処理）
図２３は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
ステップＳ２３０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。
ステップＳ２３０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
ステップＳ２３０３において判断プログラムを実行する。
ステップＳ２３０４において、アプリケーションプログラムが、コンピュータウィルス性を有するかどうかの判定を行なう。もし、コンピュータウィルス性を有すると判定されると、ステップＳ２３０５へ処理を移行させ、そうでなければ、ステップＳ２３０７へ処理をスキップする。
ステップＳ２３０５において、到達したブレークポイントが通信システムコールＡＰＩ関数かどうかを判断する。もし、通信システムコールＡＰＩ関数であれば、処理をステップＳ２３０６へ移行させ、そうでなければ、ステップＳ２３０７へ処理をスキップさせる。
ステップＳ２３０６において、外部の通信機器に通信阻止命令を出力する。この処理は、通信阻止命令出力部２１０１により行なわれる。
ステップＳ２３０７において、全体の処理を終了するかどうか判定する。もし、終了しないのであれば、処理をステップＳ２３０８へ移行させる。
ステップＳ２３０８において、アプリケーションプログラムの実行を続ける。もし、実行が続いて、有害な通信が行なわれたとしても、ステップＳ２３０６において出力された通信阻止命令により、通信が阻止されることになる。
（実施形態８：通信機器の構成）
図２４は、本実施形態に係る通信機器の機能ブロック図を例示する。通信機器２４００は、通信阻止命令受信部２４０１と、通信阻止部２４０２と、を有する。
「通信阻止命令受信部」２４０１は、通信阻止命令を受信する。通信阻止命令は、例えば、通信阻止命令出力部２１０１により出力されるものであり、ＸＭＬで記述された場合には、図２２に例示したものとなる。通信阻止命令を受信するためのポートを用意しておき、通信阻止命令受信部２４０１は、このポートに通信阻止命令が送信されるまで待つ。また、必要に応じて、通信阻止命令を出力したプログラムが正当なプログラムであることを認証するための処理を行なってもよい。
「通信阻止部」２４０２は、通信阻止命令受信部２４０１で受信された通信阻止命令に基づいて、通信を阻止する。例えば、通信阻止命令が図２２に示すものである場合、１９２．１６９．１９３．０６３のＩＰアドレスから、１０．１３９．２１０．２５４のＩＰアドレスのコンピュータの２５番ポートへ行く通信パケットの中継をしないなどの処理を行なう。
（実施形態８：通信機器の処理）
図２５は、本実施形態に係る通信機器の処理のフローチャートである。通信機器は、このフローチャートにより示される処理を繰り返し実行する。
ステップＳ２５０１において、通信阻止命令が受信されるまで待つ。この処理は、通信阻止命令受信部２４０１により行なう。
ステップＳ２５０２において、通信阻止命令に基づいて通信を阻止する。この処理は、通信阻止部２４０２により行なう。
（実施形態８：主な効果）
本実施形態によれば、いわゆるスパイウェアなどのプログラムがコンピュータのデータを外部に送信することを防止することが可能となる。また、電子メールを介して感染が広がるコンピュータウィルスが送信する電子メールの送信を阻止することが可能となる。
（実施形態９）
本発明の実施形態９として、アプリケーションプログラムが到達したブレークポイントの履歴に基づいて、アプリケーションプログラムがコンピュータウィルス性を有するかどうか判断するコンピュータウィルス検出装置について説明する。
（実施形態９：構成）
図２６は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。コンピュータウィルス検出装置２６００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、履歴保持部２６０１と、を有する。したがって、図２６に機能ブロック図が例示されたコンピュータウィルス検出装置は、実施形態１に係るコンピュータウィルス検出装置が履歴保持部２６０１を有する構成となっている。なお、本実施形態に係るコンピュータウィルス検出装置は、他の実施形態、すなわち、実施形態２から実施形態８のいずれか一に係るコンピュータウィルス検出装置が、履歴保持部２６０１を有するものであってもよい。
「履歴保持部」２６０１は、ブレークポイント設定部９０２で設定されたブレークポイントに前記アプリケーションプログラムが到達した履歴を保持する。「前記アプリケーションプログラム」とは、ブレークポイント設定部９０２によりブレークポイントが設定されたアプリケーションプログラムを意味する。
したがって、本実施形態においては、アプリケーションプログラムの実行がブレークポイントに到達すると、例えば、どのブレークポイントに到達したか、その日時、ブレークポイントがシステムコールＡＰＩ関数であれば、その引数、などを履歴として追加する。この処理は、判断プログラムが行なってもよいし、あるいは、判断プログラムに含まれるプログラムや、コンピュータウィルス検出装置２６００の部によって行なわれてもよい。なお、履歴保持部２６０１が複数のアプリケーションプログラムが到達したブレークポイントの履歴を保持する場合には、アプリケーションプログラムを識別する識別情報も履歴として追加されるのが好ましい。
本実施形態においては、判断プログラムは、履歴検査プログラムを有する。「履歴検査プログラム」とは、履歴保持部２６０１で保持された履歴に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する。
例えば、いわゆるデーモンプログラムと呼ばれるアプリケーションプログラムがある。デーモンプログラムは、コンピュータ内部に常駐して、要求が受信できるのを待ち、その要求に対してサービスを提供するアプリケーションプログラムである。このようなデーモンプログラムが提供するサービスの内容は定型化されており、したがって、デーモンプログラムの動作はほぼ一定である。例えば、デーモンプログラムのうち、ウェブページの送信要求に対して、要求されたウェブページを返信するアプリケーションプログラム（例えば、Ａｐａｃｈｅと名前が付けられたプログラムが有名である）は、特定のポートに要求が送信されるのを待ち、要求されたウェブページを格納するファイルをオープンし、そのファイルに対してｒｅａｄを行ない、ｒｅａｄの結果を返信し、ファイルをクローズして、ログファイルに書き込む、という処理を繰り返し行なう。また、オープンするべきファイルの場所は、特定のディレクトリ下であるという特性を持つ。したがって、このような一定の処理から逸脱した処理を行なうと、そのデーモンプログラムがコンピュータウィルスやワームに感染した可能性が高い。本実施形態では、このようにして、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する。
より具体的な例としては、ブレークポイントごとに、到達した回数を記録しておき、これまで到達したことがないブレークポイントに到達したならば、アプリケーションプログラムがコンピュータウィルス性を有すると判断する。あるいは、ブレークポイントの位置がシステムコールＡＰＩ関数である場合には、履歴に基づいて、その引数の規則を抽出し、その規則に合致しない引数が与えられた場合には、アプリケーションプログラムがコンピュータウィルス性を有すると判断する。例えば、ファイルをオープンする際に指定されるファイルのパスに関する規則を、ワイルドカードや正規表現として抽出し、そのワイルドカードや正規表現に適合しないパスのファイルをオープンしようとした場合には、アプリケーションプログラムがコンピュータウィルス性を有すると判断する。
なお、本実施形態は、デーモンプログラムにのみ適用できるのみならず、他のアプリケーションプログラムにも適用が可能である。例えば、一般人によるワードプロセッサなどの使用は定型的なものである。そこで、定型的な使用で呼び出されるシステムコール以外が呼び出されると、そのワードプロセッサがコンピュータウィルス性を有すると判断されるようになっていてもよい。ワードプロセッサを例に用いたが、表計算プログラム、プレゼンテーションプログラム、メーラ、ブラウザなどのアプリケーションプログラムにも適用ができる。
（実施形態９：処理）
図２７は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
ステップＳ２７０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。
ステップＳ２７０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
ステップＳ２７０３において、ブレークポイントに到達した履歴を追加する。
ステップＳ２７０４において、判断プログラムを実行する。ここで、履歴検査プログラムも実行されることになる。
ステップＳ２７０５において、終了するべきかどうかを判定する。もし、終了しないのであれば、ステップＳ２７０６へ処理を移行させる。
ステップＳ２７０６において、アプリケーションプログラムの実行を続ける。その後、ステップＳ２７０２に処理を移行させる。
なお、ステップＳ２７０３の処理は、判断プログラムを実行した後で行なわれるようになっていてもよい。
（実施形態９：主な効果）
本実施形態によれば、アプリケーションプログラムの動作がこれまでと異なる傾向を示すかどうかに基づいて、コンピュータウィルス性を判断するので、一定の動作を繰り返し行なうデーモンプログラムなどの振る舞いの監視に有用である。また、正常な動作の履歴があればコンピュータウィルス性の判断が行なえるので、判断プログラムの作成が容易となる。
（実施形態１０）
本発明の実施形態１０として、アプリケーションプログラムがバーチャルマシンであるコンピュータウィルス検出装置について説明する。
（実施形態１０：構成）
図２８は、本実施形態に係るコンピュータウィルス検出装置の使用の形態を例示する。コンピュータ２８０１の内部で、コンピュータウィルス検出装置２８０２とバーチャルマシン２８０３が動作している。コンピュータウィルス検出装置２８０２は、実施形態１ないし９のいずれか一のコンピュータウィルス検出装置を実現するプログラムである。コンピュータウィルス検出装置２８０２は、バーチャルマシン２８０３にブレークポイントを設定し、振る舞いを監視する。
「バーチャルマシン」とは、他のプログラム２８０５を実行するアプリケーションプログラムである。通常は、他のプログラム２８０５は、想定されたアーキテクチャのコンピュータのマシンインストラクションで記述される。代表的な例としては、Ｊａｖａ（登録商標）で記述され、コンパイルされたプログラムを実行するものがある。Ｊａｖａ（登録商標）のプログラムは、インターネットからダウンロードされることが想定されているので、多くの場合、その出所／素性が不明であり、危険なプログラムである場合がある。そこで、例えば、Ｊａｖａ（登録商標）のバーチャルマシンは、実行するプログラムがＯＳへのＡＰＩ（２８０４）を自由に使ってコンピュータのリソースにアクセスすることを制限するように設計されている。しかし、バーチャルマシンのバグを利用して、バーチャルマシン上で動くプログラム２８０５がコンピュータのリソースに自由にアクセスする場合がある。
そこで、本実施形態のコンピュータウィルス検出装置２８０２が、バーチャルマシン２８０３にブレークポイントを設定して、バーチャルマシン２８０３の振る舞いを検出し、バーチャルマシン２８０３がコンピュータウィルス性を有するプログラムを実行していないかどうかを判断する。なお、本実施形態においては、バーチャルマシンがコンピュータウィルス性を有するとは、コンピュータウィルス性を有するプログラムをバーチャルマシンが実行することをも意味するものとする。
（実施形態１０：主な効果）
本実施形態により、バーチャルマシンのバグなどを利用するプログラムの実行を阻止することができる。
（実施形態１１）
本発明の実施形態１１として、実施形態１０におけるコンピュータを携帯電話とした実施形態について説明する。
（実施形態１１：構成）
図２９は、本実施形態に係るコンピュータウィルス検出装置の使用の形態を例示する。図２８のコンピュータ２８０１が携帯電話２９０１に置き換わっている。
（実施形態１１：主な効果）
携帯電話の高機能化にはめざましいものがある。例えば、インターネット用のブラウザは言うに及ばず、Ｊａｖａ（登録商標）のバーチャルマシンも携帯電話の内部で動作するようになっている。また、従来はパーソナルコンピュータで動作していたオペレーティングシステムが携帯電話の内部でも動作するようになってきており、携帯電話で動作するプログラムが複雑化している。
しかし、携帯電話の販売が開始された後に、バグやセキュリティホールが見つかる場合がある。一方、携帯電話はパーソナルコンピュータ以上の台数が市場に出回り、携帯端末の回収にはコストがかかるうえ、時間も要する。このため、携帯電話で動作するバーチャルマシンなどのバグやセキュリティホールを悪用したコンピュータウィルスが作成されると、その感染規模は予想もつかないこととなり、社会的な影響が大きい。例えば、バーチャルマシンのバグなどを利用して、あらゆる携帯電話のアドレス帳のデータが収集され、プライバシ情報の漏洩につながる。
そこで、本発明のコンピュータウィルス検出装置を実現するプログラムを、携帯電話の内部で動作させておき、バーチャルマシンにブレークポイントを設定して振る舞いを検出することにより、バグやセキュリティホールなどを悪用したコンピュータウィルスの動作を未然に防ぐことが可能となる。
【産業上の利用可能性】  上記のように本発明によれば、登録された命令の実行有無により監視対象プロセスの実行を中止、あるいは実行前の状態にロールバックできるようになり、従来に比してユーザの負担を軽減してウィルスへの感染予防、及び、システムのクリーンアップができる。
また、本発明は、プログラム実行時の振る舞いを検出するため、従来のシグネチャスキャンでは必要であったスキャン前の圧縮ファイルの解凍や、暗号化ファイルの復号化等の前処理を必要としない。
したがって、本発明は、コンピュータウィルス検出装置として有用である。
【図１】
2004075060.tif 000003
【図２】
2004075060.tif 000004
【図３】
2004075060.tif 000005
【図４】
2004075060.tif 000006
【図５】
2004075060.tif 000007
【図６】
2004075060.tif 000008
【図７】
2004075060.tif 000009
【図８】
2004075060.tif 000010
【図９】
2004075060.tif 000011
【図１０】
2004075060.tif 000012
【図１１】
2004075060.tif 000013
【図１２】
2004075060.tif 000014
【図１３】
2004075060.tif 000015
【図１４】
2004075060.tif 000016
【図１５】
2004075060.tif 000017
【図１６】
2004075060.tif 000018
【図１７】
2004075060.tif 000019
【図１８】
2004075060.tif 000020
【図１９】
2004075060.tif 000021
【図２０】
2004075060.tif 000022
【図２１】
2004075060.tif 000023
【図２２】
2004075060.tif 000024
【図２３】
2004075060.tif 000025
【図２４】
2004075060.tif 000026
【図２５】
2004075060.tif 000027
【図２６】
2004075060.tif 000028
【図２７】
2004075060.tif 000029
【図２８】
2004075060.tif 000030
【図２９】
2004075060.tif 000031
【手続補正書】
【提出日】平成17年12月20日(2005.12.20)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
コンピュータで実行されるプログラムによって他のプログラムがコンピュータウィルスであるかどうかを判断するコンピュータウィルス判断方法であって、
他のプログラムが呼ぶ可能性のあるＡＰＩ関数にブレークポイントを設定するブレークポイント設定ステップと、
前記ブレークポイントにヒットしたとき他のプログラムが使用しているスタックの内容を取得するスタック取得ステップと、
スタック取得ステップで取得されたスタックの内容が、コンピュータウィルスの特徴と合致するか判断をする判断ステップと、
を含むコンピュータウィルス判断方法。
【請求項２】
スタック取得ステップは、ＡＰＩ関数の引数を取得する引数取得ステップを含む請求項１に記載のコンピュータウィルス判断方法。
【請求項３】
判断ステップでは、スタックの内容により、呼ばれていることが示されるＡＰＩ関数の種類によりコンピュータウィルスの特徴と合致するかどうかを判断する請求項１または２に記載のコンピュータウィルス判断方法。
【請求項４】
ブレークポイント設定ステップで設定されるブレークポイントのアドレスを、ＡＰＩ関数が含まれるＤＬＬファイルのマップアドレスに基づいて求めるアドレス算出ステップを含む請求項１から３のいずれか一に記載のコンピュータウィルス判断方法。
【請求項５】
レジストリやシステムファイルに変更を加えるＡＰＩ関数が呼ばれているとき、バックアップを生成するバックアップステップを含む請求項１から４のいずれか一に記載のコンピュータウィルス判断方法。
【請求項６】
判断ステップでコンピュータウィルスの特徴と合致すると判断されたとき、他のプログラムの実行の中止をするかどうかをユーザに判断させるためのダイアログボックスを表示するダイアログボックス表示ステップを含む請求項１から５のいずれか一に記載のコンピュータウィルス判断方法。
【請求項７】
判断ステップでコンピュータウィルスの特徴と合致すると判断されたとき、前記ブレークポイントにヒットしたＡＰＩ関数の実行をさせない実行阻止ステップを含む請求項項１から５のいずれか一に記載のコンピュータウィルス判断方法。
【請求項８】
前記ブレークポイントにヒットしたＡＰＩ関数は、通信を行なうための通信システムコールＡＰＩ関数であり、
判断ステップでコンピュータウィルスの特徴と合致すると判断がされたとき、外部の通信機器に対して前記他のプログラムが実行する通信システムコールＡＰＩ関数による通信を失敗させるための命令を出力する通信阻止命令出力ステップを含む請求項７に記載のコンピュータウィルス判断方法。
【請求項９】
前記ブレークポイントにヒットしたＡＰＩ関数の履歴を保持する履歴保持ステップを含み、
判断ステップでは、履歴保持ステップで保持されるＡＰＩ関数の履歴を参照して前記判断を行なう請求項１に記載のコンピュータウィルス判断方法。
【請求項１０】
他のプログラムがバーチャルマシンである請求項１に記載のコンピュータウィルス判断方法。
【請求項１１】
前記コンピュータが携帯電話である請求項１に記載のコンピュータウィルス判断方法。
【請求項１２】
他のプログラムがコンピュータウィルスであるかどうかを判断するためのコンピュータウィルス判断プログラムであって、
他のプログラムが呼ぶ可能性のあるＡＰＩ関数にブレークポイントを設定するブレークポイント設定ステップと、
前記ブレークポイントにヒットしたとき他のプログラムが使用しているスタックの内容を取得するスタック取得ステップと、
スタック取得ステップで取得されたスタックの内容が、コンピュータウィルスの特徴と合致するか判断をする判断ステップと、
を計算機に実行させるためのコンピュータウィルス判断プログラム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【書類名】      明細書
【詳細な説明】
【０００１】
技術分野
【０００２】
この発明は、電子メール、ＷＥＢ、ピア・ツー・ピアのファイル交換ソフトウェア等により、インターネットなどコンピュータの外部から導入されるなどして実行可能となったプログラムの実行をモニタリングして、コンピュータウィルスの振る舞い、若しくは、コンピュータウィルスに類似した振る舞いを検出し、プログラムの実行停止等の対応をすることに関する。
【０００３】
背景技術
【０００４】
現在、コンピュータウィルス（以下、単に「ウィルス」という場合がある。）の検出技術は、パターンマッチングを用いるものが主流である。この技術は、例えば、特開２００３−２１６４４４、特開２００２−１９６９４２、ＷＯ  ０２／０８６７１７  Ａ１などにより開示されている。パターンマッチングは、コンピュータのメモリや、ハードディスク上のファイルに着目し、過去に発見されたウィルスの特徴的なシグネチャと比較してウィルスを検出する。パターンマッチングは誤検出が少ない技術であるが、既知のウィルスしか検出できない。
【０００５】
現在、一日に、約１０〜２０種類の新しいウィルスが見つかっている。一般ユーザが使用するコンピュータが、そのような新しいウィルスを検出し、対処することができるようにするためには、頻繁にアップデートされるウィルス・シグネチャ・ファイルを速やかにアンチウィルス会社から入手して、コンピュータにインストールしなければいけない。ところで、新しいウィルスは、過去のウィルスをほんの少し変えたものが多い。このため、実際のウィルスの振る舞いは、どれも非常に似ているという特徴がある。それにもかかわらず、ウィルスのプログラムという情報としてのパターンは異なるので、ウィルスが発見されるごとに、ウィルス・シグネチャ・ファイルをインストールする必要がある。
【０００６】
ウィルスの検出技術には、パターンマッチングの他に、ヒューリスティックスキャンがある。ヒューリスティックスキャンは、擬似的にコードを実行し、ウィルスに似た挙動をしないかを、エミュレーションに基づいて判断を行なう。しかし、実行ファイルのインストラクションを全てエミュレーションできるとは限らない。また、プログラムサイズが大きく、又は／及び、複雑に暗号化されたウィルスのエミュレーションには、非常に時間がかかる。
【０００７】
発明の開示
【０００８】
本発明では、コンピュータ上で、新規にプロセスを生成するか、または実行中のプロセスにアタッチ（Ａｔｔａｃｈ）して、プロセスを監視対象とし、コンピュータに重要な変更を加えることができるシステムコールなどの呼び出しを監視することで、振る舞いを監視する。そして、監視対象であるプロセスの振る舞いと、過去のコンピュータウィルスの特徴的な振る舞いと、を比較する。ウィルスの特徴的な振る舞いが検出されると、監視対象であるプロセスを中止できるように、ユーザに通知などをする。ここで、監視対象プロセスは、主に、インターネットに接続するプロセスを指す。
【０００９】
図１は、コンピュータでのプロセスの実行を概念的に説明する図である。上位の層にアプリケーション１０１、１０２、電子メールソフトウェア１０３、ＷＥＢブラウザ１０４が動作する。このうち、アプリケーション１０２、電子メールソフトウェア１０３、ＷＥＢブラウザ１０４が、インターネットに接続などして、コンピュータの外部からプログラムを導入するプログラムを実行するプロセスであるとする。本発明では、それらのプロセスと、システムコールＡＰＩ層１０５と、の間に、本発明によるセキュリティ層を設ける。このセキュリティ層は、システムコールの呼び出しを監視する層である。
【００１０】
システムコールＡＰＩ層１０５の下には、オペレーティングシステム（以下では、「ＯＳ」と略記する場合がある。）を実現するカーネル層１０６があり、その下層に、デバイスドライバ／ハードウェア１０７の層がある。
【００１１】
通常のコンピュータにおけるＯＳにおいては、カーネルモードと、ユーザモードと、に分かれて処理が行なわれる。システムコールＡＰＩ層１０５より上の部分１０８は、ユーザモードで処理が行なわれる部分であり、システムコールＡＰＩ層１０５より下の部分１０９は、カーネルモードで処理が行なわれる部分である。
【００１２】
ユーザモードで実行するプロセスは、個別のコンテキストと、仮想アドレス空間を持っている。そのため、同じユーザモードで実行するプロセス同士が、他のプロセスのメモリをアクセスできないようになっている。
【００１３】
本発明は、アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置と、そのアプリケーションプログラムの実行がそのブレークポイントに到達したときに、そのアプリケーションプログラムのスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する判断プログラムとを関連付けて保持し、アプリケーションプログラムにブレークポイントを設定し、アプリケーションプログラムの実行がブレークポイントに到達した時には、そのブレークポイントの位置と関連付けて保持された判断プログラムを実行するコンピュータウィルス検出装置を提供する。
【００１４】
また、コンピュータウィルス検出装置は、アプリケーションプログラムを保持し、保持されたアプリケーションプログラムを実行するときに、ブレークポイントをアプリケーションプログラムに設定するようになっていてもよい。
【００１５】
また、ブレークポイントの位置は、システムコールＡＰＩ関数に基づいて定められていてもよい。このようにすることにより、図１のセキュリティ層が実現される。
【００１６】
また、アプリケーションプログラムの実行が、ブレークポイントに到達したときには、システムコールＡＰＩ関数の引数を検査してもよい。
【００１７】
さらに、システムコールＡＰＩ関数が、システムリソースを変更するものである場合には、システムコールの実行の前に、コンピュータウィルス検出装置がシステムリソースの複製が生成されるようになっていてもよい。
【００１８】
また、コンピュータウィルス検出装置は、アプリケーションプログラムがコンピュータウィルス性を有すると判断された際には、システムコールＡＰＩ関数の実行を阻止するようになっていてもよい。
【００１９】
また、システムコールＡＰＩ関数が通信を行なうものである場合には、コンピュータウィルス検出装置は、その通信を失敗させるよう外部の通信機器（例えば、ルータ）に命令を出力するようになっていてもよい。
【００２０】
また、アプリケーションプログラムがコンピュータウィルス性を有するかどうかは、アプリケーションプログラムが到達したブレークポイントの履歴に基づいて判断されるようになっていてもよい。
【００２１】
また、本発明において、アプリケーションプログラムは、Ｊａｖａ（登録商標）などの言語で記述されたプログラムを実行するためのバーチャルマシンであってもよい。また、そのバーチャルマシンは、携帯電話で動作するものであってもよい。
【００２２】
ＷＩＮＤＯＷＳ（登録商標）を含めたＯＳにおいては、プロセスの振る舞いをコントロールする方法として、カーネルドライバを書き、システムコールをフックする方法がある（例えば、コンピュータアソシエイツ社のｅＴｒｕｓｔ  Ａｃｃｅｓｓ  Ｃｏｎｔｒｏｌ  "Ｓｏｆｔ  ｈｏｏｋ"で用いられている方法）。一方、本発明によるプロセスの振る舞いの監視は、デバッガというソフトウェア開発で使われる機能を使用して行なわれる。
【００２３】
本発明における振る舞いの監視は、全てユーザモード、つまりアプリケーション層で行なわれるという特徴を有する。これにより、カーネルドライバを用いる場合にしばしば引き起こされるシステムダウンなどの致命的なエラーの発生が無い。
【００２４】
以下では、本発明の理解を助けるために、従来におけるデバッガの機能について概説を行なう。
【００２５】
図２は、アプリケーションプログラムを実行するプロセス２０１と、デバッガ２０２と、の関係を例示する。（１）まず、デバッガ２０２が、プロセス２０１にアタッチする。アタッチにより、プロセス２０１とデバッガ２０２との関係がＯＳにより管理されるようになる。すなわち、ＯＳは、デバッガ２０２にプロセス２０１を関連付け、例えば、プロセス２０１の状態に変化が発生すると、デバッガ２０２に通知が行なわれるようになる。（２）次に、デバッガ２０２は、プロセス２０１にブレークポイントを設定する。「ブレークポイント」は、プロセス２０１のプログラムカウンタが所定の値になった場合に、ＣＰＵの実行を停止させるメモリアドレスを示す。そのようなメモリアドレスを指定することを、ブレークポイントの設定という。ブレークポイントの設定を行なう方法としては、ブレークポイントが示すメモリアドレス値をＣＰＵに設定したり、ブレークポイントのプログラムカウンタ値が示すメモリアドレスの命令を特殊な命令に置換したりすることにより実現される（例えば、Ｊｏｎａｔｈａｎ  Ｂ．Ｒｏｓｅｎｂｅｒｇ著、"Ｈｏｗ  Ｄｅｂｕｇｇｅｒｓ  Ｗｏｒｋ、Ａｌｇｏｒｉｔｈｍｓ，  Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅｓ，  ａｎｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ"、Ｗｉｌｅｙ  Ｃｏｍｐｕｔｅｒ  Ｐｕｂｌｉｓｈｉｎｇ、１９９７年参照。）。その後、プロセス２０１が実行を開始し、ブレークポイントに到達すると、（２）実行が停止したことがＯＳに通知される。この通知は、プロセス２０１が行なうというよりも、プロセスの実行がブレークポイントに到達することによりＣＰＵに割り込みが発生し、その割り込みを処理するための処理ルーチンにより行なわれる。なお、処理ルーチンは、ＯＳの初期化などにより適宜設定されている。ＯＳが通知を受けると、（４）デバッガ２０２に通知が行き、デバッガ２０２はプロセス２０１の実行がブレークポイントに到達したことを知る。その後、デバッガ２０２の利用者の操作により、（５）プロセス２０１のデバッグの操作が行なわれる。デバッグ操作の代表的なものとしては、プロセスのスタックの内容を読み、関数や手続きが呼ばれたシーケンスを調べたり、引数や変数の値などを調べたりする。
【００２６】
なお、ブレークポイントはプロセスごとに設定されるものである。したがって、「アプリケーションプログラムを実行するプロセスにブレークポイントを設定する」という記述が正確であるが、記述が長くなるので、以降では、アプリケーションプログラムと、アプリケーションプログラムを実行するプロセスと、を同一視して、「アプリケーションプログラムにブレークポイントを設定する」などと記述する場合がある。
【００２７】
図３は、従来技術において、高級言語での関数や手続きの呼び出しがどのようにコンパイルされるかを例示する。高級言語において、符号３０１に示すような「ｆ（引数１，引数２，…，引数ｎ）；」という関数ないし手続き（以後、「関数」と省略する。）の呼び出しが記述されているとする。これをコンパイルすると、符号３０２に示すようなマシンインストラクションに変換される。すなわち、ｐｕｓｈ命令により引数をスタックに積み、最後に、「ｃａｌｌ  ｆ」により、ｆを呼び出す。多くのＣＰＵでは、ｃａｌｌ  ｆのような、関数を呼び出すマシンインストラクションの実行により、呼び出された関数の処理から戻る際にプログラムカウンタへ設定される値がスタックに積まれる。
【００２８】
図４は、関数ｆのコンパイル結果を例示する。ｆの呼び出しが行なわれると、まず、「ｐｕｓｈ  ｆｐ」というマシンインストラクションにより、ｆの呼び出しの前のフレームポインタ（ｆｐ）の値がスタックに積まれる。「フレームポインタ」は、関数呼び出しのためのスタックの部分を示すためのＣＰＵのレジスタである。フレームポインタは、後述するように、関数の呼び出し列（コールシーケンス）を得るために重要な役割をする。次に、「ｍｏｖｅ  ｓｐ→ｆｐ」によりスタックポインタ（ｓｐ）の値をフレームポインタ（ｆｐ）にセットする。これにより、現在呼び出されているｆのスタックの部分をフレームポインタ（ｆｐ）が指すようになる。その後、ｆの処理が行なわれる。ｆの呼び出しから復帰する際には、「ｐｏｐ  ｆｐ」により、ｆの呼び出しの前のフレームポインタ（ｆｐ）の値が設定され、「ｒｅｔ」により、ｆの呼び出しから復帰する。例えば、スタックに積まれているプログラムカウンタの値が、プログラムカウンタに設定される。
【００２９】
図５は、スタックに値が積まれた状態を例示する。スタック５０１の一番上の部分に積まれている値（すなわち、スタックの一番上の部分に格納されている値）が、現在実行中の関数に係るものであり、エリア５０１の部分には、引数の値が積まれている。エリア５０３には、関数呼び出し後のプログラムカウンタが積まれている。エリア５０４には、関数呼び出し前のフレームポインタ（ｆｐ）の値が積まれている。エリア５０５には、関数の中で定義されている自動変数の値などが格納されている。フレームポインタ（ｆｐ）は、エリア５０４の上部を指しており、エリア５０４に積まれている値は、前の関数呼び出しの時にスタック５０１に積まれたフレームポインタ（ｆｐ）が格納されている位置の上を指している。したがって、フレームポインタの値をたどることにより、どのような呼び出し列を経て、関数が呼び出されたかを知ることができる。また、スタックに積まれたプログラムカウンタの値を調べることにより、関数がプログラムのどの位置から呼ばれたかを知ることができる。また、スタックに積まれた引数を調べることにより、関数にどのような値が与えられたかを知ることができる。
【００３０】
本発明に係るコンピュータウィルス検出装置は、このようなデバッガの機能を利用することにより、プロセスの振る舞いを監視する。ただし、従来技術におけるデバッガにおいては、人間がデバッガを操作してデバッグ対象のプロセスを調査するのに対して、本発明に係るコンピュータウィルス検出装置によるプロセスの振る舞いの監視は、自動的に行なわれる。
【００３１】
また、本発明は、商用ソフトウェアにまつわる課題を解決するものである。以下、スパイウェアを例に用いて説明する。スパイウェアは、インターネット経由でその作成者または発信者に情報を送信するアプリケーションプログラムである。スパイウェアは、バックドア・ウィルスと似た振る舞いをする。悪質なスパイウェアは、ユーザ情報や、キーストロークを盗み、特定の通信チャネルを通して、他のマシンへ情報を送信する。
【００３２】
しかし、アンチウィルス企業の多くは、そのポリシーとしてスパイウェアなどの商用ソフトウェアを検出しない。ハードディスクを破棄する際に使用するデータを消去する商用ソフトウェアがあり、それが友人から電子メールとして送られてくるかも知れないからである。ユーザの意図通りにデータを消去するプログラムは、アンチウィルスでは検出しない。
【００３３】
したがって、プログラムを実行した結果が、コンピュータや、ユーザのビジネスにインパクトを与えるものであっても、現在のアンチウィルス技術では、それらの脅威を完全に防ぐことは不可能である。
【００３４】
現在のウィルスは、わずかにＬｉｎｕｘ（登録商標）で活動するものがあるが、圧倒的にＷＩＮＤＯＷＳ（登録商標）で活動する。その一つの原因として、ＷＩＮＤＯＷＳ（登録商標）を使うほとんどの人々は、アドミニストレータ権限をログオン・ユーザに加えていることが挙げられる。アドミニストレータ権限は、アプリケーションをインストールする際に必要だが、ＵＮＩＸ（登録商標）のようにシステム管理者のために一時的に、ｒｏｏｔ（特権ユーザ）になる習慣がＷＩＮＤＯＷＳ（登録商標）にはない。ＷＩＮＤＯＷＳ（登録商標）では、アドミニストレータのような特権ユーザのまま、メールで送られてきた不審なファイルがしばしば実行される。
【００３５】
アドミニストレータ権限は、システムの全ての資源にアクセスできる。つまりはシステムが稼動するために必要な重要なファイルを改ざんできる。こういった環境で、ウィルスを実行すると、コンピュータの重要なファイルが改ざんされ、さらにはインターネットを通して、世界中のコンピュータがウィルスに感染することがある。プログラムの実行環境は、ユーザのためにもっと適切に保護されるべきである。
【００３６】
発明を実施するための最良の形態
【００３７】
以下、本発明を実施するための最良の形態について、図を用いて実施形態として説明する。なお、本発明は、これら実施形態に何ら限定されるものではなく、その要旨を逸脱しない範囲において、種々なる態様で実施し得る。
【００３８】
（本発明の概要）
本発明は、プログラムの振る舞いに着目し、プログラムがウィルスかどうかを判断する。本発明を具現化したプロセスと、監視対象のプロセスは、デバッガ（Ｄｅｂｕｇｇｅｒ）と、デバッギ（Ｄｅｂｕｇｇｅｅ）の関係に類似した関係を持つ。デバッガは、本発明を具現化したプロセスに対応し、デバッギは、監視対象のプロセスに対応する。
【００３９】
デバッグされるプロセスをデバッギという。本発明は、監視対象プロセスをデバッギとして実行する。実行中のプロセスを監視する場合には、実行中のプロセスにアタッチする。
【００４０】
本発明を具現化するプロセスは、監視対象プロセスの振る舞いをチェックするため、システムに重要な変更を加えるシステムコール（またはＡＰＩ関数）にブレークポイント（Ｂｒｅａｋｐｏｉｎｔｓ）を設定する。
【００４１】
ブレークポイントは、Ｉｎｔｅｌ（登録商標）ＣＰＵの場合には、Ｉｎｔ３のハードウェア割り込みインストラクションを、ブレークポイントが示すメモリアドレスに配置することにより実現できる。プロセスの実行がブレークポイントに到達すると、そのプロセスの実行は停止し、本発明に係るコンピュータウィルス検出装置が、そのプロセスのスタックの内容などを調査して、監視対象のプロセスの振る舞いと、過去のコンピュータウィルスの特徴的な振る舞いを比較する。
【００４２】
ウィルスの特徴的な振る舞いとしては、以下のものを挙げることができる。
【００４３】
・自分自身をシステムフォルダにコピーする。
【００４４】
・ネットワークで共有されたディレクトリを探す。そして、自分自身をコピーする。
【００４５】
・メールのアドレス帳にアクセスし、ウィルスを添付したメールを大量に送信する。
【００４６】
・ファイル交換ソフトウェアがインストールされていれば、それを使って自分自身をばらまく。
【００４７】
・重要なシステムファイルを消す。または改ざんする。
【００４８】
・再起動しても、自分自身が実行されるように、システムを変更する。
【００４９】
本発明は、監視対象プロセスのＡＰＩ呼び出しを過去のコンピュータウィルスの振る舞いなどと比較し、監視対象プロセスの停止や、ユーザへの警告を発する。
【００５０】
以下、ＷＩＮＤＯＷＳ（登録商標）を例に具体的に述べる。ＷＩＮＤＯＷＳ（登録商標）では、ファイルやディレクトリを操作するＡＰＩは、ＫＥＲＮＥＬ３２．ＤＬＬというファイルに含まれている。レジストリに関連するＡＰＩは、ＡＤＶＡＰＩ３２．ＤＬＬに含まれている。ネットワークの共有ドライブを操作するＡＰＩは、ＭＰＲ．ＤＬＬに含まれている。以下、これらをＤＬＬファイルと呼ぶ。
【００５１】
監視対象のプロセスがどのＡＰＩを呼び出そうとしているか判断する方法を以下に述べる。監視対象プロセスが実行を開始するときに、ＤＬＬファイルは、仮想プロセス空間にマッピングされる。
【００５２】
図６は、仮想プロセス空間６０１に、Ｋｅｒｎｅｌ３２．Ｄｌｌ、ＭＲＰ．Ｄｌｌ、Ａｄｖａｐｉ３２．Ｄｌｌがマッピングされた状態を例示する。このようにマッピングが行なわれることにより、監視対象プロセスは、例えば、Ａｄｖａｐｉ３２．Ｄｌｌで定義されているＲｅｇＣｒｅａｔｅＫｅｙＥｘなどの関数を呼び出すことができる。
【００５３】
図７は、プロセスの仮想メモリ空間を示す。仮想メモリ空間７００は、メモリアドレスの小さい方から、インストラクションの部分７０１、ヒープの部分７０２、ＤＬＬファイルがマッピングされる部分７０３、スタックの部分７０４を有する。部分７０３は、ヒープの部分７０２とスタックの部分７０４との間に位置し、ＤＬＬファイルがマッピングされる。すなわち、部分７０３のメモリアドレスに対して参照を行なうと、ファイルとして格納されているＤＬＬファイルの内容が得られる。
【００５４】
ＤＬＬファイルのマップアドレス（ＤＬＬファイルが仮想メモリ空間へマッピングされた部分の最初のアドレス）は、イメージベースと呼ばれ、各ＤＬＬでユニークに、他と重複しないよう決められている。
【００５５】
例えば、レジストリを操作するＲｅｇＯｐｅｎＫｅｙＥｘＡというＡＰＩは、ＡＤＶＡＰＩ３２．ＤＬＬに含まれている。
【００５６】
ＲｅｇＯｐｅｎＫｅｙＥｘＡのアドレスを、「ＡＤＶＡＰＩ３２．ＤＬＬのイメージベース」＋「ＲｅｇＯｐｅｎＫｅｙＥｘＡのＲＶＡ」により求める。なお、「ＲＶＡ」とは、Ｒｅｌａｔｉｖｅ  Ｖｉｒｔｕａｌ  Ａｄｄｒｅｓｓの略である。すなわち、ＤＬＬファイルの中に、ＡＰＩの定義が現れる相対的な位置である。
【００５７】
アドレスが求められたら、デバッガ用ＡＰＩなどを使用してブレークポイントを設定する。
【００５８】
監視対象プロセスの実行が、ブレークポイントにヒットしたら、ＡＰＩの引数などを解析する。
【００５９】
監視対象プロセスが、レジストリやシステムファイルに変更を加えるＡＰＩを呼び出した場合、このステップで、バックアップを作成する。
【００６０】
ウィルスの特徴を検出したらプロセスの停止、またはユーザにレポートする。検出しなければ処理を続ける。
【００６１】
具体例を説明する。多くのＷＩＮＤＯＷＳ（登録商標）ウィルスは実行すると再起動時に、システムに常駐するために、以下のレジストリへ値を追加する。
【００６２】
ＨＫＥＹ＿ＬＯＣＡＬ＿ＭＡＣＨＩＮＥ￥ＳＯＦＴＷＡＲＥ￥ＭＩＣＲＯＳＯＦＴ￥Ｗｉｎｄｏｗｓ￥ＣｕｒｒｅｎｔＶｅｒｓｉｏｎ￥Ｒｕｎ
参考として、このキーに値を追加するメジャーなウィルスを以下に挙げる。
【００６３】
ＮＩＭＤＡ，ＬＯＶＥＬＡＴＴＥＲ，ＴＲＯＪ＿ＭＡＴＲＩＸ，Ｗ３２＿ＭＡＧＩＳＴＲ，ＴＲＯＪ＿ＨＹＢＲＩＳ，ＷＯＲＭ＿ＫＬＥＺ，ＷＯＲＭ＿ＢＵＧＢＥＡＲ，ＷＯＲＭ＿ＢＡＤＴＲＡＮＳ，ＪＳ＿ＥＸＣＥＰＴＩＯＮ，ＷＯＲＭ＿ＬＩＲＢＡ
メールで受け取った不明なプログラムがシステムに常駐する必要はないと考えられる。
【００６４】
上記レジストリを追加するには、次の２ステップのＡＰＩ呼び出しが必要である。
【００６５】
ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡ  …  Ｒｕｎの下に新しいキーを作る。
【００６６】
ＲｅｇＳｅｔＶａｌｕｅＥｘＡ    …  値をセットする。
【００６７】
上の２つのＡＰＩは、ＡＤＶＡＰＩ３２．ＤＬＬに含まれている。ここでは、ＡＤＶＡＰＩ３２．ＤＬＬのイメージベースが０ｘ７７Ｄ８００００であるとする。数字の０ｘは、１６進数であることを示す。また、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡのＲＶＡが０ｘ２９４２７、ＲｅｇＳｅｔＶａｌｕｅＥｘＡのＲＶＡが０ｘ２Ｃ５８Ｄであるとする。
【００６８】
ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡのアドレスは、
０ｘ７７Ｄ８００００＋０ｘ２９４２７＝０ｘ７７ＤＡ９４２７
ＲｅｇＳｅｔＶａｌｕｅＥｘＡのアドレスは、
０ｘ７７Ｄ８００００＋０ｘ２Ｃ５８Ｄ＝０ｘ７７ＤＡＣ５８Ｄ
で求められる。これらは仮想アドレス空間であるから同時に複数のプロセスが実行されていても、同じ仮想アドレスでＤＬＬファイルがマップされる。
【００６９】
アドレスを求めたら、それらへブレークポイントを設定する。
【００７０】
もし、監視対象のプロセスが、ＷＩＮＤＯＷＳ（登録商標）起動時に自動実行するプログラムであれば、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡのブレークポイントがヒットする。次にスタックを解析する。Ｃ言語などのコンパイラでは、スタックを介して引数が受け渡されるようなマシンインストラクションが生成されるためである。
【００７１】
８００００００２  ００４１ｆ０２８  ＡＤＶＡＰＩ３２！ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡ
例えば、上記の数値が得られたとする。ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡを呼ぶ際には、２番目の引数はレジストリの位置である。この例では、メモリアドレス４１ｆ０２８へレジストリの位置が入っている。そこで、メモリアドレス４１ｆ０２８をチェックする。
【００７２】
＞４１ｆ０２８
４１ｆ０２８    ＳＯＦＴＷＡＲＥ￥Ｍｉｃｒｏｓｏ
４１ｆ０３８    ｆｔ￥Ｗｉｎｄｏｗｓ￥Ｃｕｒｒｅ
４１ｆ０４８    ｎｔＶｅｒｓｉｏｎ￥Ｒｕｎ￥Ｖｉ
４１ｆ０５８    ｒｕｓ
ＡＰＩと引数から、監視プロセスは、Ｒｕｎの下にＶｉｒｕｓというキーを作ろうとしていることが分かる。
【００７３】
プログラム実行前の状態に復帰する場合には、Ｖｉｒｕｓキーを削除すればよい。そこで、システムコールの実行の前にレジストリなどのシステムリソースの変更の履歴や、システムリソースの複製、などを保持するようにしてもよい。
【００７４】
同様に、プログラムの振る舞いを把握するために必要なＡＰＩをチェックし、その呼び出しの傾向を解析する。
【００７５】
呼び出しを監視するＡＰＩと、引数の対応（以下これを検出ルールと呼ぶ）は、ハードコーディングではなく、検出ルールを記したファイルを外部、例えばインターネットから読み込むことで追加、変更できることが望ましい。
【００７６】
この方法では、ファイルをスキャンするオーバーヘッドは、一切無い。ウィルスの特徴的な振る舞いを検出したら、監視対象のプロセスをユーザの意思により、中止させられるように、ダイアログボックス等を表示するのが好適である。
【００７７】
または、プログラムを中止せずに、続けて実行する。フローチャートを図８に例示する。
【００７８】
（実施形態１）
本発明の実施形態１として、ブレークポイント位置情報と、アプリケーションプログラムがそのブレークポイント位置情報で示すブレークポイントに到達した場合に実行する判断プログラムと、を関連付けて保持し、ブレークポイントをアプリケーションプログラムに設定して、判断プログラムを実行するコンピュータウィルス検出装置について説明する。
【００７９】
（実施形態１：構成）
図９は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。コンピュータウィルス検出装置９００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、を有する。
【００８０】
なお、以下の説明から明らかになるように、これらの部を有するコンピュータウィルス検出装置は、コンピュータで動作するプログラムとして実現が可能である。したがって、図９は、そのようなプログラムのモジュール構成を示す図であると解釈することもできる。すなわち、そのようなプログラムは、ブレークポイント情報保持部をプログラムにより実現するプレークポイント情報保持ステップと、ブレークポイント設定部をプログラムにより実現するブレークポイント設定ステップと、判断プログラム実行部をプログラムにより実現する判断プログラム実行ステップと、をコンピュータに実行させるためのプログラムである。
【００８１】
「ブレークポイント情報保持部」９０１は、ブレークポイント情報を保持する。例えば、ハードディスクや半導体メモリなどに、ブレークポイント情報を保持する。「ブレークポイント情報」とは、ブレークポイント位置情報と、判断プログラムと、を含む情報である。「含む」とあるので、ブレークポイント情報の成分は、ブレークポイント位置情報と判断プログラムとに限られない場合がある。
【００８２】
「ブレークポイント位置情報」とは、アプリケーションプログラムの実行に際して設定するべきブレークポイントの位置を示す情報である。ブレークポイントの位置は、例えば、アプリケーションプログラムのメモリアドレスによって示される。また、アプリケーションプログラムが呼び出す関数、手続き、メソッド（以下、「関数など」という。）の名前によっても示される場合がある。
【００８３】
「判断プログラム」とは、そのアプリケーションプログラムの実行が前記ブレークポイントに到達したときに、そのアプリケーションプログラムの実行で参照されるスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なうためのプログラムである。「そのアプリケーションプログラム」とは、後で説明されるブレークポイント設定部９０２によりブレークポイント位置情報で示される位置にブレークポイントが設定されるアプリケーションプログラムを意味する。「前記ブレークポイント」とは、ブレークポイント位置情報が示す位置に設定されたブレークポイントを意味する。
【００８４】
「アプリケーションプログラムがコンピュータウィルス性を有する」場合とは、アプリケーションプログラム自身がコンピュータウィルスである場合のみならず、アプリケーションプログラムがコンピュータウィルスに感染した場合、アプリケーションプログラムのバグやセキュリティホールなどが利用されて設計時には想定されていなかった動作をする場合、などを含む。例えば、ウェブサーバプログラムのバグを利用して、悪意を持った人間が、通常の操作では得ることができないファイルの内容を得るなどの動作をする場合である。
【００８５】
そのアプリケーションプログラムの実行で参照されるスタックの内容に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なう方法としては、種々のものがある。例えば、そのアプリケーションプログラムの実行で参照されるスタックを、スタックの上部からフレームポインタをたどってスタックの下部までたどることができるかどうかを判断する。コンピュータウィルスの中には、スタックの内容を破壊することにより、アプリケーションプログラムが正常に動作するならば呼び出さない態様でシステムコールなどを呼び出す。そこで、スタックの内容が破壊されていないかどうかを判断する。その判断の一つとして、フレームポインタをたどり、プログラムの実行において最初に呼ばれる関数など（例えば、＿ｓｔａｒｔｕｐという名前の関数など）の呼び出しまでたどることができるかどうかにより、アプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断を行なう。
【００８６】
また、アプリケーションプログラムが、ブレークポイントに到達した際、どのような関数などの呼び出し系列を経て到達したかを調べることで、コンピュータウィルス性を有するかどうかの判断を行なってもよい。もし、想定されない関数などの呼び出しの系列の後にブレークポイントに到達している場合には、コンピュータウィルス性を有することが疑われる。
【００８７】
また、ブレークポイントが設定された関数などの引数を調べることにより、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断してもよい。例えば、電子メールを用いて他のコンピュータに自らを感染させるコンピュータウィルスは、電子メールアドレスを取得するために電子メールアドレスのアドレス帳をアクセスする。そこで、アドレス帳へのアクセスを行なうための引数が指定されているかどうかに基づいて、判断を行なうようになっていてもよい。
【００８８】
なお、多くの場合、コンピュータウィルス検出装置を実現するプログラムを実行するプロセスと、アプリケーションプログラムを実行するプロセスとは、異なるプロセスであり、通常は、コンピュータウィルス検出装置を実現するプログラムが、アプリケーションプログラムを実行するプロセスのメモリ空間の内容、特にスタックの内容を読むことはできない。しかし、オペレーティングシステムは、特定の関係にあるプロセス間であれば、あるプロセスが他のプロセスのメモリ空間やレジスタの内容を読んだり、変更したりすることを許可する機能を有しているのが通常である。ここでいう「特定の関係」の例としては、親子関係や、同じユーザが実行しているプロセスであり、他のプロセスに対して所定のシステムコール（例えば、ａｔｔａｃｈなど）を実行したという関係、などがある。したがって、コンピュータウィルス検出装置をプログラムにより実現する場合には、そのプログラムを実行するプロセスと、アプリケーションプログラムを実行するプロセスと、は特定の関係になっている必要がある。
【００８９】
なお、ほとんどのオペレーティングシステムでは、他のプロセスのメモリ空間やレジスタの内容を読んだり、変更したりするためのシステムコールが提供されている。あるいは、／ｄｅｖ／ｐｒｏｃというスペシャルデバイスを用いて、他のプロセスのメモリ空間やレジスタの内容を読んだり、変更したりすることができるようになっている場合もある。
【００９０】
判断プログラムは、例えば、インタープリタによって実行されるものであってもよい。例えば、判断プログラムがＬｉｓｐ、Ｐｅｒｌ、Ｒｕｂｙなどの言語により記述されていてもよい。また、判断プログラムは、コンピュータが直接実行できるマシンインストラクションの列からなっていてもよい。この場合には、コンピュータウィルス検出装置を実現するプログラムの一部として、判断プログラムが組み込まれていてもよい。あるいは、判断プログラムが、例えば、動的ライブラリなどとして、動的にコンピュータウィルス検出装置を実現するプログラムにロードされるようになっていてもよい。なお、判断プログラムが、インタープリタで実行されるものであったり、動的にロードされるものであったりする場合には、判断プログラムを差し替えることが容易に行なえる。
【００９１】
図１０は、ブレークポイント情報がブレークポイント情報保持部９０１により保持されている状態の一例を示す。図１０（ａ）においては、ブレークポイント情報がテーブルに保持されている。列１００１には、ブレークポイント位置情報が格納され、列１００２には、判断プログラムが格納される。図１０（ｂ）は、判断プログラムへのポインタがテーブルに格納されている状態の一例を示す。そのポインタは、コンピュータウィルス検出装置を実現するプログラムを実行するプロセスのメモリ空間内部における特定の場所を指す。
【００９２】
図１１は、アプリケーションプログラムごとにブレークポイント情報が提供されている様子を例示する。ブレークポイント情報保持部９０１は、このように、アプリケーションプログラムごとにブレークポイント情報を保持していてもよい。
【００９３】
「ブレークポイント設定部」９０２は、アプリケーションプログラムに、ブレークポイント情報保持部９０１で保持されたブレークポイント情報に基づいて、ブレークポイント情報を設定する。すなわち、ブレークポイント情報に含まれるブレークポイント位置情報が示す位置にブレークポイントを設定する。この設定は、オペレーティングシステムが提供するシステムコールやスペシャルデバイスを用いて行なう。「基づいて」とは、例えば、ブレークポイント位置情報が関数などの名前を用いて表現されている場合には、関数などの名前から、その関数などのアドレスを得ることを意味する。関数などの名前と、そのアドレスと、の対応付けは、アプリケーションプログラムのシンボルテーブルを読むことなどによって得ることができる。
【００９４】
「判断プログラム実行部」９０３は、前記アプリケーションプログラムの実行が、ブレークポイント設定部９０２で設定されたブレークポイントに到達したとき、前記ブレークポイント情報に含まれる判断プログラムを実行する。「前記アプリケーションプログラム」とは、ブレークポイント設定部９０２によりブレークポイントが設定されたアプリケーションプログラムである。コンピュータウィルス検出装置は、ブレークポイントが設定されたアプリケーションプログラムの実行がブレークポイントに到達するまで待つことを行なう。このためには、例えば、ｗａｉｔシステムコールが呼び出される。アプリケーションプログラムの実行がブレークポイントに到達すると、（１）ｗａｉｔシステムコールからコンピュータウィルス検出装置の処理が再開し、（２）どのブレークポイントに到達したかを判断し、（３）判断プログラム実行部９０３に、判断プログラムを実行させる。アプリケーションプログラムがどのブレークポイントに到達したかを判断するには、アプリケーションプログラムを実行するプロセスのレジスタに保持されているプログラムカウンタの値を取得することにより判断する。
【００９５】
（実施形態１：処理）
図１２は、コンピュータウィルス検出装置の処理のフローチャートを例示する。
【００９６】
ステップＳ１２０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。例えば、この処理はブレークポイント設定部９０２により行なわれる。
【００９７】
ステップＳ１２０２において、アプリケーションプログラムの実行が、ブレークポイントに到達するまで待つ。この処理は、例えば、ｗａｉｔシステムコールを実行することにより、実現される。
【００９８】
ステップＳ１２０３において、アプリケーションプログラムの実行が到達したブレークポイントに対応する判断プログラムを実行する。例えば、この処理は判断プログラム実行部９０３により行なう。
【００９９】
ステップＳ１２０４において、処理を終了するかどうかを判断する。例えば、ステップＳ１２０３における判断プログラムの実行により、アプリケーションプログラムがコンピュータウィルス性を有すると判断された場合には、処理を終了する。もし、処理を終了しないと判断された場合には、ステップＳ１２０５へ処理を移行する。
【０１００】
ステップＳ１２０５において、アプリケーションプログラムの実行を続ける。アプリケーションプログラムがブレークポイントに到達すると、アプリケーションプログラムの実行が停止するので、停止したところから処理を再開させる。例えば、アプリケーションプログラムを実行するプロセスにシグナル（例えば、ＳＩＧ＿ＣＯＮＴ）を送る。その後、ステップＳ１２０２へ処理を移行する。
【０１０１】
なお、コンピュータウィルス検出装置は、ブレークポイント情報保持ステップと、ブレークポイント設定ステップと、判断プログラム実行ステップと、を含むコンピュータウィルス検出方法を使用するための装置と考えることができる。「ブレークポイント情報保持ステップ」は、ブレークポイント情報を保持するステップであり、「ブレークポイント設定ステップ」は、アプリケーションプログラムに、ブレークポイント情報保持ステップで保持されたブレークポイント情報に基づいて、ブレークポイントを設定するステップであり、「判断プログラム実行ステップ」とは、アプリケーションプログラムの実行が、ブレークポイント設定ステップで設定されたブレークポイントに到達したとき、ブレークポイント情報に含まれる判断プログラムを実行するステップである。すなわち、ブレークポイント情報保持ステップは、ブレークポイント情報保持部を動作するステップであり、ブレークポイント設定ステップは、ブレークポイント設定部を動作するステップであり、判断プログラム実行ステップは判断プログラム実行部を実行するステップである。なお、本発明に係るコンピュータウィルス検出方法の使用は、本発明に係るコンピュータウィルス検出装置に限定されることはない。
【０１０２】
（実施形態１：主な効果）
本実施形態により、オペレーティングシステムのカーネル内部に修正を加えることなく、アプリケーションプログラムを実行するプロセスの振る舞いを、コンピュータウィルス検出装置により監視することができるので、システムダウンの発生を回避することが可能となる。また、コンピュータウィルスの振る舞いは非常に似ている場合が多いので、従来のアンチウィルスソフトウェアにおいて必要であった、パターンファイルを最新のものに更新し続けることの必要性が低くなったり、パターンファイルの更新が不要となったりする。
【０１０３】
（実施形態２）
本発明の実施形態２として、アプリケーションプログラムを保持するコンピュータウィルス検出装置を説明する。
【０１０４】
図１３は、本実施形態に係るコンピュータウィルス検出装置による表示画面を例示する。ウィンドウ１３０１は、本実施形態に係るコンピュータウィルス検出装置が表示するウィンドウである。そのウィンドウのサブウィンドウ１３０２に、アプリケーションプログラムのアイコンが表示されている。必要に応じて、ウィンドウ１３０１の外に表示されているアイコン（例えば、アイコン１３０４）をドラッグして、サブウィンドウ１３０２の内部に移動させることができる。サブウィンドウ１３０２の内部に表示されたアイコン（例えば、アイコン１３０３）をダブルクリックなどすることにより、アプリケーションプログラムを実行するプロセスが、コンピュータウィルス検出装置を実行するプロセスの子プロセスとして生成され、その振る舞いが監視される。
【０１０５】
（実施形態２：構成）
図１４は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。コンピュータウィルス検出装置１４００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、アプリケーションプログラム保持部１４０１と、プログラム実行開始部１４０２と、ブレークポイント設定命令部１４０３と、を有する。
【０１０６】
したがって、本実施形態に係るコンピュータウィルス検出装置は、実施形態１に係るコンピュータウィルス検出装置が、さらに、アプリケーションプログラム保持部１４０１と、プログラム実行開始部１４０２と、ブレークポイント設定命令部１４０３と、を有する構成となっている。なお、本明細書においては、同じ定義が適用される部には、できるだけ同じ符号を割り当てることにする。なお、同じ符号が割り当てられていることは、実際の製造などにおいて、同一の構成などになることを意味するものではない。
【０１０７】
「アプリケーションプログラム保持部」１４０１は、アプリケーションプログラムを保持する。保持には、種々の形態がある。例えば、アプリケーションプログラム全体を格納する形態がある。また、アプリケーションプログラムが格納されている場所、例えばファイルシステムにおけるパスなどで表現される、を格納する形態もあり得る。
【０１０８】
「プログラム実行開始部」１４０２は、アプリケーションプログラム保持部１４０１で保持されたアプリケーションプログラムの実行を開始する。例えば、コンピュータウィルス検出装置を実現するプログラムを実行するプロセスの子プロセスとして、アプリケーションプログラムの実行を開始する。
【０１０９】
「ブレークポイント設定命令部」１４０３は、プログラム実行開始部１４０２で実行が開始されるアプリケーションプログラムに対して、ブレークポイント設定部９０２に、ブレークポイントの設定を命令する。例えば、ブレークポイント設定部９０２を実現する関数などの呼び出しを行なう。
【０１１０】
（実施形態２：処理）
図１５は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
【０１１１】
ステップＳ１５０１において、アプリケーションプログラムを保持する。この処理は、アプリケーションプログラム保持部１４０１により行なわれる。例えば、図１３において、アイコン１３０４をサブウィンドウ１３０２の内部にドラッグされたことを検出し、アイコン１３０４が表わすアプリケーションプログラムを保持する。
【０１１２】
ステップＳ１５０２において、アプリケーションプログラムが選択されるまで待つ。例えば、図１３において、サブウィンドウ１３０２の内部のアイコンがダブルクリックされるまで待つ。
【０１１３】
ステップＳ１５０３において、ブレークポイント位置情報が示す位置に、ブレークポイントを、選択されたアプリケーションに設定することを命ずる。この処理は、ブレークポイント設定命令部１４０３により行なわれる。
【０１１４】
ステップＳ１５０４において、ブレークポイントの設定の完了を待つ。例えば、ブレークポイント設定部９０２を実現する関数などの呼び出しから戻るまで待つ。
【０１１５】
ステップＳ１５０５において、選択されたアプリケーションプログラムを実行する。より正確に述べると、選択されたアプリケーションプログラムを実行するためのプロセスを実行させる。ステップＳ１５０５の後は、図１２のフローチャートのステップＳ１２０２、ステップＳ１２０３、ステップＳ１２０４、ステップＳ１２０５を実行することとなる。最近のオペレーティングシステムにおいては、一つのプロセスの中で複数のスレッドを並列／平行に動作させることが可能となっている。そこで、ステップＳ１２０２、ステップＳ１２０３、ステップＳ１２０４、ステップＳ１２０５の実行は、図１５のフローチャートを実行するスレッドとは別のスレッドにより行なわれてもよい。
【０１１６】
ステップＳ１５０６により、処理を終了するかどうかを判断する。例えば、コンピュータウィルス検出装置の操作者が、終了ボタンを押したかどうかにより判断する。もし、終了でなければ、ステップＳ１５０２へ戻る。
【０１１７】
（実施形態２：主な効果）
本実施形態により、振る舞いを監視するべきアプリケーションプログラムを実行するプロセスを容易に生成することが可能となる。また、コンピュータウィルスを外部から導入する虞が無いアプリケーションプログラムは、監視の対象としないようにすることができるので、ブレークポイントの設定により、そのようなアプリケーションプログラムを実行するスピードを低下させることがない。
【０１１８】
（実施形態３）
本発明の実施形態３として、システムコールＡＰＩ関数にブレークポイントを設定し、プロセスの振る舞いを監視するコンピュータウィルス検出装置について説明する。
【０１１９】
（実施形態３：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態１又は２のコンピュータウィルス検出装置のブレークポイント情報保持部９０１が保持するブレークポイント情報を、アプリケーションプログラムのシステムコールＡＰＩ関数に基づいて定められるようにしたものである。
【０１２０】
「システムコールＡＰＩ関数」とは、システムコールを呼び出すためのライブラリ関数などを意味する。そのようなライブラリ関数などは、通常は、システムコールに対する引数をスタックに積み、トラップ命令を実行するようになっている。トラップ命令の実行により、オペレーティングシステムによりＣＰＵに設定された割り込みルーチンが起動され、オペレーティングシステム内部の処理が開始される。スタックに引数を積み、トラップ命令を実行する処理を、直接に高級言語で表現することは困難であるので、そのような処理を行なうライブラリ関数などが用意されている。
【０１２１】
図１６は、本実施形態におけるブレークポイント情報を例示する。図１６において、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡがシステムコールＡＰＩ関数の名前となっている。したがって、ブレークポイント設定部がブレークポイントを設定する場合には、システムコールＡＰＩ関数の名前をアドレスに変換する必要がある。その変換の処理については、概要の項で説明した通りである。
【０１２２】
（実施形態３：主な効果）
コンピュータウィルスは、システムコールＡＰＩ関数を用いて、自身をコンピュータに感染させることが多いので、システムコールＡＰＩ関数の呼び出しを検出して、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断することで、少ないブレークポイントの設定で的確に判断することが可能となる。
【０１２３】
（実施形態４）
本発明の実施形態４として、システムコールＡＰＩ関数の引数の検査に基づいて、判断を行なうコンピュータウィルス検出装置について説明する。
【０１２４】
（実施形態４：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態３に係るコンピュータウィルス検出装置において、判断プログラムに、システムコール検査プログラムを含ませた構成となっている。「システムコール検査プログラム」とは、そのアプリケーションプログラムが呼び出すシステムコールＡＰＩ関数の引数の検査に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかの判断をするためのプログラムである。「そのアプリケーションプログラム」とは、ブレークポイント設定部９０２によりプレークポイントが設定されたアプリケーションプログラムを意味する。
【０１２５】
したがって、本実施形態においては、アプリケーションプログラムの実行がブレークポイントに到達すると、アプリケーションプログラムのシステムコールＡＰＩ関数の引数が検査されることになる。この検査の結果に基づいて、アプリケーションプログラムがコンピュータウィルス性を有するかどうかが判断される。
【０１２６】
なお、本実施形態において、引数が検査されるシステムコールＡＰＩ関数は、ブレークポイントが設定されたものに限定はされない。例えば、アプリケーションプログラムのマシンインストラクションを全て調べて、全てのシステムコールＡＰＩ関数の引数が検査されるようになっていてもよい。また、到達したブレークポイントでのシステムコールＡＰＩ関数の引数を記憶しておき、後にブレークポイントに到達したときに、記憶されたシステムコールＡＰＩ関数に引数を検査するようになっていてもよい。
【０１２７】
（実施形態４：主な効果）
本実施形態では、システムコールＡＰＩ関数の引数の検査に基づいて、コンピュータウィルス性が判断されるので、より的確に判断を行なうことが可能となる。
【０１２８】
（実施形態５）
本発明の実施形態５として、到達したブレークポイントにおけるシステムコールＡＰＩ関数の引数を検査するコンピュータウィルス検出装置について説明する。
【０１２９】
（実施形態５：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態４に係るコンピュータウィルス検出装置において、システムコール検査プログラムによって検査される引数を、ブレークポイント情報保持部９０１が保持するブレークポイント位置情報で定められるシステムコールＡＰＩ関数の引数としたものである。
【０１３０】
例えば、図１６に例示されるように、ＲｅｇＣｒｅａｔｅＫｅｙＥｘＡというシステムコールＡＰＩ関数にブレークポイントが設定され、アプリケーションプログラムの実行がそのブレークポイントに到達した場合には、システムコール検査プログラムは、そのＲｅｇＣｒｅａｔｅＫｅｙＥｘＡの引数を検査する。その検査の例は、本発明の概要の項で述べたとおりである。
【０１３１】
（実施形態５：主な効果）
本実施形態により、呼び出されたシステムコールＡＰＩ関数の引数の検査に基づいてコンピュータウィルス性の判断がされるので、より的確に判断を行なえる。
【０１３２】
（実施形態６）
本発明の実施形態６として、システムリソースを変更するシステムコールＡＰＩ関数が呼ばれた場合、変更されるシステムリソースの複製を生成するコンピュータウィルス検出装置について説明する。
【０１３３】
（実施形態６：構成）
本実施形態に係るコンピュータウィルス検出装置は、実施形態４または５のコンピュータウィルス検出装置において、判断プログラムに、複製作成プログラムを含ませた構成となっている。「複製作成プログラム」は、そのアプリケーションプログラムのシステムコールＡＰＩ関数によりシステムリソースが変更される場合に、その変更されるシステムリソースの複製を生成する。「そのアプリケーションプログラム」とは、ブレークポイント設定部９０２によりブレークポイントの設定が行なわれたアプリケーションプログラムである。
【０１３４】
したがって、本実施形態においては、ブレークポイント位置情報は、システムリソースを変更するシステムコールＡＰＩ関数の位置を示すこととなる。ここでいうシステムリソースとは、例えば、レジストリ、ファイルなど、コンピュータが使用するリソースのうち、複製が可能なリソースを意味する。
【０１３５】
例えば、レジストリを変更するシステムコールＡＰＩ関数にブレークポイントを設定しておき、アプリケーションプログラムの実行が、そのブレークポイントに到達した場合には、レジストリの複製をする複製作成プログラムが実行される。複製が作成されると、システムコールによりレジストリの変更が行なわれる。レジストリの複製するにあったては、レジストリ全体を複製してもよいし、変更される部分だけを複製してもよい。レジストリの変更される部分は、システムコールＡＰＩ関数の引数により判断することができる。
【０１３６】
なお、本実施形態において、複製作成プログラムの実行は、アプリケーションプログラムがコンピュータウィルス性を有すると判断される場合に行なうようにしてもよい。これにより、作成される複製の量を減らすことができる。
【０１３７】
（実施形態６：処理）
図１７は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
【０１３８】
ステップＳ１７０１において、ブレークポイント位置情報が示す位置に、ブレークポイントをアプリケーションプログラムに設定する。
【０１３９】
ステップＳ１７０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
【０１４０】
ステップＳ１７０３において、判断プログラムを実行する。
【０１４１】
ステップＳ１７０４において、判断プログラムの実行の結果が、アプリケーションプログラムがコンピュータウィルス性を有するものであるかどうかを判定する。もし、コンピュータウィルス性を有するものであれば、ステップＳ１７０５へ処理を移行させ、そうでなければ、ステップＳ１７０７へ処理をスキップさせる。
【０１４２】
ステップＳ１７０５において、アプリケーションプログラムがシステムリソースを変更しようとしているかどうかを判定する。この判定は、到達したブレークポイントに係るシステムコールＡＰＩ関数の種類、その引数を調べることにより行なうことができる。もし、システムリソースを変更しようとしている場合には、ステップＳ１７０６へ処理を移行させ、そうでなければ、ステップＳ１７０７へ処理をスキップさせる。
【０１４３】
ステップＳ１７０６において、複製作成プログラムにより、システムリソースの複製を作成する。
【０１４４】
ステップＳ１７０７において、全体の処理を終了するかどうかを判断する。もし、終了しないと判断されると、ステップＳ１７０８へ処理を移行させる。
【０１４５】
ステップＳ１７０８において、アプリケーションプログラムの実行を続け、ステップＳ１７０２へ処理を移行させる。もし、アプリケーションプログラムがコンピュータウィルスであり、システムリソースが不正なものに変更されても、ステップＳ１７０６で作成された複製によりシステムを復元することができる。
【０１４６】
（実施形態６：主な効果）
本実施形態においては、変更されるシステムリソースの複製が作成されるので、アプリケーションプログラムがコンピュータウィルスでありコンピュータが感染したとしても、システムリソースの複製を用いてシステムの復旧が可能となる。
【０１４７】
（実施形態７）
本発明の実施形態７として、アプリケーションプログラムがコンピュータウィルス性を有すると判断された場合に、システムコールＡＰＩ関数の実行をさせないコンピュータウィルス検出装置について説明する。
【０１４８】
（実施形態７：構成）
図１８は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。本実施形態に係るコンピュータウィルス検出装置の構成は、実施形態１から６のいずれかのコンピュータウィルス検出装置が、実行阻止部を有する構成となっている。したがって、例えば、コンピュータウィルス検出装置１８００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、実行阻止部１８０１と、を有する。コンピュータウィルス検出装置１８００は、このほかに、アプリケーションプログラム保持部、プログラム実行開始部、ブレークポイント設定命令部を有していてもよい。
【０１４９】
「実行阻止部」１８０１は、判断プログラム実行部９０３による判断の結果、判断の対象となったアプリケーションプログラムがコンピュータウィルス性を有すると判断された場合に、アプリケーションプログラムのシステムコールＡＰＩ関数の実行をさせないための部である。
【０１５０】
スタックの使用が図５に例示されたものである場合には、実行阻止部１８０１は、フレームポインタ（ｆｐ）の値を用いて、部分５０４に格納されている関数呼び出し前のフレームポインタの値を取得してフレームポインタ（ｆｐ）に設定し、プログラムカウンタの値を部分５０３に格納されている値にして、システムコールＡＰＩ関数の実行をさせないようにする。
【０１５１】
（実施形態７：処理）
図１９は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
【０１５２】
ステップＳ１９０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。
【０１５３】
ステップＳ１９０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
【０１５４】
ステップＳ１９０３において、判断プログラムを実行する。
【０１５５】
ステップＳ１９０４において、判断プログラムの結果、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判定する。もし、コンピュータウィルス性を有するのであれば、ステップＳ１９０５へ処理を移行させ、そうでなければ、ステップＳ１９０６へ処理をスキップさせる。
【０１５６】
ステップＳ１９０５において、システムコールＡＰＩ関数の実行をさせないようにする。この処理において、実行阻止部１８０１を用いる。
【０１５７】
ステップＳ１９０６において、全体の処理を終了させるかどうかを判断する。もし、終了させないのであれば、ステップＳ１９０７へ処理を移行させる。
ステップＳ１９０７において、アプリケーションプログラムの実行を続ける。その後、ステップＳ１９０２へ処理を移行させる。
【０１５８】
（実施形態７：主な効果）
本実施形態においては、危険なシステムコールの実行が阻止されるので、例えば、特定のワードプロセッサのマクロプログラムがコンピュータウィルス性を有する場合に、ワードプロセッサの機能を停止させることなく、危険なマクロプログラムの実行を阻止することが可能となり、危険なシステムコールの実行を阻止しつつ、アプリケーションプログラムの実行を継続することができる。
【０１５９】
（実施形態８）
本発明の実施形態８として、コンピュータウィルス性を有するアプリケーションプログラムの通信を阻止するコンピュータウィルス検出装置と、通信機器と、について説明する。
【０１６０】
図２０は、本実施形態の概要を例示する。コンピュータ２００１が、通信機器２００２を介して外部の通信網２００３に接続されている。通信機器２００２の代表的な例としては、ルータがある。コンピュータ２００１の内部では、アプリケーションプログラムを実行するプロセス２００４と、コンピュータウィルス検出装置を実現するプロセス２００５が動作し、プロセス２００５は、プロセス２００４の振る舞いを監視している。もし、プロセス２００４が実行するアプリケーションプログラムがコンピュータウィルス性を有し、外部に対して通信２００６を行なおうとしたとする。この場合、プロセス２００５は、プロセス２００４が外部に対して有害な通信を行なうとしているとみなして、その有害な通信を阻止するために、通信機器２００２に対して通信阻止命令２００７を出力する。通信機器２００２は、通信阻止命令２００７に基づいて、プロセス２００４が行なおうとする通信のパケットを中継しないなどして、通信を阻止する。
【０１６１】
（実施形態８：コンピュータウィルス検出装置の構成）
図２１は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。本実施形態に係るコンピュータウィルス検出装置の構成は、実施形態１ないし７のいずれか一におけるコンピュータウィルス検出装置が、通信阻止命令出力部を有する構成となっている。例えば、コンピュータウィルス検出装置２１００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、通信阻止命令出力部２１０１と、を有する。
【０１６２】
「通信阻止命令出力部」２１０１は、判断プログラム実行部９０３による判断の結果、判断の対象となったアプリケーションプログラムがコンピュータウィルス性を有すると判断された場合、そのアプリケーションプログラムが通信システムコールＡＰＩ関数を実行するときに、通信阻止命令を出力する。「通信阻止命令」とは、外部の通信機器に対して、アプリケーションプログラムが実行する通信システムコールＡＰＩ関数による通信を失敗させるための命令である。
【０１６３】
例えば、コンピュータウィルス性を持つと判断されたアプリケーションプログラムが、コンピュータの外部に対してデータを送信しようとしたり、コンピュータの外部からデータを受信しようとしたりするために、通信のためのシステムコールＡＰＩ関数を実行すると、外部の通信機器、例えばルータ、に対して、その通信を失敗させる命令が出力される。
【０１６４】
図２２は、通信阻止命令の一例を示す。この例では、通信阻止命令はＸＭＬなどの構造化文書として記述されている。図２２は、例えば図２０において、コンピュータ２００１のＩＰアドレスが１９２．１６８．１９３．０６３であり、プロセス２００４が、ＩＰアドレスが１０．１３９．２１０．２５４であり、ポートが２５番である通信を行なおうとした場合に出力される通信阻止命令を示している。このような通信阻止命令は、例えば、ＳＯＡＰ（Ｓｉｍｐｌｅ  Ｏｂｊｅｃｔ  Ａｃｃｅｓｓ  Ｐｒｏｔｏｃｏｌ）により、このような通信阻止命令が外部の通信機器に出力されるようになっていてもよい。
【０１６５】
（実施形態８：コンピュータウィルス検出装置の処理）
図２３は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
【０１６６】
ステップＳ２３０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。
【０１６７】
ステップＳ２３０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
【０１６８】
ステップＳ２３０３において判断プログラムを実行する。
【０１６９】
ステップＳ２３０４において、アプリケーションプログラムが、コンピュータウィルス性を有するかどうかの判定を行なう。もし、コンピュータウィルス性を有すると判定されると、ステップＳ２３０５へ処理を移行させ、そうでなければ、ステップＳ２３０７へ処理をスキップする。
【０１７０】
ステップＳ２３０５において、到達したブレークポイントが通信システムコールＡＰＩ関数かどうかを判断する。もし、通信システムコールＡＰＩ関数であれば、処理をステップＳ２３０６へ移行させ、そうでなければ、ステップＳ２３０７へ処理をスキップさせる。
【０１７１】
ステップＳ２３０６において、外部の通信機器に通信阻止命令を出力する。この処理は、通信阻止命令出力部２１０１により行なわれる。
【０１７２】
ステップＳ２３０７において、全体の処理を終了するかどうか判定する。もし、終了しないのであれば、処理をステップＳ２３０８へ移行させる。
【０１７３】
ステップＳ２３０８において、アプリケーションプログラムの実行を続ける。もし、実行が続いて、有害な通信が行なわれたとしても、ステップＳ２３０６において出力された通信阻止命令により、通信が阻止されることになる。
【０１７４】
（実施形態８：通信機器の構成）
図２４は、本実施形態に係る通信機器の機能ブロック図を例示する。通信機器２４００は、通信阻止命令受信部２４０１と、通信阻止部２４０２と、を有する。
【０１７５】
「通信阻止命令受信部」２４０１は、通信阻止命令を受信する。通信阻止命令は、例えば、通信阻止命令出力部２１０１により出力されるものであり、ＸＭＬで記述された場合には、図２２に例示したものとなる。通信阻止命令を受信するためのポートを用意しておき、通信阻止命令受信部２４０１は、このポートに通信阻止命令が送信されるまで待つ。また、必要に応じて、通信阻止命令を出力したプログラムが正当なプログラムであることを認証するための処理を行なってもよい。
【０１７６】
「通信阻止部」２４０２は、通信阻止命令受信部２４０１で受信された通信阻止命令に基づいて、通信を阻止する。例えば、通信阻止命令が図２２に示すものである場合、１９２．１６９．１９３．０６３のＩＰアドレスから、１０．１３９．２１０．２５４のＩＰアドレスのコンピュータの２５番ポートへ行く通信パケットの中継をしないなどの処理を行なう。
【０１７７】
（実施形態８：通信機器の処理）
図２５は、本実施形態に係る通信機器の処理のフローチャートである。通信機器は、このフローチャートにより示される処理を繰り返し実行する。
【０１７８】
ステップＳ２５０１において、通信阻止命令が受信されるまで待つ。この処理は、通信阻止命令受信部２４０１により行なう。
【０１７９】
ステップＳ２５０２において、通信阻止命令に基づいて通信を阻止する。この処理は、通信阻止部２４０２により行なう。
【０１８０】
（実施形態８：主な効果）
本実施形態によれば、いわゆるスパイウェアなどのプログラムがコンピュータのデータを外部に送信することを防止することが可能となる。また、電子メールを介して感染が広がるコンピュータウィルスが送信する電子メールの送信を阻止することが可能となる。
【０１８１】
（実施形態９）
本発明の実施形態９として、アプリケーションプログラムが到達したブレークポイントの履歴に基づいて、アプリケーションプログラムがコンピュータウィルス性を有するかどうか判断するコンピュータウィルス検出装置について説明する。
【０１８２】
（実施形態９：構成）
図２６は、本実施形態に係るコンピュータウィルス検出装置の機能ブロック図を例示する。コンピュータウィルス検出装置２６００は、ブレークポイント情報保持部９０１と、ブレークポイント設定部９０２と、判断プログラム実行部９０３と、履歴保持部２６０１と、を有する。したがって、図２６に機能ブロック図が例示されたコンピュータウィルス検出装置は、実施形態１に係るコンピュータウィルス検出装置が履歴保持部２６０１を有する構成となっている。なお、本実施形態に係るコンピュータウィルス検出装置は、他の実施形態、すなわち、実施形態２から実施形態８のいずれか一に係るコンピュータウィルス検出装置が、履歴保持部２６０１を有するものであってもよい。
【０１８３】
「履歴保持部」２６０１は、ブレークポイント設定部９０２で設定されたブレークポイントに前記アプリケーションプログラムが到達した履歴を保持する。「前記アプリケーションプログラム」とは、ブレークポイント設定部９０２によりブレークポイントが設定されたアプリケーションプログラムを意味する。
【０１８４】
したがって、本実施形態においては、アプリケーションプログラムの実行がブレークポイントに到達すると、例えば、どのブレークポイントに到達したか、その日時、ブレークポイントがシステムコールＡＰＩ関数であれば、その引数、などを履歴として追加する。この処理は、判断プログラムが行なってもよいし、あるいは、判断プログラムに含まれるプログラムや、コンピュータウィルス検出装置２６００の部によって行なわれてもよい。なお、履歴保持部２６０１が複数のアプリケーションプログラムが到達したブレークポイントの履歴を保持する場合には、アプリケーションプログラムを識別する識別情報も履歴として追加されるのが好ましい。
【０１８５】
本実施形態においては、判断プログラムは、履歴検査プログラムを有する。「履歴検査プログラム」とは、履歴保持部２６０１で保持された履歴に基づいて、そのアプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する。
【０１８６】
例えば、いわゆるデーモンプログラムと呼ばれるアプリケーションプログラムがある。デーモンプログラムは、コンピュータ内部に常駐して、要求が受信できるのを待ち、その要求に対してサービスを提供するアプリケーションプログラムである。このようなデーモンプログラムが提供するサービスの内容は定型化されており、したがって、デーモンプログラムの動作はほぼ一定である。例えば、デーモンプログラムのうち、ウェブページの送信要求に対して、要求されたウェブページを返信するアプリケーションプログラム（例えば、Ａｐａｃｈｅと名前が付けられたプログラムが有名である）は、特定のポートに要求が送信されるのを待ち、要求されたウェブページを格納するファイルをオープンし、そのファイルに対してｒｅａｄを行ない、ｒｅａｄの結果を返信し、ファイルをクローズして、ログファイルに書き込む、という処理を繰り返し行なう。また、オープンするべきファイルの場所は、特定のディレクトリ下であるという特性を持つ。したがって、このような一定の処理から逸脱した処理を行なうと、そのデーモンプログラムがコンピュータウィルスやワームに感染した可能性が高い。本実施形態では、このようにして、アプリケーションプログラムがコンピュータウィルス性を有するかどうかを判断する。
【０１８７】
より具体的な例としては、ブレークポイントごとに、到達した回数を記録しておき、これまで到達したことがないブレークポイントに到達したならば、アプリケーションプログラムがコンピュータウィルス性を有すると判断する。あるいは、ブレークポイントの位置がシステムコールＡＰＩ関数である場合には、履歴に基づいて、その引数の規則を抽出し、その規則に合致しない引数が与えられた場合には、アプリケーションプログラムがコンピュータウィルス性を有すると判断する。例えば、ファイルをオープンする際に指定されるファイルのパスに関する規則を、ワイルドカードや正規表現として抽出し、そのワイルドカードや正規表現に適合しないパスのファイルをオープンしようとした場合には、アプリケーションプログラムがコンピュータウィルス性を有すると判断する。
【０１８８】
なお、本実施形態は、デーモンプログラムにのみ適用できるのみならず、他のアプリケーションプログラムにも適用が可能である。例えば、一般人によるワードプロセッサなどの使用は定型的なものである。そこで、定型的な使用で呼び出されるシステムコール以外が呼び出されると、そのワードプロセッサがコンピュータウィルス性を有すると判断されるようになっていてもよい。ワードプロセッサを例に用いたが、表計算プログラム、プレゼンテーションプログラム、メーラ、ブラウザなどのアプリケーションプログラムにも適用ができる。
【０１８９】
（実施形態９：処理）
図２７は、本実施形態に係るコンピュータウィルス検出装置の処理のフローチャートを例示する。
【０１９０】
ステップＳ２７０１において、ブレークポイント位置情報が示す位置に、ブレークポイントを、アプリケーションプログラムに設定する。
【０１９１】
ステップＳ２７０２において、アプリケーションプログラムの実行がブレークポイントに到達するまで待つ。
【０１９２】
ステップＳ２７０３において、ブレークポイントに到達した履歴を追加する。
【０１９３】
ステップＳ２７０４において、判断プログラムを実行する。ここで、履歴検査プログラムも実行されることになる。
【０１９４】
ステップＳ２７０５において、終了するべきかどうかを判定する。もし、終了しないのであれば、ステップＳ２７０６へ処理を移行させる。
【０１９５】
ステップＳ２７０６において、アプリケーションプログラムの実行を続ける。その後、ステップＳ２７０２に処理を移行させる。
【０１９６】
なお、ステップＳ２７０３の処理は、判断プログラムを実行した後で行なわれるようになっていてもよい。
【０１９７】
（実施形態９：主な効果）
本実施形態によれば、アプリケーションプログラムの動作がこれまでと異なる傾向を示すかどうかに基づいて、コンピュータウィルス性を判断するので、一定の動作を繰り返し行なうデーモンプログラムなどの振る舞いの監視に有用である。また、正常な動作の履歴があればコンピュータウィルス性の判断が行なえるので、判断プログラムの作成が容易となる。
【０１９８】
（実施形態１０）
本発明の実施形態１０として、アプリケーションプログラムがバーチャルマシンであるコンピュータウィルス検出装置について説明する。
【０１９９】
（実施形態１０：構成）
図２８は、本実施形態に係るコンピュータウィルス検出装置の使用の形態を例示する。コンピュータ２８０１の内部で、コンピュータウィルス検出装置２８０２とバーチャルマシン２８０３が動作している。コンピュータウィルス検出装置２８０２は、実施形態１ないし９のいずれか一のコンピュータウィルス検出装置を実現するプログラムである。コンピュータウィルス検出装置２８０２は、バーチャルマシン２８０３にブレークポイントを設定し、振る舞いを監視する。
【０２００】
「バーチャルマシン」とは、他のプログラム２８０５を実行するアプリケーションプログラムである。通常は、他のプログラム２８０５は、想定されたアーキテクチャのコンピュータのマシンインストラクションで記述される。代表的な例としては、Ｊａｖａ（登録商標）で記述され、コンパイルされたプログラムを実行するものがある。Ｊａｖａ（登録商標）のプログラムは、インターネットからダウンロードされることが想定されているので、多くの場合、その出所／素性が不明であり、危険なプログラムである場合がある。そこで、例えば、Ｊａｖａ（登録商標）のバーチャルマシンは、実行するプログラムがＯＳへのＡＰＩ（２８０４）を自由に使ってコンピュータのリソースにアクセスすることを制限するように設計されている。しかし、バーチャルマシンのバグを利用して、バーチャルマシン上で動くプログラム２８０５がコンピュータのリソースに自由にアクセスする場合がある。
【０２０１】
そこで、本実施形態のコンピュータウィルス検出装置２８０２が、バーチャルマシン２８０３にブレークポイントを設定して、バーチャルマシン２８０３の振る舞いを検出し、バーチャルマシン２８０３がコンピュータウィルス性を有するプログラムを実行していないかどうかを判断する。なお、本実施形態においては、バーチャルマシンがコンピュータウィルス性を有するとは、コンピュータウィルス性を有するプログラムをバーチャルマシンが実行することをも意味するものとする。
【０２０２】
（実施形態１０：主な効果）
本実施形態により、バーチャルマシンのバグなどを利用するプログラムの実行を阻止することができる。
【０２０３】
（実施形態１１）
本発明の実施形態１１として、実施形態１０におけるコンピュータを携帯電話とした実施形態について説明する。
【０２０４】
（実施形態１１：構成）
図２９は、本実施形態に係るコンピュータウィルス検出装置の使用の形態を例示する。図２８のコンピュータ２８０１が携帯電話２９０１に置き換わっている。
【０２０５】
（実施形態１１：主な効果）
携帯電話の高機能化にはめざましいものがある。例えば、インターネット用のブラウザは言うに及ばず、Ｊａｖａ（登録商標）のバーチャルマシンも携帯電話の内部で動作するようになっている。また、従来はパーソナルコンピュータで動作していたオペレーティングシステムが携帯電話の内部でも動作するようになってきており、携帯電話で動作するプログラムが複雑化している。
【０２０６】
しかし、携帯電話の販売が開始された後に、バグやセキュリティホールが見つかる場合がある。一方、携帯電話はパーソナルコンピュータ以上の台数が市場に出回り、携帯端末の回収にはコストがかかるうえ、時間も要する。このため、携帯電話で動作するバーチャルマシンなどのバグやセキュリティホールを悪用したコンピュータウィルスが作成されると、その感染規模は予想もつかないこととなり、社会的な影響が大きい。例えば、バーチャルマシンのバグなどを利用して、あらゆる携帯電話のアドレス帳のデータが収集され、プライバシ情報の漏洩につながる。
【０２０７】
そこで、本発明のコンピュータウィルス検出装置を実現するプログラムを、携帯電話の内部で動作させておき、バーチャルマシンにブレークポイントを設定して振る舞いを検出することにより、バグやセキュリティホールなどを悪用したコンピュータウィルスの動作を未然に防ぐことが可能となる。
【０２０８】
産業上の利用可能性
【０２０９】
上記のように本発明によれば、登録された命令の実行有無により監視対象プロセスの実行を中止、あるいは実行前の状態にロールバックできるようになり、従来に比してユーザの負担を軽減してウィルスへの感染予防、及び、システムのクリーンアップができる。
【０２１０】
また、本発明は、プログラム実行時の振る舞いを検出するため、従来のシグネチャスキャンでは必要であったスキャン前の圧縮ファイルの解凍や、暗号化ファイルの復号化等の前処理を必要としない。
【０２１１】
したがって、本発明は、コンピュータウィルス検出装置として有用である。
【図面の簡単な説明】
【図１】従来技術における、コンピュータでのプロセスの実行を概念的に説明する図
【図２】従来技術における、アプリケーションプログラムを実行するプロセスと、デバッガと、の関係を例示する図
【図３】従来技術において、高級言語での関数や手続きの呼び出しがどのようにコンパイルされるかを例示する図
【図４】従来技術における関数のコンパイル結果を例示する図
【図５】従来技術において、スタックに値が積まれた状態を例示する図
【図６】従来技術において、仮想プロセス空間にＤＬＬファイルがマッピングされた状態を例示する図
【図７】従来技術におけるプロセスの仮想メモリ空間を示す図
【図８】本発明における処理のフローチャートを例示する図
【図９】本発明の実施形態１に係るコンピュータウィルス検出装置の機能ブロック図
【図１０】ブレークポイント情報が保持されている状態の一例を示す図
【図１１】アプリケーションプログラムごとにブレークポイント情報が提供されている様子を例示する図
【図１２】コンピュータウィルス検出装置の処理のフローチャートを例示する図
【図１３】本発明の実施形態２に係るコンピュータウィルス検出装置による表示画面を例示する図
【図１４】本発明の実施形態２に係るコンピュータウィルス検出装置の機能ブロック図を例示する図
【図１５】コンピュータウィルス検出装置の処理のフローチャート
【図１６】本発明の実施形態３におけるブレークポイント情報を例示する図
【図１７】コンピュータウィルス検出装置の処理のフローチャート
【図１８】本発明の実施形態７に係るコンピュータウィルス検出装置の機能ブロック図
【図１９】コンピュータウィルス検出装置の処理のフローチャート
【図２０】本発明の実施形態８の概要を例示する図
【図２１】本発明の実施形態８に係るコンピュータウィルス検出装置の機能ブロック図
【図２２】通信阻止命令の一例を示す図
【図２３】コンピュータウィルス検出装置の処理のフローチャート
【図２４】本発明の実施形態８に係る通信機器の機能ブロック図
【図２５】通信機器の処理のフローチャート
【図２６】本発明の実施形態９に係るコンピュータウィルス検出装置の機能ブロック図
【図２７】コンピュータウィルス検出装置の処理のフローチャートを例示する図
【図２８】本発明の実施形態１０に係るコンピュータウィルス検出装置の使用の形態を例示する図
【図２９】本発明の実施形態１１に係るコンピュータウィルス検出装置の使用の形態を例示する図
【国際調査報告】
2004075060.tif 000032
2004075060.tif 000033
2004075060.tif 000034
2004075060.tif 000035