情報処理システムおよびプログラム
【課題】デバッガによるプログラムの解析行為を防止することができるようにしたプログラムを提供する。
【解決手段】このプログラムは、コンピュータに、保護対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能と、前記監視プログラム起動機能によって起動された監視プログラムによって前記保護対象プログラムを起動またはアタッチするプログラム起動機能を実現させる。
【解決手段】このプログラムは、コンピュータに、保護対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能と、前記監視プログラム起動機能によって起動された監視プログラムによって前記保護対象プログラムを起動またはアタッチするプログラム起動機能を実現させる。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理システムおよびプログラムに関する。
【背景技術】
【0002】
従来より、機密保護などの目的でデータやプログラムを暗号化することが行われている。
しかし、第三者によって、暗号化されたデータやプログラムが解析され、そのデータ等が盗用されたりする危険性が存在する。そこで、データやプログラムをこのような不正アクセスから保護することが必要である。プログラムの解析による改ざんなどの不正行為に対して、主にソフトウェアのみでその行為を防ぐ(解析を難しくする)というソフトウェア耐タンパー技術、あるいは難読化技術と呼ばれる技術がある。
【0003】
これらに関連する技術として、例えば、特許文献1には、ソフトウェアを分割し、一部をサーバ上に配置して、使用する毎に、クライアントにサーバからプログラムの一部を送る方法が開示されている。
また、例えば、特許文献2には、プログラムの一部を暗号化しておいて、適宜復号する方法を前提として、それをリロケーション処理の必要なOS上で実現するための方法が開示されている。
また、例えば、特許文献3には、プログラムの一部を暗号化しておいて、適宜復号する方法であり、その過程を複雑化した方法が開示されている。
また、例えば、特許文献4には、プログラムの関数呼び出しを、関数ポインタおよびそのテーブルを経由して行うことで、関数間の呼び出し関係を難読化する方法が開示されている。
また、例えば、特許文献5には、プログラムの制御構造(ループなど)を複雑化する方法が開示されている。
【0004】
特許文献1から特許文献5に開示されている技術は、プログラムの解析行為を難しくするものである。つまり、基本的にプログラムの制御構造を複雑化したり、プログラムの一部を暗号化したりするなどの技術である。
一方、プログラムは、通常、デバッガなどにより容易に動作解析が可能である。このため、プログラムに秘密情報が含まれている場合には、プログラムを解析することによって容易に秘密情報が盗み出されるという事態が生じ得る。
これらに関連する技術として、例えば、特許文献6には、ソフトウェアが現在デバッガ上で実行されているかどうかをプロセッサのフラグを参照することで検出し、検出されたらプログラムの実行を停止する方法が開示されている。
【特許文献1】特開平08−016385号公報
【特許文献2】特許第3033562号公報
【特許文献3】特開2005−018725号公報
【特許文献4】特開2003−337629号公報
【特許文献5】特開2004−185064号公報
【特許文献6】特開平11−175336号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
本発明は、このような背景技術の状況の中でなされたもので、デバッガによるプログラムの解析行為を防止することができるようにした情報処理システムおよびプログラムを提供することを目的としている。
【課題を解決するための手段】
【0006】
かかる目的を達成するための本発明の要旨とするところは、次の各項の発明に存する。
[1] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
秘密の値である秘密値を記憶している第1の秘密値記憶機能
を実現させ、
前記監視プログラムは、
前記保護対象プログラムの前記第1の秘密値記憶機能に記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶機能
を実現させ、
前記保護対象プログラムは、
前記第2の秘密値記憶機能によって記憶されている秘密値は、前記第1の秘密値記憶機能によって記憶されている秘密値と同じであるか否かを判断する判断機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0007】
[2] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0008】
[3] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶機能、
前記プログラムコードを前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0009】
[4] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0010】
[5] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記関数呼出先を記憶している関数呼出先記憶機能、
前記関数呼出先を保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0011】
[6] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記監視プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0012】
[7] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記監視プログラムに前記情報を設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0013】
[8] 前記監視プログラムは他の監視プログラムから監視されている
ことを特徴とする[1],[2],[3],[4],[5],[6]または[7]に記載のプログラム。
【0014】
[9] 前記監視プログラムは前記保護対象プログラムを監視することを解除し、
前記保護対象プログラムは前記監視プログラムを監視することを開始する
ことを特徴とする[1],[2],[3],[4],[5],[6]または[7]に記載のプログラム。
【0015】
[10] 前記監視プログラムと前記保護対象プログラムを1つのモジュールとし、
前記モジュールを起動する場合の引数によって、前記監視プログラムまたは前記保護対象プログラムを起動する
ことを特徴とする[1],[2],[3],[4],[5],[6]または[7]に記載のプログラム。
【0016】
[11] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより秘密の値である秘密値を記憶している第1の秘密値記憶手段と、
前記監視プログラムにより前記第1の秘密値記憶手段によって記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶手段と、
前記保護対象プログラムにより前記第2の秘密値記憶手段によって記憶されている秘密値は、前記第1の秘密値記憶手段によって記憶されている秘密値と同じであるか否かを判断する判断手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0017】
[12] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記保護対象プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0018】
[13] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶手段と、
前記保護対象プログラムに前記プログラムコードを設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0019】
[14] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0020】
[15] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムにより前記関数呼出先を記憶している関数呼出先記憶手段と、
前記保護対象プログラムに前記関数呼出先を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0021】
[16] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記監視プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0022】
[17] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記情報を前記監視プログラムに設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【発明の効果】
【0023】
請求項1のプログラムによれば、本構成を有していない場合に比較して、保護対象プログラムは、第2の秘密値記憶機能によって記憶されている秘密値は、第1の秘密値記憶機能によって記憶されている秘密値と同じであるか否かを判断することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0024】
請求項2のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0025】
請求項3のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0026】
請求項4のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0027】
請求項5のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、関数呼出先を保護対象プログラムに設定することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0028】
請求項6のプログラムによれば、本構成を有していない場合に比較して、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより解析されるのを防止することができる。
【0029】
請求項7のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0030】
請求項8のプログラムによれば、本構成を有していない場合に比較して、請求項1から7のプログラムによる効果に加えて、監視プログラムは他の監視プログラムから監視されることになり、監視プログラムに対する監視行為を防止することができる。
【0031】
請求項9のプログラムによれば、本構成を有していない場合に比較して、請求項1から7のプログラムによる効果に加えて、監視プログラムは保護対象プログラムの監視を解除し、保護対象プログラムは監視プログラムの監視を開始でき、他のプログラムによる監視の防止をより強固にすることができる。
【0032】
請求項10のプログラムによれば、本構成を有していない場合に比較して、請求項1から7のプログラムによる効果に加えて、保護対象プログラムを起動する場合の引数によって、監視プログラムまたは保護対象プログラムを起動することができ、他のプログラムによる監視の防止をより強固にすることができる。
【0033】
請求項11の情報処理システムによれば、本構成を有していない場合に比較して、保護対象プログラムは、第2の秘密値記憶手段によって記憶されている秘密値は、第1の秘密値記憶手段によって記憶されている秘密値と同じであるか否かを判断することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0034】
請求項12の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0035】
請求項13の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0036】
請求項14の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0037】
請求項15の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、関数呼出先を保護対象プログラムに設定することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0038】
請求項16の情報処理システムによれば、本構成を有していない場合に比較して、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0039】
請求項17の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【発明を実施するための最良の形態】
【0040】
まず、実施の形態の理解を容易にするために、デバッガの動作環境、その動作について説明する。ここで、デバッガとはあるプログラムのデバッグをするためのプログラム、デバッギとはデバッグ対象のプログラムをいう。デバッガは、一般的にはプログラム開発時に用いられ、そのプログラムの挙動を確認するために利用するソフトウェアツールである。またデバッガは、他のプログラムの挙動を監視する監視プログラムである。また、ここでは「プログラムが他のプログラムを監視する」とは、「プログラムが他のプログラムのデバッガとして動作する」ということである。
【0041】
図2は、デバッガとデバッギとの関係を示す説明図である。あるコンピュータのOS上で、デバッグ対象プログラム220(デバッギ)とそのデバッグ対象プログラム220をデバッグするためのプログラムであるデバッガ210の両者が動作しているとする。
ステップ21では、デバッガ210が、デバッグ対象プログラム220をデバッグ対象として、プロセスを生成、もしくは、既存のプロセスにデバッガとしてアタッチする。ここで、「アタッチ」とは、実行中のプロセスの挙動の監視を開始することを意味する。また、「デタッチ」とは、プロセスの挙動を監視している状態を解除(終了)することを意味する。
つまり、デバッガ210が、デバッグ対象プログラム220を起動する。このとき、デバッガ210が、デバッグ対象プログラム220のデバッガとして振舞えるように、OSのAPI(Application Program Interface)を呼び出し、パラメータを指定して起動する。例えば、ウィンドウズ(Windows、登録商標)ではAPI関数CreateProcess()が使われ、引数に"DEBUG_PROCESS"フラグを指定する。これによって、デバッグ対象プログラム220は一時停止の状態でプロセスが生成される。既に実行中のプロセス(デバッグ対象プログラム220)をデバッグすることもできる。この場合は、既存のプロセスにデバッガをアタッチするためのAPIを呼び出す。Windowsの場合は、API関数DebugActiveProcess()であり、デバッガ210をアタッチした時点でデバッグ対象プログラム220はイベントを通知し、動作を一時停止する。
【0042】
ステップ22では、デバッグ対象プログラム220が、デバッグ対象プログラム220でイベント(ブレークポイント、スレッドの生成など)が発生すると、デバッガ210に通知する。
つまり、デバッグ対象プログラム220内で、デバッガ210が設定したブレークポイント(プログラムの実行を特定のアドレスで一時停止するために用いる)が実行されたり、特定のメモリアドレスの内容が変更されたり、他のプロセスやスレッドを生成したり、などのイベントが発生すると、デバッグ対象プログラム220からデバッガ210にイベントが発生したことが知らされる(実際にはデバッグ対象プログラム220が直接知らせるのではなく、OSが介在して行われる)。イベントの通知に伴って、デバッグ対象プログラム220はプログラムの実行をそこで一時停止する。Windowsの場合は、デバッガ210がAPI関数WaitForDebugEvent()を呼び出すと、自分宛にイベント通知が来ていれば、その内容を受け取ることができる。
【0043】
ステップ23では、デバッガ210は、デバッグ対象プログラム220内の状態を取得し、表示する。その後、ユーザの指示によって、デバッグ対象プログラム220の内部状態を書き換え(ブレークポイントの設定、メモリ内容の変更など)、プロセスを続行する。
つまり、デバッガ210は、デバッグ対象プログラム220内でイベントが発生したことの通知を受け、デバッグ対象プログラム220内のメモリの内容や中断時のレジスタの内容を取得して、ユーザに理解できる形で表示し、ユーザによる次の指示を待つ。ユーザはメモリやレジスタの内容を変更し、必要ならばブレークポイントを新たに設定し、デバッグ対象プログラム220の実行を再開する。Windowsの場合は、メモリの内容を読み書きするには、API関数ReadProcessMemory/WriteProcessMemory、メモリの属性(読み込み/書き込み/実行)を書き換えるには、API関数VirtualProtectEx()、レジスタの内容の読み書きには、API関数GetThreadContext/SetThreadContext、ブレークポイントを設定するには、実行を中断させたいアドレスの実行をブレーク命令に置き換えることで、行われる。デバッグ対象プログラム220の実行を再開するには、API関数ContinueDebugEvent()が用いられる。
ステップ24では、以降、デバッグ対象プログラム220が終了するか、もしくは、デバッガ210が処理を中断するまで、ステップ22〜ステップ23の処理が繰り返される。
【0044】
このように、デバッガ210は、デバッグとしてデバッグ対象プログラム220の挙動を監視することができる。したがって、デバッガ210をデバッグ目的でなく、難読化したプログラムの挙動解析に用いることも考えられる。従来の技術では、デバッガによる解析行為そのものを防ぐ方法ではなく、デバッガを検出している部分を解析することは可能であった。
【0045】
次に、ここで実施の形態の理解をさらに容易にするために、基本的な考え方を説明する。
後述する実施の形態は、特定のプロセスに対しては、唯一のプロセスしかデバッガになれないというOS(Operating System、オペレーティングシステム、例えば、Windows(登録商標)やLinux(登録商標)など)がサポートするデバッガAPIの特徴を利用するものである。
デバッグAPIは、プログラムのデバッグを補助するために、一般的には予めOSに用意されたAPIであり、あるプロセス(プログラム)が別のプロセス(プログラム)のデバッガになれるような機能が用意されており、開発環境などが有する通常のデバッグ機能はこのデバッグAPIを利用して実現されている。
一方、デバッグAPIでは、あるプロセスのデバッガとして振舞うことができるのは、唯一のデバッグプロセスのみである。これは複数のプロセスがデバッガとして機能できると、デバッギ内の状態に一貫性が無くなるためであり(同時に複数のデバッガからメモリ内容が変更されたり、など)、OSの種類によらずデバッグAPIはこの性質がある。
そこで、デバッガによる解析を防ぐために、保護したいプロセスに対してデバッガとして動作するプロセスを予め設けることで、保護対象のプロセスに対する攻撃者によるデバッガ解析を不可能とする。
【0046】
すなわち、攻撃者による解析から防ぎたいプログラムに対して、言わばダミーのデバッガであるプロセスを起動しておくことで、攻撃者がデバッガによって解析しようとしても対象のプログラムをデバッグできないという状態を作り出すことを基本とするものである。なお、ここでダミーデバッガと呼んでいるのは、ダミーデバッガが本来のデバッグ機能のために存在しているわけではないからである。
【0047】
これを図1を用いて説明する。OS40上では、保護対象プログラム20に対してただ一つのデバッガのみを発生させるだけであり、保護対象プログラム20に対して2つ以上のデバッガを発生させることはできない。そこで、保護対象プログラム20を解析しようとする攻撃者が保護対象プログラム20の挙動を監視する攻撃者のデバッガ30を発生させようとしても、その前にダミーデバッガ10を発生させ、ダミーデバッガ10が保護対象プログラム20をデバッグしている状態にすることによって、攻撃者のデバッガ30から保護対象プログラム20に対する監視を阻止することができるようになる。
さらにダミーデバッガ10が存在しないと、保護対象プログラム20が正常に実行することができないように様々に工夫した実施の形態がある。つまり、より強力に保護するために、一方のプロセスが他方に依存するような仕組みを導入する。
【0048】
図3を用いて、後述する実施の形態の全体の構成例を説明する。なお、図3に示したブロック図は、複数の実施の形態を示したものであり、これらの一部を用いて、各種の実施の形態が実現できる。また、図3に示したモジュールを組み合わせることで、各種のプログラム解析防止プログラム、プログラム解析防止システムを構築することが可能である。
なお、モジュールとは、一般的に論理的に分離可能なソフトウェア、ハードウェア等の部品を指す。したがって、本実施の形態におけるモジュールはプログラムにおけるモジュールのことだけでなく、ハードウェア構成におけるモジュールも指す。それゆえ、本実施の形態は、プログラム、システムおよび方法の説明をも兼ねている。また、モジュールは機能にほぼ一対一に対応しているが、実装においては、1モジュールを1プログラムで構成してもよいし、複数モジュールを1プログラムで構成してもよく、逆に1モジュールを複数プログラムで構成してもよい。また、複数モジュールは1コンピュータによって実行されてもよいし、分散または並列環境におけるコンピュータによって1モジュールが複数コンピュータで実行されてもよい。また、以下、「接続」とは物理的な接続の他、論理的な接続を含む。
また、システムとは、複数のコンピュータ、ハードウェア、装置等がネットワーク等で接続されて構成されるほか、1つのコンピュータによって実現される場合も含まれる。
【0049】
図3に示すように、本実施の形態は、基本的には、攻撃者による解析から保護すべき保護対象プログラム1300、その保護対象プログラム1300を監視する監視プログラム1200、その監視プログラム1200を起動する監視プログラム起動モジュール1100を有している。
監視プログラム起動モジュール1100は、保護対象である保護対象プログラム1300を起動する場合に、保護対象プログラム1300を監視する監視プログラム1200を起動する。ここで、保護対象プログラム1300を起動する場合、保護対象プログラム1300と監視プログラム1200が起動される順番はいずれが先であってもよい。すなわち、攻撃者によるデバッガAPIが発生する前に、監視プログラム1200が起動されていればよい。監視プログラム1200が保護対象プログラム1300よりも先に起動される場合は、監視プログラム1200が保護対象プログラム1300を起動すればよい。逆に、保護対象プログラム1300が監視プログラム1200よりも先に起動される場合は、監視プログラム1200が保護対象プログラム1300にアタッチすればよい。
監視プログラム1200内のプログラム起動モジュール1210は、監視プログラム起動モジュール1100によって起動された監視プログラム1200が保護対象プログラム1300を起動または保護対象プログラム1300にアタッチする。
【0050】
保護対象プログラム1300内の確認モジュール1310は、監視プログラム1200が起動していることを確認する。また、監視プログラム1200が他の監視プログラムから監視されているか否かを確認するようにしてもよい。
保護対象プログラム1300内の第1の秘密値記憶モジュール1320は、秘密の値である秘密値を記憶している。
監視プログラム1200内の第2の秘密値記憶モジュール1220は、保護対象プログラム1300内の第1の秘密値記憶モジュール1320によって記憶されている秘密値と同じ値である秘密値を記憶している。
保護対象プログラム1300内の判断モジュール1330は、第2の秘密値記憶モジュール1220によって記憶されている秘密値は、第1の秘密値記憶モジュール1320によって記憶されている秘密値と同じであるか否かを判断する。
【0051】
監視プログラム1200内の必要情報記憶モジュール1230は、保護対象プログラム1300が処理を続行するために必要な情報を記憶している。
保護対象プログラム1300内の必要情報取得モジュール1−1340は、必要情報記憶モジュール1―1230によって記憶されている必要情報を取得する。
監視プログラム1200内のプログラムコード記憶モジュール1240は、保護対象プログラム1300のプログラムコードとして欠けているプログラムコードを記憶している。
監視プログラム1200内の復号モジュール1250は、保護対象プログラム1300の一部が暗号化されているプログラムコードを復号する。ここで復号モジュール1250は、保護対象プログラム1300内のプログラムコード取得モジュール1350から取得されるだけでなく、保護対象プログラム1300内の暗号化されたコード保持部(プログラムだけではなく、データ等も含む)を直接復号してもよい。
保護対象プログラム1300内のプログラムコード取得モジュール1350は、プログラムコード記憶モジュール1240によって記憶されているプログラムコードまたは復号モジュール1250によって復号されたプログラムコードを取得する。
【0052】
監視プログラム1200内の関数呼出先記憶モジュール1260は、関数呼出先を介して関数を呼び出すプログラムコードあるいは関数テーブルのようなデータであって、関数呼出先を記憶している。
保護対象プログラム1300内の関数呼出先取得モジュール1360は、関数呼出先記憶モジュール1260によって記憶されている関数呼出先を取得する。
保護対象プログラム1300内の必要情報記憶モジュール2―1370は、監視プログラム1200が処理を続行するために必要な情報を記憶している。
監視プログラム1200内の必要情報取得モジュール2―1270は、必要情報記憶モジュール2−1370によって記憶されている必要情報を取得する。
また、監視プログラム1200は、他の監視プログラム1200から監視されていてもよい。つまり、攻撃者による監視プログラム1200の解析を防止するために、監視プログラム1200自身が保護対象プログラム1300と同様の立場になるようにするものである。
また、監視プログラム1200は保護対象プログラム1300をデタッチ、つまり監視を解除し、保護対象プログラム1300は監視プログラム1200にアタッチ、つまり監視を開始させてもよい。すなわち、監視プログラム1200と保護対象プログラム1300の立場を逆転させるものである。
また、監視プログラム1200と保護対象プログラム1300を1つのモジュールとして作成し、そのモジュールを起動する場合の引数によって、監視プログラム1200または保護対象プログラム1300を起動するようにしてもよい。
また、監視プログラム1200は保護対象プログラム1300を起動して監視し、保護対象プログラム1300は監視プログラム1200にアタッチして監視する。つまり互いに監視し合う関係になってもよい。
【0053】
以下、図面に基づき本発明の好適な各種の実施の形態を説明する。
図4は、第1の実施の形態(ターゲットがホストを認証する例)の概念的なモジュール構成図を示している。
ここでのホスト310は図3の監視プログラム1200に対応し、ターゲット320は図3の保護対象プログラム1300に対応する。
監視プログラム(以下、「ホスト」ともいう)1200がデバッガとして、保護対象プログラム(以下、「ターゲット」ともいう)1300がデバッギとして、動作する実施の形態である。ターゲット320は、ホスト310の存在を間欠的に監視する。ここで、間欠的にとは、間隔をおいて繰り返されることの意であって、その間隔は一定時間であってもよいし、ランダムな時間間隔であってもよい。
【0054】
以下にプログラムの実行の手順を示す。
ステップ31では、ホスト310がユーザによって起動される。
ステップ32では、ホスト310がターゲット320をデバッグ対象として、ターゲット320のプロセスを生成する。つまり、ホスト310は、ターゲット320をデバッグ対象として起動する。ホスト310はその後、ターゲット320からデバッグイベントを受け取るために待機する。
ステップ33では、ターゲット320は、処理の先頭で、新規スレッドを生成し、そのスレッドで、ホスト310のプロセスが存在しているかどうかをチェックする。例えば、1分置きにホスト310のプログラムの実行ファイル名のプロセスが存在しているかどうかをチェックする。もし、存在していない場合は、ターゲット320のプログラムを終了する。
【0055】
ステップ34では、ターゲット320で特定のイベント(ブレークポイント、スレッドの生成など)が発生すると、ホスト310に通知される。
ステップ35では、ホスト310はイベントを受け取ると、それが終了イベントでない限り、ターゲット320のプロセスを続行し、引き続きイベントを待つ。
ステップ36では、以降、ターゲット320からプロセス終了イベントが通知されるまで、ステップ34〜ステップ35が繰り返される。ターゲット320からプロセス終了イベントが通知されたら、ホスト310もプロセスを終了する。
【0056】
また、上記ステップ33において、ホスト310のプロセスが正しいホスト310かどうかは、例えば、システムから、現在存在するプロセスの一覧を取得し(Windowsの場合は、EnumProcessなど)、その一つ一つのプロセスに関して、そのプロセスの起動ファイル名を取得し(Windowsの場合は、EnumProcessModulesなど)、そのモジュールの名前や属性が正しいかどうかで判定する。属性とは、そのモジュールのファイルの作成者や日付情報などである。具体的には、ファイル名に基づく認証だけでは、例えば、偽のプログラムが同一パス上に同一のファイル名で正規のプログラムと置き換えられた場合、攻撃者からの解析を阻止しにくい。しかし、上記の通りファイル名以外の属性情報を用いて認証を行えば、そのような不正な置き換えが行われた場合にも解析を阻止できる可能性が高まる。
また、ファイルに対する電子署名を確認してもよい。具体的には、不正な解析を防止するために、ターゲット320がホスト310をデジタル署名の確認などによって認証して、その認証結果が正しいホスト310の場合のみターゲット320の処理を継続させる。
【0057】
図5は、第2の実施の形態(ターゲットがホストをチャレンジ&レスポンスで認証する例)の概念的なモジュール構成図を示している。
ここでのホスト410は図3の監視プログラム1200に対応し、ターゲット420は図3の保護対象プログラム1300に対応する。
第2の実施の形態は、第1の実施の形態におけるステップ33の、ターゲット320がホスト310は正規のものであるかどうかを確認する処理を、チャレンジ&レスポンスで行う例である。チャレンジ&レスポンスとは、相手方が正しいかどうかを検証するために、何らかのチャレンジを投げ、相手方から返されたレスポンスが、チャレンジに対する正しい値かどうかをチェックすることで確認する方法である。例えば、ある秘密のバイト列を共有し、検証時に乱数を生成し、その乱数をチャレンジとして相手方に送り、相手は乱数と秘密値を連結したものを一方向性ハッシュ関数(SHA1など)に与えて得られた値を計算してレスポンスとして送り返す。レスポンスを受け取ったら、同じ計算を行って、値が一致するかどうかをチェックするというものである。この方法の場合は、秘密の値が他者に漏洩しないかぎり、相手が正しいということを認証できる。
【0058】
本実施の形態では、この方法を第1の実施の形態に適用する。具体的には第1の実施の形態のステップ33〜ステップ35を以下のようなステップ43〜ステップ45−3に変更する。ステップ36は、第2の実施の形態でも用いる。なお、これに先立って、ホスト410とターゲット420では、秘密の20バイトのデータである秘密の値Xおよび、生成した乱数Rを格納するアドレスA1と、レスポンスを格納するアドレスA2とをお互いに保持しているものとする。なお、他の実施の形態では、同様にアドレスA1、A2等を用いる場合もあるが、発明の説明の簡潔性のため明示しない場合がある。
ステップ43では、ターゲット420は、乱数Rを生成して、デバッグブレークを発生する。つまり、ターゲット420は、処理の先頭で、新規スレッドを生成する。そのスレッドは間欠的(定期的でもよく、例えば1分おきなど)に、以下の処理を行う。乱数Rを生成し、それを予め定めた特定のアドレスにセットし、デバッグブレークを発生させる。
【0059】
ステップ44では、ターゲット420の実行は中断し、デバッグブレークイベントが発生し、ホスト410に通知される。
ステップ45−1では、ホスト410はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット420の特定のアドレスA1からデータRを読み取り、その値と自分が保持する秘密の値Xを連結して、ハッシュ値Hを求め(SHA1など)、それをターゲット420の特定のアドレスA2に書き込む。
ステップ45−2では、ホスト410はターゲット420のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット420のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット420のプロセスを続行し、引き続きイベントを待つ。
ステップ45−3では、ホスト410から実行継続を指示されたターゲット420は、続いて、アドレスA1に格納してあった乱数Rと、自分が保持する秘密の値Xを連結して、ハッシュ値H'を求め、その値が、アドレスA2に格納してある値と一致するかどうかをチェックする。一致しない場合は、ターゲット420はプロセスを終了する。
【0060】
なお、第2の実施の形態では、ホスト410側とターゲット420側のデータの受け渡しのために、デバッグブレークイベントを使っているので、ホスト410がターゲット420のプロセスを生成する際に、このイベントを受け取れるように指定をして、プロセスを生成しなければならない。
【0061】
また、第2の実施の形態では、秘密のデータとハッシュ関数を用いて認証を行っているが、デジタル署名によって、同様の認証処理を行うようにしてもよい。また、デバッグブレークイベントの代わりに他の種類のイベント(スレッドが生成された、など)を使うようにしてもよい。
【0062】
図6は、第3の実施の形態(ターゲットのデータの一部をホストが保持する例)の概念的なモジュール構成図を示している。
ここでのホスト510は図3の監視プログラム1200に対応し、ターゲット520は図3の保護対象プログラム1300に対応する。
これまでの実施の形態では、ターゲットがホストの認証処理を行うのみであり、ターゲットが行うべき本来の処理には、ホストは一切かかわりが無かった。第3の実施の形態は、ターゲットプログラムの処理を続行するためには、ホスト側の助けを必要とするというものである。
ここでは、ターゲットの処理を行うために必須な何らかのデータをホスト510側が保持しておき、実行時に、ホスト510側がターゲット520側に、データを与えることによって、ターゲット520の処理が行われる例を説明する。
【0063】
第3の実施の形態は、前述の第2の実施の形態のステップ43〜ステップ45−3を以下のようなステップ53〜ステップ55−3に変更する。ステップ36は、第3の実施の形態でも用いる。なお、ターゲット520側は、処理に必要な秘密データYを予めプログラム内には保持していないものとする。
ステップ53では、ターゲット520は、本来の処理を続行する上で、必須な秘密データYを取得する必要が発生したときには、デバッグブレークを発生させる。
ステップ54では、ターゲット520の実行は中断し、デバッグブレークイベントが発生し、ホスト510に通知される。
ステップ55−1では、ホスト510はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット520の特定のアドレスAに、ホスト510側のみが保持する秘密データYを設定する。
ステップ55−2では、ホスト510はターゲット520のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット520のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット520のプロセスを続行させ、引き続きイベントを待つ。
ステップ55−3では、ホスト510から実行継続を指示されたターゲット520は、続いて、アドレスAに格納されてある秘密データYを取得して本来の処理を続行する。
【0064】
ターゲット520は、秘密データYを使用した後、直ぐに破棄することで、必要な時には毎回ホスト510側から値を取得することが必要となる。
また、ここでは、秘密のデータはYのみであると説明したが、秘密のデータをホスト510側が複数保持し、ターゲット520側が、必要なデータを指定して取得する方法も考えられる。この場合は、ホスト510は、データの識別子(番号)と、データの値の組を保持している。そして、第2の実施の形態の乱数Rの代わりにデータの識別子(番号)をあるアドレスにセットし、デバッグブレークイベントを発生させ、ホスト510は、その識別子に対応したデータをターゲット520内のアドレスAにセットするように構成すればよい。
【0065】
図7は、第4の実施の形態(ターゲットのプログラムコードの一部をホストが保持する例)の概念的なモジュール構成図を示している。
ここでのホスト610は図3の監視プログラム1200に対応し、ターゲット620は図3の保護対象プログラム1300に対応する。
第4の実施の形態は、ターゲットが持つべき処理を行うプログラムコードの一部をホスト側が保持する例である。
第4の実施の形態は、第3の実施の形態のステップ53〜ステップ55−3を以下のようなステップ63〜ステップ65−3に変更する。ステップ36は、第4の実施の形態でも用いる。なお、ターゲット620側で必要な処理を行うプログラムコードの一部が欠けている状態であるものとする。
【0066】
ステップ63では、ターゲット620は、プログラムコードが欠けている部分を実行しようとすると、デバッグブレークを発生する(プログラムを抜き出した部分の先頭に、予めデバッグブレーク命令を埋め込んでおく)。
ステップ64では、ターゲット620の実行は中断し、デバッグブレークイベントが発生し、ホスト610に通知される。
ステップ65−1では、ホスト610はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット620のプロセスのプログラムカウンタの値を読み取り、あらかじめホスト610が保持しているターゲット620のプログラムコードの一部を、ターゲット620のプログラムのプログラムカウンタの位置に埋め込む。
ステップ65−2では、ホスト610はターゲット620のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット620のプロセスを続行し、引き続きイベントを待つ。
ステップ65−3では、ホスト610から実行継続を指示されたターゲット620は、ブレークした位置の命令が既に置き換えられているので、それまでの処理を引き続き続行する。
【0067】
なお、ステップ65−1で、ホスト610がターゲット620のコード領域にプログラムコードを埋め込む際には、対象となるメモリ領域のページ属性を書き込み可能に設定することが必要な場合がある(Windowsなどは、VirtualProtectEx()で行う)。
この実施の形態では、ホスト610側はターゲット620のプログラムのプログラムコードの一部を一つしか保持しない場合を説明しているが、当然ながら複数保持するようにしても良い。その場合は、ホスト610が、埋め込むアドレス値とプログラムコードの組を保持しておけば、デバッグブレークイベントが発生したときのターゲット620のプログラムのプログラムカウンタの値を参照することで、どのプログラムコードを埋め込めばよいかを特定できる。
【0068】
ステップ65−3では、ホスト610がターゲット620にプログラムコードを一度書き込むと、その場所ではそれ以降二度とデバッグブレークが発生しなくなるが、これは、ホスト610が不要になることを意味するので、プログラムの解析に対する耐性の観点からは好ましくない。
そこで、ホスト610が書き込むターゲット620のプログラムの最後の部分をデバッグブレーク命令にしておけば、ターゲット620のプロセスが埋め込まれたコードの実行を終えると最後のデバッグブレークを実行して再びデバッグブレークイベントが発生し、ホスト610に通知され、ホスト610側はそのイベントを受け取って、先ほど埋め込んだプログラムコードをターゲット620側から消去するという処理を行わせることが可能になる。なお、ホスト610側は、デバッグイベントがプログラムコードを埋め込むべきものか、消去すべきものかをターゲット620のプロセスのプログラムカウンタの値を参照することで判別できる。あるいはデバッグブレーク命令の代わりに、ホスト610が書き込んだプログラムの最後の部分で、自分自身を元に戻す命令、すなわち、先頭にデバッグブレークを設定し、残りを消去(ゼロクリア)する命令を入れておいてもよい。
【0069】
図8は、第5の実施の形態(暗号化されたターゲットのプログラムコードをホストが復号する例)の概念的なモジュール構成図を示している。
ここでのホスト710は図3の監視プログラム1200に対応し、ターゲット720は図3の保護対象プログラム1300に対応する。
第5の実施の形態は、予め一部分が暗号化されているターゲットのプログラムコードをホスト側が復号する例である。
第5の実施の形態は、第3の実施の形態のステップ53〜ステップ55−3を以下のようなステップ73〜ステップ75−3に変更する。ステップ36は、第5の実施の形態でも用いる。なお、ターゲット720側は、一部のプログラムコードが予め暗号化されており、その復号鍵は、ホスト710側が保持するものとする。また、暗号化されたプログラムコードの始まりには、デバッグブレーク命令が配置されているものとする。なお、プログラムの暗号化に関しては、特許文献2や特許文献3などの既存の技術で実現可能である。
【0070】
ステップ73では、ターゲット720は、暗号化されたプログラムコードの部分を実行しようとすると、その直前にあるデバッグブレーク命令を実行し、デバッグブレークを発生する。なお、デバッグブレーク命令は暗号化されていない。
ステップ74では、ターゲット720の実行は中断し、デバッグブレークイベントが発生し、ホスト710に通知される。
ステップ75−1では、ホスト710はイベントを受け取り、それがデバッグブレークイベントの場合は、あらかじめホスト710が保持しているターゲット720のプログラムコードの復号鍵Kと、暗号化されているバイト長Lを使って、ターゲット720のプログラムカウンタ部分からLバイトを復号し、ターゲット720のメモリ上の命令列を書き換える。
ステップ75−2では、ホスト710は、ターゲット720のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット720のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット720のプロセスを続行し、引き続きイベントを待つ。
ステップ75−3では、ホストから実行継続を指示されたターゲット720は、既にブレークした箇所以降の命令が復号されているので、それ以降の処理を継続する。
【0071】
ステップ75−1で、ホスト710がターゲット720のコード領域にプログラムコードを埋め込む際には、対象となるメモリ領域のページ属性を書き込み可能に設定する必要があるのは前例と同様である。
この例では、ホスト710側はターゲット720のプログラムのプログラムコードの一箇所しか復号しない場合を説明しているが、当然ながら複数箇所を復号するようにしてもよい。また、復号する箇所毎に復号鍵を変更したり、アルゴリズムを変えたりするようにしても良い。その場合は、デバッグブレークイベントが発生したときのターゲット720のプログラムのプログラムカウンタの値を参照して、復号鍵を特定しても良いし、第2の実施の形態で乱数Rをホストに渡したのと同じように、復号鍵を特定するパラメータや暗号アルゴリズム、初期値などの情報をターゲット720からホスト710に渡すようにしても良い。また、復号処理はホスト710側で行うのではなく、復号鍵のみをホスト710側が提供するようにしてもよい。その場合の構成は、第3の実施の形態と同様になる。
【0072】
さらに、第4の実施の形態と同様に、ステップ75−3では、ホスト710がターゲット720にプログラムコードを一度書き込むと、その場所では平文のプログラムコードが維持されてしまうので、暗号化された範囲の最後にデバッグブレーク命令を埋め込むことで、ホストに暗号化された範囲の実行の終了を通知し、ホストが再暗号化するようにしてもよい。また、ここでは暗号化対象をプログラムコードで説明しているが、対象をデータにしてもよい。
【0073】
図9は、第6の実施の形態(ターゲットの一部の関数テーブルをホストが保持する例)の概念的なモジュール構成図を示している。
ここでのホスト810は図3の監視プログラム1200に対応し、ターゲット820は図3の保護対象プログラム1300に対応する。
第6の実施の形態は、ターゲット側が特許文献4に挙げられているように、関数の呼び出しを関数ポインタ経由で実行し、その関数ポインタの中身を特定の関数内で決定するようにプログラミングされている場合に、関数の呼び出し先を決定する処理をホスト側で実行するようにした例である。
【0074】
第6の実施の形態は、第3の実施の形態のステップ53〜ステップ55−3を以下のようなステップ83〜ステップ85−3に変更する。ステップ36は、第6の実施の形態でも用いる。なお、ターゲット820側は、少なくとも一部のプログラムコードは、関数を呼び出す際に直接呼び出すのではなく、ある関数ポインタに設定されたアドレスを呼び出すように、かつ、その呼び出し先を決定する際にデバッグブレークが発生するように、プログラミングされているものとする。また、ホストプログラムはターゲット820内の関数アドレスと、その関数を表す識別子(番号など)の対応表を持っている。
【0075】
ステップ83では、ターゲット820は、呼び出し先を決定しなければならない箇所で、呼び出し先パラメータをレジスタR1に格納しデバッグブレーク命令を実行し、デバッグブレークを発生する。
ステップ84では、ターゲット820の実行は中断し、デバッグブレークイベントが発生し、ホスト810に通知される。
ステップ85−1では、ホスト810はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット820のプロセスのレジスタR1の値を読み取り、あらかじめホスト810が保持している呼び出し先一覧リストの中からその識別子に対応する呼び出し先を決定し、そのアドレスをターゲット820のプロセス内のメモリアドレスFの位置に書き込む。
ステップ85−2では、ホスト810はターゲット820のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット820のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット820のプロセスを続行し、引き続きイベントを待つ。
ステップ85−3では、ホスト810から実行継続を指示されたターゲット820は、アドレスFに格納されているアドレス情報を関数アドレスであると解釈し、そのアドレスを関数呼び出しして、処理を続行する。
【0076】
なお、この例では、ホスト810側が決定したアドレス情報をターゲット820のメモリ内に書き込むようにしているが、ターゲット820のプログラムのプログラムカウンタを直接書き換えるようにしてもよい。この場合は、必要に応じて、関数からの戻りアドレスをターゲット820のプログラムのスタック上に設定しておく。
またホスト810側が呼び出し先を決定するようにしているが、関数テーブルそのものをターゲット820に渡して、呼び出し先の決定はターゲット820が行うようにしても良い。
【0077】
図10は、第7の実施の形態(ホストの処理に必要な処理の一部をターゲットが実行する例)の概念的なモジュール構成図を示している。
ここでのホスト910は図3の監視プログラム1200に対応し、ターゲット920は図3の保護対象プログラム1300に対応する。
これまでの実施の形態は、すべて、ターゲットの処理を続行するために、ホスト側がそれを支援する(ターゲットに必要なデータ、プログラム、処理などの一部をホスト側が保持・処理する)ものであった。しかし、第5の実施の形態のバリエーションで挙げたように、ターゲットのコードの一部を復号するための復号鍵をホスト側が保持する場合、ホストプログラム内に復号鍵が埋め込まれることになる。プログラムに埋め込まれた鍵はディスアセンブラのような静的な解析によって発見されてしまう可能性があるので、簡単には解析できないようにするのが望ましい。
そこで、第7の実施の形態では、ホスト側が処理を続行するために必要な一部のデータ・プログラム・処理などをターゲット側が提供するという方法を行う。例えば、ホスト側が保持するターゲットの復号鍵をさらに暗号化しておき、その復号をターゲット920側が行うようにする。このようにホスト910側もターゲット920の助けを借りないと処理を続行できないようにする。例えば、これまでの実施の形態とは異なり、ホスト910を主な処理を行うアプリケーションプログラムとして、ターゲット920を補助的なものとすることができる。
【0078】
本実施の形態の処理手順を以下に示す。予め、ホスト910側のデータあるいはプログラムの一部が暗号鍵Kで暗号化されているが、ホスト910側はターゲット920しか知らない秘密鍵である復号鍵Kdで暗号鍵Kを暗号化したEKしか持っていないものとする。
ステップ91では、ホスト910がユーザによって起動される。
ステップ92では、ホスト910は、ターゲット920をデバッグ対象として起動する。
ステップ93では、ターゲット920は、一時停止状態で起動され、一方でプロセスが生成されたというデバッグイベントがホスト910に通知される。
ステップ94では、ホスト910はイベントを受け取ると、暗号化された復号鍵EKのデータをターゲットのアドレスAに書き込み、ターゲット920の処理を続行させ、引き続きイベントを待つ。
【0079】
ステップ95では、ターゲット920は実行を再開すると、アドレスAから暗号化された鍵情報を読み込み、それを自分自身が保持する復号鍵Kdで復号し、結果の暗号鍵Kを再びアドレスAに書き込み、デバッグブレークを実行する。
ステップ96では、ホスト910がデバッグイベントを受け取ると、ターゲット920のアドレスAの内容を参照し、復号された結果を受け取る。以降、ホスト910側の暗号化されたデータやプログラムを暗号鍵Kで復号して実行を継続する。
【0080】
ここでは、初期化の処理時にのみ、ホスト910側がターゲット920側に処理を依頼する例であるが、ステップ96以降でターゲット920を一時停止状態で待機させておき、ホスト910で必要になったら、ステップ94以降の処理を行うというように構成する例も考えられる。このとき、ターゲット920に依頼したい処理の内容をターゲット920内のアドレスやレジスタに書き込んでから、ターゲット920の処理を続行させ、ターゲット920は指定された処理を行って、ホスト910側に値を返すというように構成することで、ターゲット920側の必要な機能をホスト910側が任意のタイミングで呼び出すことができる。ここで挙げた処理は暗号鍵を提供する例であるが、当然ながら任意の処理をターゲット920側に行わせることもできる。
また、前述の第2の実施の形態〜第6の実施の形態と組み合わせることもできる。例えば、第3の実施の形態と組み合わせて、ステップ96で得られた暗号鍵Kで、別のデータを復号すると、それがターゲット920内の暗号化されたコードを復号するための鍵を得られ、それをターゲット920に供給するというように組み合わせることもできる。
【0081】
図11は、第8の実施の形態(ホストとターゲットが協調してお互いに暗号化されたコードを実行する例)の概念的なモジュール構成図を示している。
ここでのホスト1010は図3の監視プログラム1200に対応し、ターゲット1020は図3の保護対象プログラム1300に対応する。
第8の実施の形態は、第5の実施の形態と第7の実施の形態を組み合わせたものである。第5の実施の形態では、ターゲットが任意のタイミングでホスト側に処理を依頼し、コードを復号してもらう。これに第7の実施の形態のような、ホスト側が任意のタイミングでターゲットに処理を依頼する仕組みを組み合わせる。
【0082】
以下に、本実施の形態の処理手順を示すが、処理が複雑であるので、ホスト1010側とターゲット1020側に分けて示す。
まず、ホスト1010側の処理についてである。
ステップ1101では、ホスト1010がユーザによって起動される。
ステップ1102では、ホスト1010は、ターゲット1020をデバッグ対象として起動し、ホスト1010のメインの処理を行うアプリスレッド1013を生成する。メインスレッド1011ではデバッグイベントを受け取る処理を行う。
ステップ1103−1(アプリスレッド1013の処理)では、アプリスレッド1013は元々のホスト1010の処理を続行する。ターゲット1020の処理を呼び出したいときには、ホスト1010のコマンド変数TGCMDにターゲット1020に対するコマンドを書き込み、ホスト1010のコマンド結果変数TGRESに値が書き込まれるのを待機する。
ステップ1103−2(アプリスレッド1013の処理)では、コマンド結果変数TGRESに値が書き込まれたらそれを参照して処理を続行する。以下、ステップ1103−1からステップ1103−2を必要時に繰り返す。
【0083】
ステップ1104では、デバッグイベントを受け取り、レジスタR1の値によって、ターゲット1020の要求を処理したり、ターゲット1020に処理要求を出す。具体的には、以下のステップ1104−1からステップ1104−4の処理となる。
ステップ1104−1(メインスレッド1011の処理)では、メインスレッド1011は、デバッグブレークイベントを待つ。発生したら、ターゲット1020のレジスタR1の内容を参照し、その値が特定の値(例えば0xFFFFFF01)であったら、ターゲット1020からの処理要求であると判断し、ターゲット1020のメモリ状態を読み込んで(例えば、メモリアドレスA(コマンド指定用)の内容)、処理を行い、その結果をターゲット1020に書き込んで(例えば、メモリアドレスB(結果格納用)に書き込む)、ターゲット1020を継続させる。
ステップ1104−2(メインスレッド1011の処理)では、レジスタR1の内容が別の特定の値(例えば0xFFFFFF02)である時は、ターゲット1020からの処理受付であると判断し、さらに、ホスト1010のコマンド変数TGCMDを参照し、そこにコマンドが書き込まれているときは、ターゲット1020のメモリにコマンドを書き込んで処理を継続させる。TGCMDが空であれば何もせず、ターゲット1020の処理を継続させる。
ステップ1104−3(メインスレッド1011の処理)では、レジスタR1の内容がさらに別の特定の値(例えば0xFFFFFF03)である時は、ターゲット1020からの処理結果通知であると判断し、ターゲット1020内の特定のメモリの値を読み込んで、ホスト1010のコマンド結果変数TGRESに値を書き込んで、ターゲット1020の処理を継続させる。
ステップ1104−4(メインスレッド1011の処理)では、以上のいずれでもない場合、ターゲット1020の終了イベントでなければターゲット1020の処理を継続し、終了イベントであればホスト1010も終了する。
【0084】
以下にターゲット1020側の処理手順を示す。
ステップ1201では、ターゲット1020は、ホスト1010によって起動される。
ステップ1202では、ターゲット1020は、ホスト1010に対して、コマンドを受け付けるためのスレッド(受付スレッド1022)を生成する。
ステップ1203−1(メインスレッド1021の処理)では、メインスレッド1021は処理を続行し、ホスト1010を呼び出したいときには、レジスタR1に0xFFFFFF01を入れ、また特定のメモリ領域にホスト1010に対する処理依頼内容を書き込んで、デバッグブレークイベントを発生させる。
ステップ1203−2では、処理を続行すると、ホスト1010からの処理結果がメモリ領域に書き込まれているはずなので、それを読み込んで処理を続行する。以下、ステップ1203−1からステップ1203−2を必要時に繰り返す。
【0085】
ステップ1204では、デバッグイベントを定期的に発生させながら、ホスト1010のコマンドを処理する。具体的には、以下のステップ1204−1からステップ1204−3の処理となる。
ステップ1204−1(受付スレッド1022の処理)では、一定時間毎(例えば、50msecおきなど)に、レジスタR1に0xFFFFFF02を入れて、デバッグブレークイベントを発生させる。
ステップ1204−2(受付スレッド1022の処理)では、特定のメモリ領域が空でなければ、それをホスト1010からのコマンド(処理依頼内容)と判断し、その処理を行い、結果を別のメモリ領域に書き込み、レジスタR1に0xFFFFFF03を入れて、デバッグブレークイベントを発生させる。何もなければ何もしない。
ステップ1204−3(受付スレッド1022の処理)では、ステップ1204−1からの処理を繰り返す。
【0086】
第9の実施の形態(ターゲットがホストのデバッグ状態を検出する例)を説明する。
これまでの実施の形態ではデバッギとして振舞うのはターゲットのみであるので、ホスト側をデバッガで解析する行為は防げない。そこで、ホスト側がデバッグされているかどうかをターゲット側で定期的に確認し、もし、ホスト側がデバッグされていることを検出したら、直ちに実行を停止するように構成することもできる。処理例を以下に示す。
(A)ホスト側の処理を以下に示す。
(1)ターゲットをデバッギとして起動する。このとき、自分のプロセスIDを引数として渡す。
(2)ターゲットからのデバッグイベントを待ち、終了イベントでない限りは、(2)を繰り返す。
【0087】
(B)ターゲット側の処理を以下に示す。
(1)引数として渡されたプロセスIDのプロセスがデバッグされていないかどうかをチェックするスレッドを生成する。そのスレッドは(2)の処理を行う。メインスレッドはターゲットの本来の処理(アプリケーションの機能など)を続行する。Windowsでは、CheckRemoteDebuggerPresent()というAPIを使ったり、あるいは、主流なデバッガ(Visual Studioなど)のプロセスが起動されることを検出しても良い。
(2)特定のプロセスIDのプロセスがデバッグされているかどうかを定期的(1分おきなど)にチェックし、もし、デバッグされていることを検出したら自分自身の処理を終了する。そうでなければ(2)を繰り返す。
このようにすると、ホストがデバッグされると、ターゲットをそれが検出して、プログラムを終了するようにできる。
【0088】
第10の実施の形態(多段構成の例)を説明する。
ホスト側をデバッガで解析する行為を防ぐための構成である。ホストに対するホスト、さらにはそのホストに対するホスト、というように多段階に構成する。
このとき、ホストとその下位のターゲット間の依存関係において、これまでに述べた実施の形態の様々な構成を組み合わせる。
【0089】
第11の実施の形態(相互にデバッガとして動作する例)を説明する。
ホストとターゲットの関係を対称なように(お互いがお互いのホストであり、ターゲットであるという)構成する。ステップを以下に示す。
(A)ホスト側の処理
(1)ターゲットをデバッギとして起動する。このとき、自分のプロセスIDを引数として渡す。
(2)ホストが本来行うべき処理を行うスレッドを生成する。
(3)ターゲットからのデバッグイベントを待ち、終了イベントでない限りは、(3)を繰り返す。
(B)ターゲット側の処理
(1)引数として渡されたプロセスIDに対して、自分がデバッガとしてアタッチする。アタッチに失敗したら、プロセスIDのプロセスを強制終了し、自分も終了する。
(2)ホストからのデバッグイベントを待ち、終了イベントでない限りは(2)を繰り返す。
【0090】
このようにすると、両方のプロセスが互いのプロセスのデバッガとなるので、外部からデバッグすることは一切できなくなる。上記では「アプリケーションが提供する本来の処理」をホスト側で行っているが、これはターゲット側で行ってもよいし、あるいは両者で処理してもよい。
また、この実施の形態は、お互いがお互いのデバッガとして動作するのであるが、これまで述べてきた実施の形態のようなホストとターゲットの依存関係を作り出すとより解析を困難にすることができる。
【0091】
第12の実施の形態(モジュールの構成に関する例)を説明する。
ホストとターゲットが別ファイルで、同じフォルダ内に存在していると、対応関係を推測される可能性があるので、モジュールとして一つに統合し、起動時オプションで、ホストとターゲットの動作を切り替えるようにする。ここで、オプションとは、例えば、コマンド名の後にハイフン(−)を付加して指定するものであり、そのコマンドによる処理に対する選択ができるものである。
【0092】
第13の実施の形態(ホストとターゲットのデバッガ/デバッギ関係を一定時間毎に切り替える例)を説明する。
動作しているプロセスに対して後からデバッガとしてアタッチするというAPIと対になるAPIとして、デバッガをデタッチするというAPIがある。これを利用して、あるタイミング毎にデバッガとデバッギの関係を切り替えるという方法もある。例えば、既にホストがターゲットを起動してターゲットのデバッガとして動作している状態で、以下のようにして切り替える。
【0093】
(1)ターゲット側では、一定時間毎に、レジスタに特定の値を入れるなどして、デバッガ切り替えを意味するデバッグブレークを発生させる。ターゲットは直ちに実行を停止する。
(2)ホストはデバッグイベントを受け取り、イベントがデバッガ切り替えであると判断したら、ターゲットの動作を継続させた上で、ターゲットからデタッチする。
(3)ターゲットは動作を再開したら、自分自身がデバッグされていないことを確認した上で(Windowsの場合は、IsDebuggerPresent()や、DebugActiveProcessStop()でFALSEが返るかどうか、などによって調べられる)、ホストにアタッチし、ホストからのデバッグイベントを待つ。
(4)ホストは、一定時間待ったら、(1)と同様のデバッガ切り替えのデバッグブレークを発生する。ホストは実行を停止する。
(5)ターゲットはデバッグイベントを受け取り、イベントがデバッガ切り替えであると判断したら、ホストの動作を継続させた上でホストからデタッチする。
(6)ホストは動作を再開したら、自分自身がデバッグされていないことを確認した上で、ターゲットにアタッチし、ターゲットからのデバッグイベントを待つ。
(7)上記(1)〜(6)を繰り返す。
【0094】
なお、ターゲットからホストへ制御を渡すのに、前述したブレークポイント等以外に、様々な例外(エラーによるデバッグイベント)を発生させるようにしてもよい。
ターゲットのプロセス内で、通常はエラーのときにしか発生しない例外である、0による除算や、アクセスバイオレーションなど、デバッガが存在しないと正常に実行を継続できない例外を複数回発生させる(ループ内などで)。
ホストは、どこでその例外が発生するかを把握しているので、例外が発生したら、ターゲットプロセス内の例外発生の原因を修正し(プログラムカウンタを進めたり、レジスタやメモリの内容を書き換えるなど)、処理を継続させる。これによって、ターゲット単体では実行できないようにする。
【0095】
なお、起動方法のバリエーションとして次のようにしてもよい。
これまでの実施の形態では、ホストが先に起動され、ホストからターゲットをデバッギとして起動していたが、ターゲットを普通に起動した後に、ターゲットが、自分自身のプロセスのIDを引数にしてホストを起動して、ホストがターゲットにアタッチするという構成もある。
【0096】
なお、ターゲット(デバッギ)からホスト(デバッガ)への通知(デバッグイベント)の例として、次のようにしてもよい。
デバッグイベントはプロセス/スレッドが生成/終了したとき、例外(アクセス違反など)が発生したとき、DLL(Dynamic Linking Library)をロード/アンロードしたとき、デバッグ文字列を出力したとき、などがある。これらはいずれもターゲットからホストに処理要求を通知するのに使うことができる。特にデバッグ文字列の出力は、ホストに対するパラメータを文字列として渡すことができる。
【0097】
なお、ホスト(デバッガ)からターゲット(デバッギ)への通知方法例として、次のようにしてもよい。
これまでの実施例では、ターゲットをホストが呼び出す際には、下記の2つの方法があった。
(1)ターゲット側が定期的にデバッグブレークを発生させ、そのタイミングで、コマンドがあれば、ホスト側がターゲットプロセス内のメモリに処理依頼内容を書き込んでおく方法
(2)ターゲット側は、必要がない場合は、一時停止状態で待機させておいて、ホスト側が必要になったときに、ターゲット側のプロセス内のメモリに処理依頼内容を書き込んで、処理を再開させる方法
これら以外にも、OSがサポートするAPIの種類によっては、ホスト側が強制的にターゲットの処理を中断させる方法もある(Windowsの場合は、DebugBreakProcess()、Unix(登録商標)系の場合は、kill()でシグナルを送る、など)。
【0098】
この方法を用いた処理の例を以下に示す。
(1)ターゲット側には要求処理を待つスレッドを用意しておく。
(2)ホストがターゲットを強制中断する。
(3)ホストはターゲット内の特定のメモリに要求内容を書き込んでプロセスを再開させる。
(4)ターゲットは終了したらデバッグブレークを発生させる。もしくは、別のメモリ領域に結果を書き込む。
(5)ホストは、デバッグブレークを待つ、もしくは、ターゲットの結果が書き込まれる領域を監視し、結果を受け取る。
【0099】
なお、本実施の形態としてのプログラムが実行されるコンピュータのハードウェア構成は、図12に示すように、一般的なコンピュータであり、具体的には各種アプリケーションソフトウェアが実装されたパーソナルコンピュータ等である。本実施の形態では、アプリケーションソフトウェアは、主に保護対象プログラム1300等となる。その保護対象プログラム1300、保護対象プログラム1300とペアになる監視プログラム1200等のプログラムを実行するCPU901と、そのプログラムやデータを記憶するRAM902と、本コンピュータを起動するためのプログラム等が格納されているROM903と、補助記憶装置であるHD904と、キーボード、マウス等のデータを入力する入力装置906と、CRTや液晶ディスプレイ等の出力装置905と、通信ネットワークと接続するための通信回線インタフェース907、そして、それらをつないでデータのやりとりをするためのバス908により構成されている。これらのコンピュータが複数台互いにネットワークによって接続されていてもよい。
【0100】
なお、図12に示すハードウェア構成は、1つの構成例を示すものであり、本実施の形態は、図12に示す構成に限らず、本実施の形態において説明したモジュールを実行可能な構成であればよい。例えば、一部のモジュールを専用のハードウェア(例えばASIC等)で構成してもよい。また、特に、パーソナルコンピュータの他、携帯電話、ゲーム機、カーナビ機、情報家電、複写機、ファックス、スキャナ、プリンタ、複合機(多機能複写機とも呼ばれ、スキャナ、プリンタ、複写機、ファックス等の機能を有している)などに組み込まれていてもよい。
【0101】
なお、説明したプログラムについては、記録媒体に格納することも可能であり、また、そのプログラムを通信手段によって提供することもできる。その場合、例えば、上記説明したプログラムについて、「プログラムを記録したコンピュータ読み取り可能な記録媒体」の発明として捉えることもできる。
「プログラムを記録したコンピュータ読み取り可能な記録媒体」とは、プログラムのインストール、実行、プログラムの流通などのために用いられる、プログラムが記録されたコンピュータで読み取り可能な記録媒体をいう。
なお、記録媒体としては、例えば、デジタル・バーサタイル・ディスク(DVD)であって、DVDフォーラムで策定された規格である「DVD−R、DVD−RW、DVD−RAM等」、DVD+RWで策定された規格である「DVD+R、DVD+RW等」、コンパクトディスク(CD)であって、読出し専用メモリ(CD−ROM)、CDレコーダブル(CD−R)、CDリライタブル(CD−RW)等、光磁気ディスク(MO)、フレキシブルディスク(FD)、磁気テープ、ハードディスク、読出し専用メモリ(ROM)、電気的消去および書換可能な読出し専用メモリ(EEPROM)、フラッシュ・メモリ、ランダム・アクセス・メモリ(RAM)等が含まれる。
そして、上記のプログラムまたはその一部は、上記記録媒体に記録して保存や流通等させることが可能である。また、通信によって、例えば、ローカル・エリア・ネットワーク(LAN)、メトロポリタン・エリア・ネットワーク(MAN)、ワイド・エリア・ネットワーク(WAN)、インターネット、イントラネット、エクストラネット等に用いられる有線ネットワーク、あるいは無線通信ネットワーク、さらにはこれらの組合せ等の伝送媒体を用いて伝送することが可能であり、また、搬送波に乗せて搬送することも可能である。
さらに、上記のプログラムは、他のプログラムの一部分であってもよく、あるいは別個のプログラムと共に記録媒体に記録されていてもよい。
【図面の簡単な説明】
【0102】
【図1】システム全体の構成例を示すブロック図である。
【図2】デバッガとデバッギとの関係を示す説明図である。
【図3】本実施の形態の全体の構成例を示すブロック図である。
【図4】第1の実施の形態の構成例を示すブロック図である。
【図5】第2の実施の形態の構成例を示すブロック図である。
【図6】第3の実施の形態の構成例を示すブロック図である。
【図7】第4の実施の形態の構成例を示すブロック図である。
【図8】第5の実施の形態の構成例を示すブロック図である。
【図9】第6の実施の形態の構成例を示すブロック図である。
【図10】第7の実施の形態の構成例を示すブロック図である。
【図11】第8の実施の形態の構成例を示すブロック図である。
【図12】実施の形態を実現するコンピュータのハードウェア構成例を示すブロック図である。
【符号の説明】
【0103】
10…ダミーデバッガ
20…保護対象プログラム
30…攻撃者のデバッガ
40…OS
210…デバッガ
220…デバッグ対象プログラム
310、410、510、610、710、810、910、1010…ホスト
320、420、520、620、720、820、920、1020…ターゲット
1011…メインスレッド
1012…コマンド変数TGCMD/コマンド結果変数TGRES
1013…アプリスレッド
1021…メインスレッド
1022…受付スレッド
1100…監視プログラム起動モジュール
1200…監視プログラム
1210…プログラム起動モジュール
1220…第2の秘密値記憶モジュール
1230…必要情報記憶モジュール1
1240…プログラムコード記憶モジュール
1250…復号モジュール
1260…関数呼出先記憶モジュール
1270…必要情報取得モジュール2
1300…保護対象プログラム
1310…確認モジュール
1320…第1の秘密値記憶モジュール
1330…判断モジュール
1340…必要情報取得モジュール1
1350…プログラムコード取得モジュール
1360…関数呼出先取得モジュール
1370…必要情報記憶モジュール2
【技術分野】
【0001】
本発明は、情報処理システムおよびプログラムに関する。
【背景技術】
【0002】
従来より、機密保護などの目的でデータやプログラムを暗号化することが行われている。
しかし、第三者によって、暗号化されたデータやプログラムが解析され、そのデータ等が盗用されたりする危険性が存在する。そこで、データやプログラムをこのような不正アクセスから保護することが必要である。プログラムの解析による改ざんなどの不正行為に対して、主にソフトウェアのみでその行為を防ぐ(解析を難しくする)というソフトウェア耐タンパー技術、あるいは難読化技術と呼ばれる技術がある。
【0003】
これらに関連する技術として、例えば、特許文献1には、ソフトウェアを分割し、一部をサーバ上に配置して、使用する毎に、クライアントにサーバからプログラムの一部を送る方法が開示されている。
また、例えば、特許文献2には、プログラムの一部を暗号化しておいて、適宜復号する方法を前提として、それをリロケーション処理の必要なOS上で実現するための方法が開示されている。
また、例えば、特許文献3には、プログラムの一部を暗号化しておいて、適宜復号する方法であり、その過程を複雑化した方法が開示されている。
また、例えば、特許文献4には、プログラムの関数呼び出しを、関数ポインタおよびそのテーブルを経由して行うことで、関数間の呼び出し関係を難読化する方法が開示されている。
また、例えば、特許文献5には、プログラムの制御構造(ループなど)を複雑化する方法が開示されている。
【0004】
特許文献1から特許文献5に開示されている技術は、プログラムの解析行為を難しくするものである。つまり、基本的にプログラムの制御構造を複雑化したり、プログラムの一部を暗号化したりするなどの技術である。
一方、プログラムは、通常、デバッガなどにより容易に動作解析が可能である。このため、プログラムに秘密情報が含まれている場合には、プログラムを解析することによって容易に秘密情報が盗み出されるという事態が生じ得る。
これらに関連する技術として、例えば、特許文献6には、ソフトウェアが現在デバッガ上で実行されているかどうかをプロセッサのフラグを参照することで検出し、検出されたらプログラムの実行を停止する方法が開示されている。
【特許文献1】特開平08−016385号公報
【特許文献2】特許第3033562号公報
【特許文献3】特開2005−018725号公報
【特許文献4】特開2003−337629号公報
【特許文献5】特開2004−185064号公報
【特許文献6】特開平11−175336号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
本発明は、このような背景技術の状況の中でなされたもので、デバッガによるプログラムの解析行為を防止することができるようにした情報処理システムおよびプログラムを提供することを目的としている。
【課題を解決するための手段】
【0006】
かかる目的を達成するための本発明の要旨とするところは、次の各項の発明に存する。
[1] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
秘密の値である秘密値を記憶している第1の秘密値記憶機能
を実現させ、
前記監視プログラムは、
前記保護対象プログラムの前記第1の秘密値記憶機能に記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶機能
を実現させ、
前記保護対象プログラムは、
前記第2の秘密値記憶機能によって記憶されている秘密値は、前記第1の秘密値記憶機能によって記憶されている秘密値と同じであるか否かを判断する判断機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0007】
[2] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0008】
[3] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶機能、
前記プログラムコードを前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0009】
[4] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0010】
[5] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記関数呼出先を記憶している関数呼出先記憶機能、
前記関数呼出先を保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0011】
[6] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記監視プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0012】
[7] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記監視プログラムに前記情報を設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【0013】
[8] 前記監視プログラムは他の監視プログラムから監視されている
ことを特徴とする[1],[2],[3],[4],[5],[6]または[7]に記載のプログラム。
【0014】
[9] 前記監視プログラムは前記保護対象プログラムを監視することを解除し、
前記保護対象プログラムは前記監視プログラムを監視することを開始する
ことを特徴とする[1],[2],[3],[4],[5],[6]または[7]に記載のプログラム。
【0015】
[10] 前記監視プログラムと前記保護対象プログラムを1つのモジュールとし、
前記モジュールを起動する場合の引数によって、前記監視プログラムまたは前記保護対象プログラムを起動する
ことを特徴とする[1],[2],[3],[4],[5],[6]または[7]に記載のプログラム。
【0016】
[11] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより秘密の値である秘密値を記憶している第1の秘密値記憶手段と、
前記監視プログラムにより前記第1の秘密値記憶手段によって記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶手段と、
前記保護対象プログラムにより前記第2の秘密値記憶手段によって記憶されている秘密値は、前記第1の秘密値記憶手段によって記憶されている秘密値と同じであるか否かを判断する判断手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0017】
[12] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記保護対象プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0018】
[13] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶手段と、
前記保護対象プログラムに前記プログラムコードを設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0019】
[14] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0020】
[15] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムにより前記関数呼出先を記憶している関数呼出先記憶手段と、
前記保護対象プログラムに前記関数呼出先を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0021】
[16] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記監視プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【0022】
[17] プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記情報を前記監視プログラムに設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【発明の効果】
【0023】
請求項1のプログラムによれば、本構成を有していない場合に比較して、保護対象プログラムは、第2の秘密値記憶機能によって記憶されている秘密値は、第1の秘密値記憶機能によって記憶されている秘密値と同じであるか否かを判断することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0024】
請求項2のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0025】
請求項3のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0026】
請求項4のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0027】
請求項5のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、関数呼出先を保護対象プログラムに設定することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0028】
請求項6のプログラムによれば、本構成を有していない場合に比較して、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより解析されるのを防止することができる。
【0029】
請求項7のプログラムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0030】
請求項8のプログラムによれば、本構成を有していない場合に比較して、請求項1から7のプログラムによる効果に加えて、監視プログラムは他の監視プログラムから監視されることになり、監視プログラムに対する監視行為を防止することができる。
【0031】
請求項9のプログラムによれば、本構成を有していない場合に比較して、請求項1から7のプログラムによる効果に加えて、監視プログラムは保護対象プログラムの監視を解除し、保護対象プログラムは監視プログラムの監視を開始でき、他のプログラムによる監視の防止をより強固にすることができる。
【0032】
請求項10のプログラムによれば、本構成を有していない場合に比較して、請求項1から7のプログラムによる効果に加えて、保護対象プログラムを起動する場合の引数によって、監視プログラムまたは保護対象プログラムを起動することができ、他のプログラムによる監視の防止をより強固にすることができる。
【0033】
請求項11の情報処理システムによれば、本構成を有していない場合に比較して、保護対象プログラムは、第2の秘密値記憶手段によって記憶されている秘密値は、第1の秘密値記憶手段によって記憶されている秘密値と同じであるか否かを判断することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0034】
請求項12の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0035】
請求項13の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0036】
請求項14の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0037】
請求項15の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、関数呼出先を保護対象プログラムに設定することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0038】
請求項16の情報処理システムによれば、本構成を有していない場合に比較して、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【0039】
請求項17の情報処理システムによれば、本構成を有していない場合に比較して、監視プログラムは、保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号することができ、保護対象プログラムは、監視プログラムが処理を続行するために必要な情報を記憶することができ、保護対象プログラムが他のプログラムにより監視されるのを防止することができる。
【発明を実施するための最良の形態】
【0040】
まず、実施の形態の理解を容易にするために、デバッガの動作環境、その動作について説明する。ここで、デバッガとはあるプログラムのデバッグをするためのプログラム、デバッギとはデバッグ対象のプログラムをいう。デバッガは、一般的にはプログラム開発時に用いられ、そのプログラムの挙動を確認するために利用するソフトウェアツールである。またデバッガは、他のプログラムの挙動を監視する監視プログラムである。また、ここでは「プログラムが他のプログラムを監視する」とは、「プログラムが他のプログラムのデバッガとして動作する」ということである。
【0041】
図2は、デバッガとデバッギとの関係を示す説明図である。あるコンピュータのOS上で、デバッグ対象プログラム220(デバッギ)とそのデバッグ対象プログラム220をデバッグするためのプログラムであるデバッガ210の両者が動作しているとする。
ステップ21では、デバッガ210が、デバッグ対象プログラム220をデバッグ対象として、プロセスを生成、もしくは、既存のプロセスにデバッガとしてアタッチする。ここで、「アタッチ」とは、実行中のプロセスの挙動の監視を開始することを意味する。また、「デタッチ」とは、プロセスの挙動を監視している状態を解除(終了)することを意味する。
つまり、デバッガ210が、デバッグ対象プログラム220を起動する。このとき、デバッガ210が、デバッグ対象プログラム220のデバッガとして振舞えるように、OSのAPI(Application Program Interface)を呼び出し、パラメータを指定して起動する。例えば、ウィンドウズ(Windows、登録商標)ではAPI関数CreateProcess()が使われ、引数に"DEBUG_PROCESS"フラグを指定する。これによって、デバッグ対象プログラム220は一時停止の状態でプロセスが生成される。既に実行中のプロセス(デバッグ対象プログラム220)をデバッグすることもできる。この場合は、既存のプロセスにデバッガをアタッチするためのAPIを呼び出す。Windowsの場合は、API関数DebugActiveProcess()であり、デバッガ210をアタッチした時点でデバッグ対象プログラム220はイベントを通知し、動作を一時停止する。
【0042】
ステップ22では、デバッグ対象プログラム220が、デバッグ対象プログラム220でイベント(ブレークポイント、スレッドの生成など)が発生すると、デバッガ210に通知する。
つまり、デバッグ対象プログラム220内で、デバッガ210が設定したブレークポイント(プログラムの実行を特定のアドレスで一時停止するために用いる)が実行されたり、特定のメモリアドレスの内容が変更されたり、他のプロセスやスレッドを生成したり、などのイベントが発生すると、デバッグ対象プログラム220からデバッガ210にイベントが発生したことが知らされる(実際にはデバッグ対象プログラム220が直接知らせるのではなく、OSが介在して行われる)。イベントの通知に伴って、デバッグ対象プログラム220はプログラムの実行をそこで一時停止する。Windowsの場合は、デバッガ210がAPI関数WaitForDebugEvent()を呼び出すと、自分宛にイベント通知が来ていれば、その内容を受け取ることができる。
【0043】
ステップ23では、デバッガ210は、デバッグ対象プログラム220内の状態を取得し、表示する。その後、ユーザの指示によって、デバッグ対象プログラム220の内部状態を書き換え(ブレークポイントの設定、メモリ内容の変更など)、プロセスを続行する。
つまり、デバッガ210は、デバッグ対象プログラム220内でイベントが発生したことの通知を受け、デバッグ対象プログラム220内のメモリの内容や中断時のレジスタの内容を取得して、ユーザに理解できる形で表示し、ユーザによる次の指示を待つ。ユーザはメモリやレジスタの内容を変更し、必要ならばブレークポイントを新たに設定し、デバッグ対象プログラム220の実行を再開する。Windowsの場合は、メモリの内容を読み書きするには、API関数ReadProcessMemory/WriteProcessMemory、メモリの属性(読み込み/書き込み/実行)を書き換えるには、API関数VirtualProtectEx()、レジスタの内容の読み書きには、API関数GetThreadContext/SetThreadContext、ブレークポイントを設定するには、実行を中断させたいアドレスの実行をブレーク命令に置き換えることで、行われる。デバッグ対象プログラム220の実行を再開するには、API関数ContinueDebugEvent()が用いられる。
ステップ24では、以降、デバッグ対象プログラム220が終了するか、もしくは、デバッガ210が処理を中断するまで、ステップ22〜ステップ23の処理が繰り返される。
【0044】
このように、デバッガ210は、デバッグとしてデバッグ対象プログラム220の挙動を監視することができる。したがって、デバッガ210をデバッグ目的でなく、難読化したプログラムの挙動解析に用いることも考えられる。従来の技術では、デバッガによる解析行為そのものを防ぐ方法ではなく、デバッガを検出している部分を解析することは可能であった。
【0045】
次に、ここで実施の形態の理解をさらに容易にするために、基本的な考え方を説明する。
後述する実施の形態は、特定のプロセスに対しては、唯一のプロセスしかデバッガになれないというOS(Operating System、オペレーティングシステム、例えば、Windows(登録商標)やLinux(登録商標)など)がサポートするデバッガAPIの特徴を利用するものである。
デバッグAPIは、プログラムのデバッグを補助するために、一般的には予めOSに用意されたAPIであり、あるプロセス(プログラム)が別のプロセス(プログラム)のデバッガになれるような機能が用意されており、開発環境などが有する通常のデバッグ機能はこのデバッグAPIを利用して実現されている。
一方、デバッグAPIでは、あるプロセスのデバッガとして振舞うことができるのは、唯一のデバッグプロセスのみである。これは複数のプロセスがデバッガとして機能できると、デバッギ内の状態に一貫性が無くなるためであり(同時に複数のデバッガからメモリ内容が変更されたり、など)、OSの種類によらずデバッグAPIはこの性質がある。
そこで、デバッガによる解析を防ぐために、保護したいプロセスに対してデバッガとして動作するプロセスを予め設けることで、保護対象のプロセスに対する攻撃者によるデバッガ解析を不可能とする。
【0046】
すなわち、攻撃者による解析から防ぎたいプログラムに対して、言わばダミーのデバッガであるプロセスを起動しておくことで、攻撃者がデバッガによって解析しようとしても対象のプログラムをデバッグできないという状態を作り出すことを基本とするものである。なお、ここでダミーデバッガと呼んでいるのは、ダミーデバッガが本来のデバッグ機能のために存在しているわけではないからである。
【0047】
これを図1を用いて説明する。OS40上では、保護対象プログラム20に対してただ一つのデバッガのみを発生させるだけであり、保護対象プログラム20に対して2つ以上のデバッガを発生させることはできない。そこで、保護対象プログラム20を解析しようとする攻撃者が保護対象プログラム20の挙動を監視する攻撃者のデバッガ30を発生させようとしても、その前にダミーデバッガ10を発生させ、ダミーデバッガ10が保護対象プログラム20をデバッグしている状態にすることによって、攻撃者のデバッガ30から保護対象プログラム20に対する監視を阻止することができるようになる。
さらにダミーデバッガ10が存在しないと、保護対象プログラム20が正常に実行することができないように様々に工夫した実施の形態がある。つまり、より強力に保護するために、一方のプロセスが他方に依存するような仕組みを導入する。
【0048】
図3を用いて、後述する実施の形態の全体の構成例を説明する。なお、図3に示したブロック図は、複数の実施の形態を示したものであり、これらの一部を用いて、各種の実施の形態が実現できる。また、図3に示したモジュールを組み合わせることで、各種のプログラム解析防止プログラム、プログラム解析防止システムを構築することが可能である。
なお、モジュールとは、一般的に論理的に分離可能なソフトウェア、ハードウェア等の部品を指す。したがって、本実施の形態におけるモジュールはプログラムにおけるモジュールのことだけでなく、ハードウェア構成におけるモジュールも指す。それゆえ、本実施の形態は、プログラム、システムおよび方法の説明をも兼ねている。また、モジュールは機能にほぼ一対一に対応しているが、実装においては、1モジュールを1プログラムで構成してもよいし、複数モジュールを1プログラムで構成してもよく、逆に1モジュールを複数プログラムで構成してもよい。また、複数モジュールは1コンピュータによって実行されてもよいし、分散または並列環境におけるコンピュータによって1モジュールが複数コンピュータで実行されてもよい。また、以下、「接続」とは物理的な接続の他、論理的な接続を含む。
また、システムとは、複数のコンピュータ、ハードウェア、装置等がネットワーク等で接続されて構成されるほか、1つのコンピュータによって実現される場合も含まれる。
【0049】
図3に示すように、本実施の形態は、基本的には、攻撃者による解析から保護すべき保護対象プログラム1300、その保護対象プログラム1300を監視する監視プログラム1200、その監視プログラム1200を起動する監視プログラム起動モジュール1100を有している。
監視プログラム起動モジュール1100は、保護対象である保護対象プログラム1300を起動する場合に、保護対象プログラム1300を監視する監視プログラム1200を起動する。ここで、保護対象プログラム1300を起動する場合、保護対象プログラム1300と監視プログラム1200が起動される順番はいずれが先であってもよい。すなわち、攻撃者によるデバッガAPIが発生する前に、監視プログラム1200が起動されていればよい。監視プログラム1200が保護対象プログラム1300よりも先に起動される場合は、監視プログラム1200が保護対象プログラム1300を起動すればよい。逆に、保護対象プログラム1300が監視プログラム1200よりも先に起動される場合は、監視プログラム1200が保護対象プログラム1300にアタッチすればよい。
監視プログラム1200内のプログラム起動モジュール1210は、監視プログラム起動モジュール1100によって起動された監視プログラム1200が保護対象プログラム1300を起動または保護対象プログラム1300にアタッチする。
【0050】
保護対象プログラム1300内の確認モジュール1310は、監視プログラム1200が起動していることを確認する。また、監視プログラム1200が他の監視プログラムから監視されているか否かを確認するようにしてもよい。
保護対象プログラム1300内の第1の秘密値記憶モジュール1320は、秘密の値である秘密値を記憶している。
監視プログラム1200内の第2の秘密値記憶モジュール1220は、保護対象プログラム1300内の第1の秘密値記憶モジュール1320によって記憶されている秘密値と同じ値である秘密値を記憶している。
保護対象プログラム1300内の判断モジュール1330は、第2の秘密値記憶モジュール1220によって記憶されている秘密値は、第1の秘密値記憶モジュール1320によって記憶されている秘密値と同じであるか否かを判断する。
【0051】
監視プログラム1200内の必要情報記憶モジュール1230は、保護対象プログラム1300が処理を続行するために必要な情報を記憶している。
保護対象プログラム1300内の必要情報取得モジュール1−1340は、必要情報記憶モジュール1―1230によって記憶されている必要情報を取得する。
監視プログラム1200内のプログラムコード記憶モジュール1240は、保護対象プログラム1300のプログラムコードとして欠けているプログラムコードを記憶している。
監視プログラム1200内の復号モジュール1250は、保護対象プログラム1300の一部が暗号化されているプログラムコードを復号する。ここで復号モジュール1250は、保護対象プログラム1300内のプログラムコード取得モジュール1350から取得されるだけでなく、保護対象プログラム1300内の暗号化されたコード保持部(プログラムだけではなく、データ等も含む)を直接復号してもよい。
保護対象プログラム1300内のプログラムコード取得モジュール1350は、プログラムコード記憶モジュール1240によって記憶されているプログラムコードまたは復号モジュール1250によって復号されたプログラムコードを取得する。
【0052】
監視プログラム1200内の関数呼出先記憶モジュール1260は、関数呼出先を介して関数を呼び出すプログラムコードあるいは関数テーブルのようなデータであって、関数呼出先を記憶している。
保護対象プログラム1300内の関数呼出先取得モジュール1360は、関数呼出先記憶モジュール1260によって記憶されている関数呼出先を取得する。
保護対象プログラム1300内の必要情報記憶モジュール2―1370は、監視プログラム1200が処理を続行するために必要な情報を記憶している。
監視プログラム1200内の必要情報取得モジュール2―1270は、必要情報記憶モジュール2−1370によって記憶されている必要情報を取得する。
また、監視プログラム1200は、他の監視プログラム1200から監視されていてもよい。つまり、攻撃者による監視プログラム1200の解析を防止するために、監視プログラム1200自身が保護対象プログラム1300と同様の立場になるようにするものである。
また、監視プログラム1200は保護対象プログラム1300をデタッチ、つまり監視を解除し、保護対象プログラム1300は監視プログラム1200にアタッチ、つまり監視を開始させてもよい。すなわち、監視プログラム1200と保護対象プログラム1300の立場を逆転させるものである。
また、監視プログラム1200と保護対象プログラム1300を1つのモジュールとして作成し、そのモジュールを起動する場合の引数によって、監視プログラム1200または保護対象プログラム1300を起動するようにしてもよい。
また、監視プログラム1200は保護対象プログラム1300を起動して監視し、保護対象プログラム1300は監視プログラム1200にアタッチして監視する。つまり互いに監視し合う関係になってもよい。
【0053】
以下、図面に基づき本発明の好適な各種の実施の形態を説明する。
図4は、第1の実施の形態(ターゲットがホストを認証する例)の概念的なモジュール構成図を示している。
ここでのホスト310は図3の監視プログラム1200に対応し、ターゲット320は図3の保護対象プログラム1300に対応する。
監視プログラム(以下、「ホスト」ともいう)1200がデバッガとして、保護対象プログラム(以下、「ターゲット」ともいう)1300がデバッギとして、動作する実施の形態である。ターゲット320は、ホスト310の存在を間欠的に監視する。ここで、間欠的にとは、間隔をおいて繰り返されることの意であって、その間隔は一定時間であってもよいし、ランダムな時間間隔であってもよい。
【0054】
以下にプログラムの実行の手順を示す。
ステップ31では、ホスト310がユーザによって起動される。
ステップ32では、ホスト310がターゲット320をデバッグ対象として、ターゲット320のプロセスを生成する。つまり、ホスト310は、ターゲット320をデバッグ対象として起動する。ホスト310はその後、ターゲット320からデバッグイベントを受け取るために待機する。
ステップ33では、ターゲット320は、処理の先頭で、新規スレッドを生成し、そのスレッドで、ホスト310のプロセスが存在しているかどうかをチェックする。例えば、1分置きにホスト310のプログラムの実行ファイル名のプロセスが存在しているかどうかをチェックする。もし、存在していない場合は、ターゲット320のプログラムを終了する。
【0055】
ステップ34では、ターゲット320で特定のイベント(ブレークポイント、スレッドの生成など)が発生すると、ホスト310に通知される。
ステップ35では、ホスト310はイベントを受け取ると、それが終了イベントでない限り、ターゲット320のプロセスを続行し、引き続きイベントを待つ。
ステップ36では、以降、ターゲット320からプロセス終了イベントが通知されるまで、ステップ34〜ステップ35が繰り返される。ターゲット320からプロセス終了イベントが通知されたら、ホスト310もプロセスを終了する。
【0056】
また、上記ステップ33において、ホスト310のプロセスが正しいホスト310かどうかは、例えば、システムから、現在存在するプロセスの一覧を取得し(Windowsの場合は、EnumProcessなど)、その一つ一つのプロセスに関して、そのプロセスの起動ファイル名を取得し(Windowsの場合は、EnumProcessModulesなど)、そのモジュールの名前や属性が正しいかどうかで判定する。属性とは、そのモジュールのファイルの作成者や日付情報などである。具体的には、ファイル名に基づく認証だけでは、例えば、偽のプログラムが同一パス上に同一のファイル名で正規のプログラムと置き換えられた場合、攻撃者からの解析を阻止しにくい。しかし、上記の通りファイル名以外の属性情報を用いて認証を行えば、そのような不正な置き換えが行われた場合にも解析を阻止できる可能性が高まる。
また、ファイルに対する電子署名を確認してもよい。具体的には、不正な解析を防止するために、ターゲット320がホスト310をデジタル署名の確認などによって認証して、その認証結果が正しいホスト310の場合のみターゲット320の処理を継続させる。
【0057】
図5は、第2の実施の形態(ターゲットがホストをチャレンジ&レスポンスで認証する例)の概念的なモジュール構成図を示している。
ここでのホスト410は図3の監視プログラム1200に対応し、ターゲット420は図3の保護対象プログラム1300に対応する。
第2の実施の形態は、第1の実施の形態におけるステップ33の、ターゲット320がホスト310は正規のものであるかどうかを確認する処理を、チャレンジ&レスポンスで行う例である。チャレンジ&レスポンスとは、相手方が正しいかどうかを検証するために、何らかのチャレンジを投げ、相手方から返されたレスポンスが、チャレンジに対する正しい値かどうかをチェックすることで確認する方法である。例えば、ある秘密のバイト列を共有し、検証時に乱数を生成し、その乱数をチャレンジとして相手方に送り、相手は乱数と秘密値を連結したものを一方向性ハッシュ関数(SHA1など)に与えて得られた値を計算してレスポンスとして送り返す。レスポンスを受け取ったら、同じ計算を行って、値が一致するかどうかをチェックするというものである。この方法の場合は、秘密の値が他者に漏洩しないかぎり、相手が正しいということを認証できる。
【0058】
本実施の形態では、この方法を第1の実施の形態に適用する。具体的には第1の実施の形態のステップ33〜ステップ35を以下のようなステップ43〜ステップ45−3に変更する。ステップ36は、第2の実施の形態でも用いる。なお、これに先立って、ホスト410とターゲット420では、秘密の20バイトのデータである秘密の値Xおよび、生成した乱数Rを格納するアドレスA1と、レスポンスを格納するアドレスA2とをお互いに保持しているものとする。なお、他の実施の形態では、同様にアドレスA1、A2等を用いる場合もあるが、発明の説明の簡潔性のため明示しない場合がある。
ステップ43では、ターゲット420は、乱数Rを生成して、デバッグブレークを発生する。つまり、ターゲット420は、処理の先頭で、新規スレッドを生成する。そのスレッドは間欠的(定期的でもよく、例えば1分おきなど)に、以下の処理を行う。乱数Rを生成し、それを予め定めた特定のアドレスにセットし、デバッグブレークを発生させる。
【0059】
ステップ44では、ターゲット420の実行は中断し、デバッグブレークイベントが発生し、ホスト410に通知される。
ステップ45−1では、ホスト410はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット420の特定のアドレスA1からデータRを読み取り、その値と自分が保持する秘密の値Xを連結して、ハッシュ値Hを求め(SHA1など)、それをターゲット420の特定のアドレスA2に書き込む。
ステップ45−2では、ホスト410はターゲット420のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット420のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット420のプロセスを続行し、引き続きイベントを待つ。
ステップ45−3では、ホスト410から実行継続を指示されたターゲット420は、続いて、アドレスA1に格納してあった乱数Rと、自分が保持する秘密の値Xを連結して、ハッシュ値H'を求め、その値が、アドレスA2に格納してある値と一致するかどうかをチェックする。一致しない場合は、ターゲット420はプロセスを終了する。
【0060】
なお、第2の実施の形態では、ホスト410側とターゲット420側のデータの受け渡しのために、デバッグブレークイベントを使っているので、ホスト410がターゲット420のプロセスを生成する際に、このイベントを受け取れるように指定をして、プロセスを生成しなければならない。
【0061】
また、第2の実施の形態では、秘密のデータとハッシュ関数を用いて認証を行っているが、デジタル署名によって、同様の認証処理を行うようにしてもよい。また、デバッグブレークイベントの代わりに他の種類のイベント(スレッドが生成された、など)を使うようにしてもよい。
【0062】
図6は、第3の実施の形態(ターゲットのデータの一部をホストが保持する例)の概念的なモジュール構成図を示している。
ここでのホスト510は図3の監視プログラム1200に対応し、ターゲット520は図3の保護対象プログラム1300に対応する。
これまでの実施の形態では、ターゲットがホストの認証処理を行うのみであり、ターゲットが行うべき本来の処理には、ホストは一切かかわりが無かった。第3の実施の形態は、ターゲットプログラムの処理を続行するためには、ホスト側の助けを必要とするというものである。
ここでは、ターゲットの処理を行うために必須な何らかのデータをホスト510側が保持しておき、実行時に、ホスト510側がターゲット520側に、データを与えることによって、ターゲット520の処理が行われる例を説明する。
【0063】
第3の実施の形態は、前述の第2の実施の形態のステップ43〜ステップ45−3を以下のようなステップ53〜ステップ55−3に変更する。ステップ36は、第3の実施の形態でも用いる。なお、ターゲット520側は、処理に必要な秘密データYを予めプログラム内には保持していないものとする。
ステップ53では、ターゲット520は、本来の処理を続行する上で、必須な秘密データYを取得する必要が発生したときには、デバッグブレークを発生させる。
ステップ54では、ターゲット520の実行は中断し、デバッグブレークイベントが発生し、ホスト510に通知される。
ステップ55−1では、ホスト510はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット520の特定のアドレスAに、ホスト510側のみが保持する秘密データYを設定する。
ステップ55−2では、ホスト510はターゲット520のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット520のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット520のプロセスを続行させ、引き続きイベントを待つ。
ステップ55−3では、ホスト510から実行継続を指示されたターゲット520は、続いて、アドレスAに格納されてある秘密データYを取得して本来の処理を続行する。
【0064】
ターゲット520は、秘密データYを使用した後、直ぐに破棄することで、必要な時には毎回ホスト510側から値を取得することが必要となる。
また、ここでは、秘密のデータはYのみであると説明したが、秘密のデータをホスト510側が複数保持し、ターゲット520側が、必要なデータを指定して取得する方法も考えられる。この場合は、ホスト510は、データの識別子(番号)と、データの値の組を保持している。そして、第2の実施の形態の乱数Rの代わりにデータの識別子(番号)をあるアドレスにセットし、デバッグブレークイベントを発生させ、ホスト510は、その識別子に対応したデータをターゲット520内のアドレスAにセットするように構成すればよい。
【0065】
図7は、第4の実施の形態(ターゲットのプログラムコードの一部をホストが保持する例)の概念的なモジュール構成図を示している。
ここでのホスト610は図3の監視プログラム1200に対応し、ターゲット620は図3の保護対象プログラム1300に対応する。
第4の実施の形態は、ターゲットが持つべき処理を行うプログラムコードの一部をホスト側が保持する例である。
第4の実施の形態は、第3の実施の形態のステップ53〜ステップ55−3を以下のようなステップ63〜ステップ65−3に変更する。ステップ36は、第4の実施の形態でも用いる。なお、ターゲット620側で必要な処理を行うプログラムコードの一部が欠けている状態であるものとする。
【0066】
ステップ63では、ターゲット620は、プログラムコードが欠けている部分を実行しようとすると、デバッグブレークを発生する(プログラムを抜き出した部分の先頭に、予めデバッグブレーク命令を埋め込んでおく)。
ステップ64では、ターゲット620の実行は中断し、デバッグブレークイベントが発生し、ホスト610に通知される。
ステップ65−1では、ホスト610はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット620のプロセスのプログラムカウンタの値を読み取り、あらかじめホスト610が保持しているターゲット620のプログラムコードの一部を、ターゲット620のプログラムのプログラムカウンタの位置に埋め込む。
ステップ65−2では、ホスト610はターゲット620のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット620のプロセスを続行し、引き続きイベントを待つ。
ステップ65−3では、ホスト610から実行継続を指示されたターゲット620は、ブレークした位置の命令が既に置き換えられているので、それまでの処理を引き続き続行する。
【0067】
なお、ステップ65−1で、ホスト610がターゲット620のコード領域にプログラムコードを埋め込む際には、対象となるメモリ領域のページ属性を書き込み可能に設定することが必要な場合がある(Windowsなどは、VirtualProtectEx()で行う)。
この実施の形態では、ホスト610側はターゲット620のプログラムのプログラムコードの一部を一つしか保持しない場合を説明しているが、当然ながら複数保持するようにしても良い。その場合は、ホスト610が、埋め込むアドレス値とプログラムコードの組を保持しておけば、デバッグブレークイベントが発生したときのターゲット620のプログラムのプログラムカウンタの値を参照することで、どのプログラムコードを埋め込めばよいかを特定できる。
【0068】
ステップ65−3では、ホスト610がターゲット620にプログラムコードを一度書き込むと、その場所ではそれ以降二度とデバッグブレークが発生しなくなるが、これは、ホスト610が不要になることを意味するので、プログラムの解析に対する耐性の観点からは好ましくない。
そこで、ホスト610が書き込むターゲット620のプログラムの最後の部分をデバッグブレーク命令にしておけば、ターゲット620のプロセスが埋め込まれたコードの実行を終えると最後のデバッグブレークを実行して再びデバッグブレークイベントが発生し、ホスト610に通知され、ホスト610側はそのイベントを受け取って、先ほど埋め込んだプログラムコードをターゲット620側から消去するという処理を行わせることが可能になる。なお、ホスト610側は、デバッグイベントがプログラムコードを埋め込むべきものか、消去すべきものかをターゲット620のプロセスのプログラムカウンタの値を参照することで判別できる。あるいはデバッグブレーク命令の代わりに、ホスト610が書き込んだプログラムの最後の部分で、自分自身を元に戻す命令、すなわち、先頭にデバッグブレークを設定し、残りを消去(ゼロクリア)する命令を入れておいてもよい。
【0069】
図8は、第5の実施の形態(暗号化されたターゲットのプログラムコードをホストが復号する例)の概念的なモジュール構成図を示している。
ここでのホスト710は図3の監視プログラム1200に対応し、ターゲット720は図3の保護対象プログラム1300に対応する。
第5の実施の形態は、予め一部分が暗号化されているターゲットのプログラムコードをホスト側が復号する例である。
第5の実施の形態は、第3の実施の形態のステップ53〜ステップ55−3を以下のようなステップ73〜ステップ75−3に変更する。ステップ36は、第5の実施の形態でも用いる。なお、ターゲット720側は、一部のプログラムコードが予め暗号化されており、その復号鍵は、ホスト710側が保持するものとする。また、暗号化されたプログラムコードの始まりには、デバッグブレーク命令が配置されているものとする。なお、プログラムの暗号化に関しては、特許文献2や特許文献3などの既存の技術で実現可能である。
【0070】
ステップ73では、ターゲット720は、暗号化されたプログラムコードの部分を実行しようとすると、その直前にあるデバッグブレーク命令を実行し、デバッグブレークを発生する。なお、デバッグブレーク命令は暗号化されていない。
ステップ74では、ターゲット720の実行は中断し、デバッグブレークイベントが発生し、ホスト710に通知される。
ステップ75−1では、ホスト710はイベントを受け取り、それがデバッグブレークイベントの場合は、あらかじめホスト710が保持しているターゲット720のプログラムコードの復号鍵Kと、暗号化されているバイト長Lを使って、ターゲット720のプログラムカウンタ部分からLバイトを復号し、ターゲット720のメモリ上の命令列を書き換える。
ステップ75−2では、ホスト710は、ターゲット720のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット720のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット720のプロセスを続行し、引き続きイベントを待つ。
ステップ75−3では、ホストから実行継続を指示されたターゲット720は、既にブレークした箇所以降の命令が復号されているので、それ以降の処理を継続する。
【0071】
ステップ75−1で、ホスト710がターゲット720のコード領域にプログラムコードを埋め込む際には、対象となるメモリ領域のページ属性を書き込み可能に設定する必要があるのは前例と同様である。
この例では、ホスト710側はターゲット720のプログラムのプログラムコードの一箇所しか復号しない場合を説明しているが、当然ながら複数箇所を復号するようにしてもよい。また、復号する箇所毎に復号鍵を変更したり、アルゴリズムを変えたりするようにしても良い。その場合は、デバッグブレークイベントが発生したときのターゲット720のプログラムのプログラムカウンタの値を参照して、復号鍵を特定しても良いし、第2の実施の形態で乱数Rをホストに渡したのと同じように、復号鍵を特定するパラメータや暗号アルゴリズム、初期値などの情報をターゲット720からホスト710に渡すようにしても良い。また、復号処理はホスト710側で行うのではなく、復号鍵のみをホスト710側が提供するようにしてもよい。その場合の構成は、第3の実施の形態と同様になる。
【0072】
さらに、第4の実施の形態と同様に、ステップ75−3では、ホスト710がターゲット720にプログラムコードを一度書き込むと、その場所では平文のプログラムコードが維持されてしまうので、暗号化された範囲の最後にデバッグブレーク命令を埋め込むことで、ホストに暗号化された範囲の実行の終了を通知し、ホストが再暗号化するようにしてもよい。また、ここでは暗号化対象をプログラムコードで説明しているが、対象をデータにしてもよい。
【0073】
図9は、第6の実施の形態(ターゲットの一部の関数テーブルをホストが保持する例)の概念的なモジュール構成図を示している。
ここでのホスト810は図3の監視プログラム1200に対応し、ターゲット820は図3の保護対象プログラム1300に対応する。
第6の実施の形態は、ターゲット側が特許文献4に挙げられているように、関数の呼び出しを関数ポインタ経由で実行し、その関数ポインタの中身を特定の関数内で決定するようにプログラミングされている場合に、関数の呼び出し先を決定する処理をホスト側で実行するようにした例である。
【0074】
第6の実施の形態は、第3の実施の形態のステップ53〜ステップ55−3を以下のようなステップ83〜ステップ85−3に変更する。ステップ36は、第6の実施の形態でも用いる。なお、ターゲット820側は、少なくとも一部のプログラムコードは、関数を呼び出す際に直接呼び出すのではなく、ある関数ポインタに設定されたアドレスを呼び出すように、かつ、その呼び出し先を決定する際にデバッグブレークが発生するように、プログラミングされているものとする。また、ホストプログラムはターゲット820内の関数アドレスと、その関数を表す識別子(番号など)の対応表を持っている。
【0075】
ステップ83では、ターゲット820は、呼び出し先を決定しなければならない箇所で、呼び出し先パラメータをレジスタR1に格納しデバッグブレーク命令を実行し、デバッグブレークを発生する。
ステップ84では、ターゲット820の実行は中断し、デバッグブレークイベントが発生し、ホスト810に通知される。
ステップ85−1では、ホスト810はイベントを受け取り、それがデバッグブレークイベントの場合は、ターゲット820のプロセスのレジスタR1の値を読み取り、あらかじめホスト810が保持している呼び出し先一覧リストの中からその識別子に対応する呼び出し先を決定し、そのアドレスをターゲット820のプロセス内のメモリアドレスFの位置に書き込む。
ステップ85−2では、ホスト810はターゲット820のプロセスでデバッグブレーク命令を繰り返すことのないようにプログラムカウンタを一つ進めて、ターゲット820のプロセスを続行させる。受け取ったイベントが終了イベントだったらステップ36に進む。それ以外なら、何もせずにターゲット820のプロセスを続行し、引き続きイベントを待つ。
ステップ85−3では、ホスト810から実行継続を指示されたターゲット820は、アドレスFに格納されているアドレス情報を関数アドレスであると解釈し、そのアドレスを関数呼び出しして、処理を続行する。
【0076】
なお、この例では、ホスト810側が決定したアドレス情報をターゲット820のメモリ内に書き込むようにしているが、ターゲット820のプログラムのプログラムカウンタを直接書き換えるようにしてもよい。この場合は、必要に応じて、関数からの戻りアドレスをターゲット820のプログラムのスタック上に設定しておく。
またホスト810側が呼び出し先を決定するようにしているが、関数テーブルそのものをターゲット820に渡して、呼び出し先の決定はターゲット820が行うようにしても良い。
【0077】
図10は、第7の実施の形態(ホストの処理に必要な処理の一部をターゲットが実行する例)の概念的なモジュール構成図を示している。
ここでのホスト910は図3の監視プログラム1200に対応し、ターゲット920は図3の保護対象プログラム1300に対応する。
これまでの実施の形態は、すべて、ターゲットの処理を続行するために、ホスト側がそれを支援する(ターゲットに必要なデータ、プログラム、処理などの一部をホスト側が保持・処理する)ものであった。しかし、第5の実施の形態のバリエーションで挙げたように、ターゲットのコードの一部を復号するための復号鍵をホスト側が保持する場合、ホストプログラム内に復号鍵が埋め込まれることになる。プログラムに埋め込まれた鍵はディスアセンブラのような静的な解析によって発見されてしまう可能性があるので、簡単には解析できないようにするのが望ましい。
そこで、第7の実施の形態では、ホスト側が処理を続行するために必要な一部のデータ・プログラム・処理などをターゲット側が提供するという方法を行う。例えば、ホスト側が保持するターゲットの復号鍵をさらに暗号化しておき、その復号をターゲット920側が行うようにする。このようにホスト910側もターゲット920の助けを借りないと処理を続行できないようにする。例えば、これまでの実施の形態とは異なり、ホスト910を主な処理を行うアプリケーションプログラムとして、ターゲット920を補助的なものとすることができる。
【0078】
本実施の形態の処理手順を以下に示す。予め、ホスト910側のデータあるいはプログラムの一部が暗号鍵Kで暗号化されているが、ホスト910側はターゲット920しか知らない秘密鍵である復号鍵Kdで暗号鍵Kを暗号化したEKしか持っていないものとする。
ステップ91では、ホスト910がユーザによって起動される。
ステップ92では、ホスト910は、ターゲット920をデバッグ対象として起動する。
ステップ93では、ターゲット920は、一時停止状態で起動され、一方でプロセスが生成されたというデバッグイベントがホスト910に通知される。
ステップ94では、ホスト910はイベントを受け取ると、暗号化された復号鍵EKのデータをターゲットのアドレスAに書き込み、ターゲット920の処理を続行させ、引き続きイベントを待つ。
【0079】
ステップ95では、ターゲット920は実行を再開すると、アドレスAから暗号化された鍵情報を読み込み、それを自分自身が保持する復号鍵Kdで復号し、結果の暗号鍵Kを再びアドレスAに書き込み、デバッグブレークを実行する。
ステップ96では、ホスト910がデバッグイベントを受け取ると、ターゲット920のアドレスAの内容を参照し、復号された結果を受け取る。以降、ホスト910側の暗号化されたデータやプログラムを暗号鍵Kで復号して実行を継続する。
【0080】
ここでは、初期化の処理時にのみ、ホスト910側がターゲット920側に処理を依頼する例であるが、ステップ96以降でターゲット920を一時停止状態で待機させておき、ホスト910で必要になったら、ステップ94以降の処理を行うというように構成する例も考えられる。このとき、ターゲット920に依頼したい処理の内容をターゲット920内のアドレスやレジスタに書き込んでから、ターゲット920の処理を続行させ、ターゲット920は指定された処理を行って、ホスト910側に値を返すというように構成することで、ターゲット920側の必要な機能をホスト910側が任意のタイミングで呼び出すことができる。ここで挙げた処理は暗号鍵を提供する例であるが、当然ながら任意の処理をターゲット920側に行わせることもできる。
また、前述の第2の実施の形態〜第6の実施の形態と組み合わせることもできる。例えば、第3の実施の形態と組み合わせて、ステップ96で得られた暗号鍵Kで、別のデータを復号すると、それがターゲット920内の暗号化されたコードを復号するための鍵を得られ、それをターゲット920に供給するというように組み合わせることもできる。
【0081】
図11は、第8の実施の形態(ホストとターゲットが協調してお互いに暗号化されたコードを実行する例)の概念的なモジュール構成図を示している。
ここでのホスト1010は図3の監視プログラム1200に対応し、ターゲット1020は図3の保護対象プログラム1300に対応する。
第8の実施の形態は、第5の実施の形態と第7の実施の形態を組み合わせたものである。第5の実施の形態では、ターゲットが任意のタイミングでホスト側に処理を依頼し、コードを復号してもらう。これに第7の実施の形態のような、ホスト側が任意のタイミングでターゲットに処理を依頼する仕組みを組み合わせる。
【0082】
以下に、本実施の形態の処理手順を示すが、処理が複雑であるので、ホスト1010側とターゲット1020側に分けて示す。
まず、ホスト1010側の処理についてである。
ステップ1101では、ホスト1010がユーザによって起動される。
ステップ1102では、ホスト1010は、ターゲット1020をデバッグ対象として起動し、ホスト1010のメインの処理を行うアプリスレッド1013を生成する。メインスレッド1011ではデバッグイベントを受け取る処理を行う。
ステップ1103−1(アプリスレッド1013の処理)では、アプリスレッド1013は元々のホスト1010の処理を続行する。ターゲット1020の処理を呼び出したいときには、ホスト1010のコマンド変数TGCMDにターゲット1020に対するコマンドを書き込み、ホスト1010のコマンド結果変数TGRESに値が書き込まれるのを待機する。
ステップ1103−2(アプリスレッド1013の処理)では、コマンド結果変数TGRESに値が書き込まれたらそれを参照して処理を続行する。以下、ステップ1103−1からステップ1103−2を必要時に繰り返す。
【0083】
ステップ1104では、デバッグイベントを受け取り、レジスタR1の値によって、ターゲット1020の要求を処理したり、ターゲット1020に処理要求を出す。具体的には、以下のステップ1104−1からステップ1104−4の処理となる。
ステップ1104−1(メインスレッド1011の処理)では、メインスレッド1011は、デバッグブレークイベントを待つ。発生したら、ターゲット1020のレジスタR1の内容を参照し、その値が特定の値(例えば0xFFFFFF01)であったら、ターゲット1020からの処理要求であると判断し、ターゲット1020のメモリ状態を読み込んで(例えば、メモリアドレスA(コマンド指定用)の内容)、処理を行い、その結果をターゲット1020に書き込んで(例えば、メモリアドレスB(結果格納用)に書き込む)、ターゲット1020を継続させる。
ステップ1104−2(メインスレッド1011の処理)では、レジスタR1の内容が別の特定の値(例えば0xFFFFFF02)である時は、ターゲット1020からの処理受付であると判断し、さらに、ホスト1010のコマンド変数TGCMDを参照し、そこにコマンドが書き込まれているときは、ターゲット1020のメモリにコマンドを書き込んで処理を継続させる。TGCMDが空であれば何もせず、ターゲット1020の処理を継続させる。
ステップ1104−3(メインスレッド1011の処理)では、レジスタR1の内容がさらに別の特定の値(例えば0xFFFFFF03)である時は、ターゲット1020からの処理結果通知であると判断し、ターゲット1020内の特定のメモリの値を読み込んで、ホスト1010のコマンド結果変数TGRESに値を書き込んで、ターゲット1020の処理を継続させる。
ステップ1104−4(メインスレッド1011の処理)では、以上のいずれでもない場合、ターゲット1020の終了イベントでなければターゲット1020の処理を継続し、終了イベントであればホスト1010も終了する。
【0084】
以下にターゲット1020側の処理手順を示す。
ステップ1201では、ターゲット1020は、ホスト1010によって起動される。
ステップ1202では、ターゲット1020は、ホスト1010に対して、コマンドを受け付けるためのスレッド(受付スレッド1022)を生成する。
ステップ1203−1(メインスレッド1021の処理)では、メインスレッド1021は処理を続行し、ホスト1010を呼び出したいときには、レジスタR1に0xFFFFFF01を入れ、また特定のメモリ領域にホスト1010に対する処理依頼内容を書き込んで、デバッグブレークイベントを発生させる。
ステップ1203−2では、処理を続行すると、ホスト1010からの処理結果がメモリ領域に書き込まれているはずなので、それを読み込んで処理を続行する。以下、ステップ1203−1からステップ1203−2を必要時に繰り返す。
【0085】
ステップ1204では、デバッグイベントを定期的に発生させながら、ホスト1010のコマンドを処理する。具体的には、以下のステップ1204−1からステップ1204−3の処理となる。
ステップ1204−1(受付スレッド1022の処理)では、一定時間毎(例えば、50msecおきなど)に、レジスタR1に0xFFFFFF02を入れて、デバッグブレークイベントを発生させる。
ステップ1204−2(受付スレッド1022の処理)では、特定のメモリ領域が空でなければ、それをホスト1010からのコマンド(処理依頼内容)と判断し、その処理を行い、結果を別のメモリ領域に書き込み、レジスタR1に0xFFFFFF03を入れて、デバッグブレークイベントを発生させる。何もなければ何もしない。
ステップ1204−3(受付スレッド1022の処理)では、ステップ1204−1からの処理を繰り返す。
【0086】
第9の実施の形態(ターゲットがホストのデバッグ状態を検出する例)を説明する。
これまでの実施の形態ではデバッギとして振舞うのはターゲットのみであるので、ホスト側をデバッガで解析する行為は防げない。そこで、ホスト側がデバッグされているかどうかをターゲット側で定期的に確認し、もし、ホスト側がデバッグされていることを検出したら、直ちに実行を停止するように構成することもできる。処理例を以下に示す。
(A)ホスト側の処理を以下に示す。
(1)ターゲットをデバッギとして起動する。このとき、自分のプロセスIDを引数として渡す。
(2)ターゲットからのデバッグイベントを待ち、終了イベントでない限りは、(2)を繰り返す。
【0087】
(B)ターゲット側の処理を以下に示す。
(1)引数として渡されたプロセスIDのプロセスがデバッグされていないかどうかをチェックするスレッドを生成する。そのスレッドは(2)の処理を行う。メインスレッドはターゲットの本来の処理(アプリケーションの機能など)を続行する。Windowsでは、CheckRemoteDebuggerPresent()というAPIを使ったり、あるいは、主流なデバッガ(Visual Studioなど)のプロセスが起動されることを検出しても良い。
(2)特定のプロセスIDのプロセスがデバッグされているかどうかを定期的(1分おきなど)にチェックし、もし、デバッグされていることを検出したら自分自身の処理を終了する。そうでなければ(2)を繰り返す。
このようにすると、ホストがデバッグされると、ターゲットをそれが検出して、プログラムを終了するようにできる。
【0088】
第10の実施の形態(多段構成の例)を説明する。
ホスト側をデバッガで解析する行為を防ぐための構成である。ホストに対するホスト、さらにはそのホストに対するホスト、というように多段階に構成する。
このとき、ホストとその下位のターゲット間の依存関係において、これまでに述べた実施の形態の様々な構成を組み合わせる。
【0089】
第11の実施の形態(相互にデバッガとして動作する例)を説明する。
ホストとターゲットの関係を対称なように(お互いがお互いのホストであり、ターゲットであるという)構成する。ステップを以下に示す。
(A)ホスト側の処理
(1)ターゲットをデバッギとして起動する。このとき、自分のプロセスIDを引数として渡す。
(2)ホストが本来行うべき処理を行うスレッドを生成する。
(3)ターゲットからのデバッグイベントを待ち、終了イベントでない限りは、(3)を繰り返す。
(B)ターゲット側の処理
(1)引数として渡されたプロセスIDに対して、自分がデバッガとしてアタッチする。アタッチに失敗したら、プロセスIDのプロセスを強制終了し、自分も終了する。
(2)ホストからのデバッグイベントを待ち、終了イベントでない限りは(2)を繰り返す。
【0090】
このようにすると、両方のプロセスが互いのプロセスのデバッガとなるので、外部からデバッグすることは一切できなくなる。上記では「アプリケーションが提供する本来の処理」をホスト側で行っているが、これはターゲット側で行ってもよいし、あるいは両者で処理してもよい。
また、この実施の形態は、お互いがお互いのデバッガとして動作するのであるが、これまで述べてきた実施の形態のようなホストとターゲットの依存関係を作り出すとより解析を困難にすることができる。
【0091】
第12の実施の形態(モジュールの構成に関する例)を説明する。
ホストとターゲットが別ファイルで、同じフォルダ内に存在していると、対応関係を推測される可能性があるので、モジュールとして一つに統合し、起動時オプションで、ホストとターゲットの動作を切り替えるようにする。ここで、オプションとは、例えば、コマンド名の後にハイフン(−)を付加して指定するものであり、そのコマンドによる処理に対する選択ができるものである。
【0092】
第13の実施の形態(ホストとターゲットのデバッガ/デバッギ関係を一定時間毎に切り替える例)を説明する。
動作しているプロセスに対して後からデバッガとしてアタッチするというAPIと対になるAPIとして、デバッガをデタッチするというAPIがある。これを利用して、あるタイミング毎にデバッガとデバッギの関係を切り替えるという方法もある。例えば、既にホストがターゲットを起動してターゲットのデバッガとして動作している状態で、以下のようにして切り替える。
【0093】
(1)ターゲット側では、一定時間毎に、レジスタに特定の値を入れるなどして、デバッガ切り替えを意味するデバッグブレークを発生させる。ターゲットは直ちに実行を停止する。
(2)ホストはデバッグイベントを受け取り、イベントがデバッガ切り替えであると判断したら、ターゲットの動作を継続させた上で、ターゲットからデタッチする。
(3)ターゲットは動作を再開したら、自分自身がデバッグされていないことを確認した上で(Windowsの場合は、IsDebuggerPresent()や、DebugActiveProcessStop()でFALSEが返るかどうか、などによって調べられる)、ホストにアタッチし、ホストからのデバッグイベントを待つ。
(4)ホストは、一定時間待ったら、(1)と同様のデバッガ切り替えのデバッグブレークを発生する。ホストは実行を停止する。
(5)ターゲットはデバッグイベントを受け取り、イベントがデバッガ切り替えであると判断したら、ホストの動作を継続させた上でホストからデタッチする。
(6)ホストは動作を再開したら、自分自身がデバッグされていないことを確認した上で、ターゲットにアタッチし、ターゲットからのデバッグイベントを待つ。
(7)上記(1)〜(6)を繰り返す。
【0094】
なお、ターゲットからホストへ制御を渡すのに、前述したブレークポイント等以外に、様々な例外(エラーによるデバッグイベント)を発生させるようにしてもよい。
ターゲットのプロセス内で、通常はエラーのときにしか発生しない例外である、0による除算や、アクセスバイオレーションなど、デバッガが存在しないと正常に実行を継続できない例外を複数回発生させる(ループ内などで)。
ホストは、どこでその例外が発生するかを把握しているので、例外が発生したら、ターゲットプロセス内の例外発生の原因を修正し(プログラムカウンタを進めたり、レジスタやメモリの内容を書き換えるなど)、処理を継続させる。これによって、ターゲット単体では実行できないようにする。
【0095】
なお、起動方法のバリエーションとして次のようにしてもよい。
これまでの実施の形態では、ホストが先に起動され、ホストからターゲットをデバッギとして起動していたが、ターゲットを普通に起動した後に、ターゲットが、自分自身のプロセスのIDを引数にしてホストを起動して、ホストがターゲットにアタッチするという構成もある。
【0096】
なお、ターゲット(デバッギ)からホスト(デバッガ)への通知(デバッグイベント)の例として、次のようにしてもよい。
デバッグイベントはプロセス/スレッドが生成/終了したとき、例外(アクセス違反など)が発生したとき、DLL(Dynamic Linking Library)をロード/アンロードしたとき、デバッグ文字列を出力したとき、などがある。これらはいずれもターゲットからホストに処理要求を通知するのに使うことができる。特にデバッグ文字列の出力は、ホストに対するパラメータを文字列として渡すことができる。
【0097】
なお、ホスト(デバッガ)からターゲット(デバッギ)への通知方法例として、次のようにしてもよい。
これまでの実施例では、ターゲットをホストが呼び出す際には、下記の2つの方法があった。
(1)ターゲット側が定期的にデバッグブレークを発生させ、そのタイミングで、コマンドがあれば、ホスト側がターゲットプロセス内のメモリに処理依頼内容を書き込んでおく方法
(2)ターゲット側は、必要がない場合は、一時停止状態で待機させておいて、ホスト側が必要になったときに、ターゲット側のプロセス内のメモリに処理依頼内容を書き込んで、処理を再開させる方法
これら以外にも、OSがサポートするAPIの種類によっては、ホスト側が強制的にターゲットの処理を中断させる方法もある(Windowsの場合は、DebugBreakProcess()、Unix(登録商標)系の場合は、kill()でシグナルを送る、など)。
【0098】
この方法を用いた処理の例を以下に示す。
(1)ターゲット側には要求処理を待つスレッドを用意しておく。
(2)ホストがターゲットを強制中断する。
(3)ホストはターゲット内の特定のメモリに要求内容を書き込んでプロセスを再開させる。
(4)ターゲットは終了したらデバッグブレークを発生させる。もしくは、別のメモリ領域に結果を書き込む。
(5)ホストは、デバッグブレークを待つ、もしくは、ターゲットの結果が書き込まれる領域を監視し、結果を受け取る。
【0099】
なお、本実施の形態としてのプログラムが実行されるコンピュータのハードウェア構成は、図12に示すように、一般的なコンピュータであり、具体的には各種アプリケーションソフトウェアが実装されたパーソナルコンピュータ等である。本実施の形態では、アプリケーションソフトウェアは、主に保護対象プログラム1300等となる。その保護対象プログラム1300、保護対象プログラム1300とペアになる監視プログラム1200等のプログラムを実行するCPU901と、そのプログラムやデータを記憶するRAM902と、本コンピュータを起動するためのプログラム等が格納されているROM903と、補助記憶装置であるHD904と、キーボード、マウス等のデータを入力する入力装置906と、CRTや液晶ディスプレイ等の出力装置905と、通信ネットワークと接続するための通信回線インタフェース907、そして、それらをつないでデータのやりとりをするためのバス908により構成されている。これらのコンピュータが複数台互いにネットワークによって接続されていてもよい。
【0100】
なお、図12に示すハードウェア構成は、1つの構成例を示すものであり、本実施の形態は、図12に示す構成に限らず、本実施の形態において説明したモジュールを実行可能な構成であればよい。例えば、一部のモジュールを専用のハードウェア(例えばASIC等)で構成してもよい。また、特に、パーソナルコンピュータの他、携帯電話、ゲーム機、カーナビ機、情報家電、複写機、ファックス、スキャナ、プリンタ、複合機(多機能複写機とも呼ばれ、スキャナ、プリンタ、複写機、ファックス等の機能を有している)などに組み込まれていてもよい。
【0101】
なお、説明したプログラムについては、記録媒体に格納することも可能であり、また、そのプログラムを通信手段によって提供することもできる。その場合、例えば、上記説明したプログラムについて、「プログラムを記録したコンピュータ読み取り可能な記録媒体」の発明として捉えることもできる。
「プログラムを記録したコンピュータ読み取り可能な記録媒体」とは、プログラムのインストール、実行、プログラムの流通などのために用いられる、プログラムが記録されたコンピュータで読み取り可能な記録媒体をいう。
なお、記録媒体としては、例えば、デジタル・バーサタイル・ディスク(DVD)であって、DVDフォーラムで策定された規格である「DVD−R、DVD−RW、DVD−RAM等」、DVD+RWで策定された規格である「DVD+R、DVD+RW等」、コンパクトディスク(CD)であって、読出し専用メモリ(CD−ROM)、CDレコーダブル(CD−R)、CDリライタブル(CD−RW)等、光磁気ディスク(MO)、フレキシブルディスク(FD)、磁気テープ、ハードディスク、読出し専用メモリ(ROM)、電気的消去および書換可能な読出し専用メモリ(EEPROM)、フラッシュ・メモリ、ランダム・アクセス・メモリ(RAM)等が含まれる。
そして、上記のプログラムまたはその一部は、上記記録媒体に記録して保存や流通等させることが可能である。また、通信によって、例えば、ローカル・エリア・ネットワーク(LAN)、メトロポリタン・エリア・ネットワーク(MAN)、ワイド・エリア・ネットワーク(WAN)、インターネット、イントラネット、エクストラネット等に用いられる有線ネットワーク、あるいは無線通信ネットワーク、さらにはこれらの組合せ等の伝送媒体を用いて伝送することが可能であり、また、搬送波に乗せて搬送することも可能である。
さらに、上記のプログラムは、他のプログラムの一部分であってもよく、あるいは別個のプログラムと共に記録媒体に記録されていてもよい。
【図面の簡単な説明】
【0102】
【図1】システム全体の構成例を示すブロック図である。
【図2】デバッガとデバッギとの関係を示す説明図である。
【図3】本実施の形態の全体の構成例を示すブロック図である。
【図4】第1の実施の形態の構成例を示すブロック図である。
【図5】第2の実施の形態の構成例を示すブロック図である。
【図6】第3の実施の形態の構成例を示すブロック図である。
【図7】第4の実施の形態の構成例を示すブロック図である。
【図8】第5の実施の形態の構成例を示すブロック図である。
【図9】第6の実施の形態の構成例を示すブロック図である。
【図10】第7の実施の形態の構成例を示すブロック図である。
【図11】第8の実施の形態の構成例を示すブロック図である。
【図12】実施の形態を実現するコンピュータのハードウェア構成例を示すブロック図である。
【符号の説明】
【0103】
10…ダミーデバッガ
20…保護対象プログラム
30…攻撃者のデバッガ
40…OS
210…デバッガ
220…デバッグ対象プログラム
310、410、510、610、710、810、910、1010…ホスト
320、420、520、620、720、820、920、1020…ターゲット
1011…メインスレッド
1012…コマンド変数TGCMD/コマンド結果変数TGRES
1013…アプリスレッド
1021…メインスレッド
1022…受付スレッド
1100…監視プログラム起動モジュール
1200…監視プログラム
1210…プログラム起動モジュール
1220…第2の秘密値記憶モジュール
1230…必要情報記憶モジュール1
1240…プログラムコード記憶モジュール
1250…復号モジュール
1260…関数呼出先記憶モジュール
1270…必要情報取得モジュール2
1300…保護対象プログラム
1310…確認モジュール
1320…第1の秘密値記憶モジュール
1330…判断モジュール
1340…必要情報取得モジュール1
1350…プログラムコード取得モジュール
1360…関数呼出先取得モジュール
1370…必要情報記憶モジュール2
【特許請求の範囲】
【請求項1】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
秘密の値である秘密値を記憶している第1の秘密値記憶機能
を実現させ、
前記監視プログラムは、
前記保護対象プログラムの前記第1の秘密値記憶機能に記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶機能
を実現させ、
前記保護対象プログラムは、
前記第2の秘密値記憶機能によって記憶されている秘密値は、前記第1の秘密値記憶機能によって記憶されている秘密値と同じであるか否かを判断する判断機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項2】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項3】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶機能、
前記プログラムコードを前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項4】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項5】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記関数呼出先を記憶している関数呼出先記憶機能、
前記関数呼出先を保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項6】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記監視プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項7】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記監視プログラムに前記情報を設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項8】
前記監視プログラムは他の監視プログラムから監視されている
ことを特徴とする請求項1,2,3,4,5,6または7に記載のプログラム。
【請求項9】
前記監視プログラムは前記保護対象プログラムを監視することを解除し、
前記保護対象プログラムは前記監視プログラムを監視することを開始する
ことを特徴とする請求項1,2,3,4,5,6または7に記載のプログラム。
【請求項10】
前記監視プログラムと前記保護対象プログラムを1つのモジュールとし、
前記モジュールを起動する場合の引数によって、前記監視プログラムまたは前記保護対象プログラムを起動する
ことを特徴とする請求項1,2,3,4,5,6または7に記載のプログラム。
【請求項11】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより秘密の値である秘密値を記憶している第1の秘密値記憶手段と、
前記監視プログラムにより前記第1の秘密値記憶手段によって記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶手段と、
前記保護対象プログラムにより前記第2の秘密値記憶手段によって記憶されている秘密値は、前記第1の秘密値記憶手段によって記憶されている秘密値と同じであるか否かを判断する判断手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項12】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記保護対象プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項13】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶手段と、
前記保護対象プログラムに前記プログラムコードを設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項14】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項15】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムにより前記関数呼出先を記憶している関数呼出先記憶手段と、
前記保護対象プログラムに前記関数呼出先を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項16】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記監視プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項17】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記情報を前記監視プログラムに設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項1】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
秘密の値である秘密値を記憶している第1の秘密値記憶機能
を実現させ、
前記監視プログラムは、
前記保護対象プログラムの前記第1の秘密値記憶機能に記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶機能
を実現させ、
前記保護対象プログラムは、
前記第2の秘密値記憶機能によって記憶されている秘密値は、前記第1の秘密値記憶機能によって記憶されている秘密値と同じであるか否かを判断する判断機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項2】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項3】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶機能、
前記プログラムコードを前記保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項4】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項5】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記関数呼出先を記憶している関数呼出先記憶機能、
前記関数呼出先を保護対象プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項6】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記情報を前記監視プログラムに設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項7】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作するコンピュータに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動機能
を実現させる前記保護対象プログラム及び前記監視プログラムを有しており、
前記監視プログラムは、
前記保護対象プログラムを監視する保護対象プログラム監視機能、
前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号機能
を実現させ、
前記保護対象プログラムは、
前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶機能、
前記監視プログラムに前記情報を設定する設定機能
を実現させ、前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とするプログラム。
【請求項8】
前記監視プログラムは他の監視プログラムから監視されている
ことを特徴とする請求項1,2,3,4,5,6または7に記載のプログラム。
【請求項9】
前記監視プログラムは前記保護対象プログラムを監視することを解除し、
前記保護対象プログラムは前記監視プログラムを監視することを開始する
ことを特徴とする請求項1,2,3,4,5,6または7に記載のプログラム。
【請求項10】
前記監視プログラムと前記保護対象プログラムを1つのモジュールとし、
前記モジュールを起動する場合の引数によって、前記監視プログラムまたは前記保護対象プログラムを起動する
ことを特徴とする請求項1,2,3,4,5,6または7に記載のプログラム。
【請求項11】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより秘密の値である秘密値を記憶している第1の秘密値記憶手段と、
前記監視プログラムにより前記第1の秘密値記憶手段によって記憶されている秘密値と同じ値である秘密値を記憶している第2の秘密値記憶手段と、
前記保護対象プログラムにより前記第2の秘密値記憶手段によって記憶されている秘密値は、前記第1の秘密値記憶手段によって記憶されている秘密値と同じであるか否かを判断する判断手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項12】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記保護対象プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項13】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムのプログラムコードとして欠けているプログラムコードを記憶しているプログラムコード記憶手段と、
前記保護対象プログラムに前記プログラムコードを設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項14】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項15】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムは、関数呼出先を介して関数を呼び出すプログラムコードであって、
前記監視プログラムにより前記関数呼出先を記憶している関数呼出先記憶手段と、
前記保護対象プログラムに前記関数呼出先を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項16】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記監視プログラムに前記情報を設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【請求項17】
プロセスに対して、1つのプロセスのみが監視できるオペレーティングシステムで動作する情報処理システムに、
保護の対象である保護対象プログラムを起動する場合に、該保護対象プログラムを監視する監視プログラムを起動する監視プログラム起動手段と、
前記監視プログラムにより前記保護対象プログラムを監視する保護対象プログラム監視手段と、
前記監視プログラムにより前記保護対象プログラムの一部が暗号化されているプログラムコードまたはデータを復号する復号手段と、
前記保護対象プログラムにより前記監視プログラムが処理を続行するために必要な情報を記憶している必要情報記憶手段と、
前記情報を前記監視プログラムに設定する設定手段
を有し、
前記監視プログラムが起動することにより前記保護対象プログラムが他のプログラムにより監視されるのを防止することを特徴とする情報処理システム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【公開番号】特開2008−59596(P2008−59596A)
【公開日】平成20年3月13日(2008.3.13)
【国際特許分類】
【出願番号】特願2007−246418(P2007−246418)
【出願日】平成19年9月25日(2007.9.25)
【分割の表示】特願2006−237124(P2006−237124)の分割
【原出願日】平成18年9月1日(2006.9.1)
【出願人】(000005496)富士ゼロックス株式会社 (21,908)
【Fターム(参考)】
【公開日】平成20年3月13日(2008.3.13)
【国際特許分類】
【出願日】平成19年9月25日(2007.9.25)
【分割の表示】特願2006−237124(P2006−237124)の分割
【原出願日】平成18年9月1日(2006.9.1)
【出願人】(000005496)富士ゼロックス株式会社 (21,908)
【Fターム(参考)】
[ Back to top ]