(57)【要約】個別のセキュリティプログラム（２８）がそれぞれの鍵（３２）によってランダムに選ばれ、次いでゲームプログラム（２０）と一緒にパッケージ化されて実行可能プログラムファイル（３４）が与えられる。この実行可能プログラムファイルは光ディスク（３０）のような記憶媒体に記録される。セキュリティプログラム（２８）の実行中は常に、それが生成するオブジェクトコードは難読化され、セキュリティプログラムを同定して除去することによってプロテクトを破ることが難しくなる。難読化されたオブジェクトコードは、ソースコード中の変数を該変数の関数で置き換えることによって生成される。ソースコードをコンパイルしてオブジェクトコードを生成する際に、その関数がコンパイルされたオブジェクトコード中での変数を一連の演算として提示されるようにする。
2007503038.tif 000002
【特許請求の範囲】
【請求項１】
難読化されたオブジェクトコードを生成する方法であって、ソースコード中の変数を該変数の選択された関数で置き換え、当該ソースコードをコンパイルしてオブジェクトコードを生成するステップを有しており、前記選択された関数がコンパイルされたオブジェクトコードにおいて前記変数が一連の演算として提示されるようにすることを特徴とする方法。
【請求項２】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項１記載の方法。
【請求項３】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項１または２記載の方法。
【請求項４】
前記選択された関数がソースコード中のテンプレートにおいて定義されていることを特徴とする、請求項１ないし３のうちいずれか一項記載の方法。
【請求項５】
前記ソースコードのテンプレートが複数の関数を定義し、その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されており、当該方法がさらに、その関数のうちからソースコード中の前記変数の代替とすべき一つを選択することを有することを特徴とする、請求項４記載の方法。
【請求項６】
前記テンプレート中の関数の一つ一つに異なる鍵が関連付けられており、当該方法がさらに、ソースコード中の変数を前記テンプレートで置き換え、前記テンプレート中の関数の一つをその関数に関連付けられた鍵を選択することによって選択することをさらに有することを特徴とする、請求項５記載の方法。
【請求項７】
前記ソースコードが保存された配列およびテンプレートを含んでおり、該配列およびテンプレートをナビゲートするためにポインタを利用することを特徴とする、請求項１ないし６のうちいずれか一項記載の方法。
【請求項８】
前記ソースコードが標準的なプログラミング言語であることを特徴とする、請求項１ないし８のうちいずれか一項記載の方法。
【請求項９】
前記ソースコードがC++であることを特徴とする、請求項８記載の方法。
【請求項１０】
ソースコードからコンパイルされた、オブジェクトコードの形の実行可能プログラムであって、前記ソースコード中の変数がコンパイルされるとオブジェクトコードにおいては一連の演算として提示され、それによりオブジェクトコードが難読化されることを特徴とする実行可能プロラム。
【請求項１１】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項１０記載の実行可能プロラム。
【請求項１２】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項１０または１１記載の実行可能プロラム。
【請求項１３】
前記一連の演算が、ソースコード中の前記変数を、コンパイルされたオブジェクトコードにおいて前記変数を一連の演算として提示させるよう構成されたある選択された関数で置き換えることによって生成されたものであることを特徴とする、請求項１０ないし１２のうちいずれか一項記載の実行可能プロラム。
【請求項１４】
前記選択された関数がソースコードのテンプレートにおいて定義されたものであることを特徴とする、請求項１３記載の実行可能プロラム。
【請求項１５】
前記ソースコードのテンプレートが複数の関数を定義しており、その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されており、その関数のうちからソースコード中の前記変数の代替とすべき一つが選択されたことを特徴とする、請求項１４記載の実行可能プロラム。
【請求項１６】
セキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法であって、実行可能プログラムを、該実行可能プログラムへのアクセスを管理するよう構成されたセキュリティプログラムに関連付けることによってセキュリティで保護し、前記セキュリティで保護された実行可能プログラムを前記記憶媒体に記録するステップを有しており、当該方法がさらに、前記セキュリティプログラムのオブジェクトコードを難読化し、ここで前記セキュリティプログラムのオブジェクトコードの難読化はソースコード中の変数を該変数のある選択された関数で置き換えることによって行われるものであり、前記ソースコードをコンパイルしてオブジェクトコードを生成することを有しており、前記選択された関数が前記変数をコンパイルされたオブジェクトコードにおいて一連の演算として提示されるようにすることを特徴とする方法。
【請求項１７】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項１６記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項１８】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項１６または１７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項１９】
前記実行可能プログラムおよび前記セキュリティプログラムがオブジェクトコードレベルで関連付けられていることを特徴とする、請求項１６ないし１８のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２０】
前記セキュリティプログラムが前記実行可能プログラムを暗号化するよう構成されていることを特徴とする、請求項１６ないし１９のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２１】
前記実行可能プログラムのいくつかのブロックを該実行可能プログラムから取り出し、前記セキュリティプログラム内に再配置することを特徴とする、請求項１６ないし２０のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２２】
前記セキュリティプログラムが認証プログラムの実行を要求するよう構成されていることを特徴とする、請求項１６ないし２１のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２３】
前記セキュリティプログラムのソースコード中の前記選択された関数がソースコードのテンプレートにおいて定義されていることを特徴とする、請求項１６ないし２２のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２４】
前記セキュリティプログラムのソースコードの前記テンプレートが複数の関数を定義し、それらの関数はコンパイルされると前記変数を一連の演算として提示するよう構成されており、当該方法がさらに、その関数のうちからソースコード中の前記変数の代替とすべき一つを選択することを有することを特徴とする、請求項２３記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２５】
テンプレート中の関数の一つ一つに異なる鍵が関連付けられており、当該方法がさらに、ソースコード中の変数をテンプレートで置き換え、テンプレート中の関数の一つをその関数に関連付けられた鍵を選択することによって選択することをさらに有することを特徴とする、請求項２４記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２６】
前記セキュリティプログラムのソースコードが保存された配列およびテンプレートを含んでおり、該配列およびテンプレートをナビゲートするためにポインタを利用することを特徴とする、請求項１６ないし２５のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２７】
前記セキュリティプログラムのソースコードが標準的なプログラミング言語であることを特徴とする、請求項１６ないし２６のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２８】
前記ソースコードがC++であることを特徴とする、請求項２７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２９】
前記セキュリティで保護された実行可能プログラムが記録される前記記憶媒体が光ディスクであることを特徴とする、請求項１６ないし２８記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項３０】
前記セキュリティで保護された実行可能プログラムが前記光ディスクにレーザービームエンコードによって記録されることを特徴とする、請求項２９記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項３１】
前記セキュリティで保護された実行可能プログラムが記録される前記記憶媒体が、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリであることを特徴とする、請求項１６ないし２８のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項３２】
実行可能プログラムがそれに関連付けられた、該実行可能プログラムへのアクセスを管理するよう構成されたセキュリティプログラムをもつことによってセキュリティで保護されており、前記セキュリティプログラムは難読化されたオブジェクトコードの形であり、前記セキュリティプログラムはソースコードからコンパイルされたものであり、前記セキュリティプログラムの前記ソースコード中の変数がコンパイルされてオブジェクトコード中で一連の演算として提示され、それによって前記オブジェクトコードが難読化されている、ことを特徴とする、セキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３３】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項３２記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３４】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項３２または３３記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３５】
前記一連の演算が、ソースコード中の前記変数を、コンパイルされたオブジェクトコードにおいて前記変数を一連の演算として提示させるよう構成されたある選択された関数で置き換えることによって生成されたものであることを特徴とする、請求項３２ないし３４のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３６】
前記選択された関数がソースコードのテンプレートにおいて定義されていることを特徴とする、請求項３５記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３７】
前記ソースコードの前記テンプレートが複数の関数を定義し、その関数がそれぞれコンパイルされると前記変数を一連の演算として提示するよう構成されており、前記関数のうちからソースコード中の前記変数の代替とすべき一つが選択されていることを特徴とする、請求項３６記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３８】
前記実行可能プログラムおよび前記セキュリティプログラムがオブジェクトコードレベルで関連付けられていることを特徴とする、請求項３２ないし３７のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３９】
前記実行可能プログラムが当該記憶媒体上で暗号化されており、前記関連付けられたセキュリティプログラムが前記実行可能プログラムの復号を可能にすることを特徴とする、請求項３２ないし３８のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４０】
前記実行可能プログラムのいくつかのブロックが前記セキュリティプログラム内に再配置されることを特徴とする、請求項３２ないし３９のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４１】
前記セキュリティプログラムが認証プログラムの実行を要求するよう構成されていることを特徴とする、請求項３２ないし４０のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４２】
当該記憶媒体が前記実行可能プログラムおよび前記セキュリティプログラムがその上にエンコードされる光ディスクであることを特徴とする、請求項３２ないし４１のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４３】
前記光ディスクがCD、CD-ROMまたはDVDであることを特徴とする、請求項４２記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４４】
当該記憶媒体が、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリであり、その上に前記実行可能プログラムおよび前記セキュリティプログラムが保存されることを特徴とする、請求項３２ないし４１のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４５】
前記実行可能プログラムがゲームプログラムおよび／またはビデオプログラムおよび／またはオーディオプログラムおよび／またはその他のソフトウェアであることを特徴とする、請求項３２ないし４４のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４６】
プログラムを走らせるためにプロセッサを制御する方法であって、
前記プログラムからの命令を、当該プロセッサが反応しない簡略化命令セット形式に翻訳し、
前記翻訳された命令が該簡略化命令セット形式に反応する仮想プロセッサに適用されるようにし、
前記仮想プロセッサをして、前記の適用された命令を走らせて当該プロセッサが反応する一連の単純な命令を当該プロセッサに適用させる、
ステップを有することを特徴とする方法。
【請求項４７】
前記仮想プロセッサに適用されるべき前記翻訳された命令を暗号化すること、および前記仮想プロセッサをして該暗号化された命令を復号することなくそれに反応できるようにすることをさらに有することを特徴とする、請求項４６記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項４８】
命令を翻訳および暗号化するためのテンプレートを利用することをさらに有し、ある選択されたテンプレートが当該プログラムからの各命令について簡略化命令セット形式での一連の命令を提供することを特徴とする、請求項４６または４７記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項４９】
前記テンプレートが当該プログラム中のある命令について簡略化命令セット形式での複数の命令系列を定義し、当該方法がさらに、前記複数の命令の系列のうち前記命令の翻訳で使われる一つを選択することを有することを特徴とする、請求項４８記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５０】
前記テンプレート中で、簡略化命令セット形式での複数の命令の系列のそれぞれには異なる鍵が関連付けられており、当該方法がさらに、前記複数の命令の系列の一つと関連付けられた鍵を選択し、該選択された鍵に関連付けられている前記複数の命令の系列のうちの一つに当該プログラム中の命令を翻訳することを有することを特徴とする、請求項４９記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５１】
前記仮想プロセッサが、前記複数の命令の系列のうちの前記の一つに反応できるようにされていることを特徴とする、請求項５０記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５２】
前記プログラムからの所定の関数またはルーチンを実行する命令だけが翻訳されて前記仮想プロセッサに適用されることを特徴とする、請求項４６ないし５１のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５３】
前記プログラムからの前記の命令がオブジェクトコードの形であるか、あるいはオブジェクトコードから変換されたものであり、該オブジェクトコードが請求項１ないし９のうちいずれか一項記載の方法によって難読化されていることを特徴とする、請求項４６ないし５１のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５４】
前記命令が、請求項１０ないし１５のうちいずれか一項記載のオブジェクトコードの形の実行可能プログラムからのものであることを特徴とする、請求項４６ないし５３のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５５】
前記命令が、請求項１６ないし３１のうちいずれか一項記載の方法によって生産された記憶媒体上のセキュリティで保護された実行可能プログラムからのものであることを特徴とする、請求項４６ないし５２のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５６】
前記命令が、請求項３２ないし４５のうちいずれか一項記載の記憶媒体上のセキュリティで保護された実行可能プログラムであることを特徴とする、請求項４６ないし５４のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５７】
実行可能プログラムがそれに関連付けられたセキュリティプログラムおよびエミュレーションプログラムをもつことによってセキュリティで保護され、前記セキュリティプログラムは前記実行可能プログラムへのアクセスを管理するよう構成されており、前記エミュレーションプログラムは前記実行可能プログラムの所定の関数またはルーチンを該エミュレーションプログラムによって提供される仮想プロセッサ上で実行されるようにするものであり、該エミュレーションプログラムが前記実行可能プログラムからの命令を簡略化命令セット形式に翻訳し、該翻訳された命令が仮想プロセッサに適用されるようにし、該仮想プロセッサに適用された命令を実行してプロセッサに適用するための一連の単純な命令を出力させるよう構成されていることを特徴とする、セキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項５８】
当該記憶媒体が前記実行可能プログラム、前記セキュリティプログラムおよび前記エミュレーションプログラムがその上にエンコードされる光ディスクであることを特徴とする、請求項５７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項５９】
前記光ディスクがCD、CD-ROMまたはDVDであることを特徴とする、請求項５７または５８記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項６０】
当該記憶媒体が、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリであり、その上に前記セキュリティプログラムおよび前記エミュレーションプログラムが保存されることを特徴とする、請求項５７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項６１】
前記実行可能プログラムがゲームプログラムおよび／またはビデオプログラムおよび／またはオーディオプログラムおよび／またはその他のソフトウェアであることを特徴とする、請求項５７ないし６０のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項６２】
付属の図面を参照しつつ記載されているのと実質同様の難読化されたオブジェクトコードを生成する方法。
【請求項６３】
付属の図面を参照しつつ記載されているのと実質同様のオブジェクトコードの形の実行可能プログラム。
【請求項６４】
付属の図面を参照しつつ記載されているのと実質同様のセキュリティで保護された実行可能プログラムをもつ記憶媒体を製造する方法。
【請求項６５】
付属の図面を参照しつつ記載されているのと実質同様のセキュリティで保護された実行可能プログラムをもつ記憶媒体。
【請求項６６】
付属の図面を参照しつつ記載されているのと実質同様のプログラムを走らせるためにプロセッサを制御する方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、難読化したオブジェクトコードを生成する方法、オブジェクトコードの形の実行可能プログラム、セキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法、およびセキュリティで保護された実行可能プログラムを有する記憶媒体に関するものである。本発明はまた、プログラムを走らせるためにプロセッサを制御する方法にも関する。
【０００２】
一般に、本発明はソフトウェアのセキュリティに関する。ソフトウェアは貴重である場合があり、該ソフトウェアを保護するために適用されているセキュリティ方策を迂回しようとする人や組織があることはよく知られている。
【背景技術】
【０００３】
プログラムはCやFortranといった高水準言語で書かれる。それがコンパイルされてオブジェクトコードとなる。オブジェクトコードは機械語であってもよいし、機械語に変換されるのでもよい。ソースコードからオブジェクトコードへの翻訳を行うには、コンパイラのようなデバイスが手にはいる。機械語は二進数字の羅列であって、実行可能プログラムのための命令を含むが、さまざまなセキュリティ手段をも含んでいることもある。たとえば、プログラムの純正なコピーのみが実行できることを保証するものである。クラッカーはセキュリティ手段を迂回できるよう平文のコードを得ようとするが、その際、たとえば二進数字の羅列からソースコードを生成するリバースコンパイラが手にはいることによって助けられている。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
オブジェクトコードに詰め物をする、すなわち、冗長な追加コードを加えて機能的なオブジェクトコードを隠蔽または難読化することが提案されているが、クラッカーはそうした詰め物を認識して除去するのが巧みであることを実証してきた。オブジェクトコードを暗号化することも提案されているが、プログラムを実行するときには命令が復号できるよう暗号化鍵が利用可能であることが必要である。ひとたびクラッカーが鍵をみつければ、平文のコードを手に入れられることは明らかであろう。
【０００５】
本発明は、ソフトウェアをセキュリティで保護する新しい改良された方法を提供しようとするものである。
【課題を解決するための手段】
【０００６】
本発明の第一の側面によれば、難読化されたオブジェクトコードを生成する方法であって、ソースコード中の変数を該変数の選択された関数で置き換え、当該ソースコードをコンパイルしてオブジェクトコードを生成するステップを有しており、前記選択された関数がコンパイルされたオブジェクトコードにおいて前記変数が一連の演算として提示されるようにすることを特徴とする方法が提供される。
【０００７】
変数が一連の演算にコンパイルされるので、オブジェクトコードの大きさが増し、このこと自身が有用なコードを隠蔽または難読化する作用をもつ。しかし、一つの変数を提示するために一連の演算を提供することは、結果として得られるコードの全体が有用に見えるという点で、コードの詰め物よりも利点がある。どのオブジェクトコードが必要なものであるかをクラッカーが判定するのがずっと困難になるのである。
【０００８】
ある好ましい実施形態では、前記変数を提示する一連の演算は算術演算および／または論理演算からなり、該一連の演算は当該オブジェクトコードの実行時に前記変数を与えるよう構成される。追加的に、あるいは代替的に、あるいはその両方で、前記変数を提示する一連の演算は、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含む。
【０００９】
これに関し、オブジェクトコードの長さが大幅に増し、その際、変数をたとえば一連の算術演算その他の演算として提示することによってオブジェクトコードが難読化される。
【００１０】
ある実施形態では、前記選択された関数はソースコードのテンプレートにおいて定義される。
【００１１】
たとえば、ソースコードのテンプレートは複数の関数を定義する。その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されている。本方法はさらに、その関数のうちからソースコード中の前記変数の代替とすべき一つを選択することを含む。
【００１２】
好ましくは、テンプレート中の関数の一つ一つに異なる鍵が関連付けられており、本方法はさらに、ソースコード中の変数をテンプレートで置き換え、テンプレート中の関数の一つをその関数に関連付けられた鍵を選択することによって選択することをさらに含んでいる。
【００１３】
前記変数の代替として選択されうる複数の関数を用意することで、ある特定の変数がいくつかの異なった仕方でコンパイルされることが可能になる。これは、一つのソースが多くの異なるソフトウェアアプリケーションを生成する場合にとりわけ助けになる。たとえば、CDメーカーは異なるタイトルおよびコンテンツのCDを製造するが、どのタイトルでもフォーマットとセキュリティ方式は共通にするであろう。従来技術の多くのセキュリティ方策では、クラッカーは一つのタイトルのプロテクトをクラックしさえすれば、同じ行動を繰り返すことによってあらゆるタイトルをクラックできるようになれるのである。
【００１４】
上記のような複数の関数を用意することによって、同じ変数に対しても異なるタイトルそれぞれについて異なる関数が選ばれることが可能になる。したがって、あるCDタイトルのコンテンツにアクセスしようとするクラッカーの努力は、そのクラッカーが別のCDタイトルのコンテンツへのアクセスをしおおせたとしても助けられはしないのである。さらに、関数を選択するために鍵方式を使うことによりソフトウェアをセキュリティで保護するプロセスのいくらかの自動化が可能になる。
【００１５】
ある実施形態では、ソースコードは保存された配列およびテンプレートを含んでおり、該配列およびテンプレートをナビゲートするためにポインタを利用する。
【００１６】
好ましくは、ソースコードは標準的なプログラミング言語である。たとえば、ソースコードはC++である。
【００１７】
本発明はまた、ソースコードからコンパイルされた、オブジェクトコードの形の実行可能プログラムにも広がる。ソースコード中のある変数はコンパイルされるとオブジェクトコードにおいては一連の演算として提示され、それによりオブジェクトコードが難読化される。
【００１８】
前記変数を提示する一連の演算は算術演算および／または論理演算からなり、該一連の演算は当該オブジェクトコードの実行時に前記変数を与えるよう構成される。追加的に、あるいは代替的に、あるいはその両方で、前記変数を提示する一連の演算は、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含む。
【００１９】
当該オブジェクトコードの実行時に前記変数を与えるよう構成される一連の命令を使うことによって、難読化されたオブジェクトコードの復号その他の解釈を行う必要なく、当該オブジェクトコードの命令または当該オブジェクトコードから変換された命令がプログラムを走らせることを可能にする。
【００２０】
ある実施形態では、前記一連の演算は、ソースコード中の前記変数を、コンパイルされたオブジェクトコードにおいて前記変数を一連の演算として提示させるよう構成されたある選択された関数で置き換えることによって生成されたものである。
【００２１】
たとえば、前記選択された関数はソースコードのテンプレートにおいて定義されたものである。
【００２２】
好ましくは、ソースコードのテンプレートは複数の関数を定義していた。その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されており、その関数のうちからソースコード中の前記変数の代替とすべき一つが選択された。
【００２３】
本発明のさらなる側面によれば、セキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法が提供される。該方法は、実行可能プログラムを、該実行可能プログラムへのアクセスを管理するよう構成されたセキュリティプログラムに関連付けることによってセキュリティで保護し、前記セキュリティで保護された実行可能プログラムを記憶媒体に記録するステップを有しており、該方法はさらに、前記セキュリティプログラムのオブジェクトコードを難読化し、ここで前記セキュリティプログラムのオブジェクトコードの難読化はソースコード中のある変数を該変数のある選択された関数で置き換えることによって行われるものであり、前記ソースコードをコンパイルしてオブジェクトコードを生成することを有しており、前記選択された関数は前記変数をコンパイルされたオブジェクトコードにおいて一連の演算として提示されるようにする。
【００２４】
ある実施形態では、前記変数を提示する一連の演算は算術演算および／または論理演算からなり、該一連の演算は当該オブジェクトコードの実行時に前記変数を与えるよう構成される。追加的に、あるいは代替的に、あるいはその両方で、前記変数を提示する一連の演算は、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含む。
【００２５】
好ましくは、前記実行可能プログラムおよび前記セキュリティプログラムはオブジェクトコードレベルで関連付けられている。
【００２６】
前記実行可能プログラムへのアクセスを管理するために用意されるセキュリティプログラムはいかなる好適なセキュリティプログラムでもよい。たとえば、該セキュリティプログラムは前記実行可能プログラムを暗号化するよう構成されていてもよいし、および／または前記実行可能プログラムのブロックが前記セキュリティプログラム内に移動されてもよいし、および／または前記セキュリティプログラムは認証プログラムの実行を要求するよう構成されていてもよい。
【００２７】
ある実施形態では、前記セキュリティプログラムのソースコード中の前記選択された関数はソースコードのテンプレートにおいて定義される。
【００２８】
たとえば、前記セキュリティプログラムのソースコードのテンプレートは複数の関数を定義し、その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されている。本方法はさらに、その関数のうちからソースコード中の前記変数の代替とすべき一つを選択することを含む。
【００２９】
好ましくは、テンプレート中の関数の一つ一つに異なる鍵が関連付けられており、本方法はさらに、ソースコード中の変数をテンプレートで置き換え、テンプレート中の関数の一つをその関数に関連付けられた鍵を選択することによって選択することをさらに含んでいる。
【００３０】
ある実施形態では、前記セキュリティプログラムのソースコードは保存された配列およびテンプレートを含んでおり、該配列およびテンプレートをナビゲートするためにポインタを利用する。
【００３１】
好ましくは、前記セキュリティプログラムのソースコードは標準的なプログラミング言語であり、C++などである。
【００３２】
好ましくは、前記セキュリティで保護された実行可能プログラムが記録される前記記憶媒体は光ディスクであり、たとえば前記セキュリティで保護された実行可能プログラムは該光ディスクにレーザービームエンコードによって記録される。
【００３３】
あるいはまた、前記セキュリティで保護された実行可能プログラムが記録される前記記憶媒体はサーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリである。たとえば、前記記憶媒体はコンピュータの内部にある、あるいはそれに接続されたハードディスクでありうる。
【００３４】
本発明はまた、セキュリティで保護された実行可能プログラムを有する記憶媒体にも広がる。ここで、実行可能プログラムはそれに関連付けられたセキュリティプログラムをもつことによってセキュリティで保護される。該セキュリティプログラムは、ソースコードからコンパイルされた、難読化されたオブジェクトコードの形であり、前記セキュリティプログラムのソースコード中のある変数はコンパイルされてオブジェクトコードにおいて一連の演算として提示されており、それによりオブジェクトコードが難読化されている。
【００３５】
たとえば、前記変数を提示する一連の演算は算術演算および／または論理演算からなり、該一連の演算は当該オブジェクトコードの実行時に前記変数を与えるよう構成される。追加的に、あるいは代替的に、あるいはその両方で、前記変数を提示する一連の演算は、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含む。
【００３６】
ある実施形態では、前記一連の演算は、前記セキュリティプログラムのソースコード中の前記変数を、コンパイルされたオブジェクトコードにおいて前記変数を一連の演算として提示させるよう構成されたある選択された関数で置き換えることによって生成されたものである。
【００３７】
たとえば、前記選択された関数はソースコードのテンプレートにおいて定義されたものである。
【００３８】
ある実施形態では、ソースコードのテンプレートは複数の関数を定義していた。その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されており、その関数のうちからソースコード中の前記変数の代替とすべき一つが選択された。
【００３９】
好ましくは、前記実行可能プログラムおよび前記セキュリティプログラムはオブジェクトコードレベルで関連付けられている。
【００４０】
前記実行可能プログラムは前記記憶媒体上では暗号化されていてもよく、関連付けられたセキュリティプログラムはその際、前記実行可能プログラムの復号を可能にするよう構成される。
【００４１】
追加的に、あるいは代替的に、あるいはその両方で、前記実行可能プログラムからの一部のブロックが前記セキュリティプログラムの内部に再配置されていてもよい。
【００４２】
追加的に、あるいは代替的に、あるいはその両方で、前記セキュリティプログラムは認証プログラムの実行を要求するよう構成されていてもよい。
【００４３】
前記セキュリティプログラムがたとえば認証プログラムの実行を要求するよう構成されている場合、その認証プログラムも記憶媒体上に与えられることになる。前記セキュリティプログラムが前記認証プログラムを組み込むことは可能だが、現在のところ前記セキュリティプログラムが前記認証プログラムをポイントするほうが好ましい。
【００４４】
ある実施形態では、前記記憶媒体は、前記実行可能プログラムおよび前記セキュリティプログラムがエンコードされる光ディスクである。たとえば、該光ディスクはCD、CD-ROMまたはDVDである。
【００４５】
ある代替的な実施形態では、記憶媒体はサーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随し、前記実行可能プログラムおよび前記セキュリティプログラムが保存されるメモリである。たとえば、前記記憶媒体はコンピュータの内部にある、あるいはそれに接続されたハードディスクでありうる。
【００４６】
前記実行可能プログラムは、ゲームプログラムおよび／またはビデオプログラムおよび／またはオーディオプログラムおよび／またはその他のソフトウェアである。
【００４７】
これに関し、上記したセキュリティ方法は一般にあらゆるソフトウェアアプリケーションに適用可能であることが理解されることであろう。前記記憶媒体上で提供される前記実行可能プログラムは、ゲームプログラムおよび／またはビデオプログラムおよび／またはオーディオプログラムおよび／またはその他いかなるマルチメディアフォーマットを有していてもよい。
【００４８】
上に記載したような難読化されたオブジェクトコードを生成する方法および／またはオブジェクトコードの形の実行可能プログラムおよび／またはセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法および／またはセキュリティで保護された実行可能プログラムを有する記憶媒体はそれぞれ単独で使ってもよいし、下に記載するようなプログラムを走らせるためにプロセッサを制御する方法および／またはセキュリティで保護された実行可能プログラムを有する記憶媒体とともに使ってもよい。
【００４９】
本発明のあるさらなる側面によれば、プログラムを走らせるためにプロセッサを制御する方法であって、前記プログラムからの命令を、当該プロセッサが反応しない簡略化命令セット（reduced  instruction  set）形式に翻訳し、
前記翻訳された命令が該簡略化命令セット形式に反応する仮想プロセッサに適用されるようにし、
前記仮想プロセッサをして、前記の適用された命令を走らせて当該プロセッサが反応する一連の単純な命令を当該プロセッサに適用させる、
ステップを有する方法が提供される。
【００５０】
一般には、CPUのようなプロセッサに適用されるプログラムからの命令は平文であり、クラッカーにとって、当該プログラムの実行中に前記命令にアクセスして当該プログラムへのアクセスを得ることは可能である。本発明の方法を用いれば、仮想プロセッサ、すなわちソフトウェア的に構成されたプロセッサに適用される前記翻訳された命令は一般に使用される標準的な命令ではなく、したがってクラッカーにとって有用ではない。さらに、当該プロセッサに適用される一連の単純な命令は通常よりも多数であり、よって該命令を難読化する。
【００５１】
ある好ましい実施形態では、本方法はさらに、前記仮想プロセッサに適用されるべき前記翻訳された命令を暗号化すること、および前記仮想プロセッサをして該暗号化された命令を復号することなくそれに反応できるようにすることを含む。
【００５２】
暗号化技術の一つの弱点は、復号を可能にするためには鍵またはその他のデバイスが提供されなければならないということである。クラッカーはそのような鍵を同定することには経験がある。しかし、本発明の諸方法は、仮想プロセッサが命令を走らせるために翻訳された命令を復号することを要求しないので、鍵は用意されない。仮想プロセッサをしてそれぞれの暗号化された命令を理解し、それに反応して適切な反応を生成することを可能にする情報を仮想プロセッサ内に用意することによって、復号は避けることができる。このようにして、仮想プロセッサはクラッカーによってアクセスされる可能性のある平文での命令を扱うことは決してない。
【００５３】
また、当該プログラムからの各命令の代替とすることのできる簡略化命令セット形式での命令を二系列以上用意することも提案される。各命令の系列は異なっており、それにより個々の仮想プロセッサが受け取る翻訳された命令は他の仮想プロセッサが受け取るものとは異なったものになりうる。これはテンプレートの使用によって達成できる。
【００５４】
こうして、ある好ましい実施形態では、本方法は、命令を翻訳および暗号化するためのテンプレートを利用することをさらに含む。ある選択されたテンプレートが当該プログラムからの各命令について簡略化命令セット形式での一連の命令を提供する。
【００５５】
たとえば、テンプレートは当該プログラム中のある命令について簡略化命令セット形式での複数の系列の命令を定義する。本方法はさらに、前記複数の命令の系列のうち前記命令の翻訳で使われる一つを選択することを含む。
【００５６】
好ましくは、前記テンプレート中で、簡略化命令セット形式での複数の命令の系列のそれぞれには異なる鍵が関連付けられており、本方法はさらに、前記複数の命令の系列の一つと関連付けられた鍵を選択し、該選択された鍵に関連付けられている前記複数の命令の系列のうちの一つに当該プログラム中の命令を翻訳することを含む。
【００５７】
先に説明したように、鍵の使用により、当該方法を実行するために要求されるプログラミングのいくらかの自動化が可能になる。
【００５８】
プログラムからの翻訳された命令に基づいて動作し、多数の単純な命令をプロセッサに提供する仮想プロセッサの使用は、この管理方法がたとえばゲームプログラムを走らせるために使われたとしたら、受け入れられない遅延を生じることだろう。したがって、当該プログラムの一部だけを仮想プロセッサによる処理の対象とすることが提案される。
【００５９】
上に記載したようなプロセッサを制御する方法は、単独で使ってもよいし、先に記載したような難読化されたオブジェクトコードを生成する方法および／またはオブジェクトコードの形の実行可能プログラムおよび／またはセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法および／またはセキュリティで保護された実行可能プログラムを有する記憶媒体とともに使ってもよい。
【００６０】
本発明はまた、セキュリティで保護された実行可能プログラムを有する記憶媒体にも広がる。ここで、実行可能プログラムは、それに関連付けられたセキュリティプログラムおよびエミュレーションプログラムをもつことによってセキュリティで保護される。前記セキュリティプログラムは前記実行可能プログラムへのアクセスを管理するよう構成されており、前記エミュレーションプログラムは前記実行可能プログラムの所定の関数またはルーチンを該エミュレーションプログラムによって提供される仮想プロセッサ上で実行されるようにするものであり、該エミュレーションプログラムは前記実行可能プログラムからの命令を簡略化命令セット形式に翻訳し、該翻訳された命令が仮想プロセッサに適用されるようにし、該仮想プロセッサに適用された命令を実行してプロセッサに適用するための一連の単純な命令を出力させるよう構成されている。
【００６１】
本発明の実施形態についてこれから例として付属の図面を参照しつつ説明する。
【発明を実施するための最良の形態】
【００６２】
本発明の実施形態について以下ではCD-ROMまたはDVDのような光ディスク上で提供されるゲームプログラムのような実行可能プログラムとの関連で説明し、解説する。しかし、本発明は挙げられている特定の例に制限されるものではなく、特にあらゆるソフトウェアに、また該ソフトウェアを保存するためのいかなる記憶媒体にも適用可能であることは理解されることであろう。
【００６３】
たとえば、本発明は、コンピュータおよび／もしくはサーバーおよび／もしくはその他の処理手段の内部にある、あるいはそれに付随するメモリに保存されたソフトウェアとともに、および／またはコンピュータにダウンロードされるよう構成されたソフトウェアとともに使うことができる。特に、本発明はデジタル著作権管理ソフトウェアとともに使うことができることを述べておく。
【００６４】
図１は、２で示されたソースコードの、４で示された二進数字のシーケンスである機械語への翻訳を示している。図示されているように、一般にC、C++またはFortranなどの高水準言語であるソースコード２はコンパイラ８によってオブジェクトコード６に翻訳される。
【００６５】
いくつかの例では、ソースコード２の言語およびコンパイラ８の性質に依存して、オブジェクトコード６は機械語４と同じまたは実質同様である。図１に示した実施形態では、オブジェクトコード６はアセンブラ１０によって翻訳されて機械語４を与える。
【００６６】
図１に示されている方法は、ソースコード２の種類に関係なく適用できるが、これからは特にC++ソースコード２との関連で説明し、解説する。C++は、図１で示されているように、一般的に１２、１４、１６で示されているテンプレートおよび配列を使用する、とりわけ柔軟性のある言語である。図１のテンプレート１４はCValueと示されており、これは本発明でソースコード２から生成されたオブジェクトコード６を難読化するために使われることになるクラステンプレートである。
【００６７】
非常に簡単な例を挙げると、Cで書かれたプログラムは、下に示すようなint  iおよびint  jのように変数の値を設定できる：
int  i＝5
int  j＝i＋6
図１から見て取れるように、テンプレートCValueは鍵k0,k1,...,knのそれぞれについてある変数の関連付けられた関数、すなわち関数f(int0),f(int1),...,f(intn)を提供する。これらの関数のそれぞれは異なっており、それぞれたとえば一連の算術演算または論理演算を含んでいる。
【００６８】
図示した方法を使うとき、プログラマーはソースコード中の変数の値をCValueテンプレート１４からの特定の関数で置き換える。したがって、ソースコード２をコンパイルしてオブジェクトコード６を形成する間、5にセットされることになっていた変数int  iは、鍵k0,k1,...,knのうちの一つを選択することによってCValueテンプレート１４から決定される適切な関数f(int0),f(int1),...,f(intn)によって定義される一連の演算によって置き換えられることになる。
【００６９】
上述したように、ソースコード中の変数はたとえば一連の数学的演算によって置き換えられている。これにより結果として得られるオブジェクトコード６が不明瞭になり、難読化されることになる。よって、int  iを5にセットする代わりにたとえばf(int0)は次の演算のシーケンスを指定することができる：
m＝5＋key
n＝6＋key
p＝m＋n
l＝p−(2×key)
int  l＝i
このようにして、変数iは一連の演算により5にセットされた。コンパイラ８によって出力されるオブジェクトコード６では、示されている演算のすべてが有用に見えることになり、クラッカーはどこで難読化が生じているのかを把握するのが困難になる。もちろん、演算は最終的には要求される変数についての正しい値につながり、オブジェクトコード６またはそれからアセンブルされる機械語４は復号やデコードの必要なくプロセッサによって直接実行されることができる。
【００７０】
このようにして変数に対して実行される演算は一般には上述したよりもずっと複雑なものになる。さらに、一連の加減乗除のような単純な算術演算を使うのではなく、変数を割り当てられた値に信頼できる形で戻すことのできるXORのような関数を使うことが一般には好まれる。これに関し、実際に使用されうる技術を以下に述べる。
【００７１】
この技術はC++テンプレートを使ってVqを実装する。ここで：
q=T_MANGLE_SEED_VALUE_N  XOR  T_MANGLE_SEED_VALUE_M
template <class T, int x=0, int z=0>
struct V
{
T  operator()(Tx,Tv,Tz)
{
Ty=x^z;
return(T)(v^y);
}
T  operator()(Tv)
{
Ty=x^z
return(T)(v^y);
}
};
int main(int argc, char* argv[])
{
int  z=T_MANGLE_SEED_VALUE_M;
int  y=T_MANGLE_SEED_VALUE_N;
if(12345678==argc)
{
//これが起こることはない
z=T_MANGLE_SEED_VALUE_O;
z=T_MANGLE_SEED_VALUE_P;
}
int  a=V<int,T_MANGLE_SEED_VALUE_N,T_MANGLE_SEED_VALUE_M>
()(argc);
//ここでa==Vqである
int b=a;
return=V<int>()(y,b,z);
}
生成されたコードを見ると、qの成分（NおよびM）が当該値を攪乱するのに使われ、次いで実行時にqを使って攪乱を解除しているのがわかる。これは、暗号化／復号サイクルにおいて単一の値が使われていないという意味で非対称である。
【００７２】
上記から、本方法がソースコード中の変数をオブジェクトコード中で一連の演算として提示させることが明らかであろう。これはオブジェクトコードに複雑さおよび不明瞭さを加え、クラッカーに対するプロテクトを提供する。
【００７３】
さらに、関連付けられた鍵を選択することによって選択できる異なる関数を用意することにより、同じ関数を実行するために異なるオブジェクトコードが生成されることが可能になる。それにより、あるタイトルのゲームは第二のタイトルと同じフォーマットで提供できるが、それでいて各タイトルが異なるオブジェクトコードとなるようにできる。したがって、もしクラッカーが第一のタイトルのコードをクラックしおおせたとしても、それは第二のタイトルのクラックの助けにはならないのである。
【実施例１】
【００７４】
図２は、セキュリティで保護されたゲームをCD-ROM３０に記録する方法を概略的に示している。これに関し、上述したように、本発明は光ディスク上に保存されているゲームプログラムに関してのみ例示される。本発明はいかなる媒体上に保存されているいかなるソフトウェアをセキュリティで保護するために使うこともできる。よって、たとえば本発明は、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリに保存された実行可能プログラムをセキュリティで保護するために使うこともできる。本発明は、たとえば正規ユーザーだけがセキュリティで保護された実行可能プログラムにアクセスできることを保証したり、および／またはセキュリティで保護された実行可能プログラムにユーザーがアクセスする度合いもしくは仕方を管理したりするための著作権管理ソフトウェアを使って実行可能プログラムをダウンロードすることが望まれる場合にとりわけ有用である。
【００７５】
図２に示した実施形態では、ゲームはゲームプログラムgame.exe２０を含んでおり、これが適切なセキュリティソフトウェアを用いてCD-ROM３０に記録される。これに関し、ソフトウェアツールキット２２がゲームプログラム２０をプロテクトするために必要なプログラムを提供する。ツールキット２２は、ゲームプログラム２０とともにラッピングされる（wrapped）適切なセキュリティプログラム２８にアクセスする作用をするセキュリティ適用プログラムSECPREP.DLL２４を含んでいる。これに関し、セキュリティ適用プログラム２４は、メモリ２６に適切に保存されている、いくつかあるセキュリティプログラムSECSERV.DLL２８のうちの一つにアクセスする。個々のセキュリティプログラム２８はそれぞれ鍵３２と関連付けられており、セキュリティ適用プログラム２４は鍵３２の一つをランダムに選んでそれにより対応するセキュリティプログラム２８が選択される。その後、選択されたセキュリティプログラム２８はゲームプログラム２０とともに、またその他任意のセキュリティ方策とともにパッケージ化されて（packaged）実行可能プログラムファイル３４が形成され、このファイルが次いで保存される。すなわち、今の例では適切なエンコード手段（図示せず）によってCD-ROM３０に記録されるのである。
【００７６】
図２に示した実施形態では、ツールキット２２はゲームプログラム２０をセキュリティプログラム２８とともにパッケージ化したのみならず、認証プログラム３６をも提供している。
【００７７】
セキュリティプログラム２８は、ゲームプログラム２０および認証プログラム３６のためのラッパー（wrapper）として作用する。よって、ユーザーがCD-ROM３０をコンピュータのドライブに入れることにより実行可能アプリケーションファイル３４がアクセスされたとき、セキュリティプログラム２８は認証プログラム３６の実行を要求する。たとえば、既知の仕方で、認証プログラム３６はディスク３０上の既知のエラーを探してもよい。そうしたエラーは上述した製造工程の間にディスク３０上に載るものである。期待されるエラーがみつかればディスクは純正だと宣言され、その場合、セキュリティプログラム２８は次いでゲームプログラム２０のロードおよび実行を可能にする。これに関し、セキュリティプログラム２８の実行中は常に、それが生成するオブジェクトコードは上述したように難読化されることになり、クラッカーがセキュリティプログラム２８を同定して除去することは困難になる。これでクラッカーがゲームプログラム２０にアクセスすることが防止される。
【００７８】
セキュリティプログラム２８によって提供されるセキュリティはたとえば、ゲームプログラムからたとえば３８で示したようなプログラミングブロックを取ってそれをセキュリティプログラム２８の内部に組み込むことによって向上させることができる。ゲームプログラム２０内ではブロック３８へのポインタ４０が与えられる。この技法により、ゲームプログラム自身の一部も、セキュリティプログラム２８の内部でブロック３８を実行するときに生成される難読化されたコードによってクラッカーから隠される。ゲームプログラム２０からのセキュリティプログラム２８の内部へのブロック３８の移動は、実行可能プログラムファイル３４の生成中にソフトウェアツールキット２２によって執り行われる。
【００７９】
図２で説明され、解説されたことの以外のセキュリティ方策をソフトウェアツールキット２２によって組み込んでもよいことは理解されるであろう。たとえば、ゲームプログラム２０は暗号化されてもよい。
【００８０】
コードの難読化のための上述した技法はソフトウェアをセキュリティで保護するために単独で使ってもよいし、あるいは以下のエミュレーション技法とともに使ってもよい。エミュレーション技法はこれから図３を参照しつつ記載し、解説するが、これは他のセキュリティ技法とともに使ってもよいし、単独で使ってもよい。
【実施例２】
【００８１】
C++言語などのプログラムはコンパイルされてプロセッサに適用されるための命令の組を生成することは理解されるであろう。クラッカーがゲームなどの命令の組に平文でのアクセスを得られれば、ゲームのリバースエンジニアリングが実行できる。図３は命令をクラッカーから隠すために使うことのできるエミュレーション技法を示している。
【００８２】
図３に示されているように、ソースコード２はコンパイラ５０に適用されて５２で示される命令の組を生成する。しかし、コンパイラ５０はコンパイルされた命令を暗号化するよう構成されており、またより通常のネイティブ命令ではなく簡略化命令セット形式で命令を提供するようにも構成されている。
【００８３】
図３に図示したように、コンパイラ５０は、図１との関連で上述したようにいくつかの命令の組のうちの一つを選択的に５２で提供できるテンプレート５８のライブラリ５４を備えている。これに関し、コンパイラ５０はいくつかの鍵５６のうちの一つを選択するよう構成されており、それにより対応するテンプレート５８が命令の組５２の生成において使うために選択される。仮想プロセッサすなわちエミュレータ６０も、選択された鍵を使ってエミュレータコンパイラ６４によりソフトウェア的に構成されている。これにより、エミュレータ６０が復号の必要なしに命令の組５２に含まれる命令に基づいて動作することが可能になる。
【００８４】
例として、鍵０を用いたテンプレート５８の使用によって得られる命令の組は各変数値に値+3を加えることによって暗号化されるとする。それに従いエミュレータ６０は各変数を3減らさなければならないことを理解でき、よって命令を実行することができる。したがって、たとえばMOV命令が0でエミュレータが変数3を受け取った場合、エミュレータはこの命令セットについては3がMOVに設定されていることを理解し、しかるべく動作することができる。したがって、これにより、エミュレータ６０には暗号化されない平文の命令セットが入力されることはない。
【００８５】
さらに、エミュレータ６０は各純正命令について長大な一連の命令を生成し、この長大な一連の命令をCPU６２に適用するよう構成される。たとえば、CPU６２に3を加えるよう命令する代わりに、エミュレータ６０は次のような一連の命令を発してもよい。
【００８６】
10を足す
7を引く
1で割る
1をかける
これはCPU６２に供給される命令の複雑さを増すことになり、この複雑さはクラッカーに対してコードを難読化する作用もある。
【００８７】
上述したようにエミュレータ６０を使うことは処理に必要とされる実時間を増すことになり、したがってゲームプログラムをCPU６２上でこのようにして実行することが適切でないことは理解されるであろう。その代わりにプログラムの一部のみがこの技法を使ってクラッカーに対して隠蔽されることになる。たとえば、この技法が先述した技法とともに用いられる場合、ゲームプログラム２０からのブロック３８を含んでいる可能性のあるセキュリティプログラム２８をエミュレーション技法の対象とすることができる。
【００８８】
上記から、もしもコンパイル中に異なる鍵５６が選ばれれば、命令の組５２は変化し、エミュレータ６０も変化することは理解されるであろう。異なるディスクで異なる命令の組およびエミュレータを使うこの機能により、同じメーカーによって発売される異なるディスクが異なるセキュリティをもつことを可能になるので、さらなるレベルのセキュリティが加わる。命令の組５２が暗号化されたままであることも、これによりクラッカーに利用される可能性のある平文の命令の組を手にはいらなくすることができ、重要である。
【００８９】
記載され、解説された本発明に対して、付属の特許請求の範囲内で変更および修正が可能であることは理解されることであろう。
【図面の簡単な説明】
【００９０】
【図１】高水準ソースコードの機械語への翻訳を概略的に示し、コンパイラによるテンプレートの使用を解説する図である。
【図２】セキュリティで保護された実行可能プログラムをもつ光ディスク生産を概略的に解説する図である。
【図３】本発明のプロセッサを制御する方法における仮想プロセッサの使用を解説する図である。
【図１】
2007503038.tif 000003
【図２】
2007503038.tif 000004
【図３】
2007503038.tif 000005
【手続補正書】
【提出日】平成18年9月27日(2006.9.27)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
難読化されたオブジェクトコードを生成する方法であって、ソースコード中の変数を該変数の選択された関数で置き換え、当該ソースコードをコンパイルしてオブジェクトコードを生成するステップを有しており、前記選択された関数がコンパイルされたオブジェクトコードにおいて前記変数が一連の演算として提示されるようにすることを特徴とする方法。
【請求項２】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項１記載の方法。
【請求項３】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項１または２記載の方法。
【請求項４】
前記選択された関数がソースコード中のテンプレートにおいて定義されていることを特徴とする、請求項１ないし３のうちいずれか一項記載の方法。
【請求項５】
前記ソースコードのテンプレートが複数の関数を定義し、その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されており、当該方法がさらに、その関数のうちからソースコード中の前記変数の代替とすべき一つを選択することを有することを特徴とする、請求項４記載の方法。
【請求項６】
前記テンプレート中の関数の一つ一つに異なる鍵が関連付けられており、当該方法がさらに、ソースコード中の変数を前記テンプレートで置き換え、前記テンプレート中の関数の一つをその関数に関連付けられた鍵を選択することによって選択することをさらに有することを特徴とする、請求項５記載の方法。
【請求項７】
前記ソースコードが保存された配列およびテンプレートを含んでおり、該配列およびテンプレートをナビゲートするためにポインタを利用することを特徴とする、請求項１ないし６のうちいずれか一項記載の方法。
【請求項８】
前記ソースコードが標準的なプログラミング言語であることを特徴とする、請求項１ないし８のうちいずれか一項記載の方法。
【請求項９】
前記ソースコードがC++であることを特徴とする、請求項８記載の方法。
【請求項１０】
ソースコードからコンパイルされた、オブジェクトコードの形の実行可能プログラムであって、前記ソースコード中の変数がコンパイルされるとオブジェクトコードにおいては一連の演算として提示され、それによりオブジェクトコードが難読化されることを特徴とする実行可能プロラム。
【請求項１１】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項１０記載の実行可能プロラム。
【請求項１２】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項１０または１１記載の実行可能プロラム。
【請求項１３】
前記一連の演算が、ソースコード中の前記変数を、コンパイルされたオブジェクトコードにおいて前記変数を一連の演算として提示させるよう構成されたある選択された関数で置き換えることによって生成されたものであることを特徴とする、請求項１０ないし１２のうちいずれか一項記載の実行可能プロラム。
【請求項１４】
前記選択された関数がソースコードのテンプレートにおいて定義されたものであることを特徴とする、請求項１３記載の実行可能プロラム。
【請求項１５】
前記ソースコードのテンプレートが複数の関数を定義しており、その関数のそれぞれはコンパイルされると前記変数を一連の演算として提示するよう構成されており、その関数のうちからソースコード中の前記変数の代替とすべき一つが選択されたことを特徴とする、請求項１４記載の実行可能プロラム。
【請求項１６】
セキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法であって、実行可能プログラムを、該実行可能プログラムへのアクセスを管理するよう構成されたセキュリティプログラムに関連付けることによってセキュリティで保護し、前記セキュリティで保護された実行可能プログラムを前記記憶媒体に記録するステップを有しており、当該方法がさらに、前記セキュリティプログラムのオブジェクトコードを難読化し、ここで前記セキュリティプログラムのオブジェクトコードの難読化はソースコード中の変数を該変数のある選択された関数で置き換えることによって行われるものであり、前記ソースコードをコンパイルしてオブジェクトコードを生成することを有しており、前記選択された関数が前記変数をコンパイルされたオブジェクトコードにおいて一連の演算として提示されるようにすることを特徴とする方法。
【請求項１７】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項１６記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項１８】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項１６または１７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項１９】
前記実行可能プログラムおよび前記セキュリティプログラムがオブジェクトコードレベルで関連付けられていることを特徴とする、請求項１６ないし１８のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２０】
前記セキュリティプログラムが前記実行可能プログラムを暗号化するよう構成されていることを特徴とする、請求項１６ないし１９のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２１】
前記実行可能プログラムのいくつかのブロックを該実行可能プログラムから取り出し、前記セキュリティプログラム内に再配置することを特徴とする、請求項１６ないし２０のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２２】
前記セキュリティプログラムが認証プログラムの実行を要求するよう構成されていることを特徴とする、請求項１６ないし２１のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２３】
前記セキュリティプログラムのソースコード中の前記選択された関数がソースコードのテンプレートにおいて定義されていることを特徴とする、請求項１６ないし２２のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２４】
前記セキュリティプログラムのソースコードの前記テンプレートが複数の関数を定義し、それらの関数はコンパイルされると前記変数を一連の演算として提示するよう構成されており、当該方法がさらに、その関数のうちからソースコード中の前記変数の代替とすべき一つを選択することを有することを特徴とする、請求項２３記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２５】
テンプレート中の関数の一つ一つに異なる鍵が関連付けられており、当該方法がさらに、ソースコード中の変数をテンプレートで置き換え、テンプレート中の関数の一つをその関数に関連付けられた鍵を選択することによって選択することをさらに有することを特徴とする、請求項２４記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２６】
前記セキュリティプログラムのソースコードが保存された配列およびテンプレートを含んでおり、該配列およびテンプレートをナビゲートするためにポインタを利用することを特徴とする、請求項１６ないし２５のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２７】
前記セキュリティプログラムのソースコードが標準的なプログラミング言語であることを特徴とする、請求項１６ないし２６のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２８】
前記ソースコードがC++であることを特徴とする、請求項２７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項２９】
前記セキュリティで保護された実行可能プログラムが記録される前記記憶媒体が光ディスクであることを特徴とする、請求項１６ないし２８記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項３０】
前記セキュリティで保護された実行可能プログラムが前記光ディスクにレーザービームエンコードによって記録されることを特徴とする、請求項２９記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項３１】
前記セキュリティで保護された実行可能プログラムが記録される前記記憶媒体が、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリであることを特徴とする、請求項１６ないし２８のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体を製造する方法。
【請求項３２】
実行可能プログラムがそれに関連付けられた、該実行可能プログラムへのアクセスを管理するよう構成されたセキュリティプログラムをもつことによってセキュリティで保護されており、前記セキュリティプログラムは難読化されたオブジェクトコードの形であり、前記セキュリティプログラムはソースコードからコンパイルされたものであり、前記セキュリティプログラムの前記ソースコード中の変数がコンパイルされてオブジェクトコード中で一連の演算として提示され、それによって前記オブジェクトコードが難読化されている、ことを特徴とする、セキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３３】
前記変数を提示する一連の演算が算術演算および／または論理演算からなり、該一連の演算が当該オブジェクトコードの実行時に前記変数を与えるよう構成されることを特徴とする、請求項３２記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３４】
前記変数を提示する一連の演算が、当該オブジェクトコードの実行時に前記変数を与えるよう構成されている補数演算を含むことを特徴とする、請求項３２または３３記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３５】
前記一連の演算が、ソースコード中の前記変数を、コンパイルされたオブジェクトコードにおいて前記変数を一連の演算として提示させるよう構成されたある選択された関数で置き換えることによって生成されたものであることを特徴とする、請求項３２ないし３４のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３６】
前記選択された関数がソースコードのテンプレートにおいて定義されていることを特徴とする、請求項３５記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３７】
前記ソースコードの前記テンプレートが複数の関数を定義し、その関数がそれぞれコンパイルされると前記変数を一連の演算として提示するよう構成されており、前記関数のうちからソースコード中の前記変数の代替とすべき一つが選択されていることを特徴とする、請求項３６記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３８】
前記実行可能プログラムおよび前記セキュリティプログラムがオブジェクトコードレベルで関連付けられていることを特徴とする、請求項３２ないし３７のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項３９】
前記実行可能プログラムが当該記憶媒体上で暗号化されており、前記関連付けられたセキュリティプログラムが前記実行可能プログラムの復号を可能にすることを特徴とする、請求項３２ないし３８のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４０】
前記実行可能プログラムのいくつかのブロックが前記セキュリティプログラム内に再配置されることを特徴とする、請求項３２ないし３９のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４１】
前記セキュリティプログラムが認証プログラムの実行を要求するよう構成されていることを特徴とする、請求項３２ないし４０のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４２】
当該記憶媒体が前記実行可能プログラムおよび前記セキュリティプログラムがその上にエンコードされる光ディスクであることを特徴とする、請求項３２ないし４１のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４３】
前記光ディスクがCD、CD-ROMまたはDVDであることを特徴とする、請求項４２記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４４】
当該記憶媒体が、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリであり、その上に前記実行可能プログラムおよび前記セキュリティプログラムが保存されることを特徴とする、請求項３２ないし４１のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４５】
前記実行可能プログラムがゲームプログラムおよび／またはビデオプログラムおよび／またはオーディオプログラムおよび／またはその他のソフトウェアであることを特徴とする、請求項３２ないし４４のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項４６】
プログラムを走らせるためにプロセッサを制御する方法であって、
前記プログラムからの命令を、当該プロセッサが反応しない簡略化命令セット形式に翻訳し、
前記翻訳された命令が該簡略化命令セット形式に反応する仮想プロセッサに適用されるようにし、
前記仮想プロセッサをして、前記の適用された命令を走らせて当該プロセッサが反応する一連の単純な命令を当該プロセッサに適用させる、
ステップを有することを特徴とする方法。
【請求項４７】
前記仮想プロセッサに適用されるべき前記翻訳された命令を暗号化すること、および前記仮想プロセッサをして該暗号化された命令を復号することなくそれに反応できるようにすることをさらに有することを特徴とする、請求項４６記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項４８】
命令を翻訳および暗号化するためのテンプレートを利用することをさらに有し、ある選択されたテンプレートが当該プログラムからの各命令について簡略化命令セット形式での一連の命令を提供することを特徴とする、請求項４６または４７記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項４９】
前記テンプレートが当該プログラム中のある命令について簡略化命令セット形式での複数の命令系列を定義し、当該方法がさらに、前記複数の命令の系列のうち前記命令の翻訳で使われる一つを選択することを有することを特徴とする、請求項４８記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５０】
前記テンプレート中で、簡略化命令セット形式での複数の命令の系列のそれぞれには異なる鍵が関連付けられており、当該方法がさらに、前記複数の命令の系列の一つと関連付けられた鍵を選択し、該選択された鍵に関連付けられている前記複数の命令の系列のうちの一つに当該プログラム中の命令を翻訳することを有することを特徴とする、請求項４９記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５１】
前記仮想プロセッサが、前記複数の命令の系列のうちの前記の一つに反応できるようにされていることを特徴とする、請求項５０記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５２】
前記プログラムからの所定の関数またはルーチンを実行する命令だけが翻訳されて前記仮想プロセッサに適用されることを特徴とする、請求項４６ないし５１のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５３】
前記プログラムからの前記の命令がオブジェクトコードの形であるか、あるいはオブジェクトコードから変換されたものであり、該オブジェクトコードが請求項１ないし９のうちいずれか一項記載の方法によって難読化されていることを特徴とする、請求項４６ないし５１のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５４】
前記命令が、請求項１０ないし１５のうちいずれか一項記載のオブジェクトコードの形の実行可能プログラムからのものであることを特徴とする、請求項４６ないし５３のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５５】
前記命令が、請求項１６ないし３１のうちいずれか一項記載の方法によって生産された記憶媒体上のセキュリティで保護された実行可能プログラムからのものであることを特徴とする、請求項４６ないし５２のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５６】
前記命令が、請求項３２ないし４５のうちいずれか一項記載の記憶媒体上のセキュリティで保護された実行可能プログラムであることを特徴とする、請求項４６ないし５４のうちいずれか一項記載のプログラムを走らせるためにプロセッサを制御する方法。
【請求項５７】
実行可能プログラムがそれに関連付けられたセキュリティプログラムおよびエミュレーションプログラムをもつことによってセキュリティで保護され、前記セキュリティプログラムは前記実行可能プログラムへのアクセスを管理するよう構成されており、前記エミュレーションプログラムは前記実行可能プログラムの所定の関数またはルーチンを該エミュレーションプログラムによって提供される仮想プロセッサ上で実行されるようにするものであり、該エミュレーションプログラムが前記実行可能プログラムからの命令を簡略化命令セット形式に翻訳し、該翻訳された命令が仮想プロセッサに適用されるようにし、該仮想プロセッサに適用された命令を実行してプロセッサに適用するための一連の単純な命令を出力させるよう構成されていることを特徴とする、セキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項５８】
当該記憶媒体が前記実行可能プログラム、前記セキュリティプログラムおよび前記エミュレーションプログラムがその上にエンコードされる光ディスクであることを特徴とする、請求項５７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項５９】
前記光ディスクがCD、CD-ROMまたはDVDであることを特徴とする、請求項５７または５８記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項６０】
当該記憶媒体が、サーバー、コンピュータおよび／またはその他の処理手段の内部にある、あるいはそれに付随するメモリであり、その上に前記セキュリティプログラムおよび前記エミュレーションプログラムが保存されることを特徴とする、請求項５７記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【請求項６１】
前記実行可能プログラムがゲームプログラムおよび／またはビデオプログラムおよび／またはオーディオプログラムおよび／またはその他のソフトウェアであることを特徴とする、請求項５７ないし６０のうちいずれか一項記載のセキュリティで保護された実行可能プログラムを有する記憶媒体。
【国際調査報告】
2007503038.tif 000006
2007503038.tif 000007
2007503038.tif 000008
2007503038.tif 000009
2007503038.tif 000010