(57)【特許請求の範囲】
【請求項１】
プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させるフッキング処理部と、
前記フッキング処理部でフッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集して出力する情報収集部と、
前記情報収集部から出力されたコールスタックリターンアドレス情報を分析することにより悪性行為を探知し、悪性コードが実行されることを防止する情報判断部と、を含んでなり、
前記情報判断部は、コールスタックリターンアドレス情報を分析することにより、リターンアドレスがコード領域にあるか否かを判断し、リターンアドレスがコード領域に存在しない場合には悪性行為があると判断する第１診断部と、前記コールスタックリターンアドレス情報を分析することにより、リターンアドレスが指す命令語の以前命令語が関数呼出命令語であるか否かを判断し、リターンアドレスが指す命令語の以前命令語が関数呼出命令語ではない場合には悪性行為があると判断する第２診断部と、前記情報収集部から出力されたコールスタックリターンアドレス情報を既に設定された例外処理基準と比較し、前記コールスタックリターンアドレス情報が例外処理基準に該当すると判断されると、第１、第２診断部の判断の例外処理となるようにするフィルタリング部とを含み、
前記フィルタリング部は、コールスタックリターンアドレス情報のリターンアドレスが、プロセスアドレス空間内に割り当てられていないメモリにある場合、コールスタックリターンアドレス情報のリターンアドレスがメモリのスタック領域にある場合、コールスタックリターンアドレス情報のリターンアドレスがホワイトリストにある場合、およびコールスタックリターンアドレス情報のリターンアドレスの属性が基本書き込み状態である場合、例外処理することを特徴とする、プログラムの脆弱点を用いた攻撃の探知装置。
【請求項２】
前記コールスタックリターンアドレス情報は、
フッキングされた関数を呼び出す全ての関数呼出経路上に位置する全ての関数のリターンアドレス、および前記リターンアドレスを含んでいるメモリ属性を含むことを特徴とする、請求項１に記載のプログラムの脆弱点を用いた攻撃の探知装置。
【請求項３】
前記情報判断部は、
前記第１診断部および前記第２診断部の少なくとも一つが悪性行為を感知した場合には、診断情報をログファイルと共にディスクに格納し、プロセスでそれ以上のコード実行が行われないように終了させ、前記第１診断部および前記第２診断部が悪性行為を感知していない場合には、一時中断したプログラムを実行させる処理部をさらに含むことを特徴とする、請求項１に記載のプログラムの脆弱点を用いた攻撃の探知装置。
【請求項４】
前記プログラムの脆弱点を用いた攻撃の探知装置は、プロセスの実行前にプロセスのセキュリティー状態を確認設定するセキュリティー設定部をさらに含み、
前記セキュリティー設定部は、運営体制のＤＥＰ状態をチェックして活性化させるチェック部と、前記チェック部によって運営体制のＤＥＰが活性化されていると確認された場合、プロセスに永久ＤＥＰを適用させ、実行権限のないメモリ領域でのコード実行を防止する実行部と、を含むことを特徴とする、請求項１に記載のプログラムの脆弱点を用いた攻撃の探知装置。
【請求項５】
前記実行部は、
前記プロセスにＤＥＰが適用されていなければ、プロセスが生成された状態でＤＥＰを適用し、既存にＤＥＰが設定されていれば、該当ＤＥＰを解除し、ＤＥＰをさらに適用させて、該当プロセスで悪性行為によって解除が不可能な永久ＤＥＰを設定することを特徴とする、請求項４に記載のプログラムの脆弱点を用いた攻撃の探知装置。
【請求項６】
前記セキュリティー設定部は、
ヒープスプレー攻撃技法による悪性行為に使用されるヒープ領域のアドレスを予め先占するようにするアドレス先占部をさらに含むことを特徴とする、請求項４に記載のプログラムの脆弱点を用いた攻撃の探知装置。
【請求項７】
前記プログラムの脆弱点を用いた攻撃の探知装置は、前記フッキング処理部でフッキングされた関数に対する情報を分析して動的モジュールのロードを行う関数において、プロセスにロードされる動的モジュールの既存アドレスを再配置する再配置部をさらに含み、
前記再配置部は、動的モジュールの再配置オプションが活性化されているか否かを判断し、前記再配置オプションが非活性化されていると、動的モジュールのロードを行う関数から動的モジュールの既存アドレスを収集し、前記既存アドレスにメモリを割り当てることを特徴とする、請求項１に記載のプログラムの脆弱点を用いた攻撃の探知装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの脆弱点を用いて悪性コードを実行する行為を防止するための装置および方法に係り、さらに詳しくは、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させるフッキング処理部と、前記フッキング処理部でフッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集して出力する情報収集部と、前記情報収集部から出力されたコールスタックリターンアドレス情報を分析することにより悪性行為を探知し、悪性コードが実行されることを防止する情報判断部と、を含むことにより、メモリの全領域におけるコード実行或いは不正なアクセスを探知し、悪性コードが実行されることを防止することができる、プログラムの脆弱点を用いた攻撃の探知装置および方法に関する。
【背景技術】
【０００２】
個人または組織の情報がコンピュータなどに格納され、インターネットまたは無線通信網を介しての情報交換などのコンピューティング環境も多様で複雑になるにつれて、情報セキュリティー対策が日増しに重要になっているが、特に、様々な経路で流入する悪性コードによる被害を防止することが非常に重要である。前記悪性コードは、コンピュータのユーザーに被害を与える悪意のある用途で使用できる有害プログラムを意味し、その種類としてはコンピュータウィルス、ワーム、トロイの木馬、スパイウェア、アドウェアなどがあり、ネットワークトラフィック発生、システム性能低下、ファイル削除、電子メール自動発送、個人情報漏洩、遠隔制御などの問題を起こす。
【０００３】
前記悪性コードの配布は、実行ファイル拡張子を隠す方法などによってユーザーが運営体制の実行ファイルであるか否かを知らないようにして悪性コードを配布する一般的方式から外れて、プログラムの脆弱点を用いた攻撃が可能となるように悪性コードを配布する方式が広く行われている。例えば、特定のプログラムであるインターネットエクスプローラの脆弱点を利用すると、ユーザーが特定のウェブページに入ってきた瞬間、何の行為を行わなくてもコンピュータが悪性コードに感染して実行されることになる。前記プログラムの脆弱点を用いて攻撃するというのは、プログラムのバグを探し出し、そのバグを用いてプログラムコードの実行流れを攻撃者の所望する流れに変えることをいう。すなわち、脆弱なコードは一般な場合にバグが発生しないが、脆弱なコード部分で常にバグが発生するように非正常的な入力データ（ｉｎｐｕｔ ｄａｔａ）を挿入することである。この際、入力データには悪性コードとバグを発生させるデータを含むので、その後、該当プロセスは該当入力データを処理することになる。この過程でバグが発生し、発生したバグにより、入力データにある悪性コードにプログラムコードの実行流れが移され、その結果として悪性コードが実行される。
【０００４】
よって、下記特許文献１などのハッキング探知技法などによって、悪性コードの実行を防止する。
【０００５】
ところが、前記ハッキング探知技法は、システムコール（ＡＰＩ関数呼出）が発生したとき、リターン値がスタック領域にあるか否かを判断し、悪性であるか否かを判断するので、すなわち、スタック領域のみ防御を行うので、前記ハッキング探知技法の迂回が容易であって悪性コードの未探知率が高くなる。
【０００６】
また、非実行ファイルを検査し、実行アドレスが指示するメモリ領域が実行属性であるか否かを判断することにより、非実行ファイルが悪性であるか否かを判断する装置および方法は、スタック、ヒープなどの一般なメモリ領域でのコード実行を防ぐことはできるが、実行アドレスが実行属性を持つ場合に正常と判別してしまうため、コード領域でのみ実行されるＲＯＰ（ｒｅｔｕｒｎ−ｏｒｉｅｎｔｅｄ ｐｒｏｇｒａｍｍｉｎｇ）などの攻撃は防御することができない。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】韓国公開特許１０−２００３−００４６５８１号公報（２００３年６月１８日公開）の「リアルタイムバッファオーバーフローハッキング探知方法」
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明は、上述したような問題点を解決するためになされたもので、その目的は、プログラムの脆弱点を用いて悪性コードを実行させる行為をシグネチャ基盤ではなく行為基盤で診断し遮断する、プログラムの脆弱点を用いた攻撃の探知装置および方法を提供することにある。
【０００９】
本発明の他の目的は、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させ、フッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集し、前記コールスタックリターンアドレス情報を分析することにより、メモリの全領域におけるコード実行または不正なアクセスを探知し、悪性コードが実行されることを防止することができる、プログラムの脆弱点を用いた攻撃の探知装置および方法を提供することにある。
【００１０】
本発明の別の目的は、コールスタック探知技法を用いて一つの関数のみフッキングしても、数十種の関数呼出経路を探知することができる、プログラムの脆弱点を用いた攻撃の探知装置および方法を提供することにある。
【００１１】
本発明の別の目的は、プロセスに永久ＤＥＰ（Ｄａｔａ Ｅｘｅｃｕｔｉｏｎ Ｐｒｅｖｅｎｔｉｏｎ）を設定し、ヒープ領域のアドレスを予め先占し、プロセスにロードされる動的モジュールの既存アドレスを再配置することにより、さらに効果的に悪性行為を防止することができる、プログラムの脆弱点を用いた攻撃の探知装置および方法を提供することにある。
【００１２】
本発明の別の目的は、フィルタリング部がコールスタックリターンアドレス情報をフィルタリングして診断処理部の実行を容易に行うことができる、プログラムの脆弱点を用いた攻撃の探知装置および方法を提供することにある。
【課題を解決するための手段】
【００１３】
上記の目的を達成するために、本発明は、次の構成を持つ実施例によって実現される。
【００１４】
本発明の一実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置は、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させるフッキング処理部と、前記フッキング処理部でフッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集して出力する情報収集部と、前記情報収集部から出力されたコールスタックリターンアドレス情報を分析することにより悪性行為を探知し、悪性コードが実行されることを防止する情報判断部と、を含んでなり、前記情報判断部は、コールスタックリターンアドレス情報を分析することにより、リターンアドレスがコード領域にあるかを判断し、リターンアドレスがコード領域に存在しない場合には悪性行為があると判断する第１診断部と、前記コールスタックリターンアドレス情報を分析することにより、リターンアドレスが指す命令語の以前命令語が関数呼出命令語であるか否かを判断し、リターンアドレスが指す命令語の以前命令語が関数呼出命令語ではない場合には悪性行為があると判断する第２診断部と、前記情報収集部から出力されたコールスタックリターンアドレス情報を既に設定された例外処理基準と比較し、前記コールスタックリターンアドレス情報が例外処理基準に該当すると判断するとき、第１診断部および第２診断部の判断の例外処理となるようにするフィルタリング部とを含み、前記フィルタリング部は、コールスタックリターンアドレス情報のリターンアドレスが、プロセスアドレス空間内に割り当てられていないメモリにある場合、コールスタックリターンアドレス情報のリターンアドレスがメモリのスタック領域にある場合、コールスタックリターンアドレス情報のリターンアドレスがホワイトリストにある場合、およびコールスタックリターンアドレス情報のリターンアドレスの属性が基本書き込み状態である場合に、例外処理することを特徴とする。
【００１５】
本発明の他の実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置において、前記コールスタックリターンアドレス情報は、フッキングされた関数を呼び出す全ての関数呼出経路上に位置する全ての関数のリターンアドレス、前記リターンアドレスを含んでいるメモリ属性、および前記リターンアドレスを含んでいるモジュールの名前を含むことを特徴とする。
【００１７】
本発明の別の実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置において、前記情報判断部は、前記第１診断部および第２診断部の少なくとも一つが悪性行為を感知した場合には、診断情報をログファイルと共にディスクに格納し、プロセスでそれ以上のコード実行が行われないように終了させ、前記第１診断部および第２診断部が悪性行為を感知していない場合には、一時中断したプログラムを実行させる処理部をさらに含むことを特徴とする。
【００１９】
本発明の別の実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置は、プロセスの実行前にプロセスのセキュリティー状態を確認設定するセキュリティー設定部をさらに含み、前記セキュリティー設定部は、運営体制のＤＥＰ状態をチェックして活性化させるチェック部と、前記チェック部によって運営体制のＤＥＰが活性化されていると確認された場合、プロセスに永久ＤＥＰを適用させ、実行権限のないメモリ領域でのコードが実行されることを防止する実行部とを含むことを特徴とする。
【００２０】
本発明の別の実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置において、前記実行部は、前記プロセスにＤＥＰが適用されていなければ、プロセスが生成された状態でＤＥＰを適用し、既存にＤＥＰが設定されていると、該当ＤＥＰを解除し、ＤＥＰをさらに適用させることにより、該当プロセスで悪性行為によって解除が不可能な永久ＤＥＰを設定することを特徴とする。
【００２１】
本発明の別の実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置において、前記セキュリティー設定部は、ヒープスプレー攻撃技法による悪性行為に使用されるヒープ領域のアドレスを予め先占するようにするアドレス先占部をさらに含むことを特徴とする。
【００２２】
本発明の別の実施例によれば、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置は、前記フッキング処理部でフッキングされた関数に対する情報を分析して動的モジュールのロードを行う関数において、プロセスにロードされる動的モジュールの既存アドレスを再配置する再配置部をさらに含み、前記再配置部は、動的モジュールの再配置オプションが活性化されているか否かを判断し、前記再配置オプションが非活性化されていると、動的モジュールのロードを行う関数から動的モジュールの既存アドレスを収集し、前記既存アドレスにメモリを割り当てることを特徴とする。
【発明の効果】
【００２８】
本発明は、前述した実施例と後述する構成、結合および使用関係によって次の効果を得ることができる。
【００２９】
本発明は、プログラムの脆弱点を用いて悪性コードを実行させる行為を、シグネチャ基盤ではなく行為基盤で診断し遮断することができるという効果がある。
【００３０】
また、本発明は、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させ、フッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集し、前記コールスタックリターンアドレス情報を分析することにより、メモリの全領域におけるコード実行或いは不正なアクセスを探知し、悪性コードが実行されることを防止することができるという効果がある。
【００３１】
また、本発明は、コールスタック探知技法を用いて一つの関数のみフッキングしても数十種の関数呼出経路を探知することができるという効果がある。
【００３２】
また、本発明は、プロセスに永久ＤＥＰを設定し、ヒープ領域のアドレスを予め先占し、プロセスにロードされる動的モジュールの既存アドレスを再配置することにより、さらに効果的に悪性行為を防止することができるという効果がある。
【００３３】
また、本発明は、フィルタリング部がコールスタックリターンアドレス情報をフィルタリングして診断処理部の実行を容易に行うことができるという効果がある。
【図面の簡単な説明】
【００３４】
【図１】本発明の一実施例に係るプログラムの脆弱点を用いた攻撃の探知装置を示すブロック図である。
【図２】図１のセキュリティー設定部の詳細構成を示すブロック図である。
【図３】図１のプロセス検討部の詳細構成を示すブロック図である。
【図４】プログラムの脆弱点を用いた一般な攻撃技法を説明するための参考図である。
【図５】プログラムの脆弱点を用いたＲＯＰ攻撃技法を説明するための参考図である。
【図６】プログラムの脆弱点を用いたヒープスプレー（Ｈｅａｐ Ｓｐｒａｙ）攻撃技法を説明するための参考図である。
【図７】図３の情報収集部を説明するための関数呼出経路を示す参考図である。
【図８】図３の第２診断部を説明するための参考図である。
【図９】図３の第２診断部を説明するための参考図である。
【図１０】図１の再配置部の作動過程を説明するためのフローチャートである。
【図１１】本発明の他の実施例に係るプログラムの脆弱点を用いた攻撃の探知方法を示すフローチャートである。
【発明を実施するための形態】
【００３５】
以下に添付図面を参照しながら、本発明に係るプログラムの脆弱点を用いた攻撃の探知装置および方法の好適な実施例を詳細に説明する。本発明を説明するにあたり、公知の機能または構成についての具体的な説明が本発明の要旨を無駄に不明確にする可能性があると判断される場合は、その詳細な説明を省略する。明細書全体において、ある部分がある構成要素を「含む」とするとき、これは、特に反対される記載がない限り、他の構成要素を排除するのではなく、他の構成要素をさらに含むことができることを意味する。また、明細書に記載された「・・・部」などの用語は少なくとも一つの機能または動作を処理する単位を意味し、これはハードウェア、またはソフトウェア、またはハードウェアおよびソフトウェアの組み合わせで実現できる。
【００３６】
図１は本発明の一実施例に係るプログラムの脆弱点を用いた攻撃の探知装置を示すブロック図、図２は図１のセキュリティー設定部の詳細構成を示すブロック図、図３は図１のプロセス検討部の詳細構成を示すブロック図、図４はプログラムの脆弱点を用いた一般な攻撃技法を説明するための参考図、図５はプログラムの脆弱点を用いたＲＯＰ攻撃技法を説明するための参考図、図６はプログラムの脆弱点を用いたヒープスプレー（Ｈｅａｐ Ｓｐｒａｙ）攻撃技法を説明するための参考図、図７は図３の情報収集部を説明するための関数呼出経路を示す参考図、図８および図９は図３の第２診断部を説明するための参考図、図１０は図１の再配置部の作動過程を説明するためのフローチャート、図１１は本発明の他の実施例に係るプログラムの脆弱点を用いた攻撃の探知方法を示すフローチャートである。
【００３７】
本発明の一実施例に係るプログラムの脆弱点を用いた攻撃の探知装置は、図１〜図１０を参照すると、プロセスに保護部２をロードする設置部１、および前記設置部１によってプロセスにロードされ、プログラムの脆弱点を用いた攻撃を探知防御する保護部２などを含む。
【００３８】
前記設置部１は、プロセスに保護部２をロードする構成である。前記設置部１は、カーネルで作動するデバイスドライバーであり、プロセスが生成されるときにコールバックルーチンを用いてプロセスが生成された後、プロセスの実行がされていない状態で保護部２を設置する。例えば、前記設置部１は、非同期プロシージャコール（Ａｓｙｎｃｈｒｏｎｏｕｓ Ｐｒｏｃｅｄｕｒｅ Ｃａｌｌｓ）という技術を用いて保護部２をプロセスにロードすることができる。前記プロセス（Ｐｒｏｃｅｓｓ）の生成とは、一般にプログラムが作動中である場合をいうが、プロセスが生成されると、それぞれのプロセスはメモリに個人空間を持つことになる。例えば、ＮｏｔｅＰａｄ．ｅｘｅという実行ファイルがあるとき、このファイルが実行されてメモリに積載されると、メモ帳プロセスが生成される。また、前記プロセスの実行とは、プロセスが生成された後、前記プロセスで特定の行為（例えば、ファイル生成、外部通信など）が行われるためにコードを実行させることを意味する。
【００３９】
前記保護部２は、プロセスが生成された後、プロセスの実行がされていない状態で、前記設置部１によってプロセスにロードされ、プログラムの脆弱点を用いた攻撃を探知防御する構成であって、セキュリティー設定部３、プロセス検討部４、再配置部５などを含む。
【００４０】
前記セキュリティー設定部３は、プログラムの脆弱点を用いた攻撃（以下、「悪性行為」という）を診断し遮断するために、プロセスの実行前にプロセスのセキュリティー状態を確認設定する構成であって、永久ＤＥＰ設定部３１、アドレス先占部３２などを含む。
【００４１】
前記永久ＤＥＰ設定部３１は、プロセスに永久ＤＥＰ（Ｐｅｒｍａｎｅｎｔ ＤＥＰ）を設定する構成であって、チェック部３１１、実行部３１２などを含む。
【００４２】
前記チェック部３１１は、運営体制（Ｏｐｅｒａｔｉｎｇ Ｓｙｓｔｅｍ）のＤＥＰ（Ｄａｔａ Ｅｘｅｃｕｔｉｏｎ Ｐｒｅｖｅｎｔｉｏｎ）の状態をチェックして活性化させる構成であって、前記データ実行防止（ＤＥＰ）とは、実行権限のないメモリ領域でコードが実行されることを防ぐ防御技法である。前記ＤＥＰは、それぞれのプロセスごとに適用されることが可能であるが、運営体制のＤＥＰが非活性化されていると、それぞれのプロセスにＤＥＰを適用してもＤＥＰ機能が作用しないので、それぞれのプロセスにＤＥＰを適用させる前に前記チェック部３１１が運営体制のＤＥＰ状態をチェックし、前記運営体制のＤＥＰが非活性化されていると活性化されるようにする。
【００４３】
前記実行部３１２は、前記チェック部３１１によって運営体制のＤＥＰが活性化されていると確認された場合、プロセスに永久ＤＥＰを適用させ、実行権限のないメモリ領域でのコード実行を防止する。一般にプログラムを作るとき、コンパイラでＤＥＰオプションを与えてプログラムを作ると、該当プログラムが実行されてプロセス状態になったときに該当プロセスにＤＥＰが適用されるが、この状態ではＤＥＰを解除することが可能であって、プロセスが生成された状態で前記プロセスにＤＥＰを適用し、解除が不可能な永久ＤＥＰを生成する。前記プロセスにＤＥＰが適用されていなければ、プロセスが生成された状態でＤＥＰを適用し、既存にＤＥＰが設定されていると、該当ＤＥＰを解除し、ＤＥＰをさらに適用させると、該当プロセスで悪性行為によって解除が不可能な永久ＤＥＰを設定する。本明細書全体にわたって、一般なメモリ領域（Ｎｏｒｍａｌ Ｍｅｍｏｒｙ）とは、メモリにおけるコード領域を除いたデータ、スタック、ヒープ領域などのメモリ領域を意味し、正常な場合にコード実行はメモリのコード領域で行われるので、一般なメモリ領域は実行権限のないメモリ領域で表現できる。
【００４４】
前記プロセスに永久ＤＥＰを設定する理由について考察すると、図４に示す一般な悪性行為の場合、入力データ（Ｉｎｐｕｔ Ｄａｔａ）（例えば、入力データは、文書リーダープログラムの場合には文書ファイルであり、チャットプログラムの場合にはチャットメッセージ値である。）が入ってくると、プロセスは入ってきた入力データを処理するが、この際、入力データが脆弱なコードを攻撃してコード実行流れがコード領域から一般なメモリ領域の入力データの位置に変わることになり、コード領域でそれ以上のコード実行が行われず、一般なメモリ領域でコード実行が行われることになり、入力データに入っている悪性コードが実行される。この際、該当プロセスにＤＥＰがかかっていると、一般なメモリ領域にある悪性コードは実行されない。
【００４５】
ところが、ＲＯＰ（Ｒｅｔｕｒｎ Ｏｒｉｅｎｔｅｄ Ｐｒｏｇｒａｍｍｉｎｇ）という攻撃技法を用いると、一般なメモリ領域でコード実行が直ちに行われず、コード領域で悪意的な行為を行うことにより、一般なＤＥＰ機能を迂回することが可能である。すなわち、図５に示すように、ＲＯＰ攻撃技法は、コード領域のコードセクション（Ｇａｄｇｅｔ）を用いて悪性行為を行う一つの流れを作り出すが、悪性行為を行うコードはコード領域にある命令語を組み合わせて発生させるものであるから、該当プロセスにＤＥＰがかかっていても、これを迂回し、悪性行為が発生するのである。しかし、コードセクションを探し、これを意味のある組み合わせに作り出すことは容易ではないため、ＲＯＰ攻撃技術を用いて多くの悪性行為を行うことは難しいから、攻撃者は、ＲＯＰ攻撃技法を用いてプロセスのＤＥＰの解除関数を呼び出す行為を生成し、プロセスに設定されているＤＥＰを解除させた後、一般なメモリ領域にある悪性コードに実行流れを渡すことにより悪性コードを実行させる。ところが、前記永久ＤＥＰ設定部によってプロセスには永久ＤＥＰが適用されているので、ＲＯＰ攻撃技法を用いても、プロセスに適用されたＤＥＰを解除することができないため、依然として一般なメモリ領域でコード実行を防ぐことができる。
【００４６】
前記アドレス先占部３２は、ヒープスプレー攻撃技法を防御するために、悪性行為に使用される一般なメモリ領域のヒープ領域のアドレスを予め先占する構成である。図６を参照してヒープスプレー攻撃技法をまず考察する。前記ヒープスプレー（Ｈｅａｐ Ｓｐｒａｙ）攻撃技法は、何の意味もないことをするＮＯＰスレッド（Ｎｏｐ Ｓｌｅｄ）をメモリのヒープ領域に充填し、間々にシェルコード（Ｓｈｅｌｌ Ｃｏｄｅ）を挿入して、コード領域の脆弱なコード部分でジャンプ（ｊｍｐ）またはコール（Ｃａｌｌ）命令語が行われるようにして、攻撃者の所望するアドレスに制御が移動するようにして、悪意的なコード（Ｓｈｅｌｌ Ｃｏｄｅ）が行われるようにする。悪意的なコードを実行するためには、ＮＯＰスレッドに乗って降りてくるが、前記ＮＯＰスレッド値として用いた値が、ジャンプまたはコール命令語によって制御が移動するアドレスになる。よって、ヒープスプレー攻撃技法による悪性行為に使用されるヒープ領域のアドレス（ＮＯＰスレッド値）を予め先占してしまうと、悪性コードが実行されることを防止することができる。具体的な例を挙げて説明すると、「ＡＤＣ ＡＬ、０×１４」という命令語は、ＡＬレジスタにのみ影響を与えるばかりで、多数回行われるとしても、追って実行されるコード（悪性コード）に全く影響を及ぼさない命令語であるが、前記命令語のバイナリー値は「０×１４」であって、「０×１４」がＮＯＰスレッドとして使用できる。ヒープスプレー攻撃技法においてＮＯＰスレッド値として使用された値が、ジャンプまたはコール命令語によって制御が移動するアドレスになるが、すなわち、上記で「０×１４」をＮＯＰスレッドとして使用するので、分岐されるアドレスは０×１４１４１４１４となり、もし０×１４１４１４１４に予めアドレスが割り当てられていると、追って割り当てられるヒープ領域は、０×１４１４１４１４アドレスを含むページを飛ばしてアドレスが割り当てられる。上述したような状況でプログラムの脆弱点によりジャンプまたはコールが０×１４１４１４１４に発生した場合、アドレス先占部が割り当てた（先占した）領域に入ってくることにより、悪性コードの実行が防止される。
【００４７】
前記プロセス検討部４は、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させ、フッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集し、前記コールスタックリターンアドレス情報を分析することにより悪性行為を探知し、悪性コードが実行されることを防止する構成であって、フッキング処理部４１、情報収集部４２、情報判断部４３などを含む。前記セキュリティー設定部３とプロセス検討部４は、それぞれ異なる方式で悪性行為を遮断するための構成である。よって、本発明において、前記プロセス検討部４の作動前に必ず前記セキュリティー設定部３が作動しなければならないのではなく、さらにセキュリティー設定部３なしで前記プロセス検討部４のみ作動して悪性行為を遮断することも可能である。
【００４８】
前記フッキング処理部４１は、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記関数をフッキングしてプロセスの実行を一時中断させる構成である。前記フッキング（Ｈｏｏｋｉｎｇ）は、関数呼出過程を中間に乗っ取って所望の作業を行うことができるようにする技術を意味するものであり、それぞれのプロセスは、目的に合わせて様々な行為を行うが、特定の行為を行うためにプロセスが実行されて特定の関数を呼び出すので、前記特定の関数をフッキングすると、プロセスの実行を一時中断させて所望の作業（プログラムのコード実行流れが悪性行為によって行われたか否かを判断）を行うことができる。例えば、プログラムが文書エディタであれば、ディスクにファイルを生成するために「ＣｒｅａｔｅＦｉｌｅ」関数を呼び出し、プログラムがブラウザであれば、外部との通信を行うために「Ｃｏｎｎｅｃｔ」関数を呼び出すが、前記ＣｒｅａｔｅＦｉｌｅ、Ｃｏｎｎｅｃｔなどの関数をフッキングすることで、ディスクへのファイル生成、外部との通信を一時中断させることができる。前記プロセスの実行で呼び出される関数をフッキングすることにより、プロセス生成、プロセス情報変更、プロセスハンドルの取得、ファイル生成、レジストリーアクセス、システム情報アクセス、メモリ割り当て、メモリ属性変更、外部との通信、ファイルダウンロードなどの行為を監視することができる。
【００４９】
前記情報収集部４２は、前記フッキング処理部４１でフッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集出力する構成であって、前記コールスタックリターンアドレス情報は、フッキングされた関数を呼び出す全ての関数呼出経路上に位置する全ての関数のリターンアドレス、前記リターンアドレスを含んでいるメモリ属性（例えば、メモリの保護権限、状態値など）およびモジュール名（例えば、ｈｗｐ、ｅｘｅ、ｄｌｌ）、動的モジュールがロードされるベースアドレス（Ｉｍａｇｅｂａｓｅ）などを含む。前記フッキングされた関数のコールスタック（Ｃａｌｌｓｔａｃｋ）を介して特定の関数を呼び出すまで、どのような関数呼出経路に乗ってきたかを確認することができるが、例えば、「Ｍａｉｎ」関数が内部的に「ｆｕｎｃ１」関数を呼び出し、「ｆｕｎｃ１」関数は「ｆｕｎｃ２」関数を呼び出し、「ｆｕｎｃ２」関数は「ＣｒｅａｔｅＦｉｌｅ」関数を呼び出し、前記プロセス検討部４で「ＣｒｅａｔｅＦｉｌｅ」関数が監視（フッキング）対象関数として登録されていると、前記情報収集部４２は、「ＣｒｅａｔｅＦｉｌｅ」関数を呼び出したアドレスの次のアドレス、「ｆｕｎｃ２」関数を呼び出したアドレスの次のアドレス、「ｆｕｎｃ１」関数を呼び出したアドレスの次のアドレスの順でコールスタックを得ることになる。すなわち、呼び出したアドレスの次のアドレスをリターンアドレス（Ｒｅｔｕｒｎ  Ａｄｄｒｅｓｓ）と呼ぶが、前記情報収集部４２は各関数を呼び出したリターンアドレスを引き続き収集する。前記コールスタックは単にリターンアドレスリストのみを持っているので、その後、前記情報収集部４２は、メモリから前記リターンアドレスを含んでいるメモリ属性（例えば、メモリの保護権限、状態値）およびモジュール名（例えば、ｈｗｐ、ｅｘｅ、ｄｌｌ）、動的モジュールがロードされるベースアドレス（Ｉｍａｇｅｂａｓｅ）などを収集してコールスタックリーンアドレス情報を完成して出力する。
【００５０】
前記情報収集部４２は、コールスタックを用いて、監視対象となる関数の全ての関数呼出経路上の関数の情報を含むコールスタックリターンアドレス情報を収集して出力するので、前記情報判断部４３によって、監視対象となる関数の上位全関数を診断することができて、悪性行為を効果的に防止することができる。具体的に、図７に示すように、フッキングをしている関数はＮｔＣｒｅａｔｅＦｉｌｅの一つであるが、上位の全関数に対して関数呼出（コード）流れが悪意的な流れであるか否かを検査することができる。図７では３つの関数呼出経路のみを示したが、実際にＮｔＣｒｅａｔｅＦｉｌｅ関数を呼び出す経路は数十種であり、これに対する全ての検査を行うことができる。すなわち、数十種の呼出経路を探知するときにコールスタック探知技法を使用していない場合、数十種の関数をそれぞれフッキングしなければならないが、コールスタック探知技法を用いる場合、一つの関数のみフッキングしても、数十種の呼出経路を探知することができる。
【００５１】
前記情報判断部４３は、コールスタックリターンアドレス情報を分析することにより悪性行為を探知し、悪性コードが実行されることを防止する構成であって、フィルタリング部４３１、診断処理部４３２などを含む。
【００５２】
前記フィルタリング部４３１は、前記情報収集部４２から出力されたコールスタックリターンアドレス情報を既に設定された例外処理基準と比較して前記コールスタックリターンアドレス情報が例外処理基準に該当すると判断される場合、診断処理部４３２の判断の例外処理（フィルタリング）となるようにする構成である。前記フィルタリング部４３１の例外処理基準を考察すると、例えば、コールスタックリターンアドレス情報のリターンアドレスが、プロセスアドレス空間内に割り当てられていないメモリにある場合、コールスタックリターンアドレス情報のリターンアドレスがメモリのスタック領域にある場合、コールスタックリターンアドレス情報のリターンアドレスがホワイトリストにある場合、およびコールスタックリターンアドレス情報のリターンアドレスの属性が基本書き込み（Ｗｒｉｔｅ）状態である場合に、例外処理する。
【００５３】
一般にリターンアドレスがある領域はコードが実行される領域であるため、リターンアドレスを含むメモリの属性は正常的に求めることができなければならない。メモリ属性が正常的であるというのは、リターンアドレスを含むメモリアドレスがメモリに正常的に割り当てられた領域であることをいう。ところが、実際にコールスタックに従いながらリターンアドレスを取得してきてみると、何処までリターンアドレスを取得しなければならないのか知らないため、間違ったリターンアドレスを取得してくる場合も発生する。よって、リターンアドレスが、プロセスアドレス空間内に割り当てられていないメモリにある場合、例外処理する。
【００５４】
また、プロセスには前記セキュリティー設定部３によって永久ＤＥＰが設定されているので、スタック領域でコード実行が行われることは存在しなくなる。しかし、収集したリターンアドレスがスタック領域内に存在するならば、これは悪意的な流れによるものではなく、もともと間違ったリターンアドレスを取得してきたものと判断し、すなわちリターンアドレスがメモリのスタック領域にある場合、例外処理する。
【００５５】
また、一般なバイナリーは、コード実行流れがコード領域内でのみ作動するが、アンチウィルス（Ａｎｔｉ−Ｖｉｒｕｓ）のようにシステムに従属的なプログラムは自ら悪意的な行為のように見える作業を多く行う。例えば、コード領域は、一般に実行（Ｅｘｅｃｕｔｅ）と読み取り（Ｒｅａｄ）権限のみを持たなければならないが、コード領域を修正するために書き込み（Ｗｒｉｔｅ）権限をさらに与えると、実行／読み取り／書き込み（Ｅｘｅｃｕｔｅ／Ｒｅａｄ／Ｗｒｉｔｅ）権限を持つことになる。この際、該当領域でファイルを生成する行為が発生したならば、該当行為をフッキングモニタリングルーチンで捕捉する。その後、リターンアドレスを求め、リターンアドレスのメモリ属性を検査したとき、実行／読み取り／書き込み権限を持っている場合、悪意的な流れと判断、すなわち誤判断する。まず、上記の場合、コード領域に書き込み権限を与えるための行為が正常的な流れに発生したため、開発者が意図的に上述のような行為を行ったと看做すことができる。だから、該当メモリ属性が実行／読み取り／書き込み（Ｅｘｅｃｕｔｅ／Ｒｅａｄ／Ｗｒｉｔｅ）に変更される行為が正常的な流れに発生したならば、メモリ属性が変更されたメモリはホワイトリスト（Ｗｈｉｔｅ Ａｄｄｒｅｓｓ）の範囲として登録しておき、情報判断部でリターンアドレスがホワイトリスト（Ｗｈｉｔｅ Ａｄｄｒｅｓｓ）の範囲に入っていると、正常的な流れと判断してしまう。その他にも、正常的な流れで実行／読み取り／書き込み（Ｅｘｅｃｕｔｅ／Ｒｅａｄ／Ｗｒｉｔｅ）権限をメモリに割り当てる場合などは、ホワイトリスト（Ｗｈｉｔｅ Ａｄｄｒｅｓｓ）の範囲として登録されて誤判断とならないようにしているので、すなわち、リターンアドレスがホワイトリストにある場合、例外処理する。
【００５６】
また、ファイル上で特定の領域が既に実行／読み取り／書き込み（Ｅｘｅｃｕｔｅ／Ｒｅａｄ／Ｗｒｉｔｅ）権限を持っているならば、これも開発者が意図した行為として看做すことができるが、これはコード上でメモリ属性を変更するのではないため、リターンアドレスがホワイトリストにある場合に例外処理する判断方法によって例外処理されることが不可能であって、リターンアドレスを含むメモリ領域が実行／読み取り／書き込み（Ｅｘｅｃｕｔｅ／Ｒｅａｄ／Ｗｒｉｔｅ）権限を持っているとき、前記フィルタリング部が該当メモリ領域にマッチングされるディスク上のファイルを探してファイル上で該当領域に対する属性を求める。この際、ファイル上で実行／読み取り／書き込み（Ｅｘｅｃｕｔｅ／Ｒｅａｄ／Ｗｒｉｔｅ）権限を持っているならば、これは正常的な行為と判断し、リターンアドレスの属性が基本書き込み（Ｗｒｉｔｅ）状態である場合に例外処理する。
【００５７】
前記診断処理部４３２は、前記フィルタリング部４３１によってフィルタリングされたコールスタックリターンアドレス情報を分析して悪性行為を探知し、悪性コードが実行されることを防止する構成であって、リターンアドレスがコード領域にあるか否かを判断する第１診断部４３２ａと、リターンアドレスが指す命令語の以前命令語が関数呼出命令語であるか否かを判断する第２診断部４３２ｂと、前記第１、第２診断部４３２ａ、４３２ｂの判断結果に基づいて、プロセスを中断するか否かを決定する処理部４３２ｃなどを含む。前記フィルタリング部４３１は、コールスタックリターンアドレス情報をフィルタリングして前記診断処理部４３２の実行を容易にするための構成である。よって、本発明において、前記フィルタリング部４３１なしで前記情報収集部４２から出力されたコールスタックリターンアドレス情報を分析して悪性行為を探知し、悪性コードが実行されることを防止することも可能である。
【００５８】
前記第１診断部４３２ａは、コールスタックリターンアドレス情報を分析し、リターンアドレスがコード領域にあるか否かを判断する構成であって、リターンアドレスがコード領域に存在しない場合、悪性行為があると判断する。一般に、コード実行はコード領域でのみ行うようになっているが、プログラムの脆弱点によりコード流れが変わり、一般なメモリ領域へコード流れが移動し、この状態で例えばファイル生成などの行為が起こったとすると、該当ファイル生成行為は一般なメモリ領域で発生したため、コールスタックリターンアドレス情報のリターンアドレスを見ると、あるリターンアドレスはコード領域ではなく一般なメモリ領域である部分があるので、前記第１診断部４３２ａは悪性行為があると判断する。
【００５９】
前記第２診断部４３２ｂは、コールスタックリターンアドレス情報を分析し、リターンアドレスが指す命令語の以前命令語が関数呼出（Ｃａｌｌ）命令語であるかを判断する構成であって、リターンアドレスが指す命令語の以前命令語が関数呼出命令語ではない場合、悪性行為があると判断する。具体的に、前記第２診断部４３２ｂは、コールスタックリターンアドレス情報からリターンアドレスを確認し、メモリから、リターンアドレスが指す命令語の以前命令語が関数呼出命令語であるかを判断する。図８は関数実行流れの一例を示すが、図８を参照して前記第２診断部４３２ｂを説明すると、関数ｆ１で命令語１、２が順次実行され、関数ｆ２を呼び出す命令語２（Ｃａｌｌ）によって関数ｆ２が呼び出されてｆ２の命令語が順次実行された後、関数ｆ１の関数ｆ２を呼び出したアドレスの次のアドレス（リターンアドレス）の命令語３が実行されるが、前記第２診断部４３２ｂは、前記リターンアドレスが指す命令語３の同じ関数ｆ１内の直前の命令語である以前命令語２が関数呼出命令語であるか否かを判断して悪性行為を判断する。前述したように、ＲＯＰ攻撃技法はコードセクション（Ｇａｄｇｅｔ）を組み合わせて悪性コードを作るが、一つのコードセクションは以前命令語が関数呼出命令語ではない確率が非常に高いためである。よって、前記第２診断部４３２ｂによってコードセクションを実行することを防ぐことができる。具体的に、図９は関数呼出命令語の流れをアセンブリ言語をもって表す図であるが、図９に示すように関数が呼び出される場合、「ＧｅｔＳｙｓｔｅｍＴｉｍｅＡｓＦｉｌｅＴｉｍｅ」という関数が呼び出されたとき、リターンアドレスは０×００４０２１Ｂ７、すなわち、「Ｃａｌｌ  ＧｅｔＳｙｓｔｅｍＴｉｍｅＡｓＦｉｌｅＴｉｍｅ」という命令語の次の命令語がある位置である。よって、リターンアドレスの以前命令語が呼び出し（Ｃａｌｌ）でなければ、正常的な流れではないと判断することができる。
【００６０】
前記処理部４３２ｃは、前記第１、第２診断部４３２ａ、４２３ｂの判断結果に基づいて、プロセスを中断するか否かを決定する。前記処理部４３２ｃは、前記第１、第２診断部４３２ａ、４３２ｂの少なくとも一つが悪性行為を感知した場合には、診断情報をログ（Ｌｏｇ）ファイルと共にディスクに格納し、プロセスでそれ以上のコード実行が行われないように終了させ、前記第１、第２診断部４３２ａ、４３２ｂが悪性行為を感知していない場合には、一時中断したプロセスを実行させる。
【００６１】
前記再配置部５は、前記フッキング処理部４１でフッキングされた関数（動的モジュールのロードに関与する関数）に対する情報を分析し、プロセスにロードされる動的モジュールの既存アドレスを再配置する構成である。前記動的モジュール（例えば、ｄｌｌ、ｏｃｘなど）は、独立に実行されてプロセスを生成する実行ファイル（例えば、ｅｘｅなど）に従属して実行されるファイルである。動的モジュールにおいて再配置オプション（ＤＹＮＡＭＩＣＢＡＳＥ）が活性化されていると、前記動的モジュールは、メモリにロードされるたびに他のアドレス（ｉｍａｇｅｂａｓｅ）にロードされることになり、再配置オプションの活性化を問わず、ロードしようとするアドレスが既に割り当てられていると、他のアドレスにロードされることになる。よって、図１０に示すように、前記再配置部５が動的モジュールの再配置オプションが活性化されているか否かを判断し（Ｓ５１）、前記再配置オプションが非活性化されていると、動的モジュールの既存アドレスを収集し（Ｓ５２）、前記既存アドレスにメモリを割り当てると（Ｓ５３）、動的モジュールの再配置オプションの活性化を問わず、ロードしようとするアドレスが既に割り当てられていると、運営体制は他のアドレスに動的モジュールをロードする（Ｓ５４）。前記ＲＯＰ攻撃技法は、コード領域にあるコードセクションを組み合わせて悪性コードを完成するので、このためにはコードセクションを攻撃者が直接探さなければならず、該当アドレスが固定されたアドレスを持つ動的モジュールがなければ適用させることができない。しかし、どんな動的モジュールであれ、強制再配置を行うと、攻撃者はＲＯＰ攻撃の際にコードセクションをもはや探すことができなくなり、攻撃に失敗してＲＯＰによる攻撃を効果的に防御することができる。
【００６２】
次に、上述したような構成を持つ探知装置を用いて、プログラムの脆弱点を用いた攻撃を探知する方法を図１〜図１１に基づいて説明する。前記プログラムの脆弱点を用いた攻撃探知方法は、設置部１がプロセスに保護部２をロードする設置段階（Ｓ１）と、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記設置段階（Ｓ１）で設置された前記保護部２のフッキング処理部４１が前記関数をフッキングしてプロセスの実行を一時中断させるフッキング処理段階（Ｓ２）と、前記保護部２の前記情報収集部４２が、前記フッキング処理段階（Ｓ２）でフッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集して出力する情報収集段階（Ｓ３）と、前記情報収集段階（Ｓ３）で出力されたコールスタックリターンアドレス情報を前記診断処理部４３２が分析することにより悪性行為を探知し、悪性コードが実行されることを防止する診断処理段階（Ｓ４）と、を含む。
【００６３】
前記設置段階（Ｓ１）は、設置部１がプロセスに保護部２をロードする段階であって、前記設置１は、プロセスが生成されるときにコールバックルーチンを用いてプロセスが生成された後、プロセスの実行が行われていない状態で保護部２を設置する。
【００６４】
前記フッキング処理段階（Ｓ２）は、プロセスで特定の行為を行うためにプロセスが実行されて特定の関数が呼び出された場合、前記設置段階（Ｓ１）で設置された前記保護部２のフッキング処理部４１が前記関数をフッキングしてプロセスの実行を一時中断させる段階である。
【００６５】
前記情報収集段階（Ｓ３）は、前記保護部２の前記情報収集部４２が、前記フッキング処理段階（Ｓ２）でフッキングされた関数のコールスタックを確認してコールスタックリターンアドレス情報を収集して出力する段階であって、前記コールスタックリターンアドレス情報は、フッキングされた関数を呼び出す全ての関数呼出経路上に位置する全ての関数のリターンアドレス、前記リターンアドレスを含んでいるメモリ属性（例えば、メモリの保護権限、状態値など）およびモジュール名（例えば、ｈｗｐ、ｅｘｅ、ｄｌｌ）、動的モジュールがロードされるベースアドレス（Ｉｍａｇｅｂａｓｅ）などを含む。
【００６６】
前記診断処理段階（Ｓ４）は、前記情報収集段階（Ｓ３）で出力されたコールスタックリターンアドレス情報を前記保護部２の診断処理部４３２が分析することにより悪性行為を探知し、悪性コードが実行されることを防止する段階であって、第１診断段階（Ｓ４１）、第２診断段階（Ｓ４２）、プロセス終了段階（Ｓ４３）およびプロセス実行段階（Ｓ４４）を含む。
【００６７】
前記第１診断段階（Ｓ４１）は、前記診断処理部４３２の第１診断部４３２ａがコールスタックリターンアドレス情報を分析し、リターンアドレスがコード領域にあるか否かを判断する段階であって、リターンアドレスがコード領域に存在しない場合には、悪性行為があると判断する。
【００６８】
前記第２診断段階（Ｓ４２）は、前記診断処理部４３２の第２診断部４３２ｂがコールスタックリターンアドレス情報を分析し、リターンアドレスが指す命令語の以前命令語が関数呼出（Ｃａｌｌ）命令語であるか否かを判断する段階であって、リターンアドレスが指す命令語の以前命令語が関数呼出命令語ではない場合には、悪性行為があると判断する。
【００６９】
前記プロセス終了段階（Ｓ４３）は、前記第１診断段階（Ｓ４１）または／および第２診断段階（Ｓ４２）で悪性行為があると判断した場合、前記診断処理部４３２の処理部４３２ｃが診断情報をログ（Ｌｏｇ）ファイルと共にディスクに格納し、プロセスでそれ以上のコード実行が行われないように終了させる段階である。
【００７０】
前記プロセス実行段階（Ｓ４４）は、前記第１、第２診断部４３２ａ、４３２ｂが悪性行為を感知していない場合、前記診断処理部４３２の処理部４３２ｃが一時中断したプロセスを実行させる段階である。
【００７１】
本発明の他の実施例に係るプログラムの脆弱点を用いた攻撃探知方法は、セキュリティー設定段階（図示せず）、フィルタリング段階（図示せず）、再配置段階（図示せず）などをさらに含むことができる。
【００７２】
前記セキュリティー設定段階は、設置段階（Ｓ１）で設置された保護部２のセキュリティー設定部３がフッキング処理段階（Ｓ２）の前にプロセスのセキュリティー状態を確認設定する段階であって、永久ＤＥＰ設定段階およびアドレス先占段階を含む。
【００７３】
前記永久ＤＥＰ設定段階は、前記セキュリティー設定部３の永久ＤＥＰ設定部３１がプロセスに永久ＤＥＰ（Ｐｅｒｍａｎｅｎｔ ＤＥＰ）を設定する段階であって、チェック段階、実行段階などを含む。
【００７４】
前記チェック段階は、前記永久ＤＥＰ設定部３１のチェック部３１１が運営体制（Ｏｐｅｒａｔｉｎｇ Ｓｙｓｔｅｍ）のＤＥＰ（Ｄａｔａ Ｅｘｅｃｕｔｉｏｎ Ｐｒｅｖｅｎｔｉｏｎ）状態をチェックして活性化する段階である。
【００７５】
前記実行段階は、前記チェック段階で運営体制のＤＥＰが活性化されていると確認された場合、前記永久ＤＥＰ設定部３１の実行部３１２がプロセスに永久ＤＥＰを適用させ、実行権限のないメモリ領域におけるコード実行を防止する段階であって、前記プロセスにＤＥＰが適用されていなければ、プロセスが生成された状態でＤＥＰを適用させ、既存にＤＥＰが設定されていると、該当ＤＥＰを解除し、ＤＥＰをさらに適用させると、該当プロセスで悪性行為によって解除が不可能な永久ＤＥＰを設定する。
【００７６】
前記アドレス先占段階は、前記永久ＤＥＰ設定段階の後に前記セキュリティー設定部３のアドレス先占部３２がヒープスプレー攻撃技法を防御するために、悪性行為に使用される一般なメモリ領域のヒープ領域のアドレスを予め先占する段階であって、ヒープスプレー攻撃技法による悪性行為に使用されるヒープ領域のアドレス（ＮＯＰスレッド値）を予め先占してしまうと、悪性コードが実行されることを防止することができる。
【００７７】
前記フィルタリング段階は、情報収集段階（Ｓ３）の後であって診断処理段階（Ｓ４）の前に、前記情報判断部４３のフィルタリング部４３１が、前記情報収集段階（Ｓ３）で出力されたコールスタックリターンアドレス情報を既に設定された例外処理基準と比較して、前記コールスタックリターンアドレス情報が例外処理基準に該当すると判断するとき、診断処理段階（Ｓ４）での判断の例外処理（フィルタリング）となるようにする段階である。前記フィルタリング段階では、コールスタックリターンアドレス情報のリターンアドレスが一般なメモリに存在しない場合、コールスタックリターン情報のリターンアドレスがメモリのスタック領域にある場合、コールスタックリターンアドレス情報のリターンアドレスがホワイトリストにある場合、およびコールスタックリターンアドレス情報のリターンアドレスの属性が基本書き込み（Ｗｒｉｔｅ）状態である場合に、例外処理する。
【００７８】
前記再配置段階は、前記フッキング処理段階（Ｓ２）でフッキングされた関数（動的モジュールのロードに関与する関数）に対する情報を分析して動的モジュールのロードを行う関数において、動的モジュールの既存アドレスを再配置する段階であって、図１０に示すように、前記再配置部５が、動的モジュールの再配置オプションが活性化されているかを判断し（Ｓ５１）、前記再配置オプションが非活性化されていると、動的モジュールのロードを行う関数から既存アドレスを収集し（Ｓ５２）、前記既存アドレスにメモリを割り当てると（Ｓ５３）、動的モジュールの再配置オプションの活性化を問わず、ロードしようとするアドレスが既に割り当てられていると、運営体制は他のアドレスに動的モジュールをロードする（Ｓ５４）。
【００７９】
以上、出願人は本発明の好適な実施例について説明したが、これらの実施例は本発明の技術的思想を実現する一実施例に過ぎないものであり、本発明の技術的思想を実現する限り、いずれの変更例または修正例も本発明の範囲に属するものと解釈されるべきである。
【符号の説明】
【００８０】
１    設置部
２    保護部
３    セキュリティー設定部
４    プロセス検討部
５    再配置部
３１    永久データ設定部
３２    アドレス先占部
４１    フッキング処理部
４２    情報収集部
４３    情報判断部
３１１    チェック部
３１２    実行部
４３１    フィルタリング部
４３２    診断処理部
４３２ａ    第１診断部
４３２ｂ    第２診断部
４３２ｃ    処理部
【図１】
0005908132.tif 000002
【図２】
0005908132.tif 000003
【図３】
0005908132.tif 000004
【図４】
0005908132.tif 000005
【図５】
0005908132.tif 000006
【図６】
0005908132.tif 000007
【図７】
0005908132.tif 000008
【図８】
0005908132.tif 000009
【図９】
0005908132.tif 000010
【図１０】
0005908132.tif 000011
【図１１】
0005908132.tif 000012