(57)【要約】【課題】  プログラムの解析を簡素な構成で困難化することが可能なプログラム実行方法、そのプログラム作成方法、それを実行する情報処理装置及びそのプログラムを提供する。【解決手段】  プログラム１００ａは、任意のコード１０１，１０３及び保護対象コード１０２の他に、保護箇所開始識別子１３と保護箇所終了識別子１４と保護箇所検索ルーチン呼び出しコード１１と保護作用解除ルーチン呼び出しコード１２とを有する。保護箇所開始識別子１３と保護箇所終了識別子１４とは保護対象コード１０２のメモリ上の位置を示す。保護箇所検索ルーチン呼び出しコード１１で呼び出された保護箇所検索ルーチンは保護対象コード１０２の位置を特定する。保護作用解除ルーチン呼び出しコード１２で呼び出された保護作用解除ルーチンは保護対象コードに適用された保護作用を解除する。【選択図】          図４
2005165919.tif 000002
【特許請求の範囲】
【請求項１】
メモリに展開されたプログラムを解析から保護しつつ実行するためのプログラム実行方法であって、
前記プログラムは、保護作用が適用された第１のコードと、該第１のコードに適用された前記保護作用を解除するための第２のコードとを含み、
前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除するステップを有することを特徴とするプログラム実行方法。
【請求項２】
前記プログラムは、前記メモリにおける前記第１のコードのアドレスを特定するための第３のコードと、前記メモリにおける前記第１のコードの存在範囲を示す識別子とを含み、
前記ステップは、前記プログラムの実行中に前記第３のコードを実行することで前記第１のコードの前記アドレスを特定する第１のステップと、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、
前記第１のステップは、関数ポインタの値から特定される関数の実行時の先頭アドレスを起点として前記識別子を検索することで前記第１のコードの前記アドレスを特定することを特徴とする請求項１記載のプログラム実行方法。
【請求項３】
前記プログラムは、前記第１のコードに保護作用を適用するための第３のコードを含み、
前記第１のコードを実行後、前記第３のコードを実行することで前記第１のコードに前記保護作用を適用するステップを有することを特徴とする請求項１記載のプログラム実行方法。
【請求項４】
前記保護作用は暗号化であることを特徴とする請求項１記載のプログラム実行方法。
【請求項５】
前記プログラムは、当該プログラムにおける少なくとも一部のコードを指定するための識別子を含み、
前記暗号化は、前記識別子で指定されたコードに基づいて算出した値を暗号鍵とした暗号化であり、
前記ステップは、前記識別子で指定されたコードに基づいて前記値を算出する第１のステップと、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、
前記第２のステップは前記第１のステップで算出した前記値を復号鍵として前記第１のコードに適用された前記保護作用を解除することを特徴とする請求項４記載のプログラム実行方法。
【請求項６】
前記識別子で指定されたコードは、前記第２のコードを含むことを特徴とする請求項５記載のプログラム実行方法。
【請求項７】
前記プログラムはコードとして乱数を含み、
前記識別子で指定されたコードは、前記乱数を含むことを特徴とする請求項５記載のプログラム実行方法。
【請求項８】
前記第１のステップで算出された前記値は、前記識別子で指定されたコードのチェックサム値又はハッシュ値であることを特徴とする請求項５、６または７記載のプログラム実行方法。
【請求項９】
前記ステップは、前記第１のコードに適用された暗号化を解除するための復号鍵を前記プログラムの内部又は外部から取得する第１のステップと、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、
前記第２のステップは前記第１のステップで取得した前記復号鍵を用いて前記第１のコードに適用された前記保護作用を解除することを特徴とする請求項４記載のプログラム実行方法。
【請求項１０】
前記ステップは、前記第１のコードに適用された前記保護作用が解除済みであるか否かを判定する第１のステップと、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、
前記第１のステップによる判定の結果、前記第１のコードに適用された前記保護作用が解除済みである場合、前記第２のステップを実行せずに前記第１のコードを実行することを特徴とする請求項１記載のプログラム実行方法。
【請求項１１】
前記ステップは、前記プログラムが解析されているか否かを判定する第１のステップと、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、
前記第１のステップによる判定の結果、前記プログラムが解析されている場合、前記プログラムの実行を停止する、又は前記第２のステップをスキップすることを特徴とする請求項１記載のプログラム実行方法。
【請求項１２】
前記プログラムのコード領域には書き換え可能を示す属性値が与えられていることを特徴とする請求項１記載のプログラム実行方法。
【請求項１３】
前記識別子は前記第１のコードに関して前後に設けられた所定パターンのコードであり、
前記第１のステップは前記所定パターンに基づいて前記識別子を検索することで前記第１のコードの前記アドレスを特定することを特徴とする請求項２記載のプログラム実行方法。
【請求項１４】
メモリに読み込まれて実行されるプログラムを作成するためのプログラム作成方法であって、
保護対象とする第１のコードと、前記メモリにおける前記第１のコードの存在範囲を示す識別子とを含むプログラムをメモリに読み込む第１のステップと、
前記識別子を検索することで前記メモリにおける前記第１のコードのアドレスを特定する第２のステップと、
前記第２のステップで特定した前記アドレスに基づいて前記第１のコードに保護作用を適用する第３のステップとを有することを特徴とするプログラム作成方法。
【請求項１５】
保護作用が適用された第１のコードと、該第１のコードに適用された前記保護作用を解除するための第２のコードとを含むプログラムをメモリに読み出して実行する情報処理装置であって、
前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除することを特徴とする情報処理装置。
【請求項１６】
前記プログラムは、前記メモリに展開された前記第１のコードのアドレスを特定するための第３のコードと、前記メモリにおける前記第１のコードの存在範囲を示す識別子とを含み、
前記プログラムの実行中に前記第３のコードを実行することで前記第１のコードの前記アドレスを特定するにあたり、関数ポインタの値から特定される関数の先頭アドレスを起点として前記識別子を検索することで第１のコードの前記アドレスを特定することを特徴とする請求項１５記載の情報処理装置。
【請求項１７】
コンピュータがメモリに読み出して実行するプログラムであって、
保護作用が適用された第１のコードと、
前記メモリにおける前記第１のコードの存在範囲を示す第１の識別子と、
前記第１の識別子を検索させることで前記第１のコードの前記メモリにおけるアドレスを前記コンピュータに特定させるための第２のコードと、
前記第２のコードを実行することで特定された前記第１のコードに適用された前記保護作用を前記コンピュータに解除させるための第３のコードとを有し、
前記第２のコードは、関数ポインタの値から特定される関数の先頭アドレスを起点として前記第１の識別子を検索するように前記コンピュータを動作させることを特徴とするプログラム。
【請求項１８】
前記第１のコードが実行された後で前記保護作用を適用するように前記コンピュータを動作させるための第４のコードを有することを特徴とする請求項１７記載のプログラム。
【請求項１９】
前記保護作用は暗号化であり、
全コード領域における少なくとも一部を指定する第２の識別子と、
前記第２の識別子で指定されたコード領域に基づいて前記保護作用を解除するための復号鍵を前記コンピュータに生成させる第５のコードとを有し、
前記第３のコードは、前記第５のコードを実行することで生成された前記復号鍵に基づいて前記第１のコードに適用された前記保護作用を解除するように前記コンピュータを動作させることを特徴とする請求項１７または１８記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム実行方法、プログラム作成方法、情報処理装置及びプログラムに関し、特にソフトウェアの内部を解析する行為に対して耐性を持たせたプログラム実行方法、そのプログラム作成方法、それを実行する情報処理装置及びそのプログラムに関する。
【背景技術】
【０００２】
ＩＴ（Information Technology）技術の普及に伴い、コンピュータソフトウェアの実装上の安全性が問題となってきている。特にソフトウェアプログラムの内部を解析、改造されることによって、ソフトウェア製作者が意図した動作を変更され、不正な利用を可能にしてしまう、ということが問題視されてきている。
【０００３】
例えば市販されているソフトウェアには、これの著作権などを保護する目的として、様々な手法が盛り込まれている。代表的な例としては、ソフトウェア製品を正規に購入した者だけが知りえるシリアル番号を利用して、ソフトウェアの使用を許可するか否かを判定するルーチンを組み込む手法が挙げられる。
【０００４】
しかしながら、上記のような手法では、判定ルーチンを解析することで、どのようなシリアル番号であっても、あるいはシリアル番号が入力されなくても、常にソフトウェアの使用を許可するようにプログラムを改造することが可能である。
【０００５】
このような解析からソフトウェアを保護する技術としては、例えば以下の特許文献１に開示される方法が存在する。本従来技術は、保護対象とするソフトウェアプログラムをセンタ側と端末側に分割した構成を有する。また、ソフトウェアを使用する際は、センタ側に保持されたソフトウェアの断片を端末にダウンロードする。この方法によれば、端末側に保持されたソフトウェアの断片を解析しても、ソフトウェア全体を把握することができない。従って、解析に対するソフトウェアの保護を向上することができる。
【０００６】
また、前記のような解析に対して保護作用を付与する方法としては、ソフトウェアプログラムに対し、暗号化に代表される変換を施す方法が考えられる。例えば、プログラムコード全体を暗号化し、実行時にプログラムコード全体をメモリ上で復号するやりかたなどがこれである。この場合、非実行時においてプログラムコードは暗号化されているため、それを解析することはできないという利点がある。
【０００７】
この他、ソフトウェアを暗号化する技術としては、例えば特許文献２に開示される方法が存在する。本従来技術では、一部が暗号化されたプログラムを複数用いる。また、一方のプログラムにおける暗号化部分を復号化するためのコードは他方のプログラムが格納している。従って、プログラム全体は、それぞれのプログラムにおける暗号化部分を交互に復号化しつつ、実行される。
【特許文献１】特開平８−１６３８５号公報
【特許文献２】特開２００１−３１８７８６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上述した各従来技術には様々な問題点が存在する。例えば保護対象とするソフトウェアプログラムをセンタ側と端末側に分割した技術では、ソフトウェアを実行する際、センタ側の断片を端末側にダウンロードし、これをメモリ上に展開する必要がある。このため、このメモリを参照することで、プログラム全体を解析することができるという問題が存在する。
【０００９】
また、プログラムコード全体を暗号化する技術では、実行時にすべてのプログラムコードが復号化され、メモリ上に展開されてしまうため、メモリ上のコードが解析されることを妨ぐことはできないという問題が存在する。
【００１０】
更に、一部が暗号化されたプログラムを複数用いる技術では、必ず二つ以上のプログラムを用意する必要があり、設計が煩雑となるという問題が存在する。尚、上記した特許文献２には、具体的にどのようにプログラムを構築すれば、実行時に復号できるようになるかが記載されておらず、実現方法が不明である。
【００１１】
したがって、本発明は、上記問題点に鑑みてなされたものであって、プログラムの解析を簡素な構成で困難化することが可能なプログラム実行方法、そのプログラム作成方法、それを実行する情報処理装置及びそのプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
かかる目的を達成するために、本発明は、請求項１記載のように、メモリに展開されたプログラムを解析から保護しつつ実行するためのプログラム実行方法であって、前記プログラムが保護作用が適用された第１のコードと該第１のコードに適用された前記保護作用を解除するための第２のコードとを含み、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除するステップを有して構成される。プログラムの少なくとも一部であって保護対象であるコード（第１のコード）に保護作用を適用することで、当該プログラムの非実行時に、当該プログラムの解析を困難とすることができる。また、上記のように適用された保護作用を当該プログラムの実行中に解除するように構成することで、保護作用が解除された状態、すなわち解析が可能な状態を短い時間とすることができ、当該プログラムの解析を困難とすることができる。しかも、このように作用するプログラムは、単一のプログラム又はメインルーチンとサブルーチンとで構成されたプログラムという簡素な構成で実現することができる。但し、メインルーチンとサブルーチンとで構成されたプログラムであっても、プログラムコードの実行手順は単一のプログラムと同一である。従って、本発明では、メインルーチンとサブルーチンとで構成されたプログラムを単一のプログラムと見なす。
【００１３】
また、請求項１記載の発明は、例えば請求項２記載のように、前記プログラムが前記メモリにおける前記第１のコードのアドレスを特定するための第３のコードと前記メモリにおける第１のコードの存在範囲を示す識別子とを含み、前記ステップが前記プログラムの実行中に前記第３のコードを実行することで前記第１のコードの前記アドレスを特定する第１のステップと前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、前記第１のステップが関数ポインタの値から特定される関数の先頭アドレスを起点として前記識別子を検索することで前記第１のコードの前記アドレスを特定するように構成されてもよい。メモリにおける第１のコードのアドレスを取得するためのコード（第３のコード）は、同一のプログラム中に記述することができる。また、メモリにおける第１のコードの存在位置を表す識別子をプログラムに設けることで、容易に保護対象である第１のコードのアドレスを特定することが可能となる。更に、例えばＣ言語などを用いた場合、関数の実行時のアドレスは命令文により容易に特定することができる。従って、これを起点として第１のコードのアドレスを特定することで、容易にこれを取得することが可能となる。
【００１４】
また、請求項１記載の発明は、例えば請求項３記載のように、前記プログラムが前記第１のコードに保護作用を適用するための第３のコードを含み、前記第１のコードを実行後、前記第３のコードを実行することで前記第１のコードに前記保護作用を適用するステップを有して構成されてもよい。第１のコードに保護作用を適用するためのコード（第３のコード）をプログラムに設けることで、適宜保護対象である第１のコードに保護作用を適用することが可能となる。また、本発明によれば、保護作用を解除し、第１のコードを実行した後、再度第１のコードに保護作用を適用するように構成することも可能となる。これにより、保護作用が解除された状態、すなわち解析が可能な状態を最短の時間とすることができ、当該プログラムの解析をさらに困難とすることができる。
【００１５】
また、請求項１記載の発明は、例えば請求項４記載のように、前記保護作用が暗号化であってもよい。暗号化は最も一般的で且つ効果的な手法である。従って、これを用いることで、プログラムを解析から容易に保護することができる。
【００１６】
また、請求項４記載の発明は、例えば請求項５記載のように、前記プログラムが当該プログラムにおける少なくとも一部のコードを指定するための識別子を含み、前記暗号化が前記識別子で指定されたコードに基づいて算出した値を暗号鍵とした暗号化であり、前記ステップが前記識別子で指定されたコードに基づいて前記値を算出する第１のステップと前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、前記第２のステップが前記第１のステップで算出した前記値を復号鍵として前記第１のコードに適用された前記保護作用を解除するように構成されてもよい。上述したように、暗号化は最も一般的で且つ効果的な手法であるため、これを用いることで、プログラムを解析から容易に保護することができる。ここで、暗号化に用いる暗号鍵をプログラムにおける少なくとも一部のコードから生成するように構成することで、保護作用が適用された第１のコードの復号時に用いる復号鍵をプログラム内に実装する必要がなくなる。従って、プログラムの解析をより困難とすることができる。また、プログラムにおける少なくとも一部のコードから復号鍵を生成するように構成することで、この一部のコードに何らかの改竄が行われた場合に、正しい復号鍵の生成することができないという効果も得られる。
【００１７】
また、請求項５記載の発明は、請求項６記載のように、前記識別子で指定されたコードが前記第２のコードを含んで構成されることが好ましい。第２のコードは保護作用を解除するためのコードである。ここで、例えば保護作用を暗号化とした場合、このコードは、解析者がデバッガ上で復号ルーチンの解析を行おうとする際に、デバッガのブレークポイント機能によって書き換えられてしまう。このため、デバッガ上で鍵の計算ルーチンを動作させると、正しい鍵の値を得ることができない。この結果、暗号化された保護対象箇所を正しく復号化することができず、正常な実行を妨げることとなり、解析に対する耐性を高めることができる。
【００１８】
また、請求項５記載の発明は、請求項７記載のように、前記プログラムがコードとして乱数を含み、前記識別子で指定されたコードが前記乱数を含んで構成されることが好ましい。復号鍵を生成するためのコード内に乱数を含ませることで、復号鍵に変化を持たせることが可能となる。これにより、計算される復号鍵が変化するため、解析に対する耐性をより向上することができる。
【００１９】
また、請求項５、６または７記載の発明は、例えば請求項８記載のように、前記第１のステップで算出された前記値が前記識別子で指定されたコードのチェックサム値又はハッシュ値であってもよい。但し、本発明はこれに限定するものでなく、復号鍵（暗号鍵も含む）として使用するに好ましい値であれば、如何なる方法で算出した値でも適用することができる。
【００２０】
また、請求項５記載の発明は、例えば請求項９記載のように、前記ステップが前記第１のコードに適用された暗号化を解除するための復号鍵を前記プログラムの内部又は外部から取得する第１のステップと前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、前記第２のステップが前記第１のステップで取得した前記復号鍵を用いて前記第１のコードに適用された前記保護作用を解除するように構成されてもよい。このように本発明は、復号鍵をプログラム内部に記述すること、又はこれを外部から取得することを排除するものでない。
【００２１】
また、請求項１記載の発明は、例えば請求項１０記載のように、前記ステップが前記第１のコードに適用された前記保護作用が解除済みであるか否かを判定する第１のステップと前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、前記第１のステップによる判定の結果、前記第１のコードに適用された前記保護作用が解除済みである場合、前記第２のステップを実行せずに前記第１のコードを実行するように構成されてもよい。第１のコードを複数回実行するように構成されていた場合などでは、一度実行した段階で第１のコードの保護作用は解除されている。従って、これの保護作用を再度解除する必要はない。本発明は、このような場合に適用されても好適な構成である。
【００２２】
また、請求項１記載の発明は、例えば請求項１１記載のように、前記ステップが前記プログラムが解析されているか否かを判定する第１のステップと前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除する第２のステップとを含み、前記第１のステップによる判定の結果、前記プログラムが解析されている場合、前記プログラムの実行を停止する、又は前記第２のステップをスキップするように構成されてもよい。デバッガなどによるプログラムの解析が検出された場合、プログラムの実行を停止するか、又は第１のコードの保護作用を解除する第１のステップをスキップすることで、保護作用を維持することができるため、プログラムの解析を未然に防ぐことが可能となる。
【００２３】
また、請求項１記載の発明は、請求項１２記載のように、前記プログラムのコード領域に書き換え可能を示す属性値が与えられていることが好ましい。保護作用を例えば暗号化とした場合、第１のコードを復号化した際に、これをメモリ上に書き込む必要がある。この際、保護作用が適用された状態の第１のコードとは別の書き換え可能なメモリ領域に復号化した第１のコードを格納することも可能であるが、この場合、実行アドレスを変更しなければならないという手間が生じる。そこで、プログラムのコード領域を書き換え可能に設定しておくことで、保護作用が適用された状態の第１のコードを復号化した第１のコードで置き換えることが可能となり、処理の簡素化が図れる。
【００２４】
また、請求項２記載の発明は、例えば請求項１３記載のように、前記識別子が前記第１のコードに関して前後に設けられた所定パターンのコードであり、前記第１のステップが前記所定パターンに基づいて前記識別子を検索することで前記第１のコードの前記アドレスを特定するように構成されてもよい。メモリにおける第１のコードの存在範囲を示す識別子を所定パターンのコードとすることで、この識別子を検索することが容易となるため、結果として、第１のコードのアドレスを特定することが容易となる。また、この識別子を第１のコードの前後に設けることで、第１のコードの先頭アドレスと後尾アドレスとを容易に特定することができる。尚、より好ましくは、識別子を第１のコードの直前及び直後に設けることである。これにより、識別子のアドレスから簡単に第１のコードの存在範囲を特定することができる。
【００２５】
また、他の本発明は、請求項１４記載のように、メモリに読み込まれて実行されるプログラムを作成するためのプログラム作成方法であって、保護対象とする第１のコードと前記メモリにおける前記第１のコードの存在範囲を示す識別子とを含むプログラムをメモリに読み込む第１のステップと、前記識別子を検索することで前記メモリにおける前記第１のコードのアドレスを特定する第２のステップと、前記第２のステップで特定した前記アドレスに基づいて前記第１のコードに保護作用を適用する第３のステップとを有する。プログラムの少なくとも一部であって保護対象であるコード（第１のコード）に保護作用を適用することで、当該プログラムの非実行時に、当該プログラムの解析が困難なプログラムを作成できる。また、上記のように適用された保護作用が当該プログラムの実行中に解除されるように構成することで、保護作用が解除された状態、すなわち解析が可能な状態を短い時間とすることができ、解析が困難なプログラムを作成することができる。しかも、このように作用するプログラムは、単一のプログラム又はメインルーチンとサブルーチンとで構成されたプログラムという簡素な構成で実現することができる。また、メモリにおける第１のコードの位置を示す識別子をプログラムに設けることで、容易に保護対象である第１のコードのアドレスを特定することが可能なプログラムを作成できる。
【００２６】
また、他の本発明は、請求項１５記載のように、保護作用が適用された第１のコードと、該第１のコードに適用された前記保護作用を解除するための第２のコードとを含むプログラムをメモリに読み出して実行する情報処理装置であって、前記プログラムの実行中に前記第２のコードを実行することで前記第１のコードに適用された前記保護作用を解除するように構成される。プログラムの少なくとも一部であって保護対象であるコード（第１のコード）に保護作用が適用されたプログラムの実行中に、当該コードの保護作用を解除するように構成することで、保護作用が解除された状態、すなわち解析が可能な状態を短い時間とすることができ、当該プログラムの解析を困難とすることができる。しかも、このように作用するプログラムは、単一のプログラム又はメインルーチンとサブルーチンとで構成されたプログラムという簡素な構成で実現することができる。
【００２７】
また、請求項１５記載の発明は、例えば請求項１６記載のように、前記プログラムが前記メモリに展開された前記第１のコードのアドレスを特定するための第３のコードと前記メモリにおける前記第１のコードの存在範囲を示す識別子とを含み、前記プログラムの実行中に前記第３のコードを実行することで前記第１のコードの前記アドレスを特定するにあたり、関数ポインタの値から特定される関数のアドレスを起点として前記識別子を検索することで前記第１のコードの前記アドレスを特定するように構成されてもよい。メモリにおける第１のコードのアドレスを取得するためのコード（第３のコード）は、同一のプログラム中に記述されていてもよい。また、メモリにおける第１のコードの存在位置を示す識別子をプログラムに設けた場合、これを実行することで容易に保護対象である第１のコードのアドレスを特定することが可能となる。更に、例えばＣ言語などを用いた場合、関数の実行時のアドレスは命令文により容易に特定することができる。従って、これを起点として第１のコードのアドレスを特定することで、容易にこれを取得することが可能となる。
【００２８】
また、他の本発明は、請求項１７記載のように、コンピュータがメモリに読み出して実行するプログラムであって、保護作用が適用された第１のコードと、前記メモリにおける前記第１のコードの存在範囲を示す第１の識別子と、前記第１の識別子を検索させることで前記第１のコードの前記メモリにおけるアドレスを前記コンピュータに特定させるための第２のコードと、前記第２のコードを実行することで特定された前記第１のコードに適用された前記保護作用を前記コンピュータに解除させるための第３のコードとを有し、前記第２のコードが関数ポインタの値から特定される関数のアドレスを起点として前記第１の識別子を検索するように前記コンピュータを動作させるように構成される。プログラムの少なくとも一部であって保護対象であるコード（第１のコード）に保護作用を適用することで、当該プログラムの非実行時に、当該プログラムの解析が困難なプログラムを実現できる。また、上記のように適用された保護作用が当該プログラムの実行中に解除されるように構成することで、保護作用が解除された状態、すなわち解析が可能な状態を短い時間とすることができ、解析が困難なプログラムを実現することができる。しかも、このように作用するプログラムは、単一のプログラム又はメインルーチンとサブルーチンとで構成されたプログラムという簡素な構成で実現することができる。また、メモリにおける第１のコードのアドレスを取得するためのコード（第２のコード）は、同一のプログラム中に記述することができる。更に、メモリにおける第１のコードの存在位置を示す識別子（第１の識別子）をプログラムに設けることで、容易に保護対象である第１のコードのアドレスを特定することが可能なプログラムを実現できる。更にまた、例えばＣ言語などを用いた場合、関数の実行時のアドレスは命令文により容易に特定することができる。従って、これを起点として第１のコードのアドレスを特定することで、容易にこれを取得することが可能なプログラムを実現できる。
【００２９】
また、請求項１７記載の発明は、例えば請求項１８記載のように、前記第１のコードが実行された後で前記保護作用を適用するように前記コンピュータを動作させるための第４のコードを有して構成されてもよい。第１のコードに保護作用を適用するためのコード（第４のコード）をプログラムに設けることで、適宜保護対象である第１のコードに保護作用を適用することが可能なプログラムを実現できる。また、本発明によれば、保護作用を解除し、第１のコードを実行した後、再度第１のコードに保護作用を適用するように構成することも可能となる。これにより、保護作用が解除された状態、すなわち解析が可能な状態を最短の時間とすることができ、当該プログラムの解析をさらに困難とすることができる。
【００３０】
また、請求項１７または１８記載の発明は、例えば請求項１９記載のように、前記保護作用は暗号化であり、全コード領域における少なくとも一部を指定する第２の識別子と、前記第２の識別子で指定されたコード領域に基づいて前記保護作用を解除するための復号鍵を前記コンピュータに生成させる第５のコードとを有し、前記第３のコードが前記第５のコードを実行することで生成された前記復号鍵に基づいて前記第１のコードに適用された前記保護作用を解除するように前記コンピュータを動作させるように構成されてもよい。暗号化は最も一般的で且つ効果的な手法であるため、これを用いることで、解析から効果的に保護されたプログラムを実現することができる。ここで、暗号化に用いる暗号鍵がプログラムにおける少なくとも一部のコードから生成されるように構成することで、保護作用が適用された第１のコードの復号時に用いる復号鍵をプログラム内に実装する必要がなくなる。従って、プログラムの解析をより困難とすることができる。また、プログラムにおける少なくとも一部のコードから復号鍵が生成されるように構成することで、この一部のコードに何らかの改竄が行われた場合に、正しい復号鍵を生成することができないという効果も得られる。
【発明の効果】
【００３１】
本発明によれば、プログラムの解析を簡素な構成で困難化することが可能なプログラム実行方法、そのプログラム作成方法、それを実行する情報処理装置及びそのプログラムを実現することができる。
【発明を実施するための最良の形態】
【００３２】
以下、本発明を実施するための最良の形態を図面と共に詳細に説明する。
【実施例１】
【００３３】
まず、本発明による実施例１について図面を用いて詳細に説明する。本実施例は、コンパイルされた実行プログラムの一部に保護作用を適用するものである。これにより、当該実行プログラムの非実行時に、当該実行プログラムの解析を困難とすることができる。また、本実施例は、上記した実行プログラムの一部に適用された保護作用を、当該実行プログラムの実行中に解除するものである。これにより、保護作用が解除された状態、すなわち解析が可能な状態を短い時間とすることができ、当該実行プログラムの解析を困難とすることができる。
【００３４】
図１は本実施例によるプログラム作成装置１の構成を示す機能ブロック図である。このプログラム作成装置１には、例えばパーソナルコンピュータやサーバなどの一般的な情報処理装置を用いることができる。尚、以下の説明では、Ｃ言語を用いてプログラムを作成する場合を例に挙げる。但し、本発明はこれに限定されず、後述するように、関数ポインタの値から関数の実行時のアドレスを取得することができる言語であれば、如何なるものを適用してもよい。
【００３５】
プログラム作成装置１はエディタ２とコンパイラ３と保護作用適用手段４とを有して構成される。エディタ２はユーザがプログラムを作成するための手段である。これには各種、市販されている開発ツールを用いることができる。このエディタ２を用いて作成されたプログラムは、作成者（以下、ユーザという）が理解できる高級言語で作成されており、ソースコードで記述されている。本実施例では、エディタ２によりプログラム１００及び１００ａが作成される。
【００３６】
コンパイラ３はプログラム１００ａをアセンブリ言語などの低レベルの言語に変換するための手段である。コンパイラ３には言語毎で用意された一般的なものを適用することができる。また、変換後のプログラムはＣＰＵ（Central Processing Unit）が実行できるオブジェクトコードで記述されている。本実施例では、これを実行プログラム１００Ａという。
【００３７】
保護作用適用手段４は本発明特有の構成であり、実行プログラム１００Ａにおける保護対象箇所のコード（これを以下、保護対象コードという）に保護作用を適用するための手段である。尚、本実施例において、コードに保護作用を適用することはコードを暗号化することを指し、コードの保護作用を解除することはコードを復号化することを指す。すなわち、保護作用として暗号化を用いる。また、この暗号化におけるアルゴリズムには、種々のものを適用することができる。
【００３８】
次に、上記のプログラム作成装置１を用いて実行プログラム１００Ａを作成するまでの流れを図面と共に詳細に説明する。尚、以下では、プログラムの作成者（以下、これをユーザという）が行う手順に沿って説明する。
【００３９】
図２は実行プログラム１００Ａの作成手順を示すフローチャートである。図２に示すように、本手順おいてユーザは、先ず通常通りのプログラム１００を作成する（ステップＳ１０１）。これには図１におけるエディタ２を用いることができる。次にユーザは、作成したプログラム１００のソースコードにおける保護対象コード１０２を決定する（ステップＳ１０２）。この際、ソースコードの該当個所にコメントなどを記述しておくとよい。
【００４０】
ここで、ステップＳ１０２までに作成されたプログラム１００のファイルイメージを図３に示す。図３に示すように、プログラム１００は、あるルーチン（関数）内に保護対象とするコード（保護対象コード１０２）が含まれてなる。また、他のプログラムコードは任意のコード１０１，１０３とすることができる。
【００４１】
保護対象コード１０２は、作成者以外のユーザ（以下、これを解析者という）によるデバッガなどを用いた解析に対し、これを困難化したいコードである。これには、例えばシリアル番号を用いてプログラム全体の実行の可否を判定するためのルーチン、若しくはこれに含まれた一部のコードなどを適用することが好ましい。これにより、当該プログラムの不正な使用を防止することができる。但し、これに限らず、種々のコードを適用することができる。
【００４２】
図２に戻り説明する。以上のようなプログラム１００を作成すると、次にユーザは、保護対象コード１０２に保護作用を適用するための事前準備として、保護箇所検索ルーチン呼び出しコード１１と保護作用解除ルーチン呼び出しコード１２と保護箇所開始識別子１３と保護箇所終了識別子１４とをプログラム１００に挿入する（ステップＳ１０３）。これにより、図４に示すようなプログラム１００ａが作成される。尚、図４はプログラム１００ａのファイルイメージを示す図である。
【００４３】
ここで、プログラム１００ａの構成について説明する。図３に示すプログラム１００と図４に示すプログラム１００ａとを比較すると明らかなように、プログラム１００ａは、任意のコード１０１，１０３及び保護対象コード１０２の他に、保護対象コード１０２の直前に設けられた保護箇所開始識別子１３と、保護対象コード１０２の直後に設けられた保護箇所終了識別子１４と、保護対象コード１０２より以前の行に設けられた保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２とを有する。
【００４４】
保護箇所開始識別子１３は保護対象コード１０２の開始位置（アドレス）を示すコードである。また、保護箇所終了識別子１４は保護対象コード１０２の終了位置（アドレス）を示すコードである。すなわち、本実施例では保護箇所開始識別子１３と保護箇所終了識別子１４とで挟まれたコード（但し、保護箇所開始識別子１３及び保護箇所終了識別子１４を含まない）が保護対象コード１０２となる。尚、保護箇所開始識別子１３および保護箇所終了識別子１４は、ソースコードをコンパイルした結果である実行プログラム１００Ａにおいて、特定のパターンを表すものである。これらの記述には、例えばコンパイラ３のインラインアセンブラ機能を使うことができる。すなわち、インラインアセンブラ機能を用いて特定のバイト列をソースコードの該当個所に埋め込むことで、保護箇所開始識別子１３および保護箇所終了識別子１４を所望する位置に記述することができる。
【００４５】
保護箇所検索ルーチン呼び出しコード１１は、メインルーチンとなるプログラム１００ａとは別に作成された保護箇所検索ルーチンを呼び出して実行するためのコードである。保護箇所検索ルーチンは、上述の保護箇所開始識別子１３と保護箇所終了識別子１４とを検索することで、保護対象コード１０２を特定するためのサブルーチンである。但し、保護箇所検索ルーチンをサブルーチンとすることは必須の要件でなく、これをプログラム１００ａ内に記述してもよい。また、メインルーチンとサブルーチンとで構成されたプログラムであっても、プログラムコードの実行手順は単一のプログラムと同一である。従って、本発明では、メインルーチンとサブルーチンとで構成されたプログラムを単一のプログラムと見なす。
【００４６】
また、保護作用解除ルーチン呼び出しコード１２は、メインルーチンとなるプログラム１００ａとは別に作成された保護作用解除ルーチンを呼び出して実行するためのコードである。保護作用解除ルーチンは、後述において保護された保護対象コード１０２（暗号化された保護対象コード１０２Ａに相当）の保護作用を解除するためのサブルーチンである。但し、保護作用適用ルーチンをサブルーチンとすることは必須の要件でなく、これをプログラム１００ａ内に記述してもよい。
【００４７】
図２に戻り説明する。以上のようにプログラム１００ａを編集すると、ユーザは次に、当該プログラム１００ａを、保護箇所検索ルーチン及び保護作用解除ルーチンと共に、コンパイラ３を用いてコンパイルする（ステップＳ１０４）。これにより、プログラム１００ａはソースコードからオブジェクトコードに変換され、実行プログラム１００Ａが作成される。この際、実行プログラム１００Ａは、保護箇所検索ルーチン及び保護作用解除ルーチンとリンクされる。
【００４８】
このように実行プログラム１００Ａを作成すると、次にユーザは、保護作用適用手段４を起動し、これを用いて実行プログラム１００Ａにおける保護対象コード１０２に保護作用を適用する（ステップＳ１０５）。
【００４９】
ここで、保護作用適用手段４の動作を図面と共に詳細に説明する。図５は保護作用適用手段４の動作を示すフローチャートである。図５に示すように、保護作用適用手段４は、図２のステップＳ１０５において起動されると先ず、図２のステップＳ１０４で作成した実行プログラム１００Ａを読み込み（ステップＳ１１１）、実行プログラム１００Ａに埋め込まれた保護箇所開始識別子１３と保護箇所終了識別子１４とを検索する（ステップＳ１１２）。これにより、保護対象コード１０２が特定される。
【００５０】
次に保護作用適用手段４は、特定した保護対象コード１０２に保護作用を適用する（ステップＳ１１３）。保護作用とは上述したように暗号化である。これにより、保護対象コード１０２が暗号化された保護対象コード１０２Ａに置き換えられる。このように、保護したいコードである保護対象コード１０２を暗号化することにより、プログラムを実行していない状態で、これが暗号化された状態となる。このため、静的な解析、すなわちプログラムを実行していない状態での解析を困難にすることができる。
【００５１】
次に保護作用適用手段４は、実行プログラム１００Ａのコード領域を書き換え可能状態に設定する（ステップＳ１１４）。保護作用として上述したように暗号化を適用した場合、実行プログラム１００Ａを実行する際、暗号化されたコードを復号化する必要がある。そのため、コード領域を書き換え可能状態に設定しておく必要がある。尚、コード領域を書き換え可能状態に設定するためには、例えば、実行プログラム１００Ａのファイル中に存在するコード領域の属性値を、書き換え可能を表す属性値に変更すればよい。
【００５２】
以上のような行程を経ることによって、保護作用が適用された実行プログラム１００Ａが完成する。ここで、実行プログラム１００Ａのファイルイメージを図６に示す。図６に示すように、保護作用適用後の実行プログラム１００Ａでは、保護対象コード１０２が暗号化された保護対象コード１０２Ａに置き換えられている。
【００５３】
次に、上述のように作成した実行プログラム１００Ａを実行した際の処理の流れを図面と共に詳細に説明する。尚、実行プログラム１００Ａを実行する装置には、パーソナルコンピュータやサーバなど、一般の情報処理装置を適用することができる。
【００５４】
情報処理装置は、実行プログラム１００Ａを実行すると、当該実行プログラム１００ＡをＲＡＭ（Random Access Memory）などのメモリにロードする。この際、メモリ上に展開される実行プログラム１００Ａの構成は図６に示す構成と同様である。このように実行プログラム１００Ａを展開した状態で、情報処理装置は順次コードを実行する。図７のフローチャートに、実行プログラム１００Ａを実行した際の情報処理装置の動作を示す。
【００５５】
図７に示すように、情報処理装置は先ず、任意のコード１０１の先頭から記述に沿ってコードを順次実行する（ステップＳ１２１）。この流れにおいて保護箇所検索ルーチン呼び出しコード１１が実行されると、情報処理装置は保護箇所検索ルーチンを呼び出し、これを実行する（ステップＳ１２２）。
【００５６】
保護箇所検索ルーチンを実行すると、情報処理装置は保護箇所開始識別子１３と保護箇所終了識別子１４とを検索し、これらに基づいて暗号化された保護対象コード１０２Ａを特定する。保護箇所開始識別子１３及び保護箇所終了識別子１４の検索は、暗号化された保護対象コード１０２Ａを含む関数の先頭アドレスを基点とし、この先頭アドレスからアドレスの上位方向に向かって各識別子を検索することで行われる。尚、保護箇所検索ルーチンの詳細は後述において詳細に説明する。
【００５７】
このように保護箇所検索ルーチンを実行し、暗号化された保護対象コード１０２Ａを特定すると、次に情報処理装置は、記述に沿って保護作用解除ルーチン呼び出しコード１２を実行する。これにより、情報処理装置では保護作用解除ルーチンが呼び出され、これが実行される（ステップＳ１２３）。
【００５８】
保護作用解除ルーチンは、上述のように、暗号化された保護対象コード１０２Ａに適用された保護作用を解除するためのルーチンである。従って、本実施例のように、保護作用が暗号化である場合、保護作用解除ルーチンでは暗号化された保護対象コード１０２Ａを復号化する処理が行われる。これにより、暗号化された保護対象コード１０２Ａに適用された保護作用が解除される。
【００５９】
このように保護作用を解除すると、次に情報処理装置は、記述に沿って復号化した保護対象コード１０２を実行し（ステップＳ１２４）、その後、同じく記述に沿って残りのコード（任意コード１０３を含む）を実行する（ステップＳ１２５）。
【００６０】
ここで、保護箇所開始識別子１３及び保護箇所終了識別子１４について触れておく。保護箇所開始識別子１３は、前述したように、特定のパターンを表すものである。但し、保護箇所開始識別子１３は保護作用解除ルーチン呼び出しコード１２と暗号化された保護対象コード１０２Ａとの間に挟まれたコード領域に存在する。このため、保護箇所開始識別子１３は、実行可能なコードで構成されていることが好ましい。または保護作用解除ルーチンにおいて、保護箇所開始識別子１３が実行可能なコードに書き換えられるように構成することもできる。あるいは、保護箇所解除ルーチンの呼び出し後に、コード実行の流れが保護対象コード１０２へジャンプする、換言すれば保護箇所開始識別子１３を飛び越えて（スキップしてともいう）コードの実行が進行するように構成することで、保護箇所開始識別子１３が実行されないように構成することもできる。尚、これは、保護箇所終了識別子１４についても同様である。
【００６１】
次に、保護箇所検索ルーチンについて図面と共に詳細に説明する。図８は、保護箇所検索ルーチンが実行された際の情報処理装置の動作を示すフローチャートである。
【００６２】
図８に示すように、情報処理装置は、保護箇所検索ルーチンを実行すると、先ず関数ポインタの値を利用して、関数の実行時のアドレスを特定する（ステップＳ１３１）。尚、ここで言うアドレスとは、ＲＡＭなどのメモリにおけるアドレスである。
【００６３】
これを具体例を挙げて説明する。例えばＬｉｎｕｘ  ＯＳ（オペレーティングシステム）のコンパイラ（ＧＣＣ（GNU Compiler Collection／GNU C Compiler）など）で処理されるＣ言語を利用する場合、関数ポインタの値は、そのまま関数の実行時のアドレスとなる。このため、例えば“int func1(int a)”という関数が存在すると仮定すると、当該関数の実行時のアドレスは以下の命令文で取得することができる。
【００６４】
unsigned char *p = (unsigned char *)func1;
【００６５】
この命令文によれば、“func1”の実行時のアドレスを変数“p”として取得することができる。
【００６６】
また、他のプラットフォーム、例えばＷｉｎｄｏｗｓ（登録商標）  ＯＳやＭａｃ  ＯＳ（登録商標）などの場合、上述したＬｉｎｕｘの場合と異なり、関数ポインタの値が、関数のアドレステーブルを指している場合がある。この場合、そのテーブル内の値を参照することにより、いずれの場合も関数ポインタの値から関数の実行時のアドレスを計算することが可能である。
【００６７】
以上のように関数の実行時アドレスを取得すると、次に情報処理装置は、当該実行時のアドレスを基点として、保護箇所開始識別子１３と保護箇所終了識別子１４とを検索する（ステップＳ１３２）。これにより、ある関数内の暗号化された保護対象コード１０２Ａを実行時に特定することができる。その後、図７におけるステップＳ１２３へ移行し、暗号化された保護対象コード１０２Ａを復号化して実行すると共に、残りのコードを実行する。
【００６８】
以上のように構成及び動作することで、本実施例によれば、非実行時にプログラムの一部が保護されているため、これの静的な解析を困難とすることができる。また、この保護作用は、プログラムの実行時であって該当するコードの実行前に解除されるため、保護作用が解除されている状態を非常に短い時間とすることができる。この結果、メモリを参照する解析に対しても、これを困難とすることができる。
【００６９】
尚、以上の説明では、保護対象コード１０２の存在範囲を示す識別子（保護箇所開始識別子１３及び保護箇所終了識別子１４）を保護対象コード１０２の直前及び直後に設けた場合を例に挙げた。この場合、保護対象コード１０２の先頭アドレスは保護箇所開始識別子１３の直後のアドレスとなり、保護対象コード１０２の後尾アドレスは保護箇所終了識別子１４の直前のアドレスとなる。
【００７０】
但し、本発明は、これに限定されるものではない。例えば保護箇所開始識別子１３のアドレスに対して所定アドレス分、前後したアドレスを保護対象コード１０２の先頭アドレスとすることも可能である。同様に、例えば保護箇所終了識別子１４のアドレスに対して所定アドレス分、前後したアドレスを保護対象コード１０２の後尾アドレスとすることも可能である。このように構成した場合、保護箇所検索ルーチンでは、検索により得られた保護箇所開始識別子１３及び保護箇所終了識別子１４のアドレスに対して所定アドレス分、加算又は除算したアドレスが保護対象コード１０２の先頭アドレス及び後尾アドレスとして取得される。
【００７１】
この他、例えば保護対象コード１０２のコード長を固定長とした場合、保護箇所開始識別子１３若しくは保護箇所終了識別子１４の何れか一方を省略することができる。すなわち、保護対象コード１０２の存在範囲を示す識別子を１つとすることができる。このように構成した場合であって例えば当該識別子を保護対象コード１０２の直前に設けた場合、保護箇所検索ルーチンでは、検索により得られた識別子に対して直後のアドレスから所定長のコードが保護対象コード１０２として取得される。尚、保護対象コード１０２の先頭アドレスに対して所定コード分、離れた位置に識別子を設けた場合でも、当該所定コードのコード長を考慮しつつ同様の手法により保護対象コード１０２が存在するアドレスを取得することができる。また、識別子を保護対象コード１０２の後尾アドレスに対して設けた場合でも同様である。
【００７２】
また、本発明は、保護作用解除ルーチンが保護箇所検索ルーチンで検索された識別子（例えば保護箇所開始識別子１３及び保護箇所終了識別子１４）のアドレスから保護対象コード１０２の先頭アドレス及び後尾アドレスを特定するように構成することもできる。
【実施例２】
【００７３】
次に、本発明の実施例２について図面を用いて詳細に説明する。尚、以下の説明において、実施例１と同様の構成については、同一の符号を付し、その詳細な説明を省略する。また、特記しない構成に関しては実施例１と同様である。
【００７４】
本実施例は、実施例１と同様の構成において、保護対象コードの保護作用が解除済みであるか否かを判断する。これにより、保護対象コードを複数回実行する場合にも、実施例１による構成を適用することができる。尚、以下では、本実施例を実施例１と組み合わせた場合を例に挙げて説明する。
【００７５】
本実施例において、プログラム作成装置の構成は実施例１と同様である。但し、エディタ２で作成されるプログラムは、図９に示すようなファイルイメージとなる。本実施例では、これをプログラム１００ｂとする。
【００７６】
図４に示すプログラム１００ａと図９に示すプログラム１００ｂとを比較すると明らかなように、本実施例によるプログラム１００ｂは、任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４，保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２の他に、保護箇所検索ルーチン呼び出しコード１１より以前の行に設けられた保護作用解除済み確認ルーチン呼び出しコード２１を有する。
【００７７】
任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４，保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２は実施例１と同様である。
【００７８】
保護作用解除済み確認ルーチン呼び出しコード２１は、メインルーチンとなるプログラム１００ｂとは別に作成された保護作用解除済み確認ルーチンを呼び出して実行するためのコードである。保護作用解除済み確認ルーチンは保護対象コード１０２に適用された保護作用（ここでは暗号化）が解除されたか否かを判断し、解除済みである場合、保護箇所検索ルーチン及び保護作用解除ルーチンを飛ばして保護対象コード１０２を実行するためのサブルーチンである。但し、保護作用解除済み確認ルーチンをサブルーチンとすることは必須の要件でなく、これをプログラム１００ｂ内に記述してもよい。
【００７９】
以上のように作成したプログラム１００ｂは、実施例１と同様に、コンパイラ３に入力され、実行プログラムに変換される。本実施例では、これを実行プログラム１００Ｂとする。尚、作成された実行プログラム１００Ｂは、保護箇所検索ルーチン，保護作用解除ルーチン及び保護作用解除済み確認ルーチンとリンクされる。
【００８０】
次に、上述のように作成した実行プログラム１００Ｂを実行した際の情報処理装置の動作を図面と共に詳細に説明する。
【００８１】
情報処理装置は、実行プログラム１００Ｂを実行すると、当該実行プログラム１００ＢをＲＡＭなどのメモリにロードする。この際、メモリ上に展開される実行プログラム１００Ｂにおいて、保護対象コード１０２には保護作用が適用されている（暗号化された保護対象コード１０２Ａに相当）。このように実行プログラム１００Ｂを展開した状態で、情報処理装置は順次コードを実行する。図１０のフローチャートに、実行プログラム１００Ｂを実行した際の情報処理装置の動作を示す。
【００８２】
図１０に示すように、情報処理装置は先ず、任意のコード１０１の先頭から記述に沿ってコードを順次実行する（ステップＳ２０１）。この流れにおいて保護作用解除済み確認ルーチン呼び出しコード２１が実行されると、情報処理装置は保護作用解除済み確認ルーチンを呼び出し、これを実行する（ステップＳ２０１）。
【００８３】
保護作用解除済み確認ルーチンを実行すると、情報処理装置は保護対象コード１０２に適用された保護作用が解除済みであるか否かを判定する（ステップＳ２０２）。これは、保護対象コード１０２に適用した保護作用を解除したか否かを、情報処理装置が管理しておくことで実現することができる（ステップＳ２０５）。すなわち、情報処理装置は、保護作用解除ルーチンを実行した場合、これをメモリに保存しておく等の手段で管理するように構成される。
【００８４】
ステップＳ２０２の判定の結果、保護作用を解除済みである場合（ステップＳ２０２のＹｅｓ）、情報処理装置はステップＳ２０６に移行し、保護対象コード１０２を実行する（ステップＳ２０６）。すなわち、情報処理装置は、保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２を飛ばし、保護対象コード１０２を実行する。
【００８５】
また、保護作用が解除されていない場合（ステップＳ２０２のＮｏ）、情報処理装置は、記述に沿って保護箇所検索ルーチン呼び出しコード１１を実行する。これにより、保護箇所検索ルーチンが呼び出され、これが実行される（ステップＳ２０３）。
【００８６】
保護箇所検索ルーチンを実行すると、情報処理装置は、実施例１と同様に、保護箇所開始識別子１３と保護箇所終了識別子１４とを検索し、これらに基づいて暗号化された保護対象コード１０２Ａを特定する。また、暗号化された保護対象コード１０２Ａを特定すると、情報処理装置は、記述に沿って保護作用解除ルーチン呼び出しコード１２を実行する。これにより、情報処理装置では保護作用解除ルーチンが呼び出され、これが実行される（ステップＳ２０４）。
【００８７】
また、暗号化された保護対象コード１０２Ａの保護作用を解除すると、次に情報処理装置は、記述に沿って復号化した保護対象コード１０２を実行し（ステップＳ２０６）、その後、同じく記述に沿って残りのコード（任意のコード１０３を含む）を実行する（ステップＳ２０７）。
【００８８】
以上のように構成及び動作することで、本実施例によれば、実施例１と同様の構成において、保護対象コードの保護作用が解除されているか否かを実行プログラムの実行中に判断することが可能となる。これにより、保護対象コードを複数回実行する場合にも、実施例１による構成を適用することができる。
【実施例３】
【００８９】
次に、本発明の実施例３について図面を用いて詳細に説明する。尚、以下の説明において、実施例１又は実施例２と同様の構成については、同一の符号を付し、その詳細な説明を省略する。また、特記しない構成に関しては実施例１又は実施例２と同様である。
【００９０】
本実施例は、実行中の実行プログラムに保護作用を適用するものである。これにより、当該実行プログラムの実行中であっても、保護したいコードに必要に応じて即座に保護作用を適用することができる。また、この構成を実施例１による構成と組み合わせることで、保護したいコードを実行後に、これに保護作用を即座に適用することが可能となるため、メモリ上で保護対象コードの保護作用が解除されている時間を極小化でき、解析の困難性を高めることができる。尚、以下では、本実施例を実施例１と組み合わせた場合を例に挙げて説明する。但し、本実施例は他の実施例と組み合わせることもできる。
【００９１】
本実施例において、プログラム作成装置の構成は実施例１と同様である。但し、エディタ２で作成されるプログラムは、図１１に示すファイルイメージとなる。本実施例では、これをプログラム１００ｃとする。
【００９２】
図４に示すプログラム１００ａと図１１に示すプログラム１００ｃとを比較すると明らかなように、本実施例によるプログラム１００ｃは、任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４，保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２の他に、暗号化された保護対象コード１０２Ａより以降の行に設けられた保護作用適用ルーチン呼び出しコード３１を有する。
【００９３】
任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４，保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２は実施例１と同様である。
【００９４】
保護作用適用ルーチン呼び出しコード３１は、メインルーチンとなるプログラム１００ｃとは別に作成された保護作用適用ルーチンを呼び出して実行するためのコードである。保護作用適用ルーチンは保護作用が解除された保護対象コード１０２に再度、保護作用を適用するためのサブルーチンである。但し、保護作用適用ルーチンをサブルーチンとすることは必須の要件でなく、これをプログラム１００ｃ内に記述してもよい。
【００９５】
以上のように作成したプログラム１００ｃは、実施例１と同様に、コンパイラ３に入力され、実行プログラムに変換される。本実施例では、これを実行プログラム１００Ｃとする。尚、作成された実行プログラム１００Ｃは、保護箇所検索ルーチン，保護作用解除ルーチン及び保護作用適用ルーチンとリンクされる。
【００９６】
次に、上述のように作成した実行プログラム１００Ｃを実行した際の情報処理装置の動作を図面と共に詳細に説明する。
【００９７】
情報処理装置は、実行プログラム１００Ｃを実行すると、当該実行プログラム１００ＣをＲＡＭなどのメモリにロードする。この際、メモリ上に展開される実行プログラム１００Ｃにおいて、保護対象コード１０２には保護作用が適用されている（暗号化された保護対象コード１０２Ａに相当）。このように実行プログラム１００Ｃを展開した状態で、情報処理装置は順次コードを実行する。図１２のフローチャートに、実行プログラム１００Ｃを実行した際の情報処理装置の動作を示す。
【００９８】
図１２に示すように、情報処理装置は先ず、任意のコード１０１の先頭から記述に沿ってコードを順次実行する（ステップＳ３０１）。この流れにおいて保護箇所検索ルーチン呼び出しコード１１が実行されると、情報処理装置は保護箇所検索ルーチンを呼び出し、これを実行する（ステップＳ３０２）。
【００９９】
保護箇所検索ルーチンを実行すると、情報処理装置は保護箇所開始識別子１３と保護箇所終了識別子１４とを検索し、これらに基づいて暗号化された保護対象コード１０２Ａを特定する。この際、情報処理装置は暗号化された保護対象コード１０２Ａのアドレスを保持しておく。また、暗号化された保護対象コード１０２Ａを特定すると、情報処理装置は、記述に沿って保護作用解除ルーチン呼び出しコード１２を実行する。これにより、情報処理装置では保護作用解除ルーチンが呼び出され、これが実行される（ステップＳ３０３）。
【０１００】
また、暗号化された保護対象コード１０２Ａの保護作用を解除すると、次に情報処理装置は、記述に沿って復号化した保護対象コード１０２を実行する（ステップＳ３０４）。次に情報処理装置は、同じく記述に沿って保護作用適用ルーチン呼び出しコード３１を実行する。これにより、情報処理装置では、保護作用適用ルーチンが呼び出され、これが実行される（ステップＳ３０５）。
【０１０１】
保護作用適用ルーチンが実行されると、情報処理装置は上述において保持しておいた暗号化された保護対象コード１０２Ａのアドレスを保護対象コード１０２のアドレスとして取得し、これを暗号化する。これにより、保護対象コード１０２に保護作用が再度適用される。尚、保護作用適用後の保護対象コード１０２は暗号化された保護対象コード１０２Ａとなる。
【０１０２】
このように保護対象コード１０２に再度保護作用を適用すると、次に情報処理装置は、記述に沿って残りのコード（任意のコード１０３を含む）を実行する（ステップＳ３０６）。
【０１０３】
以上のように構成及び動作することで、本実施例によれば、実施例１と同様の構成において、保護したいコードを実行後に、これに保護作用を即座に適用することが可能となる。これにより、メモリ上で保護対象コードの保護作用が解除されている時間を極小化でき、解析の困難性を高めることができる。
【実施例４】
【０１０４】
次に、本発明の実施例４について図面を用いて詳細に説明する。尚、以下の説明において、実施例１から実施例３の何れかと同様の構成については、同一の符号を付し、その詳細な説明を省略する。また、特記しない構成に関しては実施例１から実施例２の何れかと同様である。
【０１０５】
本実施例は、実行プログラムの実行中に、これが解析されているか否かを判断し、解析されている場合、正常な実行を行わない、若しくは実行を終了するものである。これにより、メモリ上で実行プログラムが解析されることを未然に防ぐことができる。尚、以下では、本実施例を実施例１と組み合わせた場合を例に挙げて説明する。但し、本実施例は他の実施例と組み合わせることもできる。
【０１０６】
本実施例において、プログラム作成装置の構成は実施例１と同様である。但し、エディタ２で作成されるプログラムは、図１３に示すようなファイルイメージとなる。本実施例では、これをプログラム１００ｄとする。
【０１０７】
図４に示すプログラム１００ａと図１３に示すプログラム１００ｄとを比較すると明らかなように、本実施例によるプログラム１００ｄは、任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４，保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２の他に、保護箇所検索ルーチン呼び出しコード１１と保護作用解除ルーチン呼び出しコード１２との間にデバッガ検出有無判定コード４１を有する。
【０１０８】
任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４，保護箇所検索ルーチン呼び出しコード１１及び保護作用解除ルーチン呼び出しコード１２は実施例１と同様である。
【０１０９】
デバッガ検出有無判定コード４１は、実行プログラム（これを１００Ｄとする）が実行されているＯＳにおいてデバッガが検出されたか否かを判定するための処理が記述されたコードである。尚、一般的なＯＳには、デバッガなどの解析プログラムの存在を監視するための手段が設けられている。尚、デバッガが検出されたか否かを判定するための処理は、サブルーチンとして記述することもできる。
【０１１０】
以上のように作成したプログラム１００ｄは、実施例１と同様に、コンパイラ３に入力され、実行プログラムに変換される。本実施例では、これを実行プログラム１００Ｄとする。尚、作成された実行プログラム１００Ｄは、保護箇所検索ルーチン及び保護作用解除ルーチンとリンクされる。
【０１１１】
次に、上述のように作成した実行プログラム１００Ｄを実行した際の情報処理装置の動作を図面と共に詳細に説明する。
【０１１２】
情報処理装置は、実行プログラム１００Ｄを実行すると、当該実行プログラム１００ＤをＲＡＭなどのメモリにロードする。この際、メモリ上に展開される実行プログラム１００Ｄにおいて、保護対象コード１０２には保護作用が適用されている（暗号化された保護対象コード１０２Ａに相当）。このように実行プログラム１００Ｄを展開した状態で、情報処理装置は順次コードを実行する。図１４のフローチャートに、実行プログラム１００Ｄを実行した際の情報処理装置の動作を示す。
【０１１３】
図１４に示すように、情報処理装置は先ず、任意のコード１０１の先頭から記述に沿ってコードを順次実行する（ステップＳ４０１）。この流れにおいて保護箇所検索ルーチン呼び出しコード１１が実行されると、情報処理装置は保護箇所検索ルーチンを呼び出し、これを実行する（ステップＳ４０２）。
【０１１４】
保護箇所検索ルーチンを実行すると、情報処理装置は保護箇所開始識別子１３と保護箇所終了識別子１４とを検索し、これらに基づいて暗号化された保護対象コード１０２Ａを特定する。
【０１１５】
また、情報処理装置は、デバッガ検出有無判定コード４１を実行し、ＯＳにおいてデバッガが検出されたか否かを判定する（ステップＳ４０３）。この判定の結果、デバッガが検出されていた場合（ステップＳ４０３のＹｅｓ）、情報処理装置は、以降のコードを実行せず、そのまま処理を終了する。一方、デバッガが検出されていない場合（ステップＳ４０３のＮｏ）、情報処理装置は、記述に沿って保護作用解除ルーチン呼び出しコード１２を実行する。これにより、情報処理装置では保護作用解除ルーチンが呼び出され、これが実行される（ステップＳ４０４）。
【０１１６】
また、暗号化された保護対象コード１０２Ａの保護作用を解除すると、次に情報処理装置は、記述に沿って復号化した保護対象コード１０２を実行し（ステップＳ４０５）、その後、同じく記述に沿って残りのコード（任意のコード１０３を含む）を実行する（ステップＳ４０６）。
【０１１７】
以上のように構成及び動作することで、本実施例によれば、実行プログラムの実行中に、これが解析されているか否かを判断することが可能となる。また、解析されている場合、実行プログラムの正常な動作を行わない、若しくは実行を終了することが可能となる。これにより、メモリ上で実行プログラムが解析されることを未然に防ぐことができる。
【０１１８】
尚、上記した本実施例では、保護作用解除ルーチン呼び出しコード１２の直前にデバッガ検出有無判定コード４１を記述したが、本発明はこれに限らず、保護作用解除ルーチン呼び出しコード１２の前であれば、どの位置に記述してもよい。また、複数の位置にデバッガ検出有無判定コード４１を記述してもよい。複数箇所で行うことにより、解析に対する耐性をより向上させることができる。更に、上記した具体例では、デバッガが検出された際、実行プログラム１００Ｄの実行を終了するように構成されていたが、本発明ではこれに限定されず、例えば保護作用解除ルーチンの実行をスキップさせ、保護作用が解除されていない状態の保護対象コード１０２を実行させることで、結果的に正常に実行されないように構成することもできる。
【実施例５】
【０１１９】
次に、本発明の実施例５について図面を用いて詳細に説明する。尚、以下の説明において、実施例１から実施例４の何れかと同様の構成については、同一の符号を付し、その詳細な説明を省略する。また、特記しない構成に関しては実施例１から実施例４の何れかと同様である。
【０１２０】
上述したように、各実施例において保護作用には暗号化を採用していた。本実施例では、このような場合における、暗号化のための暗号鍵及び復号化のための復号鍵について説明する。尚、以下では、本実施例を実施例１と組み合わせた場合を例に挙げて説明する。但し、本実施例は他の実施例と組み合わせることもできる。
【０１２１】
本実施例では、実行プログラムにおけるコードの一部分をデータとみなし、この部分に対して何らかの計算を行うことで得られた結果を暗号鍵及び復号鍵として用いる。何らかの計算としては、例えばチェックサム値の計算やハッシュ値の計算などを適用することができる。実行プログラムの一部に対して行った計算結果を暗号鍵及び復号鍵とすることで、鍵の計算に使われる部分のコードが改変された場合に、正しい鍵が生成できなくなるという効果が得られる。
【０１２２】
暗号鍵及び復号鍵の計算に使う一部のコード（以下、鍵計算対象コードという）には、保護作用解除ルーチン、すなわち復号ルーチンのコードを含めることが好ましい。なぜならば、復号ルーチンのコードは、解析者がデバッガ上で復号ルーチンの解析を行おうとする際に、デバッガのブレークポイント機能によって書き換えられるためである。このため、デバッガ上で鍵の計算ルーチンを動作させると、正しい鍵の値を得ることができない。この結果、暗号化された保護対象箇所を正しく復号化することができず、正常な実行を妨げることとなり、解析に対する耐性を高めることができる。
【０１２３】
また、本実施例では、実行プログラムの実行時に、暗号鍵及び復号鍵をコードの一部分から生成する。このため、これらの鍵を実行プログラムの中に静的に保持しておく必要がない。従って、解析者が復号鍵を得るためには、実行プログラムを実行させ、復号鍵の生成ルーチンを動作させる必要がある。しかしながら、この行為をデバッガ上で行うと、前述したように正しい鍵を得ることができない。すなわち、鍵を取得するためには実行プログラムをデバッガ上で実行させなければならないが、デバッガ上で当該実行プログラムを実行させると正しい鍵が得られない、という状況を作り出すことができ、解析に対する耐性を高めることができる。
【０１２４】
次に、本実施例による構成及び動作について説明する。本実施例において、プログラム作成装置の構成は実施例１と同様である。但し、エディタ２で作成されるプログラムは、図１５に示すようなファイルイメージとなる。本実施例では、これをプログラム１００ｅとする。
【０１２５】
図４に示すプログラム１００ａと図１５に示すプログラム１００ｅとを比較すると明らかなように、本実施例によるプログラム１００ｅは、任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４及び保護作用解除ルーチン呼び出しコード１２の他に、保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅと鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２と鍵計算ルーチン呼び出しコード５３とを有する。また、鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２とで挟まれたコード、すなわち、保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅと鍵計算ルーチン呼び出しコード５３と保護作用解除ルーチン呼び出しコード１２とは、暗号鍵及び復号鍵の計算に使われる鍵計算対象コード５４を構成する。
【０１２６】
任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４及び保護作用解除ルーチン呼び出しコード１２は実施例１と同様である。
【０１２７】
鍵計算対象箇所開始識別子５１は、暗号鍵及び復号鍵を計算する際に用いる鍵計算対象コード５４の開始位置（アドレス）を示すコードである。また、鍵計算対象箇所終了識別子５２は、鍵計算対象コード５４の終了位置（アドレス）を示すコードである。すなわち、本実施例では鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２とは、後述する実行プログラム１００Ｅの少なくとも一部のコードを指定するための識別子である。本実施例において暗号鍵及び復号鍵は、これらで挟まれた鍵計算対象コード５４を用いて計算される。尚、鍵計算対象箇所開始識別子５１および鍵計算対象箇所終了識別子５２は、ソースコードをコンパイルした結果である実行プログラム１００Ｅにおいて、特定のパターンを表すものである。また、これらの記述には、例えばコンパイラ３のインラインアセンブラ機能を使うことができる。すなわち、インラインアセンブラ機能を用いて特定のバイト列をソースコードの該当個所に埋め込むことで、鍵計算対象箇所開始識別子５１および鍵計算対象箇所終了識別子５２を所望する位置に記述することができる。
【０１２８】
ここで、鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２について触れておく。鍵計算対象箇所開始識別子５１は、前述したように、特定のパターンを表すものである。但し、鍵計算対象箇所開始識別子５１は任意のコード１０１と保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅとの間に挟まれたコード領域に存在する。このため、鍵計算対象箇所開始識別子５１は、実行可能なコードで構成されていることが好ましい。または任意のコード１０１において、鍵計算対象箇所開始識別子５１が実行可能なコードに書き換えられるように構成することもできる。あるいは、任意のコード１０１の実行後に、コード実行の流れが保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅへジャンプする、換言すれば鍵計算対象箇所開始識別子５１を飛び越えてコードの実行が進行するように構成することで、鍵計算対象箇所開始識別子５１が実行されないように構成することもできる。尚、これは、鍵計算対象箇所終了識別子５２についても同様である。
【０１２９】
保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅは、メインルーチンとなるプログラム１００ｅとは別に作成された保護箇所及び鍵計算対象箇所検索ルーチンを呼び出して実行するためのコードである。保護箇所及び鍵計算対象箇所検索ルーチンは、実施例１と同様に保護箇所開始識別子１３と保護箇所終了識別子１４とを検索することで、保護対象コード１０２を特定する他、鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２とを検索することで、鍵計算対象コード５４を特定するためのサブルーチンである。但し、保護箇所及び鍵計算対象箇所検索ルーチンをサブルーチンとすることは必須の要件でなく、これをプログラム１００ｅ内に記述してもよい。
【０１３０】
また、鍵計算ルーチン呼び出しコード５３は、メインルーチンとなるプログラム１００ｅとは別に作成された鍵計算ルーチンを呼び出して実行するためのコードである。鍵計算ルーチンは、保護箇所及び鍵計算対象箇所検索ルーチンで特定された鍵計算対象コード５４に基づいて、暗号鍵及び復号鍵を計算するためのサブルーチンである。但し、鍵計算ルーチンをサブルーチンとすることは必須の要件でなく、これをプログラム１００ｅ内に記述してもよい。また、鍵計算ルーチンを保護作用解除ルーチン又は保護作用適用ルーチンに含めてもよい。すなわち、保護作用解除ルーチン又は保護作用適用ルーチンが復号鍵又は暗号鍵を算出するように構成してもよい。
【０１３１】
以上のように作成されたプログラム１００ｅは、実施例１と同様に、コンパイラ３を用いてオブジェクトコードにコンパイルされ、実行プログラムが作成される。本実施例では、これを実行プログラム１００Ｅとする。尚、作成された実行プログラム１００Ｅは、保護箇所及び鍵計算対象箇所検索ルーチン，鍵計算ルーチン及び保護作用解除ルーチンとリンクされる。
【０１３２】
このように実行プログラム１００Ｅを作成すると、次にユーザは、保護作用適用手段４を起動し、これを用いて実行プログラム１００Ｅにおける保護対象コード１０２に保護作用を適用する。ここで、保護作用適用手段４の動作を図面と共に詳細に説明する。
【０１３３】
図１６は保護作用適用手段４の動作を示すフローチャートである。図１６に示すように、保護作用適用手段４は、起動されると先ず、作成された実行プログラム１００Ｅを読み込み（ステップＳ５０１）、実行プログラム１００Ｅに埋め込まれた保護箇所開始識別子１３及び保護箇所終了識別子１４と鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２とを検索する（ステップＳ５０２）。これにより、保護対象コード１０２と鍵計算対象コード５４とが特定される。
【０１３４】
次に保護作用適用手段４は、特定した鍵計算対象コード５４から暗号鍵を生成する（ステップＳ５０３）。暗号鍵の計算は、上述のように、例えばチェックサム値の計算やハッシュ値の計算などを適用することが可能である。
【０１３５】
次に保護作用適用手段４は、計算した暗号鍵を用いて、特定された保護対象コード１０２に保護作用を適用する（ステップＳ５０４）。保護作用とは上述したように暗号化である。これにより、保護対象コード１０２が暗号化された保護対象コード１０２Ａに置き換えられる。
【０１３６】
次に保護作用適用手段４は、実行プログラム１００Ｅのコード領域を書き換え可能状態に設定する（ステップＳ５０５）。以上のような行程を経ることによって、保護作用が適用された実行プログラム１００Ｅが完成する。
【０１３７】
次に、上述のように作成した実行プログラム１００Ｅを実行した際の情報処理装置の動作を図面と共に詳細に説明する。
【０１３８】
情報処理装置は、実行プログラム１００Ｅを実行すると、当該実行プログラム１００ＥをＲＡＭなどのメモリにロードする。この際、メモリ上に展開される実行プログラム１００Ｅにおいて、保護対象コード１０２には保護作用が適用されている（暗号化された保護対象コード１０２Ａに相当）。このように実行プログラム１００Ｅを展開した状態で、情報処理装置は順次コードを実行する。図１７のフローチャートに、実行プログラム１００Ｅを実行した際の情報処理装置の動作を示す。
【０１３９】
図１７に示すように、情報処理装置は先ず、任意のコード１０１の先頭から記述に沿ってコードを順次実行する（ステップＳ５１１）。この流れにおいて保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅが実行されると、情報処理装置は保護箇所及び鍵計算対象箇所検索ルーチンを呼び出し、これを実行する（ステップＳ５１２）。
【０１４０】
保護箇所及び鍵計算対象箇所検索ルーチンを実行すると、情報処理装置は保護箇所開始識別子１３及び保護箇所終了識別子１４と鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２とを検索し、これらに基づいて暗号化された保護対象コード１０２Ａと鍵計算対象コード５４とを特定する。また、暗号化された保護対象コード１０２Ａ及び鍵計算対象コード５４を特定すると、情報処理装置は、記述に沿ったコードの実行に従って鍵計算ルーチン呼び出しコード５３を実行する。これにより、情報処理装置では鍵計算ルーチンが呼び出され、これが実行される（ステップＳ５１３）。
【０１４１】
鍵計算ルーチンにより復号鍵を算出すると、次に情報処理装置は、記述に沿って保護作用解除ルーチン呼び出しコード１２を実行する。これにより、情報処理装置では保護作用解除ルーチンが呼び出され、これが実行される（ステップＳ５１４）。
【０１４２】
また、暗号化された保護対象コード１０２Ａの保護作用を解除すると、次に情報処理装置は、記述に沿って復号化した保護対象コード１０２を実行し（ステップＳ５１５）、その後、同じく記述に沿って残りのコード（任意のコード１０３を含む）を実行する（ステップＳ５１６）。
【０１４３】
以上のように構成及び動作することで、本実施例によれば、復号鍵を実行プログラムの中に静的に保持しておく必要がなく、且つデバッガ上で正しい鍵を得ることができないため、解析に対する耐性を高めることができる。
【０１４４】
尚、以上の構成において、鍵計算対象箇所終了識別子５２と保護箇所開始識別子１３とを隣接させた場合、これらを１つの識別子で代用することができる。これにより、実行プログラム１００Ｅを簡略化することができる。
【０１４５】
また、以上の説明では、鍵計算対象コード５４の存在範囲を示す識別子（鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２）を鍵計算対象コード５４の直前及び直後に設けた場合を例に挙げた。この場合、鍵計算対象コード５４の先頭アドレスは鍵計算対象箇所開始識別子５１の直後のアドレスとなり、鍵計算対象コード５４の後尾アドレスは鍵計算対象箇所終了識別子５２の直前のアドレスとなる。
【０１４６】
但し、本発明は、これに限定されるものではない。例えば鍵計算対象箇所開始識別子５１のアドレスに対して所定アドレス分、前後したアドレスを鍵計算対象コード５４の先頭アドレスとすることも可能である。同様に、例えば鍵計算対象箇所終了識別子５２のアドレスに対して所定アドレス分、前後したアドレスを鍵計算対象コード５４の後尾アドレスとすることも可能である。このように構成した場合、保護箇所及び鍵計算対象箇所検索ルーチンでは、検索により得られた鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２のアドレスに対して所定アドレス分、加算又は除算したアドレスが鍵計算対象コード５４の先頭アドレス及び後尾アドレスとして取得される。
【０１４７】
この他、例えば鍵計算対象コード５４のコード長を固定長とした場合、鍵計算対象箇所開始識別子５１若しくは鍵計算対象箇所終了識別子５２の何れか一方を省略することができる。すなわち、鍵計算対象コード５４の存在範囲を示す識別子を１つとすることができる。このように構成した場合であって例えば当該識別子を鍵計算対象コード５４の直前に設けた場合、鍵計算対象箇所検索ルーチンでは、検索により得られた識別子に対して直後のアドレスから所定長のコードが鍵計算対象コード５４として取得される。尚、鍵計算対象コード５４の先頭アドレスに対して所定コード分、離れた位置に識別子を設けた場合でも、当該所定コードのコード長を考慮しつつ同様の手法により鍵計算対象コード５４が存在するアドレスを取得することができる。また、識別子を鍵計算対象コード５４の後尾アドレスに対して設けた場合でも同様である。
【０１４８】
また、本発明は、鍵計算ルーチンが保護箇所及び鍵計算対象箇所検索ルーチンで検索された識別子（例えば鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２）のアドレスから鍵計算対象コード５４の先頭アドレス及び後尾アドレスを特定するように構成することもできる。
【実施例６】
【０１４９】
次に、本発明の実施例６について図面を用いて詳細に説明する。尚、以下の説明において、実施例１から実施例５の何れかと同様の構成については、同一の符号を付し、その詳細な説明を省略する。また、特記しない構成に関しては実施例１から実施例５の何れかと同様である。
【０１５０】
上述の実施例５では、鍵計算対象コード５４が一定のコードとされていた。しかしながら、鍵計算対象コード５４が一定である場合、それを元に計算される暗号鍵及び復号鍵も常に一定となる。すなわち、保護したい箇所が複数ある場合に、すべて同じ暗号鍵となってしまう。これは、安全性の観点から好ましくない。そこで本実施例では、鍵計算対象コード５４に変化を持たせる。これにより、計算される暗号鍵及び復号鍵が変化するため、解析に対する耐性をより向上することができる。尚、以下では、本実施例を実施例３及び実施例５と組み合わせた場合を例に挙げて説明する。但し、本実施例は他の実施例と組み合わせることもできる。
【０１５１】
本実施例において、プログラム作成装置の構成は実施例１と同様である。但し、エディタ２で作成されたプログラムは、図１８に示すようなファイルイメージとなる。本実施例では、これをプログラム１００ｆとする。
【０１５２】
図４に示すプログラム１００ａと図１８に示すプログラム１００ｆとを比較すると明らかなように、本実施例によるプログラム１００ｆは、任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４及び保護作用解除ルーチン呼び出しコード１２の他に、保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅと鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２と鍵計算ルーチン呼び出しコード５３と乱数格納領域６１と保護作用適用ルーチン呼び出しコード３１とを有する。また、鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２とで挟まれたコード、すなわち、保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅと鍵計算ルーチン呼び出しコード５３と保護作用解除ルーチン呼び出しコード１２と乱数格納領域６１（但し、実際にはこれに格納された乱数）とは、暗号鍵及び復号鍵の計算に使われる鍵計算対象コード５４を構成する。
【０１５３】
任意のコード１０１，１０３，保護対象コード１０２，保護箇所開始識別子１３，保護箇所終了識別子１４及び保護作用解除ルーチン呼び出しコード１２は実施例１と同様である。また、保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅと鍵計算対象箇所開始識別子５１と鍵計算対象箇所終了識別子５２と鍵計算ルーチン呼び出しコード５３とは実施例５と同様である。更に、保護作用適用ルーチン呼び出しコード３１は実施例３と同様である。
【０１５４】
乱数格納領域６１は鍵計算対象コード５４から計算した暗号鍵又は復号鍵に変化を持たせるための乱数を格納する領域である。すなわち、乱数格納領域６１に例えば外部で発生させた乱数を格納することで、鍵計算対象コード５４が変化する。従って、これに対してチェックサムやハッシュなどを行うことで計算した暗号鍵又は復号鍵も変化する。
【０１５５】
以上のように作成されたプログラム１００ｆは、実施例１と同様に、コンパイラ３を用いてオブジェクトコードにコンパイルされ、実行プログラムが作成される。本実施例では、これを実行プログラム１００Ｆとする。尚、作成された実行プログラム１００Ｆは、保護箇所及び鍵計算対象箇所検索ルーチン，鍵計算ルーチン，保護作用解除ルーチン及び保護作用適用ルーチンとリンクされる。
【０１５６】
このように実行プログラム１００Ｆを作成すると、次にユーザは、保護作用適用手段４を起動し、これを用いて実行プログラム１００Ｆにおける保護対象コード１０２に保護作用を適用すると共に、乱数格納領域６１に乱数を格納する。ここで、保護作用適用手段４の動作を図面と共に詳細に説明する。
【０１５７】
図１９は保護作用適用手段４の動作を示すフローチャートである。図１９に示すように、保護作用適用手段４は、起動されると先ず、作成された実行プログラム１００Ｆを読み込み（ステップＳ６０１）、実行プログラム１００Ｆに埋め込まれた保護箇所開始識別子１３及び保護箇所終了識別子１４と鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２と乱数格納領域６１とを検索する（ステップＳ６０２）。これにより、保護対象コード１０２と鍵計算対象コード５４とが特定される。また、乱数格納領域６１の検索は、例えばこの領域に所定パターンのコードを格納しておく、または鍵計算対象箇所終了識別子５２の直前に置く等あらかじめ場所を決めておくことなどで実現することができる。
【０１５８】
次に保護作用適用手段４は、乱数を発生させ（ステップＳ６０３）、これを特定した乱数格納領域６１に格納する（ステップＳ６０４）。次に保護作用適用手段４は、特定した鍵計算対象コード５４から暗号鍵を生成する（ステップＳ６０５）。暗号鍵の計算は、上述のように、例えばチェックサム値の計算やハッシュ値の計算などを適用することが可能である。
【０１５９】
次に保護作用適用手段４は、実行プログラム１００Ｆのコード領域を書き換え可能状態に設定する（ステップＳ６０６）。以上のような行程を経ることによって、保護作用が適用された実行プログラム１００Ｆが完成する。ここで、実行プログラム１００Ｆのファイルイメージを図２０に示す。図２０に示すように、保護作用適用後の実行プログラム１００Ｆでは、保護対象コード１０２が暗号化された保護対象コード１０２Ａに置き換えられていると共に、乱数格納領域６１に乱数６１Ｆが格納されている。
【０１６０】
次に、上述のように作成した実行プログラム１００Ｆを実行した際の情報処理装置の動作を図面と共に詳細に説明する。
【０１６１】
情報処理装置は、実行プログラム１００Ｆを実行すると、当該実行プログラム１００ＦをＲＡＭなどのメモリにロードする。この際、メモリ上に展開される実行プログラム１００Ｆにおいて、保護対象コード１０２には保護作用が適用されている（暗号化された保護対象コード１０２Ａに相当）。このように実行プログラム１００Ｆを展開した状態で、情報処理装置は順次コードを実行する。図２１のフローチャートに、実行プログラム１００Ｆを実行した際の情報処理装置の動作を示す。
【０１６２】
図２１に示すように、情報処理装置は先ず、任意のコード１０１の先頭から記述に沿ってコードを順次実行する（ステップＳ６１１）。この流れにおいて保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード１１ｅが実行されると、情報処理装置は保護箇所及び鍵計算対象箇所検索ルーチンを呼び出し、これを実行する（ステップＳ６１２）。
【０１６３】
保護箇所及び鍵計算対象箇所検索ルーチンを実行すると、情報処理装置は保護箇所開始識別子１３及び保護箇所終了識別子１４と鍵計算対象箇所開始識別子５１及び鍵計算対象箇所終了識別子５２とを検索し、これらに基づいて暗号化された保護対象コード１０２Ａ及び鍵計算対象コード５４とを特定する。また、暗号化された保護対象コード１０２Ａ及び鍵計算対象コード５４を特定すると、情報処理装置は、記述に沿って鍵計算ルーチン呼び出しコード５３を実行する。これにより、情報処理装置では鍵計算ルーチンが呼び出され、これが実行される（ステップＳ６１３）。
【０１６４】
鍵計算ルーチンにより復号鍵を算出すると、次に情報処理装置は、記述に沿って保護作用解除ルーチン呼び出しコード１２を実行する。これにより、情報処理装置では保護作用解除ルーチンが呼び出され、これが実行される（ステップＳ６１４）。この際、情報処理装置は暗号化された保護対象コード１０２Ａのアドレスを保持しておく。また、情報処理装置は、乱数格納領域６１に格納された乱数６１Ｆを実行可能なコードで書き換えておく（ステップＳ６１５）。この際、情報処理装置は、書換えの対象である乱数６１Ｆをメモリに保持しておく。尚、ステップＳ６１５は保護作用解除ルーチン内で行われてもよい。
【０１６５】
また、暗号化された保護対象コード１０２Ａの保護作用を解除すると、次に情報処理装置は、記述に沿って復号化した保護対象コード１０２を実行する（ステップＳ６１６）。次に情報処理装置は、同じく記述に沿って保護作用適用ルーチン呼び出しコード３１を実行する。これにより、情報処理装置では、保護作用適用ルーチンが呼び出され、これが実行される（ステップＳ６１７）。
【０１６６】
保護作用適用ルーチンが実行されると、情報処理装置は上述において保持しておいた暗号化された保護対象コード１０２Ａのアドレスを保護対象コード１０２のアドレスとして取得し、これを暗号化する。これにより、保護対象コード１０２に保護作用が再度適用される。尚、保護作用適用後の保護対象コード１０２は暗号化された保護対象コード１０２Ａである。また、情報処理装置は、保持しておいた乱数６１Ｆを乱数格納領域６１に戻す（ステップＳ６１８）。これにより、何度でも暗号鍵及び復号鍵を計算することができる。尚、ステップＳ６１５は保護作用解除ルーチン内で行われてもよい。
【０１６７】
このように保護対象コード１０２に再度保護作用を適用すると、次に情報処理装置は、記述に沿って残りのコード（任意のコード１０３を含む）を実行する（ステップＳ６１９）。
【０１６８】
以上のように構成することで、本実施例によれば、計算される暗号鍵及び復号鍵を変化させることが可能となり、結果として、解析に対する耐性をより向上することができる。
【０１６９】
上述のように、本発明によれば、関数ポインタのアドレス情報と保護箇所識別情報とを利用することで、プログラムの実行時に保護作用適用箇所を特定することが可能となり、実行時に保護作用を解除する具体的手法を提供することができる。また、本発明によれば、保護作用の解除時に解析ツールの存在を検出するため、解析ツールを用いた解析時に正常な実行を妨げることが可能となり、解析を困難にさせることができる。更に、本発明によれば、保護作用として暗号化を用いた場合、実行時に保護対象箇所を復号する際に使用する復号鍵を、実行時に計算するため、実行コードが改変された場合に正しく復号されることを防止でき、結果として、正常な実行を妨げ、解析を困難にさせることができる。
【０１７０】
尚、上記実施例１から実施例５は本発明を実施するための例にすぎず、本発明はこれらに限定されるものではなく、これらの実施例を種々変形することは本発明の範囲内であり、更に本発明の範囲内において、他の様々な実施例が可能であることは上記記載から自明である。
【０１７１】
例えば暗号鍵及び復号鍵を取得する方法は、実施例で例示した方法に限られるものではなく、例えばこれを外部ファイル又はネットワーク経由で取得するようにも構成することができる。また、実施例で例示した方法で計算した暗号鍵又は復号鍵と、外部ファイル又はネットワーク経由で取得した暗号鍵又は復号鍵とを組み合わせる、若しくは計算することで、真の復号鍵を生成するようにも構成することができる。
【０１７２】
また、本発明は、暗号鍵及び復号鍵を実行プログラム中に予め埋め込んでおくことを排除するものでもない。例えば解析から実行プログラムを保護すると共に、実行効率を重視するような場合などのように、実行時に暗号鍵及び復号鍵を計算するオーバヘッドを避けるために、予め計算しておいた暗号鍵及び復号鍵を実行プログラム中に埋め込んでおく方法を取ることが好ましい場合がある。
【図面の簡単な説明】
【０１７３】
【図１】本発明の実施例１によるプログラム作成装置１の構成を示す機能ブロック図である。
【図２】本発明の実施例１による実行プログラム１００Ａの作成手順を示すフローチャートである。
【図３】本発明の実施例１によるプログラム１００のファイルイメージを示す図である。
【図４】本発明の実施例１によるプログラム１００ａのファイルイメージを示す図である。
【図５】本発明の実施例１による保護作用適用手段４の動作を示すフローチャートである。
【図６】本発明の実施例１によるプログラム１００Ａのファイルイメージを示す図である。
【図７】本発明の実施例１において実行プログラム１００Ａを実行した際の情報処理装置の動作を示すフローチャートである。
【図８】本発明の実施例１による保護箇所検索ルーチンが実行された際の情報処理装置の動作を示すフローチャートである。
【図９】本発明の実施例２によるプログラム１００ｂのファイルイメージを示す図である。
【図１０】本発明の実施例２において実行プログラム１００Ｂを実行した際の情報処理装置の動作を示すフローチャートである。
【図１１】本発明の実施例３によるプログラム１００ｃのファイルイメージを示す図である。
【図１２】本発明の実施例３において実行プログラム１００Ｃを実行した際の情報処理装置の動作を示すフローチャートである。
【図１３】本発明の実施例４によるプログラム１００ｄのファイルイメージを示す図である。
【図１４】本発明の実施例４において実行プログラム１００Ｄを実行した際の情報処理装置の動作を示すフローチャートである。
【図１５】本発明の実施例５によるプログラム１００ｅのファイルイメージを示す図である。
【図１６】本発明の実施例５による保護作用適用手段４の動作を示すフローチャートである。
【図１７】本発明の実施例５において実行プログラム１００Ｅを実行した際の情報処理装置の動作を示すフローチャートである。
【図１８】本発明の実施例６によるプログラム１００ｆのファイルイメージを示す図である。
【図１９】本発明の実施例６による保護作用適用手段４の動作を示すフローチャートである。
【図２０】本発明の実施例６によるプログラム１００Ｆのファイルイメージを示す図である。
【図２１】本発明の実施例５において実行プログラム１００Ｆを実行した際の情報処理装置の動作を示すフローチャートである。
【符号の説明】
【０１７４】
１  プログラム作成装置                    ２  エディタ
３  コンパイラ                            ４  保護作用適用手段
１３  保護箇所開始識別子                  １４  保護箇所終了識別子
４１  デバッガ検出有無判定コード        ５１  鍵計算対象箇所開始識別子
５３  鍵計算ルーチン呼び出しコード      ５４  鍵計算対象コード
６１  乱数格納領域                      ６１Ｆ  乱数
１０１、１０３  任意のコード            １０２  保護対象コード
１１  保護箇所検索ルーチン呼び出しコード
１１ｅ  保護箇所及び鍵計算対象箇所検索ルーチン呼び出しコード
１２  保護作用解除ルーチン呼び出しコード
２１  保護作用解除済み確認ルーチン呼び出しコード
３１  保護作用適用ルーチン呼び出しコード
５２  鍵計算対象箇所終了識別子
１０２Ａ  暗号化された保護対象コード
１００、１００ａ、１００ｂ、１００ｃ、１００ｄ、１００ｅ、１００ｆ  プログラム
１００Ａ、１００Ｂ、１００Ｃ、１００Ｄ、１００Ｅ、１００Ｆ  実行プログラム
【図１】
2005165919.tif 000003
【図２】
2005165919.tif 000004
【図３】
2005165919.tif 000005
【図４】
2005165919.tif 000006
【図５】
2005165919.tif 000007
【図６】
2005165919.tif 000008
【図７】
2005165919.tif 000009
【図８】
2005165919.tif 000010
【図９】
2005165919.tif 000011
【図１０】
2005165919.tif 000012
【図１１】
2005165919.tif 000013
【図１２】
2005165919.tif 000014
【図１３】
2005165919.tif 000015
【図１４】
2005165919.tif 000016
【図１５】
2005165919.tif 000017
【図１６】
2005165919.tif 000018
【図１７】
2005165919.tif 000019
【図１８】
2005165919.tif 000020
【図１９】
2005165919.tif 000021
【図２０】
2005165919.tif 000022
【図２１】
2005165919.tif 000023