(57)【要約】【課題】マルウェアによる攻撃を有効に阻止することができるプログラム、情報処理装置、及び情報処理方法を提供する。【解決手段】所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する。【選択図】図７１
2018195155.tif 000002
【特許請求の範囲】
【請求項１】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項２】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項３】
請求項１又は２記載のプログラムにおいて、
前記第３の条件は、マッピング時の前記実ファイルのヘッダ情報とアンマッピング時の前記実ファイル又は前記仮想ファイルのヘッダ情報とが相違することである
ことを特徴とするプログラム。
【請求項４】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項５】
請求項１乃至４のいずれか１項に記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する命令、又は、前記仮想ファイルを前記メモリにマッピングする命令が呼び出されると、前記第１の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項６】
請求項１記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを前記メモリからアンマッピングする命令、前記仮想ファイルの一部を前記ディスクに書き込む命令、又は、前記仮想ファイルのハンドルを閉じる命令が呼び出されると、前記第２の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項７】
請求項２記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する命令、又は、前記仮想ファイルを前記メモリにマッピングする命令が連続して呼び出されると、前記第４の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項８】
請求項１乃至７のいずれか１項に記載のプログラムにおいて、
前記コンピューターを、更に、
前記所定のプロセスにより前記実ファイルが前記仮想ファイルとして前記メモリ上にマッピングされる時に前記実ファイルをバックアップしたバックアップファイルを生成し、前記判断部が前記所定のプロセスをランサムウェアと判断した場合には、前記バックアップファイルを前記ディスク上の前記実ファイルに書き戻すバックアップ部
として機能させるためのプログラム。
【請求項９】
コンピューターを、
所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項１０】
請求項９記載のプログラムにおいて、
前記判断部は、前記書き込み命令により前記実ファイルのファイル構造が不適切な状態に変更されているという第９の条件を更に満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とするプログラム。
【請求項１１】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段
を実行させるプログラム。
【請求項１２】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段
を実行させるプログラム。
【請求項１３】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段
を実行させるプログラム。
【請求項１４】
コンピューターに、
所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段
を実行させるプログラム。
【請求項１５】
請求項１乃至１４のいずれか１項に記載のプログラムを記録したコンピューター読み取り可能な記録媒体。
【請求項１６】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１７】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１８】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１９】
所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項２０】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項２１】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項２２】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項２３】
所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム、情報処理装置、及び情報処理方法に関する。
【背景技術】
【０００２】
近年、ランサムウェアと呼ばれる種類のマルウェアが世界的に流行している。
【０００３】
ランサムウェアは、他の一般的なマルウェアと同じくインターネットやメール経由で端末に感染する。
【０００４】
ランサムウェアは一度感染すると、端末上の一部のファイルまたは全体を暗号化（ロック）し、ファイルの使用または端末の使用を不可能にした上で、身代金（ランサム：ransom）を支払うよう要求する。暗号化されたファイルを復元することの見返りに金銭を要求する脅迫型のマルウェアである。
【０００５】
ランサムウェアの場合、感染すると直ちにファイルの暗号化が開始される。このため、そのランサムウェアがセキュリティ製品にとって未知の検体である場合、パターンファイルによる検知等の通常の検知では間に合わず、ファイルの暗号化を阻止することは困難である。仮にランサムウェアの感染に早期に気付き、直ちに端末の電源を切る等の処置をとったとしても、ランサムウェアによりいくらかのファイルが暗号化されることは免れず、被害を完全に阻止することは非常に困難である。
【０００６】
ランサムウェアを検出するための方法として、ランサムウェアがユーザーによる操作や入力状態に関係なく、突然ウィンドウを表示する等の特徴的動作をすることを利用して、キーボード、マウス等の入力インターフェースの操作状態と、ディスプレイデバイスの変更状態とを監視してランサムウェアを検出する方法が知られている（特許文献１参照）
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】米国特許出願公開第２０１４／０１８１９７１号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００８】
従来の方法ではランサムウェアのようなマルウェアによるファイルの暗号化等の攻撃を有効に阻止することが困難であった。
【０００９】
本発明の目的は、マルウェアによる攻撃を有効に阻止することができるプログラム、情報処理装置、及び情報処理方法を提供することにある。
【課題を解決するための手段】
【００１０】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル書込関数が、前記ファイルパスのファイルのヘッダを書き換えるという第２の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００１１】
上述したプログラムにおいて、前記判断部は、前記第１の条件及び前記第２の条件に加えて、前記ファイルパスのファイルがヘッダを有しないテキストファイルであるという第３の条件とを満足する場合には、前記所定のプロセスをランサムウェアとして処理するか否かの処理の選択肢をユーザーに提示するようにしてもよい。
【００１２】
上述したプログラムにおいて、前記判断部は、前記第１の条件及び前記第２の条件に加えて、前記所定のプロセスから、前記ファイル書込関数の呼び出しの前に、前記ファイルパスに含まれるパスと同一のパスにおける他のファイルを検索するファイル検索関数が呼びだされているという第４の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断するようにしてもよい。
【００１３】
上述したプログラムにおいて、前記判断部は、前記第１の条件及び前記第２の条件に加えて、前記所定のプロセスから、前記ファイル書込関数の呼び出しの後に、前記ファイルパスに含まれるパスと同一のパスを移動元のパスとし、前記ファイルパスに含まれるパスと同一のパスを移動元のパスとするファイル移動関数が呼びだされているという第５の条件を満足する場合に、前記所定のプロセスをランサムウェアと判断するようにしてもよい。
【００１４】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスから呼び出されるファイル削除関数が削除するファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記所定のプロセスから呼び出される前記ファイル削除関数が削除する前記ファイルパスと同一のファイルパスを移動先とする第１のファイル移動関数が既に呼び出されているという第２の条件と、前記所定のプロセスから呼び出される第２のファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第３の条件と、前記第１のファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル削除関数が削除する前記ファイルパスのファイルのヘッダとが相違しているという第４の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００１５】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスから呼び出されるファイル移動関数の移動先のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第２の条件と、前記ファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル移動関数の移動先のファイルパスのファイルのヘッダとが相違しているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００１６】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル書込関数が、前記ファイルパスのファイルのヘッダを書き換えるという第２の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する手順を実行させることを特徴とする。
【００１７】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスから呼び出されるファイル削除関数が削除するファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記所定のプロセスから呼び出される前記ファイル削除関数が削除する前記ファイルパスと同一のファイルパスを移動先とする第１のファイル移動関数が既に呼び出されているという第２の条件と、前記所定のプロセスから呼び出される第２のファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第３の条件と、前記第１のファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル削除関数が削除する前記ファイルパスのファイルのヘッダとが相違しているという第４の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する手順を実行させることを特徴とする。
【００１８】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスから呼び出されるファイル移動関数の移動先のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第２の条件と、前記ファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル移動関数の移動先のファイルパスのファイルのヘッダとが相違しているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する手順を実行させることを特徴とする。
【００１９】
本発明の一態様による情報処理装置は、所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル書込関数が、前記ファイルパスのファイルのヘッダを書き換えるという第２の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００２０】
本発明の一態様による情報処理装置は、所定のプロセスから呼び出されるファイル削除関数が削除するファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記所定のプロセスから呼び出される前記ファイル削除関数が削除する前記ファイルパスと同一のファイルパスを移動先とする第１のファイル移動関数が既に呼び出されているという第２の条件と、前記所定のプロセスから呼び出される第２のファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第３の条件と、前記第１のファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル削除関数が削除する前記ファイルパスのファイルのヘッダとが相違しているという第４の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００２１】
本発明の一態様による情報処理装置は、所定のプロセスから呼び出されるファイル移動関数の移動先のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第２の条件と、前記ファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル移動関数の移動先のファイルパスのファイルのヘッダとが相違しているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００２２】
本発明の一態様による情報処理方法は、所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル書込関数が、前記ファイルパスのファイルのヘッダを書き換えるという第２の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【００２３】
本発明の一態様による情報処理方法は、所定のプロセスから呼び出されるファイル削除関数が削除するファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記所定のプロセスから呼び出される前記ファイル削除関数が削除する前記ファイルパスと同一のファイルパスを移動先とする第１のファイル移動関数が既に呼び出されているという第２の条件と、前記所定のプロセスから呼び出される第２のファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第３の条件と、前記第１のファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル削除関数が削除する前記ファイルパスのファイルのヘッダとが相違しているという第４の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【００２４】
本発明の一態様による情報処理方法は、所定のプロセスから呼び出されるファイル移動関数の移動先のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、前記ファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第２の条件と、前記ファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル移動関数の移動先のファイルパスのファイルのヘッダとが相違しているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【００２５】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００２６】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００２７】
上述したプログラムにおいて、前記第３の条件は、マッピング時の前記実ファイルのヘッダ情報とアンマッピング時の前記実ファイル又は前記仮想ファイルのヘッダ情報とが相違することであるようにしてもよい。
【００２８】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００２９】
上述したプログラムにおいて、前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する命令、又は、前記仮想ファイルを前記メモリにマッピングする命令が呼び出されると、前記第１の条件を満足すると判断するようにしてもよい。
【００３０】
上述したプログラムにおいて、前記判断部は、前記所定のプロセスにより、前記仮想ファイルを前記メモリからアンマッピングする命令、前記仮想ファイルの一部を前記ディスクに書き込む命令、又は、前記仮想ファイルのハンドルを閉じる命令が呼び出されると、前記第２の条件を満足すると判断するようにしてもよい。
【００３１】
上述したプログラムにおいて、前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する命令、又は、前記仮想ファイルを前記メモリにマッピングする命令が連続して呼び出されると、前記第４の条件を満足すると判断するようにしてもよい。
【００３２】
上述したプログラムにおいて、前記コンピューターを、更に、前記所定のプロセスにより前記実ファイルが前記仮想ファイルとして前記メモリ上にマッピングされる時に前記実ファイルをバックアップしたバックアップファイルを生成し、前記判断部が前記所定のプロセスをランサムウェアと判断した場合には、前記バックアップファイルを前記ディスク上の前記実ファイルに書き戻すバックアップ部として機能させるようにしてもよい。
【００３３】
本発明の一態様によるプログラムは、コンピューターを、所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部として機能させることを特徴とする。
【００３４】
上述したプログラムにおいて、前記判断部は、前記書き込み命令により前記実ファイルのファイル構造が不適切な状態に変更されているという第９の条件を更に満足する場合に、前記所定のプロセスをランサムウェアと判断するようにしてもよい。
【００３５】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段を実行させることを特徴とする。
【００３６】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段を実行させることを特徴とする。
【００３７】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段を実行させることを特徴とする。
【００３８】
本発明の一態様によるプログラムは、コンピューターに、所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手段を実行させることを特徴とする。
【００３９】
本発明の一態様による情報処理装置は、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００４０】
本発明の一態様による情報処理装置は、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００４１】
本発明の一態様による情報処理装置は、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００４２】
本発明の一態様による情報処理装置は、所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部を有することを特徴とする。
【００４３】
本発明の一態様による情報処理方法は、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【００４４】
本発明の一態様による情報処理方法は、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【００４５】
本発明の一態様による情報処理方法は、所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【００４６】
本発明の一態様による情報処理方法は、所定のプロセスによりディスク上の実ファイルへの書き込み命令が発せられたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断することを特徴とする。
【発明の効果】
【００４７】
以上の通り、本発明によれば、所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、所定のプロセスからファイル読出関数が既に呼び出されているという第１の条件と、ファイル書込関数が、ファイルパスのファイルのヘッダを書き換えるという第２の条件とを満足する場合に、所定のプロセスをランサムウェアと判断するようにしたので、マルウェアによる攻撃を有効に阻止することができる。
【００４８】
また、本発明によれば、所定のプロセスによりディスク上の実ファイルが実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、所定のプロセスにより仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の実ファイル又は仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、所定のプロセスをランサムウェアと判断するようにしたので、マルウェアによる攻撃を有効に阻止することができる。
【図面の簡単な説明】
【００４９】
【図１】一般的な情報処理装置を示すブロック図である。
【図２】コンピュータープログラムの動作をコンピューターのハードウェアとの関連で示す説明図（その１）である。
【図３】コンピュータープログラムの動作をコンピューターのハードウェアとの関連で示す説明図（その２）である。
【図４】本発明の原理（その１）に関し、ランサムウェアCryptoLockerによるファイル暗号化の説明図（その１）である。
【図５】本発明の原理（その１）に関し、ランサムウェアCryptoLockerによるファイル暗号化の説明図（その２）である。
【図６】本発明の原理（その１）に関し、ランサムウェアCryptoLockerによるファイル暗号化の説明図（その３）である。
【図７】本発明の原理（その１）に関し、ランサムウェアCryptoLockerによるファイル暗号化の説明図（その４）である。
【図８】本発明の原理（その１）に関し、ランサムウェアCryptoWallによるファイル暗号化の説明図（その１）である。
【図９】本発明の原理（その１）に関し、ランサムウェアCryptoWallによるファイル暗号化の説明図（その２）である。
【図１０】本発明の原理（その１）に関し、ランサムウェアCryptoWallによるファイル暗号化の説明図（その３）である。
【図１１】本発明の原理（その１）に関し、ランサムウェアCryptoWallによるファイル暗号化の説明図（その４）である。
【図１２】本発明の原理（その１）に関し、ランサムウェアCryptoWallによるファイル暗号化の説明図（その５）である。
【図１３】本発明の原理（その１）に関し、ランサムウェアCryptoWallによるファイル暗号化の説明図（その６）である。
【図１４】本発明の原理（その１）に関し、ランサムウェアCERBERによるファイル暗号化の説明図である。
【図１５】本発明の原理（その１）に関し、ランサムウェアTeslaCryptによるファイル暗号化の説明図（その１）である。
【図１６】本発明の原理（その１）に関し、ランサムウェアTeslaCryptによるファイル暗号化の説明図（その２）である。
【図１７】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１）である。
【図１８】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２）である。
【図１９】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その３）である。
【図２０】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その４）である。
【図２１】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その５）である。
【図２２】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その６）である。
【図２３】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その７）である。
【図２４】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その８）である。
【図２５】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その９）である。
【図２６】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１０）である。
【図２７】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１１）である。
【図２８】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１２）である。
【図２９】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１３）である。
【図３０】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１４）である。
【図３１】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１５）である。
【図３２】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１６）である。
【図３３】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１７）である。
【図３４】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１８）である。
【図３５】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１９）である。
【図３６】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２０）である。
【図３７】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２１）である。
【図３８】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２２）である。
【図３９】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２３）である。
【図４０】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２４）である。
【図４１】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２５）である。
【図４２】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２６）である。
【図４３】本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２７）である。
【図４４】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１）である。
【図４５】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２）である。
【図４６】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その３）である。
【図４７】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その４）である。
【図４８】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その５）である。
【図４９】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その６）である。
【図５０】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その７）である。
【図５１】本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その８）である。
【図５２】本発明の原理（その２）に関し、一般的なファイル操作とファイルマッピングによるファイル操作の相違について説明する図である。
【図５３】本発明の原理（その２）に関し、ランサムウェアSporaによるファイル暗号化時のファイル操作の流れを示す図である。
【図５４】本発明の原理（その２）に関し、ランサムウェアSporaによるファイル操作とハードウェアとの関係を示す図である。
【図５５】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１）である。
【図５６】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２）である。
【図５７】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その３）である。
【図５８】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その４）である。
【図５９】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その５）である。
【図６０】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その６）である。
【図６１】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その７）である。
【図６２】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その８）である。
【図６３】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その９）である。
【図６４】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１０）である。
【図６５】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１１）である。
【図６６】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１２）である。
【図６７】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１３）である。
【図６８】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１４）である。
【図６９】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１５）である。
【図７０】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１６）である。
【図７１】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１７）である。
【図７２】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１８）である。
【図７３】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１９）である。
【図７４】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２０）である。
【図７５】本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２１）である。
【図７６】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その１）である。
【図７７】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その２）である。
【図７８】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その３）である。
【図７９】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その４）である。
【図８０】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その５）である。
【図８１】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その６）である。
【図８２】本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法を説明する説明図（その７）である。
【発明を実施するための形態】
【００５０】
［情報処理装置］
本発明が適用される一般的な情報処理装置及びその動作について図１乃至図３を用いて説明する。
【００５１】
図１は一般的な情報処理装置を示すブロック図である。
【００５２】
標準的なスタンドアロン環境における情報処理装置１０は、コンピューター（ＰＣ）２０と、外部周辺装置３０とから構成されている。
【００５３】
コンピューター（ＰＣ）２０は、命令を実行するＣＰＵ２１と、データおよびプログラムを格納するハードディスク２２と、データやプログラムをＣＰＵ２１が読み込むためのメモリ２３と、ユーザーの操作を受け付けるマウスやキーボードのような入出力装置２４と、操作内容や処理結果等を表示するディスプレイ２５等から構成されている。
【００５４】
外部周辺装置３０は、処理結果等を印刷するためのプリンター３１や、ＵＳＢメモリ等の外部記憶装置３２等から構成されている。
【００５５】
次に、図２及び図３を用いて、コンピュータープログラム、すなわち、コンピューターに行わせる処理の手順を決められた形式（プログラム言語）に従って書き表したものを実行させる場合の一連の動作について、コンピューター２０におけるＣＰＵ２１、ハードディスク２２、メモリ２３等のハードウェアとの関連で説明する。
【００５６】
コンピューター２０が起動する前は、オペレーションソフトウェア（ＯＳ）のプログラムやデータを含むＯＳデータと、コンピューター２０で実行させるプログラムと、文書、図面等のユーザーデータ等がファイルとしてハードディスク２２に格納されている（図２（ａ））。メモリ２３にはプログラムやデータ等は展開されていない。
【００５７】
コンピューター２０が起動して、ＣＰＵ２１が、ハードディスク２２に格納されたＯＳデータをメモリ２３にロードする命令を実行すると、ＯＳデータがメモリ２３上にプロセスとして展開される（図２（ｂ））。
【００５８】
次に、ＣＰＵ２１がメモリ２３上のＯＳデータのプロセスを実行して、ハードディスク２２に格納されたプログラムにアクセスして、そのプログラムを読み込む（図２（ｃ））。ハードディスク２２に格納されたプログラムはメモリ２３にロードされ、メモリ２３上にプロセスとして展開される（図３（ａ））。
【００５９】
次に、ＣＰＵ２１がメモリ２３上のプログラムのプロセスを実行して、ハードディスク２２に格納されたユーザーデータにアクセスして、ハードディスク２２へのデータの読み書きを行う（図３（ｂ））。
【００６０】
このように、オペレーションソフトウエアやプログラムにより、ＣＰＵ２１、ハードディスク２２、メモリ２３との間での動作が行われる。
【００６１】
なお、本明細書において「プロセス」とは「メモリ２３上に展開されたプログラム」のことであり、「プログラム」とは「ハードディスク等に格納されたプログラム（ファイル）」のことである。理解しやすさのため「プロセス」である「メモリ２３上に展開されたプログラム」のことを単に「プログラム」と記載することもある。
【００６２】
また、本明細書において、Windows API関数の文字列末尾に付与されている"W"や"Ex"は、付与されていないものと同じ意味合いとする。例えば、"FindFirstFileW"は"FindFirstFile"と同義であり、"MoveFileEx"は"MoveFile"と同義である。
【００６３】
［発明の原理（その１）］
本発明の原理（その１）について図４乃至図１６を用いて説明する。
【００６４】
（ランサムウェアの分析）
本願発明者等は、まず、国内外で被害が報告されている主なランサムウェア複数種について、ファイルの暗号化を行う際のファイル操作に関わる挙動について解析した。具体的には、４種類のランサムウェア、CryptoLocker、CryptWall、CERBER、TeslaCryptのファイル操作の挙動について解析した。
（ａ）ランサムウェアCryptoLockerの分析
ＡＰＩモニター（API Monitor）という解析ツールを用いてランサムウェアCryptoLockerの動作を分析した。ＡＰＩモニターは、アプリケーションから呼ばれるWindows API（Application Programming Interface）コールの引数、戻り値を、アプリケーションを変更することなくモニターすることができるプログラムである。Windowsは登録商標である。
【００６５】
図４にランサムウェアCryptoLockerのファイル暗号化時に呼び出されたＡＰＩのログ（log）を示す。ランサムウェアCryptoLockerにより、フォルダ"C:\Python27\Lib\compiler"内のファイルが順次暗号化される場合のログである。
【００６６】
１行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【００６７】
２行目のCreateFileWは、引数"C:\Python27\Lib\compiler\consts.py"のファイルを開くというWindows API関数である。
【００６８】
３−４行目のReadFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\consts.py"を読み出すというWindows API関数である。
【００６９】
５−７行目のWriteFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\consts.py"にデータを書き込むというWindows API関数である。
【００７０】
１−７行目のログは次のことを示している。
【００７１】
１行目のFindNextFileにより次のファイルを検索し、２行目のCreateFileWにより引数"C:\Python27\Lib\compiler\consts.py"のファイルを開き、３−４行目のReadFileと５−７行目のWriteFileにより、ファイル"C:\Python27\Lib\compiler\consts.py"の暗号化が実行される。
【００７２】
８行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【００７３】
９行目のCreateFileWは、引数"C:\Python27\Lib\compiler\future.py"のファイルを開くというWindows API関数である。
【００７４】
１０−１１行目のReadFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\future.py"を読み出すというWindows API関数である。
【００７５】
１２−１５行目のWriteFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\future.py"にデータを書き込むというWindows API関数である。
【００７６】
８−１５行目のログは次のことを示している。
【００７７】
８行目のFindNextFileにより次のファイルを検索し、９行目のCreateFileWにより引数"C:\Python27\Lib\compiler\future.py"のファイルを開き、１０−１１行目のReadFileと１２−１５行目のWriteFileにより、ファイル"C:\Python27\Lib\compiler\future.py"の暗号化が実行される。
【００７８】
１６行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【００７９】
１７行目のCreateFileWは、引数"C:\Python27\Lib\compiler\misc.py"のファイルを開くというWindows API関数である。
【００８０】
１８−１９行目のReadFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\misic.py"を読み出すというWindows API関数である。
【００８１】
２０−２２行目のWriteFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\misic.py"にデータを書き込むというWindows API関数である。
【００８２】
１６−２２行目のログは次のことを示している。
【００８３】
１６行目のFindNextFileにより次のファイルを検索し、１７行目のCreateFileWにより引数"C:\Python27\Lib\compiler\misic.py"のファイルを開き、１８−１９行目のReadFileと２０−２２行目のWriteFileにより、ファイル"C:\Python27\Lib\compiler\misic.py"の暗号化が実行される。
【００８４】
以下同様にして、フォルダ"C:\Python27\Lib\compiler\"内のファイルが順次暗号化される。
【００８５】
このログから、ランサムウェアCryptoLockerは、次のようにしてファイルを暗号化していることがわかる。
（１）FindFirstFile、FindNextFileによりファイルを検索する。FindFirstFile、  FindNextFileは、セットで使用される検索用のWindows API関数である。
（２）CreateFileにより暗号化対象のファイルを開く。
（３）開いたファイルに対し、ReadFile、WriteFileでファイルを書き換えて暗号化する。すなわち、ReadFileにより、暗号化対象ファイルのファイル内容を読み込み、読み込んだ暗号化対象ファイル内容をマルウェアが暗号化し、暗号化された後のデータをWriteFileにより元の暗号化対象ファイルに書き込む。
【００８６】
図５にランサムウェアCryptoLockerのファイル暗号化時に呼び出されたＡＰＩのログを示す。ランサムウェアCryptoLockerにより、フォルダ"C:\User\Public\Videos"下にあるファイル"Wildlife.wmv"が検索され暗号化される場合のログである。
【００８７】
３行目のFindFirstFileは、引数"C:\Users\Public\Videos\*.*"の最初のファイルを検索するというWindows API関数である。
【００８８】
４−９行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【００８９】
１０行目のFindFirstFileは、引数"C:\Users\Public\Videos\Sample Videos\*.*"の最初のファイルを検索するというWindows API関数である。
【００９０】
１１−１３行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【００９１】
１４行目のCreateFileWは、引数"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"のファイルを開くというWindows API関数である。
【００９２】
１５−１６行目のReadFileは、CreateFileWで開いたファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を読み出すというWindows API関数である。
【００９３】
１７−１９行目のWriteFileは、CreateFileWで開いたファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"にデータを書き込むというWindows API関数である。
【００９４】
２０行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【００９５】
３−９行目のログは次のことを示している。
【００９６】
３行目のFindFirstFileと４−９行目のFindNextFileにより、フォルダ"C:\Users\Public\Videos\*.*"内のファイルを検索したが、ファイルが見つからない。
【００９７】
１０−１４行目のログは次のことを示している。
【００９８】
１０行目のFindFirstFileにより、フォルダ"C:\Users\Public\Videos\*.*"より下層のフォルダ"C:\Users\Public\Videos\Sample Videos\*.*"に移行し、１１−１３行目のFindNextFileにより、フォルダ"C:\Users\Public\Videos\Sample Videos\*.*"内を検索し、ファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を見つけたので、１４行目のCreateFileWにより開く。
【００９９】
１５−２０行目のログは次のことを示している。
【０１００】
CreateFileWにより開いたファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を、１５−１６行目のReadFileと１７−１９行目のWriteFileにより、暗号化する。
【０１０１】
そして、２０行目のFindNextFileにより、フォルダ"C:\Users\Public\Videos\Sample Videos\*.*"内の次のファイルを検索する。
【０１０２】
図５のように、あるフォルダ下にあるファイルが検索され暗号化される場合も、図４と同様に、FindFirstFile、FindNextFile、CreateFile、ReadFile、WriteFileにより、ファイルを検索し、検索されたファイルを書き換えて暗号化する。
【０１０３】
図６は、ランサムウェアCryptoLockerによりアクセスされる前と後のファイル"Wildlife.wmv"の状態を示す。図６（ａ）が、ランサムウェアCryptoLockerによりアクセスされる前の状態であり、図６（ｂ）が、ランサムウェアCryptoLockerによりアクセスされた後の状態である。
【０１０４】
図６に示すように、ランサムウェアCryptoLockerによりアクセスされた後には、暗号化されたファイル"Wildlife.wmv"のヘッダが書き換えられている。
【０１０５】
図７は、ランサムウェアCryptoLockerにより暗号化される前と後のファイル"Wildlife.wmv"のヘッダを示す。図７（ａ）が、ランサムウェアCryptoLockerにより暗号化される前のヘッダであり、図７（ｂ）が、ランサムウェアCryptoLockerにより暗号化された後のヘッダである。
【０１０６】
図７に示すように、ファイル"Wildlife.wmv"の先頭から末尾までの全てのバイトの部分が書き換えられている。少なくとも、バイナリファイルであれば、ファイルの種類や、サイズ、ファイルの種類に応じた各種情報の情報を表す「ヘッダ」と呼ばれる部分（通常、先頭から数バイトから数十バイト）が書き換えられている。
【０１０７】
以上のことから、ランサムウェアCryptoLockerの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
（１）ファイル検索のWindows API関数であるFindFirstFile、FindNextFileが呼び出される。
（２）ファイルを開くWindows API関数であるCreateFileが呼び出される。
（３）CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
（４）CreateFileの対象ファイルのヘッダが、ランサムウェアCryptoLockerのアクセス前後で相違している。
（ｂ）ランサムウェアCryptoWallの分析
プログラムのデバッグを支援するプログラムであるデバッガ（Debugger）を用いてランサムウェアCryptoWallの動作を分析した。
【０１０８】
ランサムウェアCryptoWallは、まずファイルを検索するWindows API関数であるFindFirstFileWにより、ルートドライブから端末内のファイルを検索する。
【０１０９】
図８は、ランサムウェアCryptoWallがファイル検索を開始する際の様子を示すデバッガの画面のキャプチャである。
【０１１０】
最初の図８（ａ）のキャプチャは、FindFirstFileWに、ドライブのルートである"C:\*"が引数として渡されていることを示している。
【０１１１】
次の図８（ｂ）のキャプチャは、FindFirstFileWに、ドライブのルート"C:\*"より下層のフォルダである"C:\Users\*"が引数として渡されていることを示している。
【０１１２】
その次の図８（ｃ）のキャプチャは、FindFirstFileWに、フォルダ"C:\Users\*"より下層のフォルダである"C:\Users\Publice\*"が引数として渡されていることを示している。
【０１１３】
更にその次の図８（ｄ）のキャプチャは、FindFirstFileWに、フォルダ"C:\Users\Public\*"より下層のフォルダである"C:\Users\Publice\Videos\*"が引数として渡されていることを示している。
【０１１４】
Windows API関数であるFindFirstFileWによる、ルートドライブから端末内の更なるファイル検索の結果、最初に"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"が検索され、ランサムウェアCryptoWallにより暗号化される。
【０１１５】
図９は、ランサムウェアCryptoWallがファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を暗号化する際の様子を示すデバッガの画面のキャプチャである。
【０１１６】
最初の図９（ａ）のキャプチャは、Windows API関数であるCreateFileWにより、ファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"が開かれていることを示している。
【０１１７】
次の図９（ｂ）のキャプチャは、Windows API関数であるReadFileと、Windows API関数であるWriteFileが交互に呼び出され、ファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"が所定のサイズ分ずつ書き換えられて暗号化されていることを示している。
【０１１８】
その次の図９（ｃ）のキャプチャは、Windows API関数であるMoveFileが呼び出され、元のファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"のファイル名を暗号化後の別のファイル名に変更されていることを示している。
【０１１９】
図１０は、ランサムウェアCryptoWallによりアクセスされる前と後のファイル"Wildlife.wmv"の状態を示す。図６（ａ）が、ランサムウェアCryptoWallによりアクセスされる前の状態であり、図６（ｂ）が、ランサムウェアCryptoWallによりアクセスされた後の状態である。
【０１２０】
図１０に示すように、ランサムウェアCryptoWallによりアクセスされた後には、フォルダ"C:\Users\Public\Videos\Sample Videos\*.*"内に元のファイル名"野生動物.wmv(Wildlif.wmv)"とは別のファイル名に変更され、ファイルのヘッダが書き換えられている。
【０１２１】
図１１は、ランサムウェアCryptoWallにより暗号化される前と後のファイル"Wildlife.wmv"のヘッダを示す。図１１（ａ）が、ランサムウェアCryptoLockerにより暗号化される前のヘッダであり、図１１（ｂ）が、ランサムウェアCryptoLockerにより暗号化された後のヘッダである。暗号化されたファイルはファイル名が変更されている。
【０１２２】
図１１に示すように、ファイル"Wildlife.wmv"の先頭から末尾までの全てのバイトの部分が書き換えられている。少なくとも、バイナリファイルであれば、ファイルの種類や、サイズ、ファイルの種類に応じた各種情報の情報を表す「ヘッダ」と呼ばれる部分（通常、先頭から数バイトから数十バイト）が書き換えられている。
【０１２３】
次に、別のファイルを暗号化する際の様子について説明する。
【０１２４】
図１２及び図１３は、ランサムウェアCryptoWallがファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"を暗号化する際の様子を示すデバッガの画面のキャプチャである。
【０１２５】
最初の図１２（ａ）のキャプチャは、Windows API関数であるCreateFileにより、ファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"が開かれていることを示している。
【０１２６】
次の図１２（ｂ）のキャプチャは、Windows API関数であるReadFileと、Windows API関数であるWriteFileが繰り返し呼び出されることを示している。
【０１２７】
その次の図１３のキャプチャは、ファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"が暗号化により破損され、サムネイルで表示できなくなっていることを示している。更に、Windows API関数であるMoveFileEXが呼び出され、元のファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"が暗号化後の別のファイル名"C:\Users\Public\Pictures\Sample Pictures\p3EiSzLkWhfU5pgrD5SX9PdYPyP5ICa5iXzySi34oaY=.E08A29776586FC717E27.breaking_bad"に変更されていることを示している。
【０１２８】
以上のことから、ランサムウェアCryptoWallの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
（１）ファイル検索のWindows API関数であるFindFirstFile、FindNextFileが呼び出される。
（２）ファイルを開くWindows API関数であるCreateFileが呼び出される。
（３）CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
（４）CreateFileの対象ファイルのヘッダが、ランサムウェアCryptoWallのアクセス前後で相違している。
（５）ファイルを移動するWindows API関数であるMoveFileExが呼び出され、移動元の移動先が同じでファイル名が変更される。
（ｃ）ランサムウェアCERBERの分析
プログラムのデバッグを支援するプログラムであるデバッガ（Debugger）を用いてランサムウェアCERBERの動作を分析した。
【０１２９】
ランサムウェアCERBERは、まずファイルを検索するWindows API関数であるFindFirstFile、FindNextFileにより、端末内のファイルを検索し、特定の拡張子を持つファイルを暗号化対象ファイルとして、そのリストをあらかじめ作成する。
【０１３０】
次に、リスト化した暗号化対象ファイルを、Windows API関数であるCreateFileWにより順に開いたのち、Windows API関数であるReadFileによりファイルを一度読み出し、その後、Windows API関数であるWriteFileによりファイルにデータを書き込むことにより暗号化を行う。更に、WriteFileによるデータの書き込みにより暗号化が終了すると、Windows API関数であるMoveFileWにより、同一フォルダにファイルを移動、すなわちファイル名の変更が行われる。
【０１３１】
図１４は、ランサムウェアCERBERがファイルを暗号化する際の様子を示すデバッガの画面のキャプチャである。
【０１３２】
最初の図１４（ａ）のキャプチャは、Windows API関数であるCreateFileWにより、ファイル"C:\Python27\Lib\unittest\test\test_assertions.py"が開かれていることを示している。
【０１３３】
次の図１４（ｂ）のキャプチャは、Windows API関数であるReadFileにより、CreatFileWで開いたファイルを読み込むことを示している。
【０１３４】
更に次の図１４（ｃ）のキャプチャは、Windows API関数であるWriteFileにより、CreatFileWが開いたファイルにデータを書き込むことを示している。
【０１３５】
更に次の図１４（ｄ）のキャプチャは、Windows API関数であるMoveFileWが呼び出され、CreatFileWが開いたファイルのファイル名を変更されたことを示している。
【０１３６】
以上のことから、ランサムウェアCERBERの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
（１）ファイル検索のWindows API関数であるCreateFileが呼び出される。
（２）CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
（３）CreateFileの対象ファイルのヘッダが、ランサムウェアCERBERのアクセス前後で相違している。
（４）ファイルを移動するWindows API関数であるMoveFileExが呼び出され、移動元の移動先が同じでファイル名が変更される。
（ｄ）ランサムウェアTeslaCryptの分析
プログラムのデバッグを支援するプログラムであるデバッガ（Debugger）を用いてランサムウェアTeslaCryptの動作を分析した。
【０１３７】
ランサムウェアTeslaCryptは、まずファイルを検索するWindows API関数であるFindFirstFile、FindNextFileにより、Ｃドライブ直下から端末内のファイルを検索する。暗号化対象ファイルである特定の拡張子を持つファイルが存在した場合、Windows API関数であるCreateFileWにより開いたのち、Windows API関数であるReadFileを複数回実行してメモリ上にファイルを読み出し、そのメモリ上のファイルを暗号化し、その後、Windows API関数であるWriteFileを複数回実行して、暗号化対象ファイルを上書きする。
【０１３８】
図１５は、ランサムウェアTeslaCryptがファイルを暗号化する際の様子を示すデバッガの画面のキャプチャである。
【０１３９】
最初の図１５（ａ）のキャプチャは、Windows API関数であるFindFirstFile、FindNextFileにより、Ｃドライブ直下から端末内のファイルを検索していくことを示している。
【０１４０】
次の図１５（ｂ）のキャプチャは、Windows API関数であるCreateFileWにより、ファイル"C:\Users\test\Desktop\おとり.png"が開かれていることを示している。
【０１４１】
更に次の図１５（ｃ）のキャプチャは、Windows API関数であるReadFileにより、CreatFileWが開いたファイルを複数回にわけて読み出すことを示している。
【０１４２】
更に次の図１５（ｄ）のキャプチャは、Windows API関数であるWriteFileにより、CreatFileWが開いたファイルにデータを複数回にわけて書き込むことを示している。
【０１４３】
図１６は、ランサムウェアTeslaCryptにより暗号化される前と後のファイル"C:\Users\test\Desktop\おとり.png"のヘッダを示す。図１６（ａ）が、ランサムウェアTeslaCryptoにより暗号化される前のヘッダであり、図１６（ｂ）が、ランサムウェアTeslaCryptoにより暗号化された後のヘッダである。
【０１４４】
図１６に示すように、ファイル"おとり.png"の先頭から末尾までの全てのバイトの部分が書き換えられている。少なくとも、バイナリファイルであれば、ファイルの種類や、サイズ、ファイルの種類に応じた各種情報の情報を表す「ヘッダ」と呼ばれる部分（通常、先頭から数バイトから数十バイト）が書き換えられている。
【０１４５】
以上のことから、ランサムウェアTeslaCryptの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
（１）ファイル検索のWindows API関数であるFindFirstFile、FindNextFileが呼び出される。
（２）ファイル検索のWindows API関数であるCreateFileが呼び出される。
（３）CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
（４）CreateFileの対象ファイルのヘッダが、ランサムウェアTeslaCryptのアクセス前後で相違している。
【０１４６】
（本発明の原理）
本願発明者等は、これら４種類のランサムウェアの分析結果から、ファイルを暗号化する際のファイル操作の挙動に、次のような共通する挙動があることに気がついた。
（１）ファイルを開くWindows API関数であるCreateFileが呼び出される。
（２）CreateFileの対象ファイルに、Windows API関数であるReadFile、WriteFileが１回以上呼び出される。
（３）CreateFileの対象ファイルのヘッダが変化している。
【０１４７】
一般のアプリケーションで、このような挙動をするものは想定しにくく、ランサムウェア特有の挙動である。
【０１４８】
そこで、本願発明者等は、このような挙動を検出することにより、ファイルを暗号化しようとする未知のランサムウェアを確実に検出し、未知のランサムウェアによる攻撃を有効に阻止することができると考え、本発明を着想するに至った。
【０１４９】
［第１実施形態］
本発明の第１実施形態によるプログラム、情報処理装置及び情報処理方法について図１７乃至図４３を用いて説明する。
【０１５０】
（本実施形態の概要）
本実施形態の概要について図１７及び図１８を用いて説明する。
【０１５１】
本実施形態では、ハードディスク２２に保存されたユーザーデータへアクセスするという挙動を有するプログラムの全ての挙動が検出対象である。
【０１５２】
ＣＰＵ２１がメモリ２３上のＯＳデータのプロセスを実行して、ハードディスク２２に格納されたプログラムにアクセスして、そのプログラムを読み込み（図２（ｃ））、ハードディスク２２に格納されたプログラムがメモリ２３にロードされ、メモリ２３上にプロセスとして展開される（図３（ａ））前に、メモリ２３に本発明プログラムのプロセスを常駐させておく（図１７（ａ））。
【０１５３】
本発明プログラムは、ランサムウェアが導入される危険性のある状態となる前であればいつ実行してメモリ２３上にプロセスとして常駐させてもよい。
【０１５４】
例えば、スタートアッププログラムとして、コンピューターの起動時に起動させておく。Windows OSには、ＰＣの起動と共に実行されるプログラムとして「スタートアッププログラム」が登録できる仕組みがある。本実施形態では、その仕組みを利用し本発明プログラムをスタートアッププログラムとして登録しておく。これにより、本発明プログラムがＰＣの起動直後からメモリ２３上に配置している状態にする。
【０１５５】
また、ＰＣの起動時にプログラムを起動する方法としては、レジストリやサービスの仕組みを使用する方法もあるが、いずれの方法を用いてもよい。
【０１５６】
これにより、ＰＣの起動直後から常にコンピューターをランサムウェアから保護することができる。
【０１５７】
本発明プログラムは、図１７（ａ）に示すように、ハードディスク２２に格納されたプログラムがメモリ２３にロードするという動作と、ＣＰＵ２１がプログラムを実行するという動作との間に割り込む。ＣＰＵ２１によるプログラムに基づく動作をフックすることにより、プログラムが実行される直前で、そのプログラムの挙動を本発明プログラムの監視下に置く。
【０１５８】
これにより、これ以降、監視対象プログラムの全ての挙動は、本発明プログラムが実行直前に把握することができる。必要に応じて、監視対象プログラムの処理に機能を加えたり、変更したりすることができる。
【０１５９】
本発明プログラムにより、監視対象プログラムの挙動が、ランサムウェア特有の挙動であると判断された場合には、図１７（ｂ）に示すように、本発明プログラムは、監視対象プログラムがハードディスク２２内のファイルにアクセスを行おうとする直前に、そのアクセスをブロックする。このようにして、未知のランサムウェアによる攻撃をブロックしてファイルの暗号化を阻止する。
【０１６０】
本発明プログラムは３つの機能を有する。本発明プログラムの３つの機能について図１８を用いて説明する。
【０１６１】
第１の機能は、現在動作中のプログラムや、後ほど起動するプログラムである監視対象プログラムが使用するWindows APIをフックする機能である。図１８に示すように、本発明プログラムから、現在起動中のプロセス、すなわち、notepad.exe、WINWORD.exe、calc.exe、Ramsomware.exe、cmd.exe、…のプロセスが使用するWindows APIをフックする。
【０１６２】
第２の機能は、フックしたWindows APIにより、監視対象プログラムの挙動を本発明プログラムに通知、問い合わせをして、その結果に基づいて監視対象プログラムがランサムウェアであるか判断する機能である。
【０１６３】
第３の機能は、フックしたWindows APIからの通知の受領、記録、問い合わせに応答する機能である。
【０１６４】
第１の機能と第３の機能は、常駐している本発明プログラムの機能であり、第２の機能は、監視対象プログラム内に組み込まれる本発明プログラムの機能である。
【０１６５】
（フック対象のWindows API関数）
本発明プログラムは、監視対象プロセスにおいて、ランサムウェアの分析結果から得られた共通の挙動であるWindows API関数をフックすることにより、ランサムウェアの検知および防御を実現する。
【０１６６】
ランサムウェアの共通の挙動であるWindows API関数とは、本発明の原理で指摘したように、CreateFile（ファイル作成関数（ファイルハンドル取得関数））、（ファイル生成関数）、ReadFile（ファイル読出関数）、WriteFile（ファイル書込関数）である。
【０１６７】
本実施形態では、共通のWindows API関数である、ファイルを開きファイルハンドルを取得するためのCreateFile（ファイル生成関数）はフック対象とせず、ReadFile（ファイル読出関数）、WriteFile（ファイル書込関数）のみをフック対象としている。それは次のような理由からである。
【０１６８】
まず、共通のWindows API関数である、ReadFile（ファイル読出関数）、WriteFile（ファイル書込関数）を実行するためには、ファイルのハンドルを取得することは事前に必須の処理であるので、ReadFile（ファイル読出関数）、WriteFile（ファイル書込関数）をフック対象とするだけで、ファイルのハンドルを取得することを検出できる。
【０１６９】
また、ファイルのハンドルを取得するためには、CreateFile（ファイル生成関数）以外のWindows API関数、例えば、OpenFile（ファイルオープン関数）でも実現可能であるので、CreateFile（ファイル生成関数）はファイルのハンドルを取得するために必須のWindows API関数とは言えない。
【０１７０】
（HookReadFile）
HookReadFileは、ReadFile（ファイル読出関数）をフックするWindows API関数である。
【０１７１】
HookReadFileは、通常のReadFileの動作に加えて、本発明プログラムに対して、次の情報（ａ）〜（ｃ）を通知する機能を付加したWindows API関数である。
【０１７２】
通知手段としては、プロセス間通信等、プロセスの動作に大きな遅延を発生させない程度の高速な手法が望ましい。ソケット通信やファイルによる受け渡し等でも、高速に実現できる環境であれば、いかなる方法でもよい。
（ａ）通知元ＡＰＩ名。フックするWindows API関数の名前であるReadFileである。
（ｂ）自身のプロセスＩＤ。フックするReadFileを呼び出す監視対象プロセスのプロセスＩＤである。
（ｃ）ReadFileの対象ファイルパス。通知元ＡＰＩであるReadFileのパラメータに指定されたファイルハンドルを示すファイルパスである。
【０１７３】
ここで「ファイルパス」とは、その「ファイル」を保存している「フォルダ」に辿り着くまでに階層を重ねたフォルダの「経路（path）」を含めたものである。例えば、ハードディスクの「Ｃドライブ」上のフォルダ「Users」内のフォルダ「user」内のフォルダ「Desktop」内にあるファイル「note.doc」の「ファイルパス」は次の通りである。
【０１７４】
C:\Users\user\desktop\note.doc
また、ファイルパス（C:\Users\user\desktop\note.doc）からファイル名（note.doc）を除いたファイルパス（C:\Users\user\desktop\）のことを「フォルダパス」と言う。
【０１７５】
HookReadFile（ReadFileのフック関数）から通知を受けた本発明プログラムは、通知された内容、すなわち、ＡＰＩ名、プロセスＩＤ、ファイルパスを、順次、通知記録データとしてメモリ２３に保存する。この通知記録データは、後述するHookWriteFile（WriteFileのフック関数）において使用される。
【０１７６】
なお、オペレーティングシステムではプロセスＩＤを再利用する機能があるので、長時間継続していると、異なるプロセスに対して偶発的に同じプロセスＩＤが割り当てられる可能性がある。このような偶発的なプロセスＩＤの一致によるランサムウェアの誤検知を防止するため、通知記録データを定期的にクリアすることが望ましい。
【０１７７】
通議記録データの定期的クリアの間隔は任意であるが、長くともオペレーティングシステムの終了時または再起動時にはクリアすることが望ましい。クリア間隔をユーザーが設定できるようにしてもよい。
【０１７８】
図１９に上述したHookReadFileによる動作のイメージを示す。図１９左部に監視対象プログラムのプロセスを示し、図１９右部に本発明プログラムのプロセスを示す。
【０１７９】
図１９左側の監視対象プログラムのプロセスには、本発明プログラムのフック機能であるHookReadFileが組み込まれている。組み込まれたHookReadFileは、通常のReadFileの動作に加えて、（ａ）通知元ＡＰＩ名、（ｂ）自身のプロセスＩＤ、（ｃ）ReadFile対象ファイルパスを、図１９右側の本発明プロセスに通知する。
【０１８０】
図１９右側の本発明プログラムのプロセスは、HookReadFileからの通知への対応を行う。図１９左側のHookReadFileからの通知を受け取り、通知記録データとして順次記録する。
【０１８１】
図１９では、HookReadFileは、（ａ）通知元ＡＰＩ名、（ｂ）自身のプロセスＩＤ、（ｃ）ReadFile対象ファイルパスとして、（ａ）[ReadFile]と（ｂ）pid:3421と（ｃ）filename:c:\Users\user\Desktop\note.docの組；（ａ）[ReadFile]と（ｂ）pid:1568と（ｃ）filename:c:\Users\user\Documents\schedule.xlsの組；（ａ）[ReadFile]と（ｂ）pid:1568と（ｃ）filename:c:\Users\user\Documents\schedule.xlsの組；・・・・を順次通知し、本発明プログラムは順次通知されたものを通知記録データとして記録している。
【０１８２】
（HookWriteFile）
HookWriteFileは、WriteFile（ファイル書込関数）をフックするWindows API関数である。
【０１８３】
HookWriteFileは、通常のWriteFileの動作に加えて、次の機能を付加したWindows API関数である。
【０１８４】
WriteFileに指定されたパラメータ及びパラメータから取得できる情報が、後述する「ランサムウェアによるファイル暗号化操作であることの判断基準」に合致した場合、ランサムウェアによるファイル暗号化操作であると判断し、WriteFileによるデータ書き込みを行わずにプロセスを終了させる機能。
【０１８５】
上記の「ランサムウェアによるファイル暗号化操作であることの判断基準」とは、次の条件（Ａ）〜（Ｃ）を満足することである。
【０１８６】
条件（Ａ）：WriteFileの書き込み対象に指定されたファイルハンドルのファイルポインタの現在位置を取得し、その現在位置が先頭またはヘッダ範囲内であること。ファイルポインタの現在位置はSetFilePointer関数を使用する等で取得可能である。
【０１８７】
条件（Ｂ）：WriteFileの呼び出しにより書き換え前後でデータが変化すること。
【０１８８】
条件（Ｃ）：本発明プログラムに問い合わせた結果、WriteFileが呼び出し時に指定されたファイルに対して、既に自身のプロセスから ReadFileが呼び出されていること。
【０１８９】
条件（Ａ）と条件（Ｂ）により、ファイルの先頭またはヘッダ範囲内情報が変化しているかを判断する。
【０１９０】
条件（Ｃ）を含めたのは次の理由である。
【０１９１】
一般的なファイルの暗号化手順では、プログラムの実装方法として、ReadFileで読み取った内容を暗号化した後、WriteFileで別のファイルに直接書き込む手法がとられる。しかし、今回分析したランサムウェアにおいては、そのような手法をとらず、あえて ReadFileで読み込んだファイルをWriteFileで書き換え、その後にリネームするといった動作を行っていた。これは、フォレンジック技術によるファイルの復元を防止するためと考えられる。ReadFileで読み込んだファイルをあえてWriteFileで上書きすることで、ディスク上のデータを上書きするため、フォレンジック技術を用いた方法でも、ファイルの復元ができなくなる可能性が高い。ランサムウェアの作者はあえてその状況を狙っているものと考えられる。本発明プログラムでは、この挙動を検知条件のひとつとしているため、このようなランサムウェアの特性に非常に効果的である。
【０１９２】
この付加した機能により、HookWriteFile（WriteFileのフック関数）内で、呼び出し元プロセスがランサムウェアかどうかを判断し、ランサムウェアである場合、ファイル暗号化の防止、ランサムウェア検知の通知、ランサムウェアのプロセスの強制終了を行うことができる。
【０１９３】
条件（Ａ）のイメージを図２０に示す。
【０１９４】
図２０（ａ）（ｂ）左部はメモリ２３上の監視対象プログラムのプロセスを示し、図２０（ａ）（ｂ）右部はハードディスク２２上の書き込み対象ファイルを示す。
【０１９５】
メモリ２３上の監視対象プロセスに組み込まれたHookWriteFileから、ハードディスク２２上の書き込み対象ファイルへの書き込み開始位置が指定される。
【０１９６】
図２０（ａ）の場合、ハードディスク２２上の上側の書き込み対象ファイルに対する書き込み開始位置"0x00000020"はファイルの先頭ではなく、下側の書き込み対象ファイルに対する書き込み開始位置"0x00000000"はファイルの先頭である。書き込み開始位置がファイルの先頭である下側の書き込み対象ファイルへの書き込みが条件（Ａ）を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【０１９７】
図２０（ｂ）の場合、ハードディスク２２上の上側の書き込み対象ファイルに対する書き込み開始位置"0x00000024"はファイルのヘッダの範囲内でなく、下側の書き込み対象ファイルに対する書き込み開始位置"0x00000004"はファイルの先頭ではないがヘッダの範囲内である。書き込み開始位置がファイルのヘッダの範囲内である下側の書き込み対象ファイルへの書き込みが条件（Ａ）を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【０１９８】
なお、ヘッダの範囲内であるかを判断するためには、ファイルの各拡張子に対するヘッダのサイズが予め分かっている必要がある。各拡張子に対応するヘッダのサイズは予めHookWriteFile（WriteFileのフック関数）内に保持しておく。例えば、拡張子が"pdf"であるＰＤＦファイルでは先頭から５バイトがヘッダである。
【０１９９】
条件（Ｂ）のイメージを図２１に示す。
【０２００】
図２１左部はメモリ２３上の監視対象プログラムのプロセスを示し、図２１右部はハードディスク２２上の書き込み対象ファイルを示す。
【０２０１】
メモリ２３上の監視対象プロセスに組み込まれたHookWriteFileが書き込もうとする書き込み予定データと、ハードディスク２２上の書き込み対象ファイルの書き込み前の状態のデータとを比較する。
【０２０２】
図２１の場合、HookWriteFileが書き込もうとする書き込み予定データ"00 AA 00 BB 00 CC 00 DD 00 EE 00 FF 00 00 08 00"と、ハードディスク２２上の書き込み対象ファイルの書き込み前の状態のデータ"50 4B 03 04 14 00 06 00 08 00 00 00 21 00 A3 EF"とは相違するので、条件（Ｂ）を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【０２０３】
条件（Ｃ）のイメージを図２２に示す。
【０２０４】
図２２（ａ）左部にメモリ２３上の監視対象プログラムのプロセスを示し、図２２（ａ）右部にメモリ２３上の本発明プログラムのプロセスを示す。
【０２０５】
図２２（ａ）左部の監視対象プロセスに組み込まれたHookWriteFileは、自身（監視対象プロセス）のプロセスＩＤと、WriteFileの対象ファイルパスに基づいて、図２２（ａ）右部の本発明プログラムのプロセスに対して、ReadFileの通知記録データ中に、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があるか否かを問い合わせる。図２２右側の本発明プログラムは、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があるか否かをHookWriteFileに応答する。
【０２０６】
図２２（ａ）の場合、監視対象プロセスに組み込まれたHookWriteFileからプロセスＩＤ"pid:1568"とファイルパス"C:\Users\user\Documents\schedule.xls"に基づいて、ReadFileの通知記録データに対して問い合わせる。
【０２０７】
図２２（ｂ）にReadFileの通知記録データを示す。
【０２０８】
ReadFileの通知記録データの第４〜６行、第７〜９行、第１３〜１５行に、HookWriteFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"と同一である、プロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"のReadFileの記録があるので、条件（Ｃ）を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【０２０９】
その結果、図２２（ａ）右側の本発明プログラムは、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があった旨をHookWriteFileに応答する。
【０２１０】
（除外リスト）
本発明プログラムを、システム上において動作する全てのプロセスから呼び出される全てのReadFile、WriteFileをフックし、そのプロセスがランサムウェアである否かを判断することは、システムに新たな負荷を加えることになる。
【０２１１】
そこで、本実施形態では、明らかにランサムウェアではないプログラムを予め登録した「除外リスト」を作成しておき、除外リストに登録されたプログラムに対しては、本発明プログラムを実行しないようにする。
【０２１２】
図２３に除外リストの具体例を示す。
【０２１３】
除外リストには正規のプログラムを登録する。例えば、システムにインストールされている「プログラム名」「プログラムファイル」「ファイルのフルパス」「ファイルサイズ」「ハッシュ値」「デジタル著名」等を必要に応じて登録する。
【０２１４】
図２３では、正規のプログラムとして、「インターネットエクスプローラー」「ＭＳワード」「ＭＳエクセル」を登録している。
【０２１５】
除外リストは、システムへのプログラムをインストールするたびに更新し、ハードディスク２２上に格納しておく。本発明プログラムの起動時に除外リストの内容を読み込むようにする。
【０２１６】
本発明プログラムの動作後、読み込んだ除外リストの情報はメモリ２３上にマッピングされる。突然のマシントラブルでメモリ情報が揮発しても内容を失わないよう、ハードディスク２２上のファイルに対して常に更新しておくことがよい。
【０２１７】
また、除外リストのファイルは、マルウェアやランサムウェアによる編集を避けるため、暗号化しておくことが望ましい。
【０２１８】
（ユーザーによる除外リストへの追加）
「ランサムウェアによるファイル暗号化操作であることの判断基準」の条件（Ａ）は、HookWriteFileからの書き込み対象ファイルへの書き込み開始位置が先頭又はヘッダ範囲内であることである。この条件（Ａ）は、監視対象プログラムがファイルのヘッダを書き換えるものであるかを判断するための条件である。監視対象プログラムがファイルのヘッダを書き換える場合には、監視対象プログラムがランサムウェアの可能性があると判断する。監視対象プログラムがファイルのヘッダ以外の部分を書き換える場合には、通常の書き換え処理でありランサムウェアの可能性がないと判断する。
【０２１９】
一般的に、コンピューターが扱うファイルは「テキストファイル（テキスト形式）」と「バイナリファイル（バイナリ形式）」の２種類に分類される。
【０２２０】
バイナリファイル、例えば、拡張子が"doc"、"ppt"、"exe"、"pdf"、"jpg"、"bmp"等のファイルは、通常、ファイル種別に応じたヘッダ情報を有している。バイナリファイルの内容を編集して変更し上書き保存した場合でも、通常、ヘッダ情報となるファイルの先頭部分は変更されず、データ部分が変更される。バイナリファイルのヘッダが書き換えられると、そのファイルは適切に開けなくなり、通常のアプリケーションではそのようなことは行われない。したがって、ファイルのヘッダを書き換えるプログラムはランサムウェアの可能性がある。
【０２２１】
ファイルの先頭部分のヘッダを書き換えるような処理を行うアプリケーションも存在するが、その場合には、ヘッダの書き換えに応じて、ファイルの拡張子も変更されてファイル種別が変更される。拡張子を含むファイル名が変わらないままで、ヘッダを書き換えることは通常のアプリケーションでは行われない。したがって、ファイル名が変わらないままで、ファイルのヘッダを書き換えるプログラムはランサムウェアの可能性がある。
【０２２２】
一方、テキストファイル、例えば、拡張子が"txt"、"csv"等のファイルは、通常、ファイル種別に応じたヘッダ情報を有していない。テキストファイルの場合、ファイルの先頭部分もデータ部分である。したがって、テキストファイルが先頭部分から書き換えられていても、それがランサムウェアによる暗号化か、通常のアプリケーションにより書き換えかを判断することは困難である。
【０２２３】
本発明プログラムでは、ファイルの拡張子に基づいて、テキスト形式のファイルであると判断された場合は、その対応をユーザーの判断にゆだねるようにする。
【０２２４】
図２４は、テキスト形式のファイルの書き換えを検出した場合の警告画面である。
【０２２５】
警告画面では「以下のプロセスがテキストファイルの改変挙動を行っています。どう処理しますか。」と尋ね、「プロセス名：AAATextEditor.exe」、「該当挙動：ファイル内容の改変」、「対象ファイル：C:\Users\test\Desktop\議事録.txt」、「書き込み内容："[議事録]\n 出席者：佐藤・・・"」を示す。
【０２２６】
更に「※現在の操作に心当たりのないプロセスおよびファイルである場合、ランサムウェアによるファイルの暗号化処理の可能性があります。」と警告し、その対応処理の選択ボタン「プロセスを終了」、「この警告を放置」、「プロセスを除外に追加」を示す。
【０２２７】
ユーザーが「プロセスを終了」を選択した場合には、プロセス"AAATextEditor.exe"を直ちに終了させる。ユーザーが、そのプロセスをランサムウェアであると判断した場合である。
【０２２８】
ユーザーが「この警告を放置」を選択した場合には、プロセス"AAATextEditor.exe"を終了させることなく、そのまま処理を続行する。ユーザーが、そのプロセスをランサムウェアであるか否か判断できない又は判断を保留する場合である。
【０２２９】
ユーザーが「プロセスを除外に追加」を選択した場合には、プロセス"AAATextEditor.exe"を、図２５に示すように、「除外リスト」に追加し、同じプロセスに対する警告を再度行わないようにする。ユーザーが、そのプロセスはランサムウェアでないと判断した場合である。
【０２３０】
なお、監視対象プログラムからの除外リスト（ホワイトリスト）の参照および追加は、直接ハードディスク２２上のファイルへアクセスするよう実装してもよいし、一度常駐プログラムを経由してアクセスするように実装してもよい。
【０２３１】
（対処行動）
本発明プログラムが、監視対象プログラムをランサムウェアであると判断した場合の対処行動について説明する。
【０２３２】
監視対象のプログラムをランサムウェアであると判断した場合には、WriteFileによるファイルへの書き込みは行わず、監視対象プログラムによるプロセスを強制終了する。
【０２３３】
プロセスの強制終了は、WriteFileをフックしているHookWriteFile関数内で行う。一般的には、ExitProcess関数や、Exit関数等を用いることで実現できるが、プロセスを終了可能な命令であればいかなるものを使用してもよい。
【０２３４】
プロセスの強制終了により、ランサムウェアによるファイルの暗号化を防ぐことができる。プロセスの強制終了では、当該ファイルは暗号化されないため、事前のファイルのバックアップ等も不要である。
【０２３５】
なお、直ちにプロセスを終了させることにより不都合が生じる可能性のある環境においては、例えば、ユーザーに強制終了予定であることを事前に通知し、強制終了するか否かの判断を仰ぐようにしてもよい。また、後述する「付加機能による検出精度のコントロール」の機能を用いて対応するようにしてもよい。
【０２３６】
（HookReadFileとHookWriteFile）
図２６に、本発明プログラムによるHookReadFileによる動作とHookWriteFileによる動作のイメージをまとめて示す。
【０２３７】
図２６左部に監視対象プログラムのプロセスを示し、図２６右部に本発明プログラムのプロセスを示す。
【０２３８】
図２６左側の監視対象プログラムのプロセスには、本発明プログラムのフック機能であるHookReadFileとHookWriteFileが組み込まれている。
【０２３９】
組み込まれたHookReadFileは、通常のReadFileの動作に加えて、（ａ）通知元ＡＰＩ名、（ｂ）自身のプロセスＩＤ、（ｃ）ReadFile対象ファイルパスを、図１９右側の本発明プロセスに通知する。
【０２４０】
図２６右側の本発明プログラムのプロセスは、図２６左側のHookReadFileからの通知を受け取り、通知記録データとして順次記録する。
【０２４１】
組み込まれたHookWriteFileは、自身（監視対象プロセス）のプロセスＩＤと、WriteFileの対象ファイルパスに基づいて、図２６右部の本発明プログラムのプロセスに対して、ReadFileの通知記録データ中に、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があるか否かを問い合わせる。図２６右側の本発明プログラムは、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があるか否かをHookWriteFileに応答する。
【０２４２】
組み込まれたHookWriteFileは、更に、書き換え対象ファイルがテキストファイルの場合にユーザーに通知し、その対処方法の選択肢をユーザーに示す。
【０２４３】
ユーザーにより監視対象プロセスの除外リストへの追加が選択された場合には、除外リストに当該プロセスを追加する。
【０２４４】
ユーザーにより監視対象プロセスの終了が選択された場合には、監視対象プロセスを強制終了する。
【０２４５】
（Windows APIのフック方法）
本発明プログラムが、Windows APIをフックする具体的な方法について、図２７乃至図３４を用いて説明する。
【０２４６】
すべてのWindowsプログラムは、起動するとそれぞれのプロセス空間（メモリ空間）と呼ばれる仮想メモリ上に配置される仕組みとなっている。
【０２４７】
それぞれのプロセス空間には、マルウェアのプロセス空間の状態を拡大して表示した図２７に示すように、Import Address Table（ＩＡＴ）という項目があり、ＩＡＴ にはプログラムが使用する関数（ＡＰＩ）の一覧とそれに応じたメモリアドレス（番地）が記録されている。これはプログラムが動作する際に、どういった関数がどこのメモリに読み込まれているかを把握するための一般的な仕組みである。
【０２４８】
この前提のもとフック制御を行う方法について記述する。
【０２４９】
まず、図２８に示すように、監視対象プログラムのプロセス空間に、フック用の WriteFile関数（HookWriteFile関数）を埋め込む。自分以外の他のプロセスにコードを注入する、すなわち、コードをインジェクションするには、そのプロセスのメモリ空間において、VirtualAllocEx関数というWindows APIを利用し、まだ使用されていない領域に一定サイズのメモリ領域を確保する。図２８右部の網掛け部分がそのメモリ領域である。
【０２５０】
次に、図２９に示すように、WriteProcessMemoryというWindows APIを利用し、確保したメモリ領域に実行させたいコード、ここではHookWriteFile関数本体、および、その HookWriteFile関数を監視対象プログラムのプロセス空間内のＩＡＴへ組み込むための関数Ａを書き込む。この動作を図２９の太線矢印で示す。なお、確保したメモリ領域の具体的なアドレスはVirtualAllocExの戻り値を確認することで取得することができる。
【０２５１】
次に、図３０に示すように、書き込んだコード（関数Ａ）を実行させるために CreateRemoteThreadというWindows APIを呼び出すことにより、その任意のコードをマルウェアのプロセス空間上で実行することができる。この動作を図３０の太線矢印で示す。
【０２５２】
ここで、監視対象プログラムのプロセス空間のみに注目すると、図３１に示すようになる。
【０２５３】
次に、図３２に示すように、CreateRemoteThreadにより、関数Ａが実行されると、関数 Ａは、監視対象プログラムのプロセス空間のＩＡＴにおける、正規のWriteFile関数のアドレス（図３２ではアドレス"0x46700000"番地）を、HookWriteFile関数のアドレス（図３２ではアドレス"0x49000000"番地）へ書き換える。これでフックの事前処理が完了する。
【０２５４】
なお、どの関数がどのアドレスに展開されているか、すなわち、ＩＡＴにあるその関数に対応するアドレス、を知るには、GetProcAddressというWindows APIの引数に関数名を渡すことで、指定した関数がプロセス空間のどのアドレスに対応づけられているのか、具体的なアドレスを知ることができる。
【０２５５】
次に、図３３及び図３４に示すように、監視対象プログラムが、例えば"0x3C0"というファイルハンドルの指すファイル内容を書き換えようとしたと仮定する。その場合、WriteFile関数が呼び出されると、監視対象プログラムは自身のプロセス空間内のＩＡＴを参照した結果、正規の WriteFile関数ではなく、HookWriteFile関数に"0x3C0"というパラメータを渡すことになる。
【０２５６】
HookWriteFile関数の内部では、任意の処理を行うことが可能である。具体的には、本来WriteFileを使用して書き込むデータの内容を事前にチェックする、変更する等である。本発明プログラムにおけるHookWriteFile関数の内容は、前述のとおりである。
【０２５７】
（付加機能による検出精度のコントロール）
本発明プログラムが監視対象プログラムをランサムウェアであると判断した場合には、ランサムウェアによるファイルの暗号化を防ぐため、監視対象プログラムによるプロセスを強制終了する。
【０２５８】
しかしながら、環境によっては、直ちにプロセスを強制終了させることにより不都合が生じる場合がある。そこで、本発明プログラムに付加機能を設けて、ランサムウェアの検出精度をコントロールするようにする。
【０２５９】
（HookFindNextFileによるコントロール）
HookFindNextFileは、FindNextFile（ファイル検索関数）をフックするWindows API関数である。
【０２６０】
ReadFile（ファイル読出関数）をフックするHookReadFile、WriteFile（ファイル書込関数）をフックするHookWriteFileに加えて、HookFindNextFileによりFindNextFile（ファイル検索関数）をフックするようにして、ランサムウェアの検出精度を向上させる。
【０２６１】
FindFirstFileとFindNextFileは、ファイルの検索や列挙に使用するWindows API関数であり、通常、セットで使用される。
【０２６２】
図３５に、FindFirstFileとFindNextFileによる動作を示す。
【０２６３】
まず、場所を指定してFindFirstFileを呼び出すと、その場所の最初のファイルの情報がシステムから応答され、最初のファイルの情報（AAA.txt）が取得できる。
【０２６４】
次に、FindNextFileを呼び出すと、FindFirstFileにより取得したファイルハンドルから、その場所の次のファイルの情報（BBB.pdf）が取得できる。
【０２６５】
以降、FindNextFileを呼び出すことにより、その場所の更に次のファイルの情報（CCC.txt、DDD.exe、…）を順次取得できる。
【０２６６】
したがって、HookReadFile、HookWriteFileによる上述したランサムウェアの検知時に、FindFirstFileやFindNextFileが常に呼び出されている場合には、ランサムウェアが連続してファイルの暗号化を行っていると判断することができる。
【０２６７】
図３６に示すように、まず、FindFirstFileを呼び出し、ある場所の最初のファイルの情報を取得する。続いて、ReadFileとWriteFileを呼び出し、そのファイルの暗号化処理を行う。次に、FindNextFileを呼び出し、その場所の次のファイルの情報を取得する。続いて、ReadFileとWriteFileを呼び出し、そのファイルの暗号化処理を行う。次に、同様に、FindNextFileを呼び出し、その場所の次のファイルの情報を取得する。続いて、ReadFileとWriteFileを呼び出し、そのファイルの暗号化処理を行う。以降、同様な処理を繰り返して、その場所のファイルを連続して暗号化する。
【０２６８】
このようなファイルの連続した暗号化処理を検出するためには、FindNextFileのみをフックして監視すればよい。FindFirstFileは必ずしもフックして監視しなくともよい。
【０２６９】
FindNextFileをフックするHookFindNextFileは、呼び出されると通常のFindNextFileの動作に加えて、本発明プログラムに対して次の情報（ａ）〜（ｃ）を通知する。
【０２７０】
通知手段としては、プロセス間通信等、プロセスの動作に大きな遅延を発生させない程度の高速な手法が望ましい。ソケット通信やファイルによる受け渡し等でも、高速に実現できる環境であれば、いかなる方法でもよい。
（ａ）通知元ＡＰＩ名。フックするWindows API関数の名前であるFindNextFileである。
（ｂ）自身のプロセスＩＤ。フックするFindNextFileを呼び出す監視対象プロセスのプロセスＩＤである。
（ｃ）通知元ＡＰＩであるFindNextFileのパラメータで指定されたデータバッファから取得できるファイル名。データバッファには次のファイルの情報が格納されている。
【０２７１】
したがって、HookReadFile、HookWriteFileによりランサムウェアが検知されたことを条件として、その暗号化処理の前に、FindNextFileが呼び出され、かつ、取得された次のファイル名がReadFileおよびWriteFileの対象ファイルと合致するかどうかを確認することにより、暗号化処理が複数のファイルに対して連続して行われていることを判断することができる。
【０２７２】
上記を判断するためには、例えば、HookReadFile、HookWriteFile、HookNextFileが、それぞれ、本発明プログラムに対して通知する（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパスを、通知記録データに記録しておき、その通知記録データに基づいて判断する。
【０２７３】
図３７に通知記録データの具体例を示す。
【０２７４】
図３７の通知記録データには、第４〜６行に、FindNextFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第７〜９行、第１３〜１５行に、ReadFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第１０〜１２行、第１６〜１１８行に、WriteFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録がある。
【０２７５】
FindNextFileのプロセスＩＤとファイルパスは、ReadFileとWriteFileのプロセスＩＤとファイルパスと同一である。WriteFileにより、ファイル"schedule.xls"のヘッダが変更されたことが検出された場合には、暗号化処理が複数のファイルに対して連続して行われていると判断する。
【０２７６】
図３７の通知記録データには、更に、第２２〜３６行に、同じフォルダ
"C:\Users\user\Documents\"内のファイル"description.doc"に対して同様な処理を行っていることが記録されている。WriteFileにより、ファイル"description.doc"のヘッダが変更されたことが検出された場合には、暗号化処理が同一フォルダ内の複数のファイルに対して連続して行われていると判断する。
【０２７７】
暗号化処理が複数のファイルに対して連続して行われているかの判断を有効にするか設定することにより、ランサムウェアによる暗号化処理に対する検知挙動の精度をコントロールすることができる。
【０２７８】
図３８は、複数ファイルに対する暗号化処理を有効にするかの設定画面である。図３８の設定画面の表現方法は一例であり、他の表現方法でもよい
設定画面では、チェックボタンの後に「複数のファイルに対する暗号化処理を検知条件の入れる」を表示すると共に、「チェックを入れない場合は単一ファイルに対する暗号化処理も検知対象に含まれます」との注意書きを表示する。ユーザーがチェックボタンをチェックすることに検知条件を変更することができる。
【０２７９】
例えば、単一のファイルに対する暗号化処理を行う可能性のあるユーザー環境では、この検知条件がないと、正当な暗号化処理をランサムウェアによる処理と誤検知することとなる。このような誤検知、誤検知による過検知を発生させないようにすることができる。
【０２８０】
（HookMoveFileによるコントロール）
HookMoveFileは、MoveFile（MoveFileA、MoveFileW、MoveFileExA、MoveFileExW）（ファイル移動関数）をフックするWindows API関数である。
【０２８１】
ReadFile（ファイル読出関数）をフックするHookReadFile、WriteFile（ファイル書込関数）をフックするHookWriteFileに加えて、HookMoveFileによりMoveFile（ファイル移動関数）をフックするようにして、ランサムウェアの検出精度を向上させる。
【０２８２】
MoveFileは、ファイルの移動及びファイル名の変更を行うためのWindows API関数である。図３９に示すように、MoveFileの第一引数は移動元のファイルパス（ファイル名）であり、第二引数は移動先のファイルパス（ファイル名）である。
【０２８３】
MoveFileの第一引数と第二引数のファイル名を除くファイルパスが異なる場合は、「ファイルの移動」の処理になる。MoveFileの第一引数と第二引数のファイル名を除くファイルパスが同じ場合は、実質的に「ファイル名の変更」の処理となる。
【０２８４】
ランサムウェアには、暗号化対象のファイル名を暗号化後に変更するものがある。これは、暗号化ファイルの元ファイル名を判断不能にするためであり、ファイルの中身だけではなくファイル名も同時に暗号化処理を行う。
【０２８５】
そのようなランサムウェアは、図４０に示すように、ファイルの暗号化処理が行われた直後にMoveFileを呼び出すことで、ファイル名の暗号化も併せて行う。その流れを検知することで、ランサムウェアによるファイル名の暗号化挙動を本発明プログラムが把握することを可能にする。
【０２８６】
図４０に示すように、FindNextFileを呼び出し、その場所の次のファイルの情報を取得する。続いて、CreateFile、ReadFile、WriteFileを呼び出し、そのファイルの暗号化処理を行う。続いて、MoveFileを呼び出し、そのファイルのファイル名を暗号化している。図４０では、MoveFileにより、暗号化されたファイル"ABS.pdf"のファイル名が"g1d4fr.vvv"に変更されている。
【０２８７】
このようなファイル名の暗号化処理を検出するために、MoveFileをフックして監視する。MoveFileをフックするHookMoveFileは、呼び出されると通常のMoveFileの動作に加えて、本発明プログラムに対して次の情報（ａ）〜（ｃ）を通知する。
【０２８８】
通知手段としては、プロセス間通信等、プロセスの動作に大きな遅延を発生させない程度の高速な手法が望ましい。ソケット通信やファイルによる受け渡し等でも、高速に実現できる環境であれば、いかなる方法でもよい。
（ａ）通知元ＡＰＩ名。フックするWindows API関数の名前であるMoveFileである。
（ｂ）自身のプロセスＩＤ。フックするMoveFileを呼び出す監視対象プロセスのプロセスＩＤである。
（ｃ）通知元ＡＰＩであるMoveFileの第一引数と第二引数で指定されたファイルパス。
【０２８９】
したがって、HookReadFile、HookWriteFileによりランサムウェアが検知されたことを条件として、その暗号化処理の後に、MoveFileが呼び出され、かつ、MoveFileの第一引数と第二引数のパス（ファイルパスからファイル名を除いたファイルパス）が同一であるかどうかを確認することにより、ファイル名に対する暗号化処理が行われていることを判断することができる。
【０２９０】
上記を判断するためには、例えば、HookReadFile、HookWriteFileが、それぞれ、本発明プログラムに対して通知する（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパス、MoveFileが、それぞれ、本発明プログラムに対して通知する（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）第一引数のファイルパス、（ｄ）第二引数のファイルパスを、通知記録データに記録しておき、その通知記録データに基づいて判断する。
【０２９１】
図４１に通知記録データの具体例を示す。
【０２９２】
図４１の通知記録データには、第４〜６行、第１０〜１２行に、ReadFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第７〜９行、第１３〜１５行に、WriteFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第１６〜１９行に、MoveFileのプロセスＩＤ"pid:1568"、第一引数ファイルパス"C:\Users\user\Documents\schedule.xls"、第二引数ファイルパス"C:\Users\user\Documents\g1d4fr6ps.vvv"の記録がある。
【０２９３】
MoveFileのプロセスＩＤは、ReadFileとWriteFileのプロセスＩＤと同一であり、MoveFileの第一引数のファイルパスは、ReadFileとWriteFileのファイルパスと同一であり、MoveFileの第１引数のパスと第２引数のパスは同一である。WriteFileによりファイル"schedule.xls"のヘッダが変更されたことが検出された場合には、"schedule.xls"が暗号化処理され、かつ、"schedule.xls"のファイル名も"g1d4fr6ps.vvv"に暗号化処理されていると判断する。
【０２９４】
図４１の通知記録データには、更に、第２２〜３７行に、同じフォルダ
"C:\Users\user\Documents\"内のファイル"description.doc"に対して同様な処理を行っていることが記録されている。WriteFileによりファイル"description.doc"のヘッダが変更されたことが検出された場合には、"description.doc"が暗号化処理され、かつ、"description.doc"のファイル名も"p6dfg7p4.vvv"暗号化処理されていると判断する。
【０２９５】
ファイルに対する暗号化処理を検知した上で、ファイル名の変更が行われていることを検知した場合、本発明プログラムは、その情報をユーザーに示して、ランサムウェアによる暗号化処理に対する検知挙動の精度をコントロールすることができる。
【０２９６】
図４２は、ファイル名の変化を検知した場合に警告するか否かの設定画面である。図４２の設定画面の表現方法は一例であり、他の表現方法でもよい
設定画面では、チェックボタンの後に「「ファイル名の変化」を検知条件に入れる」を表示すると共に、「チェックを入れない場合はファイル名が変化しない暗号化処理も検知対象に含まれます」「チェックを入れた場合はファイル名の変化に関する情報が検知時に表示され、対処を選択可能となります」との注意書きを表示する。ユーザーがチェックボタンをチェックすることで警告するか否かを設定することができる。
【０２９７】
図４３は、ファイル内容が改変され、かつ、ファイル名が改変された場合の警告画面である。慎重なユーザーはこの情報を元にどう対処するかを選択できユーザビリティが向上するとともに、誤検知、誤検知による過検知のコントロールも可能となる。
【０２９８】
警告画面では「以下のプロセスがテキストファイルの改変挙動を行っています。どう処理しますか。」と尋ね、「プロセス：AAAA.exe」、「該当挙動：ファイル内容の改変、ファイル名の改変、「d1g2r.vvv」に変更しようとしています」、「「対象ファイル：C:\Users\test\Document\BBB.pdf」を示す。
【０２９９】
更に、その対応処理の選択ボタン「プロセスを終了」、「この警告を放置」、「プロセスを除外に追加」を示す。
【０３００】
ユーザーが「プロセスを終了」を選択した場合には、プロセス"AAAA.exe"を直ちに終了させる。ユーザーが、そのプロセスをランサムウェアであると判断した場合である。
【０３０１】
ユーザーが「この警告を放置」を選択した場合には、プロセス"AAAA.exe"を終了させることなく、そのまま処理を続行する。ユーザーが、そのプロセスをランサムウェアであるか否か判断できない又は判断を保留する場合である。
【０３０２】
ユーザーが「プロセスを除外に追加」を選択した場合には、プロセス"AAAA.exe"を、前述した「除外リスト」に追加し、同じプロセスに対する警告を再度行わないようにする。ユーザーが、そのプロセスはランサムウェアでないと判断した場合である。
【０３０３】
［第２実施形態］
本発明の第２実施形態によるプログラム、情報処理装置及び情報処理方法について図４４乃至図５１を用いて説明する。
【０３０４】
本発明の第１実施形態は、主なランサムウェアの挙動を分析して共通部分を洗い出し、そこから確実に不正であると判断できる挙動を検知・防御するものである。しかしながら、分析したランサムウェアによる手法でなくても、ファイルの暗号化処理は可能である。
【０３０５】
そこで、本願発明者等は、分析したランサムウェア以外の想定しうる挙動を検出することにより、未知のランサムウェアを確実に検出し、ランサムウェアによる攻撃を有効に阻止することができると考え、本実施形態を着想するに至った。
【０３０６】
本願発明者等が想定した暗号化手法について説明する。図４４に本願発明者等が想定した暗号化手法を示す。
【０３０７】
あるファイルＡを暗号化対象とした場合、本発明の第１実施形態では、暗号化されたファイルは元のファイルに直接上書き処理している。しかしながら、直接上書き処理しなくても、暗号化されたファイルを元のファイルが存在したフォルダに存在する状態にすることができる。
【０３０８】
図４４の暗号化方法について、ステップの番号順に説明する。
（ステップ１）：ReadFileにより、ファイルＡを読み込みメモリ２３上で暗号化する。
（ステップ２）：メモリ２３上のファイルＡの暗号化されたデータを、WriteFileにより、任意の場所にファイルＢとして作成する。
（ステップ３−Ａ）：暗号化されたファイルＢを、MoveFileにより、ファイル名をファイルＣに変更する。
（ステップ３−Ｂ）：暗号化されたファイルＢを、MoveFileにより、ファイル名をファイルＡに変更し、ファイルＡが存在したフォルダに移動することでファイルＡを上書きする。
（ステップ４）：MoveFileにより、ファイルＣをファイルＡが存在したフォルダに移動する。
（ステップ５）：DeleteFileにより、ファイルＡを削除する。
【０３０９】
ステップ５の後は、ファイルＡが存在したフォルダに、暗号化されたファイルＡのファイル名がファイルＣに変更された「状態１」となる。
【０３１０】
ステップ３−Ｂの後は、ファイルＡが存在したフォルダに、暗号化されたファイルＡが存在する「状態２」となる。
【０３１１】
図４５に暗号化方法の複数のケースを示す。
【０３１２】
暗号化方法のケース１は、ステップ１、ステップ２、ステップ３−Ａ、ステップ４、ステップ５の順番に進行し、状態１となるケースである。
【０３１３】
暗号化方法のケース１は、ステップ１、ステップ２、ステップ３−Ｂの順番に進行し、状態２となるケースである。
【０３１４】
本実施形態では、例えば、ケース１、ケース２を検知することにより、分析したランサムウェア以外の想定しうる挙動を検出するようにする。
【０３１５】
なお、「状態１」「状態２」となるための挙動はケース１、ケース２に限らないが、そのような別のケースについても、後述する検知方法と同様の方法により検知することが可能である。
【０３１６】
本実施形態においても、第１実施形態におけるHookReadFile、HookWriteFileによる暗号化処理を検知する。本実施形態では、それに加えて、MoveFile（MoveFileA、MoveFileW、MoveFileExA、MoveFileExW）（ファイル移動関数）をフックするHookMoveFileや、DeleteFile（ファイル削除関数）をフックするHookDeleteFileを用いる。
【０３１７】
そして、HookReadFile、HookWriteFile、HookDeleteFileが、それぞれ、本発明プログラムに対して（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパスを通知し、HookMoveFileが、本発明プログラムに対して（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）第一引数のファイルパス、（ｄ）第二引数のファイルパスを通知する。本発明プログラムに通知された、これらデータは、適宜、所定のリストに記録する。
【０３１８】
（ケース１の検知）
図４８に、ケース１の検知の事前処理を示す。
【０３１９】
本発明プログラムに対して、HookReadFileから通知される、（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパスを、リストＡとして記録する。
【０３２０】
本発明プログラムに対して、HookWriteFileから通知される、（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパスを、リストＢとして記録する。
【０３２１】
本発明プログラムに対して、HookMoveFileから通知される、（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）第一引数のファイルパス、（ｄ）第二引数のファイルパスを、リストＣとして記録する。
【０３２２】
ケース１の検知条件を次に示す。
【０３２３】
条件１：あるプロセスにより、DeleteFileが呼び出され、引数のファイルパス（削除対象のファイル）がリストＡに含まれている。すなわち、HookDeleteFileから通知されるプロセスＩＤが、HookReadFileから通知されるプロセスＩＤと同一であり、かつ、HookDeleteFileから通知されるファイルパスがリストＡに含まれている。
【０３２４】
条件１の具体例を図４７に示す。図４７に示すように、あるプロセスにより、DeleteFileが呼び出され、引数のファイルパス"C:\DDD\CC.doc"がリストＡに含まれている。
【０３２５】
この条件１は、あるプロセスが過去にReadFileで読み込んだことがあるファイルをDeleteFileにより削除しようとしていることを意味する。
【０３２６】
条件２：DeleteFileの引数（削除対象ファイルの）のフォルダパスが、リストＣの第二引数のフォルダパスと等しい。すなわち、HookDeleteFileから通知されるプロセスＩＤが、HookMoveFileから通知されるプロセスＩＤと同一であり、かつ、HookDeleteFileから通知されるファイルパスからファイル名を除いたパスが、リストＣの第二引数からファイル名を除いたパスと同一である。
【０３２７】
条件２の具体例を図４８に示す。図４８に示すように、DeleteFileの引数のフォルダパス"C:\DDD\"が、リストＣの第二引数のフォルダパス"C:\DDD\"と等しい。
【０３２８】
この条件２は、あるプロセスが削除しようとしているファイルの場所が、過去にそのプロセスが何らかのファイルを移動先として指定した記録があるということを意味する。
【０３２９】
条件３：MoveFileの第一引数のファイルが、リストＢに含まれている。すなわち、HookWriteFileから通知されるプロセスＩＤが、HookMoveFileから通知されるプロセスＩＤと同一であり、かつ、HookMoveFileから通知される第一引数のファイルパスと同一である。
【０３３０】
条件３の具体例を図４９に示す。図４９に示すように、MoveFileの第一引数のファイル"C:\XXX\VV.doc"が、リストＢに含まれている。
【０３３１】
この条件３は、あるプロセスが過去にWriteFileで書き込んだファイルを、MoveFileで移動させようとしていることを意味する。
【０３３２】
条件４：上記の条件２を満足したMoveFileの第一引数のファイルのヘッダが、第１の条件を満足したDeleteFileの引数のファイルのヘッダと異なる。
【０３３３】
条件４の具体例を図５０に示す。図５０に示すように、MoveFileの第一引数のファイル"C:\DDD\CC.doc"のヘッダが、第１の条件を満足したDeleteFileの引数のファイル"C:\XXX\VV.doc"のヘッダと異なる。
【０３３４】
この条件４は、第１実施形態におけるファイルのヘッダの相違の判断条件と同じである。
【０３３５】
（ケース２の検知）
図５１に、ケース２の検知の事前処理を示す。
【０３３６】
本発明プログラムに対して、HookReadFileから通知される、（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパスを、リストＡとして記録する。
【０３３７】
本発明プログラムに対して、HookWriteFileから通知される、（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパスを、リストＢとして記録する。
【０３３８】
ケース２の検知条件を次に示す。
【０３３９】
条件１：あるプロセスにより、MoveFileが呼び出され、第二引数のファイルパスがリストＡに含まれている。すなわち、HookMoveFileから通知されるプロセスＩＤが、HookReadFileから通知されるプロセスＩＤと同一であり、かつ、HookMoveFileから通知される第二引数のファイルパスがリストＡに含まれている。
【０３４０】
この条件１は、このプロセスが過去にReadFileで読み込んだ事があるファイルを何らかのファイルで上書きしようとしていることを意味する。
【０３４１】
条件２：その際、MoveFileの第一引数のファイルパスが、リストＢに含まれている。すなわち、HookMoveFileから通知されるプロセスＩＤが、HookWriteFileから通知されるプロセスＩＤと同一であり、かつ、HookMoveFileから通知される第一引数のファイルパスがリストＢに含まれている。
【０３４２】
この条件２は、このプロセスが過去にWriteFileで書き込んだことがあるファイルを、移動させようとしていることを意味する。
【０３４３】
条件３：MoveFileの第一引数のファイルのヘッダが、第二引数のファイルのヘッダと異なる。
【０３４４】
この条件３は、第１実施形態におけるファイルのヘッダの相違の判断条件と同じである。
【０３４５】
［発明の原理（その２）］
本発明の原理（その２）について図５２乃至図５４を用いて説明する。
【０３４６】
（ランサムウェアの分析）
本願発明者等は、国内外で被害が報告されている他のランサムウェアについて更に解析を行った。
【０３４７】
発明の原理（その１）に記載したように、通常のランサムウェアがファイルを暗号化する際には、ReadFileおよびWriteFileというWindows APIをファイルの読み書き時に利用する。そこで、発明の原理（その１）に基づく本発明の第１実施形態や本発明の第２実施形態では、ファイルの読み書きの関数、すなわち、ReadFileやWriteFileを用いてファイルが操作された際に、ファイルのヘッダが書き換えられているか否かに着目してランサムウェアを検知している。
【０３４８】
しかしながら、ランサムウェアの中には、ファイルを暗号化する際に、ファイルマッピングという仕組みを利用してファイル操作を行うタイプのランサムウェアが存在する。このようなランサムウェアでは、ファイルの読み書き関数であるReadFile及びWriteFileを使用しない。このため、発明の原理（その１）に基づく本発明の第１実施形態や本発明の第２実施形態では、このようなランサムウェアを検知することが困難である。
（ａ）一般的なファイル操作とファイルマッピングによるファイル操作の相違
図５２を用いて、一般的なファイル操作とファイルマッピングによるファイル操作の相違について説明する。
【０３４９】
図５２に示すように、実ファイルはハードディスク２２に記憶されている。一般的なファイル操作におけるファイルの読み書きの処理では、その都度、メモリ２３にバッファ（図示せず）を用意してファイルを読み込み、編集したデータをファイルに書き戻す、といった一連の処理を行う。
【０３５０】
ファイルマッピングとは、オペレーティングシステム（Windows OS）がファイルをメモリデータのように扱うことを可能にする技術である。
【０３５１】
ファイルマッピングによるファイル操作では、図５２に示すように、ハードディスク２２に記憶されている実ファイルの全体を、メモリ２３に、仮想ファイル（ファイルマッピングオブジェクト）として展開する。ファイルマッピングによるファイル操作において、ファイルの内容を書き換える際には、その都度、メモリ２３に展開された仮想ファイルに対して内容の書き換えが行われる。ファイルの内容の変更結果は一連の処理の最後の段階でハードディスク２２の実ファイルへ反映させる。
【０３５２】
図５２に示すように、プロセスからハードディスク２２に記憶された実ファイルにアクセスすることが可能であり、また、プロセスからメモリ２３に展開された仮想ファイルにアクセスすることが可能である。
【０３５３】
ファイル操作を行う場合、ハードディスク２２に記憶された実ファイルを書き換えるよりも、メモリ２３に展開された仮想ファイルを書き換える方が圧倒的に高速である。
【０３５４】
したがって、ファイルマッピングによるファイル操作では、一般的なファイル操作のように、内容を変更する都度、実ファイルに対する読み込み処理と書き込み処理を行う必要がない。したがって、ファイルマッピングによるファイル操作の方が高速にファイルの内容の書き換えが可能である。
（ｂ）ランサムウェアSporaの分析
（ファイル操作について）
本願発明者等が調査した結果、ランサムウェアの中で２０１７年初頭に出現した「Spora」がファイルマッピングによるファイル操作を行っていることがわかった。
【０３５５】
本願発明者等がランサムウェアSporaを解析した結果、ファイル暗号化時のファイル操作の流れがわかった。図５３に、ランサムウェアSporaによるファイル暗号化時のファイル操作の流れを示す。
（ステップ１）：CreateFileにより、暗号化対象の実ファイルを開く。
（ステップ２）：CreateFileMappingにより、仮想ファイル（ファイルマッピングオブジェクト）を作成する。
（ステップ３）：MapViewOfFileにより、プロセスのメモリアドレス空間にマッピングを行う。
（ステップ４）：ファイルマッピングオブジェクトをメモリ上で暗号化する。
（ステップ５）：UnmapViewOfFileにより、ファイルマッピングオブジェクトをアンマップする。
（ステップ６）：CloseHandleにより、ファイルハンドルをクローズする。
【０３５６】
また、メモリ２３上の仮想ファイルであるファイルマッピングオブジェクトに対する変更が、ハードディスク２２上の実ファイルに反映されるタイミングについて解析した。その結果、次のタイミング（１）〜（５）で、ハードディスク２２上の実ファイルに暗号化が反映されることがわかった。
（１）UnmapViewOfFileが呼び出されたタイミング。
（２）UnmapViewOfFileExが呼び出されたタイミング。
（３）FlushViewOfFileが呼び出されたタイミング。
（４）CloseHandleが呼び出されたタイミング。
（５）上記（１）〜（４）以外で、ファイルマッピングオブジェクトのハンドルが閉じられたタイミング。
【０３５７】
一般的な正しい処理手順では（１）UnmapViewOfFile、又は（２）UnmapViewOfFileExにより、ファイルマッピングオブジェクトをアンマップした後に、ファイルオブジェクトを（４）CloseHandleで閉じるという流れとなる。なお（３）FlushViewOfFileにより、マップドファイル内にある指定された範囲のデータをディスクに書き込むこともある。
【０３５８】
ただし、上記（１）〜（４）の関数が呼び出されなくても、プロセスを終了する等の何らかのトリガーにより、ファイルマッピングオブジェクトのハンドルを閉じることでも、ハードディスク２２上の実ファイルに暗号化が反映される。
【０３５９】
図５４に、ランサムウェアSporaによるファイル操作とハードウェアとの関係を示す。
【０３６０】
まず、プロセスが、CreateFileにより、ハードウェア２２上にある暗号化対象の実ファイルを開く（ステップ１）。
【０３６１】
次に、図５４（ａ）に示すように、プロセスが、CreateFileMappingにより、実ファイルの仮想ファイル（ファイルマッピングオブジェクト）を作成し（ステップ２）、プロセスが、MapViewOfFileにより、メモリ２３上のプロセスのメモリアドレス空間に仮想ファイルをマッピングする（ステップ３）。
【０３６２】
図５４（ａ）に示すように、一般的なファイル操作では、ハードディスク２２上の実ファイルへのアクセスは、ファイルの読み書き関数であるReadFile及びWriteFileを用いる。しかしながら、ランサムウェアSporaによるファイルの暗号化操作では、ReadFile及びWriteFileを使用しない。
【０３６３】
次に、プロセスが、ファイルマッピングオブジェクトをメモリ２３上で暗号化する（ステップ４）。
【０３６４】
次に、図５４（ｂ）に示すように、プロセスが、UnmapViewOfFileにより、ファイルマッピングオブジェクトをアンマップし（ステップ５）、プロセスが、CloseHandleにより、ファイルハンドルをクローズする（ステップ６）。それにより、メモリ２３上の暗号化された仮想ファイル（ファイルマッピングオブジェクト）への変更が、ハードディスク２２上の実ファイルに反映される。
【０３６５】
メモリ２３上の仮想ファイル（ファイルマッピングオブジェクト）への変更が、ハードディスク２２上の実ファイルに反映されるタイミングとしては、上記のUnmapViewOfFileが呼び出されたタイミング、CloseHandleが呼び出されたタイミングの他に、UnmapViewOfFileExが呼び出されたタイミングや、FlushViewOfFileが呼び出されたタイミングや、上記以外で、ファイルマッピングオブジェクトのハンドルが閉じられたタイミングがある。
【０３６６】
本願明細書において「マッピング時」とは、仮想ファイル（ファイルマッピングオブジェクト）がプロセスのメモリアドレス空間にマッピングされた時のことである。例えば、CreateFileにより暗号化対象の実ファイルを開き、CreateFileMappingにより仮想ファイル（ファイルマッピングオブジェクト）を作成し、MapViewOfFileによりプロセスのメモリアドレス空間にマッピングを行った時である。
【０３６７】
本願明細書において「アンマッピング時」とは、メモリ２３上の仮想ファイルであるファイルマッピングオブジェクトに対する変更が、ハードディスク２２上の実ファイルに反映された時である。例えば、次のタイミング（１）〜（５）のタイミングである。
（１）UnmapViewOfFileが呼び出されたタイミング。
（２）UnmapViewOfFileExが呼び出されたタイミング。
（３）FlushViewOfFileが呼び出されたタイミング。
（４）CloseHandleが呼び出されたタイミング。
（５）上記（１）〜（４）以外で、ファイルマッピングオブジェクトのハンドルが閉じられたタイミング。
【０３６８】
上記（１）〜（４）の関数が呼び出されなくても、プロセスを終了する等の何らかのトリガーにより、ファイルマッピングオブジェクトのハンドルを閉じることでも、ハードディスク２２上の実ファイルに暗号化が反映される。
（ファイル内容の変更について）
ランサムウェアによるファイルの変更と通常のアプリケーションによるファイルの変更との差異は、ヘッダ情報を有するタイプのファイルで顕著に表れる。通常のアプリケーションがファイルを書き換える場合、ファイルのヘッダ情報はそのまま変更せず、ファイルの中間部分のデータが書き換わることが圧倒的に多い。これに対し、ランサムウェアがファイルを暗号化する場合、ファイルのヘッダ情報が書き換わる。
【０３６９】
したがって、ファイルの先頭部分を比較することで、ランサムウェアによる暗号化である可能性が高い操作と、そうではない通常のアプリケーションによる操作とを判別することが可能となる。
【０３７０】
より広範囲にランサムウェアを検知し、かつ誤検知を防ぐためには、ファイルの先頭部分だけの変化を監視するのではなく、「ファイル構造の不適切な状態への変更」を監視することが本質的な要請である。
【０３７１】
それは、ランサムウェア作成者の目的が、ユーザーからランサム（身代金）を獲得することにあるからである。ユーザーがファイルを開こうとしたときに、そのファイルを開くことができないと、ユーザーはランサムウェアによる感染を認識し、ランサムウェア作成者にランサム（身代金）を支払おうとする。ファイルの内容が大幅に書き換えられた場合も同様である。
【０３７２】
ユーザーにランサム（身代金）を支払おうとする動機付けをもたらす「ファイル構造の不適切な状態への変更」には、例えば、次のような態様がある。
（ｉ）ヘッダ情報の変更
ヘッダ情報が変更されるとアプリケーションにより開くことができなくなる。例えば、拡張子「.pdf」のファイルにおいて、ファイルがPDFフォーマットでなくなると、PDFフォーマットに対応したアプリケーションでファイルを開くことができなくなる。
【０３７３】
ヘッダ情報を持つファイルの多くは、ファイルのヘッダ情報はファイルの先頭部分にある。しかし、ファイルの種類によっては、ファイルのヘッダ情報がファイルの先頭部分にないものもある。ファイルの先頭部分の監視だけでは、様々な種類のファイルのヘッダ情報の変更を監視できない。
【０３７４】
ヘッダ情報の位置はファイルの種類ごとに定められている。ファイルの種類に応じて定められたヘッダ情報の位置の部分を監視することにより、ヘッダ情報の変更を監視する。
【０３７５】
ファイルの種類に対するヘッダ情報の位置は公開情報により知ることができる。公開情報としては、ファイルのマジックナンバーと呼ばれるヘッダ内の固定値が公開されているものや、各フォーマットに対するRFCの定義が公開されているものがある。
・Magic number (programming)
https://en.wikipedia.org/wiki/Magic_number_(programming)
・Windows Image Media Types
https://tools.ietf.org/html/rfc7903#section-1.2
例えば、拡張子が「GIF」のファイルのマジックヘッダ（ファイルの先頭データ）は「47 49 46 38 39 61」か「47 49 46 38 37 61」となるので、これらのデータが、これら以外に書き換えられる場合には暗号化操作と判断することができる。
【０３７６】
公開情報に存在しない拡張子のファイルのヘッダ情報については、ファイルの先頭から固定のサイズをヘッダ情報とみなして監視する。また、この監視方法を他の監視方法と併用してもよい。
（ii）フッタ情報の変更
一般的なファイルには「ヘッダ＋ボディ」という形式が多いが「ヘッダ＋ボディ＋フッタ」というファイル形式のファイルもある。そのようなファイルにおいて、フッタ情報が変更されると、アプリケーションにより開くことができなくなる場合がある。
（iii）ボディ情報の変更
ファイルの種類によってはボディの構造に一定のルールが定められている場合がある。
【０３７７】
例えば、ボディ内は４つのデータ部分に分かれていて、各データ部分の最後には0x00（ヌル文字）が複数バイト連続するというルールが定められたファイルがある。このようなファイルの場合、各データ部分の最後が暗号化されて0x00（ヌル文字）でなくなった場合、アプリケーションで開くことができなくなる。
【０３７８】
また、ボディ内に存在するデータ部分の数や、各データ部分のサイズ、各データ部分の開始位置等のルールがヘッダ上で定義されているファイルがある。このようなファイルの場合、このルールから逸脱する変更がボディに加えられると、アプリケーションで開くことができなくなる。
【０３７９】
また、ボディがとる値（バイナリ値）の範囲が定められているファイルがある。このようなファイルの場合、ボディの値が定められた範囲から逸脱する変更がボディに加えられると、アプリケーションで開くことができなくなる。
（ランサムウェアSporaの検知条件）
本願発明者等は、上記のランサムウェアSporaの分析に基づき、ランサムウェアSporaを有効に検知することができる、次のような検知条件を着想するに至った。
（ａ）条件Ａ：ファイル構造の不適切な状態への変更がある。
【０３８０】
この条件Ａは、ファイルのファイル構造が不適切な状態に書き換わることである。
【０３８１】
ファイル構造の不適切な状態への変更には、例えば、ヘッダ情報の変更、フッタ情報の変更、ボディ情報の変更がある。
（ｉ）ヘッダ情報の変更
この場合の条件Ａは、同じファイルのヘッダ情報が書き換わることである。
【０３８２】
ファイルマッピングを利用したランサムウェアでは、ハードディスク２２上の実ファイルがメモリ２３上に仮想ファイルとして展開される。したがって、条件Ａは次の条件Ａ１、条件Ａ２のいずれかとなる。
【０３８３】
条件Ａ１：ファイル操作前の実ファイルのヘッダ情報と、ファイル操作後の所定タイミングにおける実ファイルのヘッダ情報を比較して、書き換わっている。
【０３８４】
条件Ａ２：ファイル操作前の実ファイルのヘッダ情報と、ファイル操作後の所定タイミングにおける仮想ファイルのヘッダ情報を比較して、書き換わっている。
【０３８５】
ファイル操作後の所定タイミングとは、メモリ２３上の仮想ファイルであるファイルマッピングオブジェクトに対する変更が、ハードディスク２２上の実ファイルに反映されるタイミングである。具体的には上述した（１）〜（５）のタイミングである。
【０３８６】
なお、ファイルマッピングオブジェクトのハンドルが閉じられた（５）のタイミングの場合には、そのタイミングを捕まえることが困難な場合がある。
【０３８７】
実際には、ヘッダ情報を持つファイルの多くは、ファイルのヘッダ情報はファイルの先頭部分にある。
【０３８８】
ヘッダ情報がファイルの先頭部分にある場合、条件Ａは、先頭部分のデータが書き換わることである。この場合、条件Ａは次の条件Ａ１、条件Ａ２のいずれかとなる。
【０３８９】
条件Ａ１：ファイル操作前の実ファイルの先頭部分のデータと、ファイル操作後の所定タイミングにおける実ファイルの先頭部分のデータを比較して、書き換わっている。
【０３９０】
条件Ａ２：ファイル操作前の実ファイルの先頭部分のデータと、ファイル操作後の所定タイミングにおける仮想ファイルの先頭部分のデータを比較して、書き換わっている。
（ii）フッタ情報の変更
この場合の条件Ａは、同じファイルのフッタ情報が書き換わることである。
【０３９１】
条件Ａは次の条件Ａ１、条件Ａ２のいずれかとなる。
【０３９２】
条件Ａ１：ファイル操作前の実ファイルのフッタ情報と、ファイル操作後の所定タイミングにおける実ファイルのフッタ情報を比較して、書き換わっている。
【０３９３】
条件Ａ２：ファイル操作前の実ファイルのフッタ情報と、ファイル操作後の所定タイミングにおける仮想ファイルのフッタ情報を比較して、書き換わっている。
（iii）ボディ情報の変更
この場合の条件Ａは、同じファイルのボディのデータが書き換わることである。
【０３９４】
条件Ａは次の条件Ａ１、条件Ａ２のいずれかとなる。
【０３９５】
条件Ａ１：ファイル操作前の実ファイルのボディのデータと、ファイル操作後の所定タイミングにおける実ファイルのボディのデータを比較して、書き換わっている。
【０３９６】
条件Ａ２：ファイル操作前の実ファイルのボディのデータと、ファイル操作後の所定タイミングにおける仮想ファイルのボディのデータを比較して、書き換わっている。
（ｂ）条件Ｂ：ファイルマッピングオブジェクトの連続的な操作がある。
【０３９７】
ファイルマッピングを利用した場合、１ファイルに対して、必ず、CreateFileMappingというＡＰＩと、MapViewOfFileというＡＰＩを一度読み出す必要がある。したがって、連続的なファイルマッピングが発生した場合には、CreateFileMappingというＡＰＩと、MapViewOfFileというＡＰＩが２回以上読み出される。
【０３９８】
したがって、条件Ｂは、具体的には、CreateFileMappingというＡＰＩと、MapViewOfFileというＡＰＩとが複数回読み出されることである。
【０３９９】
条件Ｂを設けたのには次のような意義がある。理想的には条件Ａによりひとつ目のファイルの暗号化を検知できることが望ましいが、それが困難な場合でも、条件Ｂの検知によりファイルの暗号化操作を確実に検知することができる。
【０４００】
［第３実施形態］
本発明の第３実施形態によるプログラム、情報処理装置及び情報処理方法について図５５乃至図７５を用いて説明する。
【０４０１】
（本実施形態の概要）
本実施形態の概要について図５５及び図５６を用いて説明する。
【０４０２】
本実施形態では、ハードディスク２２に保存されたユーザーデータへアクセスするという挙動を有するプログラムの全ての挙動が検出対象である。
【０４０３】
ＣＰＵ２１がメモリ２３上のＯＳデータのプロセスを実行して、ハードディスク２２に格納されたプログラムにアクセスして、そのプログラムを読み込み（図２（ｃ））、ハードディスク２２に格納されたプログラムがメモリ２３にロードされ、メモリ２３上にプロセスとして展開される（図３（ａ））前に、メモリ２３に本発明プログラムのプロセスを常駐させておく（図５５（ａ））。
【０４０４】
本発明プログラムは、ランサムウェアが導入される危険性のある状態となる前であればいつ実行してメモリ２３上にプロセスとして常駐させてもよい。
【０４０５】
例えば、スタートアッププログラムとして、コンピューターの起動時に起動させておく。オペレーティングシステム（Windows OS）には、ＰＣの起動と共に実行されるプログラムとして「スタートアッププログラム」が登録できる仕組みがある。本実施形態では、その仕組みを利用し本発明プログラムをスタートアッププログラムとして登録しておく。これにより、本発明プログラムがＰＣの起動直後からメモリ２３上に配置している状態にする。
【０４０６】
また、ＰＣの起動時にプログラムを起動する方法としては、レジストリやサービスの仕組みを使用する方法もあるが、いずれの方法を用いてもよい。
【０４０７】
これにより、ＰＣの起動直後から常にコンピューターをランサムウェアから保護することができる。
【０４０８】
本発明プログラムは、図５５（ａ）に示すように、ハードディスク２２に格納されたプログラムがメモリ２３にロードするという動作と、ＣＰＵ２１がプログラムを実行するという動作との間に割り込む。ＣＰＵ２１によるプログラムに基づく動作をフックすることにより、プログラムが実行される直前で、そのプログラムの挙動を本発明プログラムの監視下に置く。
【０４０９】
これにより、これ以降、監視対象プログラムの全ての挙動は、本発明プログラムが実行直前に把握することができる。必要に応じて、監視対象プログラムの処理に機能を加えたり、変更したりすることができる。
【０４１０】
本発明プログラムにより、コンピューターを、監視対象プログラムがランサムウェアと判断する判断部として機能させる。
【０４１１】
本発明プログラムにより、コンピューターに、監視対象プログラムがランサムウェアと判断する判断手順を実行させる。
【０４１２】
判断部又は判断手順により、監視対象プログラムの挙動が、ランサムウェア特有の挙動であると判断された場合には、図５５（ｂ）に示すように、本発明プログラムは、監視対象プログラムがハードディスク２２内のファイルにアクセスを行おうとする直前に、そのアクセスをブロックする。このようにして、未知のランサムウェアによる攻撃をブロックしてファイルの暗号化を阻止する。
【０４１３】
（本発明プログラムの３つの機能）
本発明プログラムは３つの機能を有する。本発明プログラムの３つの機能について図５６を用いて説明する。
【０４１４】
第１の機能は、現在動作中のプログラムや、後ほど起動するプログラムである監視対象プロセスが使用するWindows APIをフックする機能である。図５６に示すように、本発明プログラムから、現在起動中のプロセス、すなわち、notepad.exe、WINWORD.exe、calc.exe、Ramsomware.exe、cmd.exe、…のプロセスが使用するWindows APIをフックする。
【０４１５】
第２の機能は、フックしたWindows APIにより、監視対象プロセスの挙動を記録する機能である。
【０４１６】
第３の機能は、第２の機能により記録した挙動によりランサムウェアであるかどうかを判断する機能である。
【０４１７】
第１の機能は、常駐している本発明プログラムの機能であり、第２の機能と第３の機能は、監視対象プロセス内に組み込まれる本発明プログラムの機能である。
【０４１８】
なお、常駐している本発明プログラムに第１の機能と第３の機能を持たせ、監視対象プロセス内に組み込まれる本発明プログラムに第２の機能を持たせるようにしてもよい。その場合には、監視対象プロセス内に組み込まれる本発明プログラムが第２の機能により記録した挙動を常駐している本発明プログラムに通知し、常駐している本発明プログラムが第３の機能によりランサムウェアであるどうかを判断する。
【０４１９】
（第１の機能：監視対象プロセスが使用するAPIをフックする機能）
本発明プログラムは、監視対象プロセスにおいて、ランサムウェアの分析結果から得られた挙動であるＡＰＩ及びこれと同等の機能を持つＡＰＩをフックする。本実施形態におけるフック対象ＡＰＩは次の通りである。
【０４２０】
CreateFileMapping
MapViewOfFile/MapViewOfFileEx
UnmapViewOfFile/UnmapViewOfFileEx
FlushViewOfFile
CloseHandle
ＡＰＩをフックする具体的な方法は後述する。
【０４２１】
監視対象プロセスは、現在動作中のプログラム及び以降起動するプログラムである。後述する除外リストに挙げられているプログラムは監視対象プロセスから除外される。また、除外リストになくても、デジタル署名が付与されている等によりファイルの出自が明らかであるプログラムや、安全性が確認されているプログラムを監視対象プロセスから除外することができる。
【０４２２】
（第２の機能：フックしたAPIにより監視対象プロセスの挙動を記録する機能）
本発明プログラムは、第１の機能によりフックしたＡＰＩにより監視対象プロセスの挙動を記録する。
【０４２３】
監視対象プロセスの挙動を記録するために、第１の機能で列挙したＡＰＩのうち、CreateFileMapping、MapViewOfFile/MapViewOfFileExのＡＰＩのフック関数を使用する。
【０４２４】
（HookCreateFileMapping関数）
HookCreateFileMapping関数は、CreateFileMappingなるＡＰＩをフックする関数である。
【０４２５】
CreateFileMappingは、ファイルマッピングを使用してファイルの読み書きを行う際に、指定されたファイルに対する、名前付きまたは名前なしのファイルマッピングオブジェクトを作成または開くＡＰＩである。
【０４２６】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc430039.aspx
には、CreateFileMappingの説明が記載されている。その抜粋を図５７に示す。
【０４２７】
CreateFileMappingのフック関数であるHookCreateFileMapping関数には、フックにより捕捉した情報及び通常のCreateFileMappingの呼び出しにより取得した情報を記録する機能を持たせる。
【０４２８】
HookCreateFileMapping関数で記録する情報を次に示す。なお、CreateFileMappingにより指定されたファイルのことを、暗号化を説明する便宜上「暗号化対象ファイル」と称することとする。
（ａ）暗号化対象ファイルのハンドル
CreateFileMappingＡＰＩが呼び出される際に指定されたファイルハンドル（hFile）。
（ｂ）暗号化対象ファイルパス
ファイルハンドルをもとに取得したファイルパス。ファイルハンドル（hFile）からファイルパスを求めることができる。
（ｃ）ファイルマッピングオブジェクトのハンドル
CreateFileMappingを呼び出すことによって得られる戻り値。
【０４２９】
フック関数（HookCreateFileMapping関数）内でフック前のオリジナルのCreateFileMappingを呼び出すことで取得できる。
（ｄ）暗号化対象ファイルの暗号化前のヘッダデータ
ファイルハンドルをもとに取得したヘッダデータ。ファイルハンドル（hFile）に対してReadFile等のＡＰＩを使用してファイルのヘッダデータを読み込むことにより取得できる。図５８に示すように、ファイルハンドル（hFile）に基づいて、例えばReadFileのＡＰＩを使用して、暗号化対象ファイルの暗号化前のヘッダデータをハードディスク２２から読み込む。
【０４３０】
このようにHookCreateFileMapping関数により記録される情報は、メモリ２３上に、例えば、図５９に示すようなリスト形式で記録される。以降、このリストを「メモリマップドリスト」と呼ぶ。
【０４３１】
図５９は、暗号化対象ファイルのハンドルが「0xABC」であり、暗号化対象ファイルパスが「C:\test.pdf」であり、ファイルマッピングオブジェクトのハンドルが「0xABCD」であり、暗号化対象ファイルの暗号化前のヘッダデータが「25 50 44 46 2D」であることを示している。
（ｅ）実ファイルのバックアップ機能
HookCreateFileMapping関数には、暗号化対象ファイルのハンドルが指すファイルの実ファイルをバックアップする機能も持たせる。
【０４３２】
具体的にはHookCreateFileMapping関数の第一引数に指定された暗号化対象ファイルハンドルからファイルパスを割り出し、そのファイルをハードディスク２２上の別の場所に保管する機能である。保管場所はどこでもよい。
【０４３３】
ランサムウェアによる暗号化が検知された場合に、このバックアップから暗号化される前のファイルをコピーし復元する。
【０４３４】
バックアップはあくまでも一時ファイルであり、暗号化が発生しない場合はディスクを無駄に圧迫することになるので、適宜この一時ファイルを削除する。
【０４３５】
保管する際は、拡張子を含むファイル名やファイルの内容を暗号化することが望ましい。また、特定のプログラム以外からの書き込みができないようなフォルダに保管する等の対策をとることが望ましい。バックアップファイルが攻撃者によって置き換えられたり削除されたりすることを防ぐためである。
【０４３６】
図６０に、ファイルマッピング時のファイルバックアップから、暗号化検知後のファイル復元の流れの具体例を示す。
【０４３７】
CreateFileMapping関数が呼び出される（ステップ１）と、HookCreateFileMapping関数の第一引数に指定された暗号化対象ファイルハンドル（0x1A）からファイルパス（C:\users\test\Desktop\test.doc）を取得する（ステップ２）。取得したファイルパス（C:\users\test\Desktop\test.doc）から割り出したファイル（test.doc）を別の場所に暗号化を施したファイル（91B4083010E141872685）として保管する（ステップ３）。
【０４３８】
その後、ランサムウェアによる暗号化ファイル（C:\users\test\Desktop\test.doc.encrypted）を検知する（ステップ４）と、バックアップしたファイル（91B4083010E141872685）の暗号化を解いて、ファイル（C:\users\test\Desktop\test.doc）を復元する（ステップ５）。
【０４３９】
なお、バックアップしたファイルは、ディスクを圧迫しないよう定期的に削除する必要がある。削除する頻度は任意であるが、一定の期間を過ぎたものを削除する、バックアップファイルが一定の個数を超えたら古いものから削除する、残りのディスク容量が一定量を下回った場合に古いものから削除する等、ディスク資源が枯渇しないような処理とする必要がある。
【０４４０】
（HookCreateFile関数）
HookCreateFile関数は、CreateFileなるＡＰＩをフックする関数である。
【０４４１】
図６０では、CreateFileMappingをフックするHookCreateFileMapping関数によりバックアップファイルを作成した。しかしながら、ファイルが排他モードで開かれている場合にはバックアップが作成できない。
【０４４２】
このため、バックアップ機能は、CreateFileMapping関数より前に呼び出されるCreateFileをフックするHookCreateFile関数により、排他モードで開かれる前にバックアップしておくことが望ましい。
【０４４３】
CreateFileは、ファイル等のオブジェクトにアクセスするためにオブジェクトを作成するか、利用できるハンドルを返すかする関数である。この関数を呼び出すことで、指定したファイルに読み書きするためのハンドルを取得できる。
【０４４４】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc429198.aspx
には、CreateFileの説明が記載されている。その抜粋を図６１に示す。
【０４４５】
CreateFileのフック関数であるHookCreateFile関数に、次の機能を持たせる。
【０４４６】
呼び出し時のパラメータに指定されたファイル名が存在する場合は、そのファイルをバックアップする機能、すなわち別の場所にコピーする機能である。
【０４４７】
バックアップファイルのファイル名は、どのプロセスによって暗号化されたものかを判別するために、例えば、プロセスＩＤやプロセス名等を埋め込んでおくのが望ましい。
【０４４８】
CreateFileは暗号化操作に関わらず頻繁に呼び出される関数であるので、全てをバックアップ対象とするとディスク領域を圧迫するおそれがある。このため、書き込み権限を指定してハンドルを取得しようとする場合、排他モードを指定してハンドルを取得しようとする場合等の条件を満たした場合等のみバックアップ対象とするようにしてもよい。
【０４４９】
バックアップはあくまでも一時ファイルであり、暗号化が発生しない場合はディスクを無駄に圧迫しないよう削除すべきである。
【０４５０】
例えば、オペレーティングシステム（Windows OS）でも一時領域として使用されるユーザー毎の一時フォルダである %temp%（例：C:\Users\test\AppData\Local\Temp）等に保管するようにしてもよい。
【０４５１】
なお、バックアップしたファイルは、ディスクを圧迫しないよう定期的に削除する必要がある。削除する頻度は任意であるが、一定の期間を過ぎたものを削除する、バックアップファイルが一定の個数を超えたら古いものから削除する、残りのディスク容量が一定量を下回った場合に古いものから削除する等、ディスク資源が枯渇しないような処理とする必要がある。
【０４５２】
（HookMapViewOfFile関数/HookMapViewOfFileEx関数）
HookMapViewOfFile関数は、MapViewOfFileなるＡＰＩをフックする関数である。HookMapViewOfFileEx関数は、MapViewOfFileExなるＡＰＩをフックする関数である。
【０４５３】
MapViewOfFileおよびMapViewOfFileExは、CreateFileMappingにより作成されたマッピングオブジェクトを指定して、ファイルのビューをプロセスのアドレス空間にマップする関数である。この関数を呼び出すことで、読み込んだファイルのデータが対応付けられたアドレスを取得できる。
【０４５４】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc430198.aspx
には、MapViewOfFileの説明が記載されている。その抜粋を図６２（ａ）に示す。
【０４５５】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc430178.aspx
には、MapViewOfFileExの説明が記載されている。その抜粋を図６２（ｂ）に示す。
【０４５６】
MapViewOfFile、MapViewOfFileExのフック関数であるHookMapViewOfFile関数、HookMapViewOfFileEx関数には、次の機能を持たせる。
【０４５７】
呼び出し時のパラメータに指定されたファイルマッピングオブジェクトハンドル（hFileMappingObject）がメモリマップドリスト内に存在するかを確認し、存在する場合はその行にマップの開始アドレスを追記する機能である。
【０４５８】
マップの開始アドレスは、MapViewOfFile/MapViewOfFileExを呼び出すことによって得られる戻り値の「マップされたビューの開始アドレス」である。「マップされたビューの開始アドレス」は、HookMapViewOfFile関数/HookMapViewOfFileEx関数内でフック前のオリジナルのMapViewOfFile/MapViewOfFileExを呼び出すことにより取得できる。
【０４５９】
図６３に示す具体例では、呼び出し時のパラメータに指定されたファイルマッピングオブジェクトハンドル「0xABCD」がメモリマップドリスト内に存在したので、その行にマップ開始アドレス「0x201000」が追記されている。
【０４６０】
（メモリマップドリスト）
上述したように、HookCreateFileMapping関数、HookMapViewOfFile関数/HookMapViewOfFileEx関数により、図６４に示すメモリマップドリストが生成される。
【０４６１】
メモリマップドリストの「暗号化対象ファイルのハンドル」「暗号化対象ファイルパス」「ファイルマッピングオブジェクトのハンドル」「暗号化前のヘッダデータ」は、HookCreateFileMapping関数により挿入され、「マップ開始アドレス」はHookMapViewOfFile関数/HookMapViewOfFileEx関数により挿入される。
【０４６２】
HookCreateFileMapping関数が呼び出されるたびに、新たな「暗号化対象ファイルのハンドル」「暗号化対象ファイルパス」「ファイルマッピングオブジェクトのハンドル」「暗号化前のヘッダデータ」がメモリマップドリストに追加される。なお、既にリストに記録されているものは追加しなくてもよい。そして、HookMapViewOfFile関数/HookMapViewOfFileEx関数が呼び出されるたびに、新たな「マップ開始アドレス」が追加される。
【０４６３】
図６４は、後述する「（第３の機能（その２）：明示的にマップのクローズ・反映処理が行われない場合）」に記録されるメモリマップドリストの例である。
【０４６４】
具体的には「C:\document\」フォルダ内のファイルが順に暗号化される流れにおいて、２つ目のファイル「2.pdf」がマッピングされたため、ファイル「1.pdf」の暗号化前のヘッダデータと暗号化後（現在）のヘッダデータを比較する状況を示している。
【０４６５】
ファイル「1.pdf」のヘッダデータが異なっている場合、当該マッピング処理は暗号化を目的としたものであると判断し、検知する。
【０４６６】
図６４に示すメモリマップドリストの情報は、ひとつの監視対象プロセスが終了するとクリアされる。
【０４６７】
本発明プログラムを常駐プログラムとして動作させる場合には、ひとつの監視対象プロセスが終了してもメモリマップドリストの情報はクリアされない。そのため、オペレーティングシステムのハンドル値の再利用により、異なるハンドルであるのに、偶発的にハンドル値が一致すると誤って検知するおそれがある。そのような誤検知を防止するため、メモリマップドリストを定期的にクリアすることが望ましい。ユーザーがクリアする間隔を設定できるようにしてもよい。また、オペレーティングシステムの終了時または再起動時にはクリアすることが望ましい。
【０４６８】
ランサムウェアによる暗号化では、ファイルを１つずつ処理する流れをとることが多いため、マッピングによる暗号化においても「マップ」「暗号化」「アンマップ」を交互に繰り返すことが基本的な流れになる。この基本的な流れに対する対応であればメモリマップドリストが大きい必要はない。
【０４６９】
しかしながら、多数のファイルを一気にマップし、その後、多数のファイルに暗号化を施し、その後、多数のファイルを一気にアンマップする、という処理を行う場合には、メモリマップドリストに、多数のファイル分の領域を設ける必要がある。
【０４７０】
（第３の機能：記録を使用してランサムウェアであるかどうかを判断する機能）
本発明プログラムは、第３の機能は、第２の機能により記録した挙動により監視対象プロセスがランサムウェアであるかどうかを判断する。監視対象プロセスが、明示的にマップのクローズ・反映処理を行う場合と、明示的にマップのクローズ・反映処理が行わない場合とがあり、それぞれの場合を想定した処理を行う。
【０４７１】
（第３の機能（その１）：明示的にマップのクローズ・反映処理が行われる場合）
監視対象プロセスの挙動を記録するために、第１の機能で列挙したフック対象ＡＰＩのうち、次のＡＰＩのフック関数を使用する。
【０４７２】
UnmapViewOfFile/UnmapViewOfFileEx
FlushViewOfFile
CloseHandle
UnmapViewOfFile関数、UnmapViewOfFileEx関数は、マッピングされたメモリ（以下この状態のメモリを「マップドメモリ」と呼ぶ）を解除（アンマップ）する関数である。アンマップすることにより、マップドメモリ上のデータがファイルへ反映されるため、実質的に実ファイルへの書き込みが行われる動作である。監視対象プロセスがランサムウェアであれば実ファイルが暗号化される。
【０４７３】
FlushViewOfFile関数は、マップされた状態（マップドメモリ）を解除（アンマップ）しないが、この関数を呼び出すことによりマップドメモリ上のデータを実ファイルに反映する関数である。
【０４７４】
CloseHandle関数は、より広範に使用されるＡＰＩである。ファイルマッピングでは、マップされた仮想ファイルの実ファイルへの書き込みが終わった後、マップされた仮想ファイルを閉じる際に呼び出される。したがって、通常のプログラムであれば、CloseHandleを呼び出す前に、UnmapViewOfFile関数やUnmapViewOfFileEx関数により、仮想ファイルがアンマップされる。しかしながら、UnmapViewOfFile関数やUnmapViewOfFileEx関数を呼び出すことなくCloseHandleを呼び出した場合には、マップドメモリのデータが実ファイルへ反映される。したがって、CloseHandle関数も、UnmapViewOfFile関数、UnmapViewOfFileEx関数、FlushViewOfFile関数と同様、実ファイルへの書き込みタイミグとして監視すべきＡＰＩである。
【０４７５】
（HookUnmapViewOfFile関数/HookUnmapViewOfFileEx関数）
HookUnmapViewOfFile関数は、UnmapViewOfFileなるＡＰＩをフックする関数である。HookUnmapViewOfFileEx関数は、UnmapViewOfFileExなるＡＰＩをフックする関数である。
【０４７６】
UnmapViewOfFileおよびUnmapViewOfFileExは、マップされた状態（マップドメモリ）を解除（アンマップ）する関数である。
【０４７７】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc430200.aspx
には、UnmapViewOfFileの説明が記載されている。その抜粋を図６５（ａ）に示す。
【０４７８】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/windows/desktop/mt670639(v=vs.85).aspx
には、UnmapViewOfFileExの説明が記載されている。その抜粋を図６５（ｂ）に示す。
【０４７９】
UnmapViewOfFile、UnmapViewOfFileExのフック関数であるHookUnmapViewOfFile関数、HookUnmapViewOfFileEx関数には、通常のUnmapViewOfFile/UnmapViewOfFileExの動作に加え以下の機能を追加する。
（ａ）呼び出し時のパラメータに指定されたマップドメモリ（lpBaseAddress）がメモリマップドリスト内に存在するかを確認し、存在する場合はその行の「暗号化前のヘッダデータ」を取得する機能。
（ｂ）呼び出し時のパラメータに指定されたマップドメモリ（lpBaseAddress）がメモリマップドリスト内に存在するかを確認し、存在する場合はlpBaseAddressの位置にマップされた「暗号化後のヘッダデータ」（マップドメモリ上の先頭データ）を取得する機能。
【０４８０】
UnmapViewOfFileが呼び出されるということは、既にMapViewOfFileが呼ばれていて、かつ、マップドメモリの使用を終え、ファイルにマップドメモリの内容を反映させる等の理由によりマップを解除したい段階と考えられる。このため、この時点のマップドメモリの先頭データはファイル暗号化後のヘッダデータとみなせる。
（ｃ）上記の「暗号化前のヘッダデータ」と「暗号化後のヘッダデータ」とを比較し、それらに差異がある場合、ランサムウェアによるファイル暗号化操作であると判断し、プロセスを終了させる機能。
【０４８１】
これらの機能による具体例を図６６に示す。図６６に示す例では、暗号化対象ファイルのハンドル「0xABC」の「暗号化前のヘッダデータ」は「25 50 44 46 2D」であり、HookUnMapViewOfFileFile/HookUnMapViewOfFile のパラメータの「開始アドレス（lpBaseAddress）」に「0x201000」が指定されている。メモリ２３上のアドレス「0x201000」のデータ「50 4B 03 04 14」が「暗号化後のヘッダデータ」である。図６６に示す例では、暗号化前のヘッダデータ「25 50 44 46 2D」と、暗号化後のヘッダデータ「50 4B 03 04 14」が相違するので、ランサムウェアによるファイル暗号化操作であると判断し、監視対象プロセスを終了させる。
【０４８２】
（HookFlushViewOfFile関数）
HookFlushViewOfFile関数は、FlushViewOfFileなるＡＰＩをフックする関数である。
【０４８３】
FlushViewOfFileは、マップドファイルのビュー内にある、指定された範囲のデータをディスクに書き込む関数である。
【０４８４】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc430048.aspx
には、FlushViewOfFileの説明が記載されている。その抜粋を図６７に示す。
【０４８５】
FlushViewOfFileはUnmapViewOfFile/UnmapViewOfFileExと同様、呼び出しパラメータにマップの開始アドレス（lpBaseAddress）があるため、HookUnmapViewOfFile/HookUnmapViewOfFileExと同様に暗号化を検知することが可能である。
【０４８６】
FlushViewOfFileのフック関数であるHookFlushViewOfFile関数には、通常のFlushViewOfFileの動作に加え以下の機能を追加する。
（ａ）呼び出し時のパラメータに指定されたマップドメモリ（lpBaseAddress）がメモリマップドリスト内に存在するかを確認し、存在する場合はその行の「暗号化前のヘッダデータ」を取得する機能。
（ｂ）呼び出し時のパラメータに指定されたマップドメモリ（lpBaseAddress）がメモリマップドリスト内に存在するかを確認し、存在する場合はlpBaseAddressの位置にマップされた「暗号化後のヘッダデータ」（マップドメモリ上の先頭データ）を取得する機能。
（ｃ）上記の「暗号化前のヘッダデータ」と「暗号化後のヘッダデータ」とを比較し、それらに差異がある場合、ランサムウェアによるファイル暗号化操作であると判断し、プロセスを終了させる機能。
【０４８７】
（HookCloseHandle関数）
HookCloseHandle関数は、CloseHandleなるＡＰＩをフックする関数である。
【０４８８】
CloseHandleは、ファイルが閉じられる際に呼び出されるＡＰＩである。
【０４８９】
Microsoft社のリファレンス
https://msdn.microsoft.com/ja-jp/library/cc429605.aspx
には、CloseHandleの説明が記載されている。その抜粋を図６８に示す。
【０４９０】
ファイルマッピングを使用する場合、一般的にはCloseHandleを呼び出す前にアンマップする。そのため一般的にアンマップはHookUnmapViewOfFile/HookUnmapViewOfFileExで検知できる。しかしながら、意図的にアンマップするHookUnmapViewOfFile/HookUnmapViewOfFileExを用いずに、直ちにファイルをクローズする方法も考えられ、この場合にもマップドメモリの内容が実ファイルに反映される可能性があることから、CloseHandleをトリガーとして検知することが望ましい。
【０４９１】
CloseHandleのフック関数であるHookCloseHandle関数には、通常のCloseHandleの動作に加え次の機能を追加する。
【０４９２】
HookCloseHandle関数においても、実施すべきことの基本的な考え方は、HookUnmapViewOfFile/HookUnmapViewOfFileEx関数の場合と同じである。メモリマップドリストを利用して以前のファイルの状態（暗号化前のヘッダデータ）と、HookCloseHandleが呼び出されたタイミングでの暗号化後のヘッダデータを取得して、これらヘッダデータを比較する。
【０４９３】
HookUnmapViewOfFile/HookUnmapViewOfFileEx関数の場合と異なる点は、ヘッダデータを取得するまでのメモリマップドリストの辿り方である。その辿り方を図６９及び図７０に示す。
【０４９４】
CloseHandle関数のパラメータには「マップの開始アドレス」は存在せず、ファイルハンドルのみとなる。そのため、前のファイルの状態（暗号化前のヘッダデータ）を取得するには、図６９に示すように、メモリマップドリスト内の「暗号化対象ファイルのハンドル」を検索し、パラメータに指定されたファイルハンドルhObjectの値と合致する行の「暗号化前のヘッダデータ」列の値を取得する。
【０４９５】
ただし「ファイルハンドル」の値は、オペレーティングシステム（Windows OS）により再利用される可能性がある。このため、ハンドルの一致による誤検知にならないために、「ファイルハンドル（hObject）」から「ファイルパス」を求め、「ファイルハンドル」の一致に加え、求めた「ファイルパス」と「暗号化対象ファイルパス」列の値が一致することも条件としてもよい。
【０４９６】
暗号化後のヘッダデータ取得については、図７０に示すように、ファイルハンドル（hObject）からReadFile関数等を使用し、ハードディスク２２上の実ファイルから先頭データ（ヘッダデータ）を読み取る方法や、フック前のオリジナルのCloseHandleを呼び出し、クローズされたファイルを再度オープンし、ハードディスク２２上の実ファイルから先頭データ（ヘッダデータ）を読み取る方法が考えられる。
【０４９７】
処理のオーバーヘッドを考えると、ファイルハンドルを使用して先頭データを取得するほうが、よりよいパフォーマンスとなると思われる。
【０４９８】
（第３の機能のまとめ）
明示的にマップのクローズ・反映処理が行われる場合の動作について、図７１を用いて時系列に沿って説明する。
【０４９９】
まず、ステップ１では、HookCreateFileMappingにより、メモリマップドリストに新しい行が追加される。新しい行には、暗号化対象ファイルのハンドル、暗号化対象ファイルパス、ファイルマッピングオブジェクトのハンドル、暗号化対象ファイルの暗号化前のヘッダデータが記入される。
【０５００】
図７１では、暗号化対象ファイルのハンドルが「0xABC」であり、暗号化対象ファイルパスが「C:\test.pdf」であり、ファイルマッピングオブジェクトのハンドルが「0xABCD」であり、暗号化対象ファイルの暗号化前のヘッダデータが「25 50 44 46 2D」である。
【０５０１】
次に、ステップ２では、HookMapViewOfFile/HookMapViewOfFileExにより、メモリマップドリストに、マップの開始アドレスが記入される。
【０５０２】
図７１では、呼び出し時のパラメータに指定されたファイルマッピングオブジェクトハンドル「0xABCD」がメモリマップドリスト内に存在したので、その行にマップ開始アドレス「0x201000」が追記される。
【０５０３】
次に、ステップ３では、監視対象プロセスがランサムウェアであるとマップドメモリのデータが暗号化される。
【０５０４】
次に、ステップ４では、HookUnmapViewOfFile/HookUnmapViewOfFileEx、又は、HookFlushViewOfFileにより、まず、UnmapViewOfFile/UnmapViewOfFileEx、又は、HookFlushViewOfFileの呼び出し時のパラメータに指定されたアドレスとマッチするものを「マップの開始アドレス」列から検索する（ステップ４−１）。次に、マッチする行があれば、その行のヘッダデータ（暗号化前）と、マップドメモリから取得した現在のヘッダデータ（暗号化後）とを比較して、差異があれば暗号化されたと判断する。そのようにして、監視対象プロセスがランサムウェアであるか否かを判断する（ステップ４−２）。
【０５０５】
図７１では、呼び出し時のパラメータ「0xABCD」から、メモリマップドリストの暗号化前のヘッダデータ「25 50 44 46 2D」を取得し、呼び出し時のパラメータ「0xABCD」により指定されたアドレス「0x201000」から現在のヘッダデータ（暗号化後）「50 4B 03 04 14」を取得する。これらを比較すると差異があるので、監視対象プロセスはランサムウェアであると判断する。
【０５０６】
（ランサムウェアの検知処理（その１））
ランサムウェアの検知処理（その１）の詳細について、図７２のフローチャートを用いて説明する。
【０５０７】
HookUnmapViewOfFile/HookUnmapViewOfFileEx、又は、HookFlushViewOfFileを用いた場合のランサムウェアの検知処理である。
【０５０８】
まず、UnmapViewOfFile/UnmapViewOfFileEx、又は、HookFlushViewOfFileの呼び出し時のパラメータ「lpBaseAddress」に指定されたアドレスがメモリマップドリストに存在するか否かを判断する（ステップＳ１１）。
【０５０９】
そのアドレスがメモリマップドリストに存在しなければ、直ちにランサムウェアの検知処理を終了する。
【０５１０】
そのアドレスがメモリマップドリストに存在すると、その行のヘッダデータ（暗号化前）を取得する（ステップＳ１２）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０５１１】
次に、呼び出し時のパラメータ「lpBaseAddress」により指定されたアドレスから現在のヘッダデータ（暗号化後）を取得する（ステップＳ１３）。これは、現在のメモリ２３の仮想ファイルから取得したデータである。
【０５１２】
次に、取得した暗号化前のヘッダデータと暗号化後のヘッダデータとを比較して、相違するか否かを判断する（ステップＳ１４）。
【０５１３】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違しなければ、直ちにランサムウェアの検知処理を終了する。
【０５１４】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ１５）。
【０５１５】
（ランサムウェアの検知処理（その２））
ランサムウェアの検知処理（その２）の詳細について、図７３のフローチャートを用いて説明する。
【０５１６】
HookCloseHandleを用いた場合のランサムウェアの検知処理である。
【０５１７】
まず、HookCloseHandleの呼び出し時のパラメータ「hObject」に指定されたハンドルがメモリマップドリストに存在するか否かを判断する（ステップＳ２１）。
【０５１８】
そのハンドルがメモリマップドリストに存在しなければ、直ちにランサムウェアの検知処理を終了する。
【０５１９】
そのハンドルがメモリマップドリストに存在すると、そのパラメータ「hObject」からファイルパスを算出する（ステップＳ２２）。
【０５２０】
次に、メモリマップドリストから「暗号化対象ファイルパス」を取得する（ステップＳ２３）。
【０５２１】
次に、パラメータから算出されたファイルパスと、メモリマップドリストから取得したファイルパスとが同じであるか否か判断する（ステップＳ２４）。
【０５２２】
ファイルパスが同じでなければ、直ちにランサムウェアの検知処理を終了する。
【０５２３】
ファイルパスが同じであると、該当する行のヘッダデータ（暗号化前）を取得する（ステップＳ２５）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０５２４】
次に、ファイルパスから現在のヘッダデータ（暗号化後）を取得する（ステップＳ２６）。これは、現在のハードディスク２２の実ファイルから取得したデータである。
【０５２５】
次に、取得した暗号化前のヘッダデータと暗号化後のヘッダデータとを比較して、相違するか否かを判断する（ステップＳ２７）。
【０５２６】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違しなければ、直ちにランサムウェアの検知処理を終了する。
【０５２７】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ２８）。
【０５２８】
（バックアップ処理）
本発明プログラムによれば、上述したように、監視対象プロセスがひとつ目のファイルの暗号化を実行した時点で、監視対象プロセスをランサムウェアとして検知することが可能である。しかし、ランサムウェアとして検知した時点で、既にマップドメモリの内容は暗号化された状態となっている。このため、監視対象プロセスを強制的に終了させても、ひとつ目のファイルの暗号化は阻止できない。
【０５２９】
したがって、監視対象プロセスをランサムウェアとして検知した場合には、HookCreateFileMapping関数でバックアップしたファイルをハードディスク２２の実ファイルとして書き戻すようにする。本発明プログラムの常駐プログラムにランサムウェアの検知を通知し、バックアップしたファイルを書き戻す。
【０５３０】
バックアップファイルの書き戻しに際しては、（第２の機能：フックしたAPIにより監視対象プロセスの挙動を記録する機能）の（HookCreateFileMapping関数）に示した処理を適用する。
【０５３１】
（第３の機能（その２）：明示的にマップのクローズ・反映処理が行われない場合）
明示的にUnmapViewOfFile/UnmapViewOfFileEx、FlushViewOfFile、CloseHandleを呼び出さずとも、プログラムの終了時には、オペレーティングシステム（Windows OS）によってマップドメモリの内容がファイルに書き出される。ランサムウェアの開発者がＡＰＩの監視から逃れるために、意図的に上述したクローズ処理を行わない方法をとることも考えられる。このため、このような場合にもランサムウェアを検知できるようにする必要がある。
【０５３２】
明示的に上記のAPIが呼び出されない場合には、マップドメモリに対してヘッダデータの差異確認を行うトリガーがなくなる。このため、監視対象プロセスによりファイルが処理された直後に、そのファイルが暗号化されたかを検知することができない。
【０５３３】
そこで、本発明プログラムでは、通常、ランサムウェアがファイルを連続して暗号化するという特徴に着目し、ファイル暗号化の連続性を利用して検知するようにした。
【０５３４】
本発明プログラムは、MapViewOfFile、MapViewOfFileExのフック関数であるHookMapViewOfFile関数、HookMapViewOfFileEx関数に、更に次の機能を追加する。
（ａ）メモリマップドリストをすべて走査する機能。
（ｂ）走査して取得した全ての行の「暗号化前のヘッダデータ」をそれぞれ取得する機能
（ｃ１）走査して取得した全ての行の「暗号化対象ファイルパス」から、ハードディスク２２上の実ファイルから現在のヘッダデータをそれぞれ取得する機能。
（ｃ２）走査して取得した全ての行の「マップの開始アドレス」からメモリ２３上の仮想ファイルの現在のヘッダデータを取得する機能。この場合は、マップの開始アドレスがＯＳにより再利用されていない、すなわち、マップの開始アドレスがメモリマップドリスト内で重複していない状況でのみ有効である。ＯＳにより再利用されている場合、既に新しい情報で置き換えられている可能性があるためである。
（ｄ）上記の全ての行の「暗号化前のヘッダデータ」と「暗号化後のヘッダデータ」とをそれぞれ比較し、それらに差異がある場合、ランサムウェアによるファイル暗号化操作であると判断し、プロセスを終了させる機能。
【０５３５】
HookMapViewOfFile関数、HookMapViewOfFileEx関数に上述した機能を追加しても、ひとつ目のファイルの暗号化を検知することはできない。ひとつ目のファイルに対してHookMapViewOfFile関数、HookMapViewOfFileEx関数を実行したときには、ひとつ目のファイルに対する暗号化がまだ実行されていないからである。ふたつ目以降のファイルの暗号化でHookMapViewOfFile関数、HookMapViewOfFileEx関数を実行したときには、ひとつ目のファイルに対する暗号化は既に実行されているので、ひとつ目のファイルの暗号化を検知することができる。
【０５３６】
（ランサムウェアの検知処理）
本発明プログラムによるランサムウェアの検知処理について、図７４及び図７５を用いて説明する。
【０５３７】
図７４に示すのは、監視対象プロセスにより連続的にファイルの暗号化が行われた場合の処理である。
【０５３８】
ひとつ目のファイルに対してステップ１（HookCreateFileMapping）、ステップ２（HookMapViewOfFile/HookMapViewOfFileEx）、ステップ３（ランサムウェアによりマップドメモリのデータ暗号化）が行われる。
【０５３９】
ステップ３まで終了した時点ではメモリマップドリストには、暗号化対象ファイルのハンドルに「0xABC」、暗号化対象ファイルパスに「C:\test.pdf」、ファイルマッピングオブジェクトのハンドルに「0xABCD」、暗号化前のヘッダデータに「25 50 44 46 2D」、マップ開始アドレスに「0x201000」が記録されている。
【０５４０】
ひとつ目のファイルに対するステップ３の後、明示的なクローズ処理（UnmapViewOfFile/UnmapViewOfFileEx、FlushViewOfFile、CloseHandle）が行われないまま、オペレーティングシステム（Windows OS）によってマップドメモリの内容がファイルに書き出される。次にふたつ目のファイルに対する処理が行われる。
【０５４１】
ふたつ目のファイルに対しても、同様に、ステップ１（HookCreateFileMapping）、ステップ２（HookMapViewOfFile/HookMapViewOfFileEx）、ステップ３（ランサムウェアによりマップドメモリのデータ暗号化）が行われる。
【０５４２】
ステップ１まで終了した時点ではメモリマップドリストには、暗号化対象ファイルのハンドルに「0xDEF」、暗号化対象ファイルパスに「C:\doc.txt」、ファイルマッピングオブジェクトのハンドルに「0xEF01」、暗号化前のヘッダデータに「61 62 63 64 65」が記録されている。
【０５４３】
ステップ２（HookMapViewOfFile/HookMapViewOfFileEx）の詳細について、図７５のフローチャートを用いて説明する。HookMapViewOfFile/HookMapViewOfFileExを用いたランサムウェアの検知処理である。
【０５４４】
まず、メモリマップドリストの走査を開始し（ステップＳ３１）。
【０５４５】
次に、メモリマップドリストの末尾であるか否か判断する（ステップＳ３２）。メモリマップドリストの末尾であると、走査が終了したとして、直ちにランサムウェアの検知処理を終了する。
【０５４６】
メモリマップドリストの末尾でないと、メモリマップドリストの該当行の「暗号化前のヘッダデータ」を取得する（ステップＳ３３）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０５４７】
次に、メモリマップドリストの該当行の「暗号化対象ファイルパス」を取得する（ステップＳ３４）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０５４８】
次に、該当行の「暗号化対象ファイルパス」のファイルから現在のヘッダデータ（暗号化後）を取得する（ステップＳ３５）。これは、現在のハードディスク２２の実ファイル、又は、現在のメモリ２３の仮想ファイルから取得したデータである。
【０５４９】
次に、取得した暗号化前のヘッダデータと暗号化後のヘッダデータとを比較して、相違するか否かを判断する（ステップＳ３６）。
【０５５０】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違しなければ、メモリマップドリストの次の行を走査すべくステップＳ３２に戻る。
【０５５１】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ３７）。
【０５５２】
（バックアップ処理）
本発明プログラムによれば、上述したように、監視対象プロセスがふたつ目のファイルの暗号化を実行した時点で、監視対象プロセスをランサムウェアとして検知することが可能である。しかし、ランサムウェアとして検知した時点で、既にひとつ目のファイル及びふたつ目のファイルのマップドメモリの内容は暗号化された状態となっている。このため、監視対象プロセスを強制的に終了させても、ひとつ目のファイル及びふたつ目のファイルの暗号化は阻止できない。
【０５５３】
したがって、監視対象プロセスをランサムウェアとして検知した場合には、HookCreateFileMapping関数でバックアップしたファイルをハードディスク２２の実ファイルとして書き戻すようにする。本発明プログラムの常駐プログラムにランサムウェアの検知を通知し、バックアップしたファイルを書き戻す。
【０５５４】
バックアップファイルの書き戻しに際しては、（第２の機能：フックしたAPIにより監視対象プロセスの挙動を記録する機能）の（HookCreateFileMapping関数）に示した処理を適用する。
【０５５５】
（除外リスト）
本発明プログラムを、システム上において動作する全てのプロセスに対して、そのプロセスがランサムウェアである否かを判断することは、システムに新たな負荷を加えることになる。
【０５５６】
そこで、本実施形態では、明らかにランサムウェアではないプログラムを予め登録した「除外リスト」を作成しておき、除外リストに登録されたプログラムに対しては、本発明プログラムを実行しないようにする。
【０５５７】
除外リストには正規のプログラムを登録する。例えば、システムにインストールされている「プログラム名」「プログラムファイル」「ファイルのフルパス」「ファイルサイズ」「ハッシュ値」「デジタル署名」等を必要に応じて登録する。
【０５５８】
除外リストは、システムへのプログラムをインストールするたびに更新し、ハードディスク２２上に格納しておく。本発明プログラムの起動時に除外リストの内容を読み込むようにする。
【０５５９】
本発明プログラムの動作後、読み込んだ除外リストの情報はメモリ２３上にマッピングされる。突然のマシントラブルでメモリ情報が揮発しても内容を失わないよう、ハードディスク２２上のファイルに対して常に更新しておくことがよい。
【０５６０】
また、除外リストのファイルは、マルウェアやランサムウェアによる編集を避けるため、暗号化しておくことが望ましい。
【０５６１】
（プロセスの強制終了）
本発明プログラムが、監視対象プロセスがランサムウェアであると判断した場合、当該プロセスを強制終了する。プロセスの強制終了は、フックしている関数内で行う。一般的には、ExitProcess関数や、Exit関数等を用いることで実現できるが、プロセスを終了可能な命令であればいかなるものを使用してもよい。これにより、ランサムウェアによるファイルの暗号化を防ぐことができる。
【０５６２】
なお、直ちにプロセスを終了させることで問題となる可能性のある環境においては、ユーザーに通知し終了の判断を仰ぐといった対応も可能である。
【０５６３】
［発明の原理（その３）］
本発明の原理（その３）について説明する。
【０５６４】
本願発明者等が確認しているランサムウェアの暗号化処理では、対象ファイルの内容全体が暗号化され、ヘッダ情報、データ部全てが書き換えられている。上述した発明の原理（その１）及び発明の原理（その２）では、ランサムウェアが対象ファイルの内容全体を書き換えることを前提として、対象ファイルの少なくともヘッダ情報が書き換えられたか否かを判断して、ランサムウェアを検知している。
【０５６５】
しかしながら、今後、発明の原理（その１）及び発明の原理（その２）に基づくランサムウェア検知を逃れるために、ファイルのヘッダ情報は書き換えずに、データ部のみを暗号化するランサムウェアが出現する可能性が考えられる。
【０５６６】
このようなランサムウェアの暗号化処理においては、暗号化後もファイルフォーマットが成立し、ファイルを正規のアプリケーションで開くことができるが、データ内容が確認することができず、ランサムウェアにより暗号化が達成されることとなる。
【０５６７】
発明の原理（その１）及び発明の原理（その２）に基づく実施形態では、このようなランサムウェアを検知することが困難である。本発明の原理（その３）は、別の手法により、ファイルのヘッダ情報は書き換えずに、データ部のみを暗号化するランサムウェアを検知しようとするものである。
【０５６８】
まず、ファイルのデータ部の内容は正規のアプリケーションによって常に書き換えられるものであるため、データ部が書き換えられたか否かのみによりランサムウェアを検知することはできない。
【０５６９】
多くの環境では、特定のファイルを扱うアプリケーションはオペレーションシステム（ＯＳ）によって関連付けがなされている。例えば、拡張子が「.doc」「.docx」のファイルを開く際は、自動的に規定のアプリケーションであるMicrosoft社のWordアプリケーションにより開かれる設定となっている。
【０５７０】
したがって、拡張子が「.doc」「.docx」に関連付けされていないプログラムが、拡張子「.doc」「.docx」のファイルのデータ部のみを変更するという処理は、当該プログラムがランサムウェアである可能性があると考えることができる。
【０５７１】
本発明の原理（その３）は、監視対象プログラムがファイルにアクセスする際に、その監視対象プログラムが当該ファイルの拡張子に関連付けされていないプログラムであって、当該ファイルのデータ部のみを変化させたか否かを判断し、それに基づいてランサムウェアを検知する。
【０５７２】
当該ファイルのデータ部のみを変化させたことの検知には、データ部の変化を検知するがヘッダ情報の変化は検知しない場合を含み、データ部の変化を検知し、かつヘッダ情報が変化していないことを検知する場合を含む。
【０５７３】
なお、データ部のみの暗号化への対策においては、データ部の「変化」よりも、書き込み対象ファイルの拡張子に関連付けされていないアプリケーションがデータ部に「書き込む可能性がある」ことをランサムウェア検知の優先事項としてもよい。
【０５７４】
ユーザーの設定やカスタマイズされた環境によっては、ファイルの拡張子に関連付けられた規定のアプリケーション以外のプログラムにより開いてデータ部を編集することがある。例えば、Microsoft Word以外のプログラムで、拡張子が「.doc」「.docx」のファイルのデータ部を編集することがある。
【０５７５】
これに対しては、ユーザーに当該プログラムが「意図したプログラムであるか否か」を問う画面を表示して、ユーザーの回答に応じて、ランサムウェアではないことを示すホワイトプログラムリストに追加する。これにより、それ以降は、繰り返し検知されることがなくなる。
【０５７６】
［第４実施形態］
本発明の第４実施形態によるプログラム、情報処理装置及び情報処理方法について図７６乃至図８２を用いて説明する。
【０５７７】
本実施形態では、監視対象プログラムがファイルにアクセスする際に、まず、監視対象プログラムが当該ファイルの拡張子に関連付けされたプログラムであるか否かを判断する。そして、関連付けされたプログラムでないと判断された場合には、監視対象プログラムが当該ファイルのデータ部のみを変化させたか否かを判断する。当該ファイルのデータ部のみを変化させたと判断された場合には、監視対象プログラムをランサムウェアの疑いありと判断する。
【０５７８】
（監視対象プログラムがファイルの拡張子に関連付けされているか否かの検出）
本発明プログラムが、監視対象プロセスからのＡＰＩをフックするときには、アクセスするアプリケーション名と、アクセス対象のファイル名（拡張子）を把握している。ファイルの読み書きの際に、アクセス対象ファイルの拡張子を切り出し、その拡張子から関連付けされたアプリケーションのパスを取得し、監視対象プロセスのアプリケーションのパスと比較し、これらパスが同じであれば、関連付けされたアプリケーションと判断する。
【０５７９】
拡張子に関連付けられたアプリケーションのリストは、オペレーティングシステム（Windows OS）では、ハードディスク上にレジストリ値として保管されている。したがって、HKEY_CLASSES_ROOT配下にあるレジストリ値を直接読み取ることで、関連付けされたアプリケーションを取得することができる。
【０５８０】
また、拡張子に関連付けられた単一のアプリケーションだけでなく、当該ファイルを右クリックした際に表示される「プログラムから選択」に表示されるアプリケーションの候補の一覧を取得することもできる。
【０５８１】
ハードディスク上のレジストリ領域から「拡張子に関連付けられたアプリケーション」を取得する流れの具体例を図７６に示す。
【０５８２】
図７６に示すように、レジストリ「HKCR\.docx」からＣＬＳＩＤと呼ばれる識別子「{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}」を取得し、この識別子「{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}」から、拡張子「.docx」に関連付けられたプログラムのパス「C:\Program Files\Microsoft Office\Office15\WINWORD.EXE」を取得する。
【０５８３】
より単純な方法として、オペレーティングシステム（Windows OS）のAssocQueryString APIの引数に「.docx」等の拡張子を指定して呼び出すことで、「C:\Program Files\Microsoft Office\Office15\WINWORD.EXE」のようにアプリケーションの場所を取得できる。
【０５８４】
例えば、HookCreateFileMapping関数において、ファイルを暗号化しようとしているアプリケーションが当該ファイルの拡張子に関連付けされたアプリケーションであるかどうかを判断する流れを図７７に示す。
【０５８５】
関連付けられたアプリケーションを取得するには次のようにする。
【０５８６】
まず、HookCreateFileMapping関数からファイルのハンドル「0x6C」を取得する。
【０５８７】
次に、ファイルハンドルからGetFinalPathNameByHandle等を使用して、アクセス対象ファイルのファイルパス「C:\users\test\Desktop\test.doc」を取得する。
【０５８８】
次に、取得したファイルパス「C:\users\test\Desktop\test.doc」から拡張子「.doc」のみを切り出す。
【０５８９】
次に、AssocQueryStringを使用して、切り出された拡張子「.doc」に関連付けられたアプリケーション「C:\Program Files\Microsoft Office\Office15\WINWORD.EXE」を取得する。
【０５９０】
一方、監視対象のプロセスに対しては、GetModuleFileName等を使用して、自身のパス
「C:\Program Files\Microsoft Office\Office15\WINWORD.EXE」を取得する。
【０５９１】
そして、このようにして取得した拡張子に関連付けられたアプリケーションと、監視対象のプロセス自身のパスとを比較する。一致する場合には、拡張子に関連付けられたアプリケーションによるデータ変更であるから暗号化ではないと判断する。一致しない場合には、拡張子に関連付けられていないアプリケーションによるデータ変更であるから暗号化の可能性があると判断する。
【０５９２】
（ファイルのヘッダ部とデータ部）
本発明プログラムでは、書き込み対象の場所がヘッダ部であるか、データ部であるかの判断が必要である。そこで、ファイルのヘッダ部とデータ部の判断方法を説明する。
【０５９３】
ヘッダ部の位置やサイズはアプリケーション毎に定義され公開されている。基本的には公開されている各ファイルの形式にしたがう。本発明プログラムでは公開されている各ファイルの形式におけるヘッダ情報のうち、不変となる部分をそのファイル形式のヘッダ情報とする。
【０５９４】
例えば、図７８（ａ）は、画像形式であるビットマップファイルの公開されているフォーマットの一部である。ヘッダ部には、ファイルヘッダ、情報ヘッダ、カラーテーブル等の情報が記録されている。データ部には、ピクセルデータ（画像データ）が記録されている。
【０５９５】
しかしながら、ヘッダ部のデータは全てが固定値ではない。例えば、図７８（ａ）のヘッダ部において３バイト目（アドレス「00000002」）のデータ「F6 93 25 00」値は、当該ビットマップファイルのファイルサイズを示している。画像ファイルのファイルサイズが変化すれば、この部分のデータも変化する。
【０５９６】
本発明では、ファイル種別が変化しない限り変化しない部分を「本発明のヘッダ部」とする。例えば、ビットマップファイルでは、図７８（ｂ）に示すように、ヘッダ部の先頭２バイト「42 4D」（文字列「ＢＭ」）を「本発明のヘッダ部」とし、その他の部分を［本発明のデータ部」とする。
【０５９７】
なお、ファイル種別が変化しない限り変化しない部分は、必ずしも連続している必要はない。不連続な変化していない部分を「本発明のヘッダ部」としてもよい。例えば、図７８（ｂ）では、３〜６バイトを除いた「42 4D xx xx xx xx 00 00 00 00」を「本発明のヘッダ部」としてもよい。「xx」は変化しうるバイトを示す。
【０５９８】
ファイル形式が公開されていない又はヘッダ部のサイズが公開されていない場合には、ファイルの先頭部分をヘッダ部、それ以外をデータ部としてもよい。この場合、先頭部分のサイズは任意であるが、一般的に数バイトから数十バイト程度を設定する。そして、ランサムウェアを検知しようとした結果、誤検知が多い場合にはサイズを調整できるようにする。
【０５９９】
（一般的なファイル操作とファイルマッピングによるファイル操作）
前述したように、ファイル操作として、一般的なファイル操作とファイルマッピングによるファイル操作が可能である。
【０６００】
実ファイルはハードディスクに記憶されている。一般的なファイル操作におけるファイルの読み書きの処理では、その都度、メモリにバッファ（図示せず）を用意してファイルを読み込み、編集したデータをファイルに書き戻す、といった一連の処理を行う。
【０６０１】
ファイルマッピングによるファイル操作では、ハードディスク２２に記憶されている実ファイルの全体を、メモリに、仮想ファイル（ファイルマッピングオブジェクト）として展開する。ファイルマッピングによるファイル操作において、ファイルの内容を書き換える際には、その都度、メモリに展開された仮想ファイルに対して内容の書き換えが行われる。ファイルの内容の変更結果は一連の処理の最後の段階でハードディスクの実ファイルへ反映させる。
【０６０２】
発明の原理（その３）は、一般的なファイル操作にも、ファイルマッピングによるファイル操作にも適用することができる。
【０６０３】
（ファイルマッピングによるファイル操作）
発明の原理（その３）を、ファイルマッピングによるファイル操作に適用した場合について説明する。
【０６０４】
本発明プログラムは、第２実施形態と同様の３つの機能を有する。
【０６０５】
第１の機能は、現在動作中のプログラムや、後ほど起動するプログラムである監視対象プロセスが使用するWindows APIをフックする機能である。
【０６０６】
第２の機能は、フックしたWindows APIにより、監視対象プロセスの挙動を記録する機能である。
【０６０７】
第３の機能は、第２の機能により記録した挙動によりランサムウェアであるかどうかを判断する機能である。
【０６０８】
（Hook関数及びそれに追加する機能）
本実施形態におけるHook関数及びそれに追加する機能を説明する。
【０６０９】
本実施形態におけるフック対象ＡＰＩは、第３実施形態と同様、次の通りである。
【０６１０】
CreateFileMapping
MapViewOfFile/MapViewOfFileEx
UnmapViewOfFile/UnmapViewOfFileEx
FlushViewOfFile
CloseHandle
本実施形態では、上記のフック対象ＡＰＩをフックするHook関数に次のような機能を追加する。
（ａ）自身のプロセスが既定のプログラムであるかを確認する機能。
（ｂ）HookCreateFileMapping関数の「暗号化対象ファイルの暗号化前のヘッダデータ」をメモリマップドリストに登録する際に、併せて「暗号化対象ファイルの暗号化前のデータ部のハッシュ値」を取得し登録する機能。
（ｃ）HookMapViewOfFile関数、HookMapViewOfFileEx関数、HookUnmapViewOfFile関数、HookUnmapViewOfFileEx関数、FlushViewOfFile関数、CloseHandle関数において、「暗号化後（フック関数呼び出し時点）のデータ部のハッシュ値」を取得する機能。
（ｄ）自身のプロセスが既定のプログラムでない場合、かつ取得した暗号化前後のデータ部のハッシュ値を比較し異なる場合に検知する機能。
【０６１１】
（第３の機能のまとめ）
明示的にマップのクローズ・反映処理が行われる場合の動作について、図７９を用いて時系列に沿って説明する。
【０６１２】
まず、ステップ１では、HookCreateFileMappingにより、メモリマップドリストに新しい行が追加される。新しい行には、暗号化対象ファイルのハンドル、暗号化対象ファイルパス、ファイルマッピングオブジェクトのハンドル、暗号化対象ファイルの暗号化前のヘッダデータ、暗号化前のデータ部のハッシュ値が記入される。
【０６１３】
図７９では、暗号化対象ファイルのハンドルが「0xABC」であり、暗号化対象ファイルパスが「C:\test.pdf」であり、ファイルマッピングオブジェクトのハンドルが「0xABCD」であり、暗号化対象ファイルの暗号化前のヘッダデータが「25 50 44 46 2D」であり、暗号化前のデータ部のハッシュ値が「4669.....CBD7」である。
【０６１４】
次に、ステップ２では、HookMapViewOfFile/HookMapViewOfFileExにより、メモリマップドリストに、マップの開始アドレスが記入される。
【０６１５】
図７９では、呼び出し時のパラメータに指定されたファイルマッピングオブジェクトハンドル「0xABCD」がメモリマップドリスト内に存在したので、その行にマップ開始アドレス「0x201000」が追記される。
【０６１６】
次に、ステップ３では、監視対象プロセスがランサムウェアであるとマップドメモリのデータが暗号化される。
【０６１７】
次に、ステップ４では、HookUnmapViewOfFile/HookUnmapViewOfFileEx、又は、HookFlushViewOfFileにより、まず、UnmapViewOfFile/UnmapViewOfFileEx、又は、HookFlushViewOfFileの呼び出し時のパラメータに指定されたアドレスとマッチするものを「マップの開始アドレス」列から検索する（ステップ４−３）。
【０６１８】
次に、マッチする行があれば、その行のデータ部（暗号化前）のハッシュ値と、マップドメモリから取得した現在のデータ部（暗号化後）のハッシュ値を計算する。続いて、暗号化前のデータ部のハッシュ値と暗号化後のデータ部のハッシュ値とを比較して、差異があれば暗号化されたと判断する。そのようにして、監視対象プロセスがランサムウェアであるか否かを判断する（ステップ４−２）。
【０６１９】
図７９では、呼び出し時のパラメータ「0xABCD」から、暗号化前のデータ部のハッシュ値「4669.....CBD7」を取得し、呼び出し時のパラメータ「0xABCD」により指定されたアドレス「0x201000」から現在の暗号化後のデータ部のハッシュ値「B66A1.....40AB」を取得する。これらを比較すると差異があるので、監視対象プロセスはランサムウェアであると判断する。
【０６２０】
データ部のハッシュ値が何らかの理由で正しく取得できない場合には、（第３の機能（その２）：明示的にマップのクローズ・反映処理が行われない場合）と同様に、２つ目のファイル暗号化処理の初期段階（MapViewOfFile/Exの呼び出しタイミング）で検知を試みる。
【０６２１】
（ランサムウェアの検知処理）
ランサムウェアの検知処理の詳細について、図８０のフローチャートを用いて説明する。
【０６２２】
HookUnmapViewOfFile/HookUnmapViewOfFileEx、又は、HookFlushViewOfFileを用いた場合のランサムウェアの検知処理である。
【０６２３】
まず、UnmapViewOfFile/UnmapViewOfFileEx、又は、HookFlushViewOfFileの呼び出し時のパラメータ「lpBaseAddress」に指定されたアドレスがメモリマップドリストに存在するか否かを判断する（ステップＳ４１）。
【０６２４】
そのアドレスがメモリマップドリストに存在しなければ、直ちにランサムウェアの検知処理を終了する。
【０６２５】
そのアドレスがメモリマップドリストに存在すると、その行のヘッダデータ（暗号化前）を取得する（ステップＳ４２）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０６２６】
次に、呼び出し時のパラメータ「lpBaseAddress」により指定されたアドレスから現在のヘッダデータ（暗号化後）を取得する（ステップＳ４３）。これは、現在のメモリ２３の仮想ファイルから取得したデータである。
【０６２７】
次に、取得した暗号化前のヘッダデータと暗号化後のヘッダデータとを比較して、相違するか否かを判断する（ステップＳ４４）。
【０６２８】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ４５）。
【０６２９】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違しなければ、監視対象プログラム自身が対象ファイルの拡張子に関連付けられたアプリケーションである否かを判断する（ステップＳ４６）。
【０６３０】
監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションであれば、直ちにランサムウェアの検知処理を終了する。
【０６３１】
監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションでなければ、該当した行の暗号化前のデータ部のハッシュ値を取得する（ステップＳ４７）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０６３２】
次に、lpBaseAddress（マップドメモリ）から現在のデータ部を取得し、そのハッシュ値を計算する（ステップＳ４８）。これは、現在のメモリ２３の仮想ファイルから取得したデータである。
【０６３３】
次に、暗号化前のデータ部のハッシュ値と現在のデータ部のハッシュ値とを比較して、相違するか否かを判断する（ステップＳ４９）。
【０６３４】
暗号化前のデータ部のハッシュ値と暗号化後のデータ部のハッシュ値が相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ４５）。
【０６３５】
暗号化前のデータ部のハッシュ値と暗号化後のデータ部のハッシュ値が相違しなければ、ランサムウェアの検知処理を終了する。
【０６３６】
（一般的なファイル操作）
発明の原理（その３）を、一般的なファイル操作に適用した場合について説明する。
【０６３７】
一般的なファイル操作におけるファイルの読み書きの処理では、その都度、メモリにバッファ（図示せず）を用意してハードディスク上の実ファイルを読み込み、編集したデータをファイルに書き戻す、といった一連の処理を行う。
【０６３８】
一般的なファイル操作の場合には、監視対象プログラムが、対象ファイルの拡張子に関連付けされていないアプリケーションであって、データ部に対しWriteFileが呼び出されるか否かを検知する。
【０６３９】
本実施形態では、WriteFileをフックするHookWriteFile関数に以下の処理を追加する。
（ａ）自身のプロセスが既定のプログラムであるかを確認する機能。
（ｂ）自身のプロセスが既定のプログラムでない場合に検知する機能。
【０６４０】
ランサムウェアの検知処理の詳細について、図８１のフローチャートを用いて説明する。
【０６４１】
HookWriteFile関数を用いた場合のランサムウェアの検知処理である。
【０６４２】
まず、書き込み対象ファイルが過去のReadFileの記録に存在するか否かを判断する（ステップＳ５１）。過去のReadFileの記録とは、図２２（ｂ）に示すようなReadFileの通知記録データである。ここには、ReadFileのプロセスＩＤ、ファイルパスが順次記録されている。
【０６４３】
書き込み対象ファイルが過去のReadFileの記録に存在しなければ、直ちにランサムウェアの検知処理を終了する。
【０６４４】
書き込み対象ファイルが過去のReadFileの記録に存在すると、書き込み対象位置がヘッダの範囲内であるか否かを判断する（ステップＳ５２）。
【０６４５】
書き込み対象位置がヘッダの範囲内であると、その行のヘッダデータ（暗号化前）を取得する（ステップＳ５３）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０６４６】
次に、書き込みデータの内容から現在のヘッダデータ（暗号化後）を取得する（ステップＳ５４）。これは、現在のメモリ２３の仮想ファイルから取得したデータである。
【０６４７】
次に、取得した暗号化前のヘッダデータと暗号化後のヘッダデータとを比較して、相違するか否かを判断する（ステップＳ５５）。
【０６４８】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ５６）。
【０６４９】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違しなければ、直ちにランサムウェアの検知処理を終了する。
【０６５０】
ステップＳ５２において、書き込み対象位置がヘッダの範囲内でないと判断されると、監視対象プログラム自身が対象ファイルの拡張子に関連付けられたアプリケーションである否かを判断する（ステップＳ５７）。
【０６５１】
監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションであれば、直ちにランサムウェアの検知処理を終了する。
【０６５２】
監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションでなければ、書き込み前のデータ部（書き込み対象箇所のデータ）を取得する（ステップＳ５８）。これは、現在のハードディスク２２の実ファイルから取得するデータである。
【０６５３】
次に、書き込み対象データを取得する（ステップＳ５９）。これは、現在のメモリ２３のバッファから取得するデータである。
【０６５４】
次に、書き込み前後のデータの内容が相違するか否かを判断する（ステップＳ６０）。すなわち、ステップＳ５８で取得した書き込み前の書き込み対象箇所のデータと、ステップＳ５９で取得した書き込み対象データとを比較して、相違するか否かを判断する（ステップＳ６０）。
【０６５５】
書き込み前後のデータの内容が相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ５６）。
【０６５６】
書き込み前後のデータの内容が相違しなければ、ランサムウェアの検知処理を終了する。
【０６５７】
上記実施形態では、ファイルへの書き込み命令（WriteFile）によるヘッダデータの変更又はデータ部の書き込み前後のデータの変更を検知したが、ヘッダデータの変更やデータ部のデータの変更以外の他のファイル構造の不適切な状態への変更を検知してもよい。
【０６５８】
（一般的なファイル操作の変形実施形態）
発明の原理（その３）を、一般的なファイル操作に適用した場合の変形実施形態について説明する。
【０６５９】
第４実施形態における上記説明では、監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションでないことを検知し、かつ、WriteFileによる書き込み前後のデータが相違することを検知した場合に、監視対象プロセスをランサムウェア又はその疑いとして検知している。
【０６６０】
しかしながら、WriteFileの呼び出し自体が、監視対象プログラムによる書き込みを行う意思を明確に示していると言える。WriteFileによる書き込み前後のデータの相違を検知しなくとも、監視対象プロセスをランサムウェア又はその疑いとして検知してもよい。
【０６６１】
このようなランサムウェアの検知処理の詳細について、図８２のフローチャートを用いて説明する。
【０６６２】
HookWriteFile関数を用いた場合のランサムウェアの検知処理である。
【０６６３】
まず、書き込み対象ファイルが過去のReadFileの記録に存在するか否かを判断する（ステップＳ７１）。過去のReadFileの記録とは、図２２（ｂ）に示すようなReadFileの通知記録データである。ここには、ReadFileのプロセスＩＤ、ファイルパスが順次記録されている。
【０６６４】
書き込み対象ファイルが過去のReadFileの記録に存在しなければ、直ちにランサムウェアの検知処理を終了する。
【０６６５】
書き込み対象ファイルが過去のReadFileの記録に存在すると、書き込み対象位置がヘッダの範囲内であるか否かを判断する（ステップＳ７２）。
【０６６６】
書き込み対象位置がヘッダの範囲内であると、その行のヘッダデータ（暗号化前）を取得する（ステップＳ７３）。これは、前もってハードディスク２２の実ファイルから取得したデータである。
【０６６７】
次に、書き込みデータの内容から現在のヘッダデータ（暗号化後）を取得する（ステップＳ７４）。これは、現在のメモリ２３の仮想ファイルから取得したデータである。
【０６６８】
次に、取得した暗号化前のヘッダデータと暗号化後のヘッダデータとを比較して、相違するか否かを判断する（ステップＳ７５）。
【０６６９】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違すれば、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ７６）。
【０６７０】
暗号化前のヘッダデータと暗号化後のヘッダデータが相違しなければ、直ちにランサムウェアの検知処理を終了する。
【０６７１】
ステップＳ７２において、書き込み対象位置がヘッダの範囲内でないと判断されると、監視対象プログラム自身が対象ファイルの拡張子に関連付けられたアプリケーションである否かを判断する（ステップＳ７７）。
【０６７２】
監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションでなければ、監視対象プロセスをランサムウェア又はその疑いとして検知する（ステップＳ７６）。
【０６７３】
監視対象プログラムが対象ファイルの拡張子に関連付けられたアプリケーションであれば、ランサムウェアの検知処理を終了する。
【０６７４】
上記変形実施形態では、ファイルへの書き込み命令（WriteFile）によるヘッダデータの変更を検知したが、ヘッドデータの変更を検知しなくともよい。また、ヘッダデータの変更やデータ部のデータの変更以外の他のファイル構造の不適切な状態への変更を検知してもよい。
【０６７５】
［変形実施形態］
本発明は上記実施形態に限らず種々の変形が可能である。
【０６７６】
例えば、上記実施形態では、マイクロソフトのオペレーティングシステムであるマイクロソフトウィンドウズ（Microsoft Windows）に本発明を適用したが、Android、BSD、iOS、Linux、OS X、Windows Phone、IBM z/OS（全て登録商標）等の他のオペレーティングシステムに本発明を適用してもよい。各オペレーティングシステムに対するランサムウェアによる攻撃を確実かつ有効に阻止することができる。
【０６７７】
また、上記実施形態では、実ファイルがハードディスクに記録されている場合に本発明を適用したが、ハードディスク以外のディスク、例えば、ソリッドステートドライブ（ＳＳＤ）等の半導体素子メモリを用いたストレージや、携帯電話、スマートフォン等に用いられる半導体素子メモリを用いたストレージに、実ファイルが記録されている場合に本発明を適用してもよい。
【符号の説明】
【０６７８】
１０…情報処理装置
２０…コンピューター（ＰＣ）
３０…外部周辺装置
２１…ＣＰＵ
２２…ハードディスク
２３…メモリ
２４…入出力装置
２５…ディスプレイ
３１…プリンター
３２…外部記憶装置
【図１】
2018195155.tif 000003
【図２】
2018195155.tif 000004
【図３】
2018195155.tif 000005
【図４】
2018195155.tif 000006
【図５】
2018195155.tif 000007
【図６】
2018195155.tif 000008
【図７】
2018195155.tif 000009
【図８】
2018195155.tif 000010
【図９】
2018195155.tif 000011
【図１０】
2018195155.tif 000012
【図１１】
2018195155.tif 000013
【図１２】
2018195155.tif 000014
【図１３】
2018195155.tif 000015
【図１４】
2018195155.tif 000016
【図１５】
2018195155.tif 000017
【図１６】
2018195155.tif 000018
【図１７】
2018195155.tif 000019
【図１８】
2018195155.tif 000020
【図１９】
2018195155.tif 000021
【図２０】
2018195155.tif 000022
【図２１】
2018195155.tif 000023
【図２２】
2018195155.tif 000024
【図２３】
2018195155.tif 000025
【図２４】
2018195155.tif 000026
【図２５】
2018195155.tif 000027
【図２６】
2018195155.tif 000028
【図２７】
2018195155.tif 000029
【図２８】
2018195155.tif 000030
【図２９】
2018195155.tif 000031
【図３０】
2018195155.tif 000032
【図３１】
2018195155.tif 000033
【図３２】
2018195155.tif 000034
【図３３】
2018195155.tif 000035
【図３４】
2018195155.tif 000036
【図３５】
2018195155.tif 000037
【図３６】
2018195155.tif 000038
【図３７】
2018195155.tif 000039
【図３８】
2018195155.tif 000040
【図３９】
2018195155.tif 000041
【図４０】
2018195155.tif 000042
【図４１】
2018195155.tif 000043
【図４２】
2018195155.tif 000044
【図４３】
2018195155.tif 000045
【図４４】
2018195155.tif 000046
【図４５】
2018195155.tif 000047
【図４６】
2018195155.tif 000048
【図４７】
2018195155.tif 000049
【図４８】
2018195155.tif 000050
【図４９】
2018195155.tif 000051
【図５０】
2018195155.tif 000052
【図５１】
2018195155.tif 000053
【図５２】
2018195155.tif 000054
【図５３】
2018195155.tif 000055
【図５４】
2018195155.tif 000056
【図５５】
2018195155.tif 000057
【図５６】
2018195155.tif 000058
【図５７】
2018195155.tif 000059
【図５８】
2018195155.tif 000060
【図５９】
2018195155.tif 000061
【図６０】
2018195155.tif 000062
【図６１】
2018195155.tif 000063
【図６２】
2018195155.tif 000064
【図６３】
2018195155.tif 000065
【図６４】
2018195155.tif 000066
【図６５】
2018195155.tif 000067
【図６６】
2018195155.tif 000068
【図６７】
2018195155.tif 000069
【図６８】
2018195155.tif 000070
【図６９】
2018195155.tif 000071
【図７０】
2018195155.tif 000072
【図７１】
2018195155.tif 000073
【図７２】
2018195155.tif 000074
【図７３】
2018195155.tif 000075
【図７４】
2018195155.tif 000076
【図７５】
2018195155.tif 000077
【図７６】
2018195155.tif 000078
【図７７】
2018195155.tif 000079
【図７８】
2018195155.tif 000080
【図７９】
2018195155.tif 000081
【図８０】
2018195155.tif 000082
【図８１】
2018195155.tif 000083
【図８２】
2018195155.tif 000084
【手続補正書】
【提出日】平成29年6月28日(2017.6.28)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項２】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項３】
請求項１又は２記載のプログラムにおいて、
前記第３の条件は、マッピング時の前記実ファイルのヘッダ情報とアンマッピング時の前記実ファイル又は前記仮想ファイルのヘッダ情報とが相違することである
ことを特徴とするプログラム。
【請求項４】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項５】
請求項１乃至４のいずれか１項に記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する関数、又は、前記仮想ファイルを前記メモリにマッピングする関数が呼び出されると、前記第１の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項６】
請求項１記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを前記メモリからアンマッピングする関数、前記仮想ファイルの一部を前記ディスクに書き込む関数、又は、前記仮想ファイルのハンドルを閉じる関数が呼び出されると、前記第２の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項７】
請求項２記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する関数、又は、前記仮想ファイルを前記メモリにマッピングする関数が連続して呼び出されると、前記第４の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項８】
請求項１乃至７のいずれか１項に記載のプログラムにおいて、
前記コンピューターを、更に、
前記所定のプロセスにより前記実ファイルが前記仮想ファイルとして前記メモリ上にマッピングされる時に前記実ファイルをバックアップしたバックアップファイルを生成し、前記判断部が前記所定のプロセスをランサムウェアと判断した場合には、前記バックアップファイルを前記ディスク上の前記実ファイルに書き戻すバックアップ部
として機能させるためのプログラム。
【請求項９】
コンピューターを、
所定のプロセスによりディスク上の実ファイルへの書き込み関数が呼び出されたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項１０】
請求項９記載のプログラムにおいて、
前記判断部は、前記書き込み関数により前記実ファイルのファイル構造が不適切な状態に変更されているという第９の条件を更に満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とするプログラム。
【請求項１１】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１２】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１３】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１４】
コンピューターに、
所定のプロセスによりディスク上の実ファイルへの書き込み関数が呼び出されたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１５】
請求項１乃至１４のいずれか１項に記載のプログラムを記録したコンピューター読み取り可能な記録媒体。
【請求項１６】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１７】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１８】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１９】
所定のプロセスによりディスク上の実ファイルへの書き込み関数が呼び出されたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項２０】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項２１】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項２２】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項２３】
所定のプロセスによりディスク上の実ファイルへの書き込み関数が呼び出されたという第７の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第８の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１１２
【補正方法】変更
【補正の内容】
【０１１２】
その次の図８（ｃ）のキャプチャは、FindFirstFileWに、フォルダ"C:\Users\*"より下層のフォルダである"C:\Users\Public\*"が引数として渡されていることを示している。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】０１１３
【補正方法】変更
【補正の内容】
【０１１３】
更にその次の図８（ｄ）のキャプチャは、FindFirstFileWに、フォルダ"C:\Users\Public\*"より下層のフォルダである"C:\Users\Public\Videos\*"が引数として渡されていることを示している。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】０１１９
【補正方法】変更
【補正の内容】
【０１１９】
図１０は、ランサムウェアCryptoWallによりアクセスされる前と後のファイル"Wildlife.wmv"の状態を示す。図１０（ａ）が、ランサムウェアCryptoWallによりアクセスされる前の状態であり、図１０（ｂ）が、ランサムウェアCryptoWallによりアクセスされた後の状態である。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】０１７７
【補正方法】変更
【補正の内容】
【０１７７】
通知記録データの定期的クリアの間隔は任意であるが、長くともオペレーティングシステムの終了時または再起動時にはクリアすることが望ましい。クリア間隔をユーザーが設定できるようにしてもよい。
【手続補正６】
【補正対象書類名】明細書
【補正対象項目名】０２０５
【補正方法】変更
【補正の内容】
【０２０５】
図２２（ａ）左部の監視対象プロセスに組み込まれたHookWriteFileは、自身（監視対象プロセス）のプロセスＩＤと、WriteFileの対象ファイルパスに基づいて、図２２（ａ）右部の本発明プログラムのプロセスに対して、ReadFileの通知記録データ中に、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があるか否かを問い合わせる。図２２（ａ）右部の本発明プログラムは、同一プロセスＩＤ、同一対象ファイルパスのReadFileの記録があるか否かをHookWriteFileに応答する。
【手続補正７】
【補正対象書類名】明細書
【補正対象項目名】０２３９
【補正方法】変更
【補正の内容】
【０２３９】
組み込まれたHookReadFileは、通常のReadFileの動作に加えて、（ａ）通知元ＡＰＩ名、（ｂ）自身のプロセスＩＤ、（ｃ）ReadFile対象ファイルパスを、図２６右側の本発明プロセスに通知する。
【手続補正８】
【補正対象書類名】明細書
【補正対象項目名】０２７４
【補正方法】変更
【補正の内容】
【０２７４】
図３７の通知記録データには、第４〜６行に、FindNextFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第７〜９行、第１３〜１５行に、ReadFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第１０〜１２行、第１６〜１８行に、WriteFileのプロセスＩＤ"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録がある。
【手続補正９】
【補正対象書類名】明細書
【補正対象項目名】０２７８
【補正方法】変更
【補正の内容】
【０２７８】
図３８は、複数ファイルに対する暗号化処理の検知を有効にするかの設定画面である。図３８の設定画面の表現方法は一例であり、他の表現方法でもよい。設定画面では、チェックボタンの後に「複数のファイルに対する暗号化処理を検知条件の入れる」を表示すると共に、「チェックを入れない場合は単一ファイルに対する暗号化処理も検知対象に含まれます」との注意書きを表示する。ユーザーがチェックボタンをチェックすることに検知条件を変更することができる。
【手続補正１０】
【補正対象書類名】明細書
【補正対象項目名】０２９０
【補正方法】変更
【補正の内容】
【０２９０】
上記を判断するためには、例えば、HookReadFile、HookWriteFileが、それぞれ、本発明プログラムに対して通知する（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）ファイルパス、MoveFileが、本発明プログラムに対して通知する（ａ）通知元ＡＰＩ名、（ｂ）プロセスＩＤ、（ｃ）第一引数のファイルパス、（ｄ）第二引数のファイルパスを、通知記録データに記録しておき、その通知記録データに基づいて判断する。
【手続補正１１】
【補正対象書類名】明細書
【補正対象項目名】０２９８
【補正方法】変更
【補正の内容】
【０２９８】
警告画面では「以下のプロセスがテキストファイルの改変挙動を行っています。どう処理しますか。」と尋ね、「プロセス：AAAA.exe」、「該当挙動：ファイル内容の改変、ファイル名の改変、「d1g2r.vvv」に変更しようとしています」、「対象ファイル：C:\Users\test\Document\BBB.pdf」を示す。
【手続補正１２】
【補正対象書類名】明細書
【補正対象項目名】０３０４
【補正方法】変更
【補正の内容】
【０３０４】
本発明の第１実施形態は、主なランサムウェアの挙動を分析して共通部分を洗い出し、そこから確実に不正であると判断できる挙動を検知・防御するものである。しかしながら、分析したランサムウェアによる手法でなくても、ファイルの暗号化処理の防御は可能である。
【手続補正１３】
【補正対象書類名】明細書
【補正対象項目名】０３２９
【補正方法】変更
【補正の内容】
【０３２９】
条件３：MoveFileの第一引数のファイルが、リストＢに含まれている。すなわち、HookWriteFileから通知されるプロセスＩＤが、HookMoveFileから通知されるプロセスＩＤと同一であり、かつ、HookWriteFileから通知されるファイルパスが、HookMoveFileから通知される第一引数のファイルパスと同一である。
【手続補正１４】
【補正対象書類名】明細書
【補正対象項目名】０４３１
【補正方法】変更
【補正の内容】
【０４３１】
図５９は、「暗号化対象ファイルのハンドル」が「0xABC」であり、「暗号化対象ファイルパス」が「C:\test.pdf」であり、「ファイルマッピングオブジェクトのハンドル」が「0xABCD」であり、「暗号化対象ファイルの暗号化前のヘッダデータ」が「25 50 44 46 2D」であることを示している。
【手続補正１５】
【補正対象書類名】明細書
【補正対象項目名】０４７０
【補正方法】変更
【補正の内容】
【０４７０】
（第３の機能：記録を使用してランサムウェアであるかどうかを判断する機能）
本発明プログラムの第３の機能は、第２の機能により記録した挙動により監視対象プロセスがランサムウェアであるかどうかを判断する。監視対象プロセスが、明示的にマップのクローズ・反映処理を行う場合と、明示的にマップのクローズ・反映処理が行わない場合とがあり、それぞれの場合を想定した処理を行う。
【手続補正１６】
【補正対象書類名】明細書
【補正対象項目名】０５４４
【補正方法】変更
【補正の内容】
【０５４４】
まず、メモリマップドリストの走査を開始する（ステップＳ３１）。
【手続補正書】
【提出日】平成29年9月8日(2017.9.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項２】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項３】
請求項１又は２記載のプログラムにおいて、
前記第３の条件は、マッピング時の前記実ファイルのヘッダ情報とアンマッピング時の前記実ファイル又は前記仮想ファイルのヘッダ情報とが相違することである
ことを特徴とするプログラム。
【請求項４】
コンピューターを、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
として機能させるためのプログラム。
【請求項５】
請求項１乃至４のいずれか１項に記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する関数、又は、前記仮想ファイルを前記メモリにマッピングする関数が呼び出されると、前記第１の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項６】
請求項１記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを前記メモリからアンマッピングする関数、前記仮想ファイルの一部を前記ディスクに書き込む関数、又は、前記仮想ファイルのハンドルを閉じる関数が呼び出されると、前記第２の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項７】
請求項２記載のプログラムにおいて、
前記判断部は、前記所定のプロセスにより、前記仮想ファイルを作成する関数、又は、前記仮想ファイルを前記メモリにマッピングする関数が連続して呼び出されると、前記第４の条件を満足すると判断する
ことを特徴とするプログラム。
【請求項８】
請求項１乃至７のいずれか１項に記載のプログラムにおいて、
前記コンピューターを、更に、
前記所定のプロセスにより前記実ファイルが前記仮想ファイルとして前記メモリ上にマッピングされる時に前記実ファイルをバックアップしたバックアップファイルを生成し、前記判断部が前記所定のプロセスをランサムウェアと判断した場合には、前記バックアップファイルを前記ディスク上の前記実ファイルに書き戻すバックアップ部
として機能させるためのプログラム。
【請求項９】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１０】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１１】
コンピューターに、
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断手順
を実行させるプログラム。
【請求項１２】
請求項１乃至１１のいずれか１項に記載のプログラムを記録したコンピューター読み取り可能な記録媒体。
【請求項１３】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１４】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１５】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
【請求項１６】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスにより前記仮想ファイルがアンマッピングされるという第２の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項１７】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記第１の条件が連続して発生するという第４の条件と、アンマッピング時の前記実ファイル又は前記仮想ファイルのファイル構造が不適切な状態に変更されているという第３の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【請求項１８】
所定のプロセスによりディスク上の実ファイルが前記実ファイルに対応する仮想ファイルとしてメモリ上にマッピングされるという第１の条件と、前記所定のプロセスが前記実ファイルのファイル種別に関連付けられていないプログラムであるという第５の条件と、マッピング時の前記実ファイルの情報とアンマッピング時の前記実ファイル又は前記仮想ファイルの情報とが相違するという第６の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。