(57)【要約】【課題】プログラミングモジュール内でセキュアな変数を自動的に提供するための、方法、装置、および製品を提供すること。【解決手段】このシステムは、ＯＴＬ選択モジュールと、ＯＴＬ代入モジュールと、ＯＴＬタイプライブラリデータベースと、コンパイラモジュールと、実行可能処理モジュールを生み出すためのリンカモジュールとを備える。ＯＴＬ選択モジュールは、宣言されたセキュアな変数それぞれにつき、可能な変数難読化関数のうちの１つをランダムに選択または生成する。ＯＴＬ代入モジュールは、宣言されたセキュアな変数へのあらゆる参照につき、選択された変数難読化関数の別個のインスタンスを代入する。ＯＴＬタイプライブラリデータベースは、ＯＴＬ選択モジュールから照会を受け取り、データベースに照会して、宣言されたセキュアな変数に対応する変数型に適用できる可能な変数難読化関数を識別する。【選択図】　図７
2004038966.tif 000002
【特許請求の範囲】
【請求項１】
セキュアで不明瞭なタイプライブラリを設けて、プログラミングモジュール内でセキュアな変数を自動的に提供するためのシステムであって、
宣言されたセキュアな変数それぞれにつき、可能な変数難読化関数のうちの１つをランダムに生成するＯＴＬ選択モジュールと、
前記宣言されたセキュアな変数へのあらゆる参照につき、前記選択された変数難読化関数の別個のインスタンスを代入するＯＴＬ代入モジュールと、
前記ＯＴＬ選択モジュールから照会を受け取り、データベースに照会して、前記宣言されたセキュアな変数に対応する変数型に適用できる可能な変数難読化関数を識別するＯＴＬタイプライブラリデータベースと、
コンパイラモジュールと、
実行可能処理モジュールを生み出すためのリンカモジュールと
を備えたことを特徴とするシステム。
【請求項２】
追加の難読化演算を加えてデータ−メモリアクセスパターンを保護するための追加の難読化処理モジュールをさらに備えることを特徴とする請求項１に記載のシステム。
【請求項３】
前記ＯＴＬ代入モジュールは、前記代入される変数難読化関数を関連する命令で最適化して、前記セキュアな変数の内容をさらに難読化することを特徴とする請求項２に記載のシステム。
【請求項４】
前記変数型宣言は、セキュアな整数、セキュアな浮動小数点変数、セキュアなブール変数、セキュアな文字、セキュアなストリング、セキュアな構造体、およびその他すべてのデータ型のセキュアなバージョンを含むことを特徴とする請求項１に記載のシステム。
【請求項５】
前記ＯＴＬ選択モジュールは、事前定義済みの関数ライブラリから変数難読化関数をランダムに選択することによって、前記可能な変数難読化関数のうちの１つをランダムに生成することを特徴とする請求項１に記載のシステム。
【請求項６】
前記ＯＴＬ選択モジュールは、事前定義済みの関数演算子ライブラリを使用して変数難読化関数をランダムに生成することによって、前記可能な変数難読化関数のうちの１つをランダムに生成することを特徴とする請求項１に記載のシステム。
【請求項７】
前記ＯＴＬ選択モジュール、前記ＯＴＬ代入モジュール、および前記ＯＴＬタイプライブラリデータベースはプリプロセッサモジュール中に位置することを特徴とする請求項５に記載のシステム。
【請求項８】
前記選択された変数難読化関数の別個のインスタンスがそれぞれ１つまたは複数のパラメータを利用することを特徴とする請求項１に記載のシステム。
【請求項９】
前記１つまたは複数のパラメータは、ランダムに生成された値を含むことを特徴とする請求項８に記載のシステム。
【請求項１０】
セキュアで不明瞭なタイプライブラリを設けて、プログラミングモジュール内でセキュアな変数を自動的に提供するための方法であって、
変数型宣言を含むセキュア変数宣言ステートメントをソースコードモジュール内で識別するステップと、
データベースに照会して、前記セキュア変数宣言ステートメントに対応する変数型に適用できる可能な変数難読化関数を識別するステップと、
前記データベース照会に応答して返された前記可能な変数難読化関数のうちの１つをランダムに生成するステップと、
前記セキュア変数宣言に対応する前記選択された変数難読化関数の別個のインスタンスを生み出すステップと、
前記宣言されたセキュアな変数へのあらゆる参照につき、前記選択されたセキュア変数難読化関数の前記別個のインスタンスを代入するステップと
を含むことを特徴とする方法。
【請求項１１】
前記代入される変数難読化関数を関連する命令で最適化して、前記セキュアな変数の内容をさらに難読化するステップをさらに含むことを特徴とする請求項１０に記載の方法。
【請求項１２】
前記ソースコードをコンパイルするステップと、
前記ソースコードを追加の処理モジュールでリンクするステップと、
追加の難読化処理を適用してデータ−メモリアクセスパターンを保護するステップとをさらに含むことを特徴とする請求項１１に記載の方法。
【請求項１３】
前記セキュアな変数を隠蔽して攻撃者の注意を機密データおよびコードからそらすように設計された、「無用な」コードだがしっかりと統合され得るコードを生成および挿入するステップをさらに含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
前記変数型宣言は、セキュアな整数、セキュアな浮動小数点変数、セキュアなブール変数、セキュアな文字、セキュアなストリング、セキュアな構造体、およびその他すべてのデータ型のセキュアなバージョンを含むことを特徴とする請求項１０に記載の方法。
【請求項１５】
変数難読化関数の前記別個のインスタンスは、プリプロセッサモジュール中で選択され、生み出され、前記ソースコードに代入されることを特徴とする請求項１０に記載の方法。
【請求項１６】
前記可能な変数難読化関数のうちの１つをランダムに生成するステップは、事前定義済みの関数ライブラリから変数難読化関数をランダムに選択するステップを含むことを特徴とする請求項１０に記載の方法。
【請求項１７】
前記可能な変数難読化関数のうちの１つをランダムに生成するステップは、事前定義済みの関数演算子ライブラリを使用して変数難読化関数をランダムに生成するステップを含むことを特徴とする請求項１０に記載の方法。
【請求項１８】
前記セキュアなブール変数は、時間と共に変化するセキュアなブール変数に対応することを特徴とする請求項１４に記載の方法。
【請求項１９】
前記時間と共に変化するセキュアなブール変数を利用して認証関数呼出しが実施されることを特徴とする請求項１８に記載のコンピュータプログラムデータ製品。
【請求項２０】
セキュアで不明瞭なタイプライブラリを設けてプログラミングモジュール内でセキュアな変数を自動的に提供するための方法を実施する命令を符号化した、コンピューティングシステム可読のコンピュータプログラムデータ製品であって、前記方法は、
変数型宣言を含むセキュア変数宣言ステートメントをソースコードモジュール内で識別するステップと、
データベースに照会して、前記セキュア変数宣言ステートメントに対応する変数型に適用できる可能な変数難読化関数を識別するステップと、
前記データベース照会に応答して返された前記可能な変数難読化関数のうちの１つを、実行中にランダムに選択または生成するステップと、
前記セキュア変数宣言に対応する前記選択された変数難読化関数の別個のインスタンスを生み出すステップと、
前記宣言されたセキュアな変数へのあらゆる参照につき、前記選択されたセキュア変数難読化関数の前記別個のインスタンスを代入するステップと
を含むことを特徴とするコンピュータプログラムデータ製品。
【請求項２１】
前記方法はさらに、前記代入される変数難読化関数を関連する命令で最適化して、前記セキュアな変数の内容をさらに難読化するステップをさらに含むことを特徴とする請求項２０に記載のコンピュータプログラムデータ製品。
【請求項２２】
前記方法はさらに、
前記ソースコードをコンパイルするステップと、
前記ソースコードを追加の処理モジュールでリンクするステップと、
追加の難読化処理を適用してデータ−メモリアクセスパターンを保護するステップとをさらに含むことを特徴とする請求項２１に記載のコンピュータプログラムデータ製品。
【請求項２３】
前記変数型宣言は、セキュアな整数、セキュアな浮動小数点変数、セキュアなブール変数、セキュアな文字、セキュアなストリング、セキュアな構造体、およびその他すべてのデータ型のセキュアなバージョンを含むことを特徴とする請求項２０に記載のコンピュータプログラムデータ製品。
【請求項２４】
変数難読化関数の前記別個のインスタンスは、プリプロセッサモジュール中で選択され、生み出され、前記ソースコードに代入されることを特徴とする請求項２０に記載のコンピュータプログラムデータ製品。
【請求項２５】
コンピュータ可読記憶媒体に対応することを特徴とする請求項２０に記載のコンピュータプログラムデータ製品。
【請求項２６】
前記方法はさらに、前記セキュアな変数を隠蔽して攻撃者の注意を機密データおよびコードからそらすように設計された、「無用な」コードだがしっかりと統合され得るコードを生成および挿入するステップをさらに含むことを特徴とする請求項２２に記載のコンピュータプログラムデータ製品。
【請求項２７】
前記セキュアなブール変数は、時間と共に変化するセキュアなブール変数に対応することを特徴とする請求項２１に記載のコンピュータプログラムデータ製品。
【請求項２８】
前記時間と共に変化するセキュアなブール変数を利用して認証関数呼出しが実施されることを特徴とする請求項２７に記載のコンピュータプログラムデータ製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、プログラミングモジュール内でセキュアな変数を提供するためのシステム、方法、および製品に関し、より詳細には、セキュアで不明瞭（ｏｐａｑｕｅ）なタイプライブラリを設けてプログラミングモジュール内でセキュアな変数を自動的に提供するためのシステム、方法、および製品に関する。
【背景技術】
【０００２】
初期のＩＢＭのＰＣおよび８ビットマシンの時代からずっと、アプリケーションプログラマとクラッカーは、終わらない闘いをソフトウェア保護の分野で続けてきた。「クラッキングされない」プログラムを生み出すことは、理論上および実際上の未解決問題にとどまっており、特に、自分の仕事に多大な時間および労力を費やす熟練した才能あるリバースエンジニアに対してはそうである。しかし、所与のチャネルにおける海賊行為のモデルに応じて、様々な難読化（ｏｂｆｕｓｃａｔｉｏｎ）技法および改ざん防止技法が有用である可能性があり、それにより、思いつきの海賊行為を抑止することができ、またクラッカーが実行時にセキュリティチェックをバイパスしたり、ウイルスを添付したり、コードやデータにパッチを当てたり、一般にソフトウェア挙動を改変したりするのを遅らせることができる。
【０００３】
開発者はしばしば、ソフトウェアセキュリティを、アプリケーションが完成した後で容易に「プラグイン」できる独立した機能として扱ってきた。実際、実行可能ファイルを暗号化したりアンチハッキングコードの層を追加したりするための多数の自動「プロテクタ」または「ラッパ」が利用可能である。残念ながら、このようなプラグイン解決法は一般に、数日以内さらには数時間以内に行われるハッキングに対処するために継続的にアップグレードおよび改良が重ねられるにもかかわらず、非常に破られやすく効果が小さいことが証明されている。いくつかの理論モデルでは、プログラムを自動的に難読化するのは不可能である。このことはすべて、セキュアなソフトウェアを生み出したいと思うプログラマはより深く保護に関与する必要があることをいくらか証明している。
【０００４】
プログラマは、保護プロセスに最初から関与する必要がある。プログラマは、どの変数および変数計算に保護が必要かをフラグで示し、可能なら常に、求められる保護の程度を何らかの方式で示す必要がある。その場合コンパイラは、それが生成するいくつかの変数でこれらのフラグ付き部分をプールし、共通のデータ型および演算を難読化して検証することができる。この目的の１つは、コードの実行中に攻撃者が多大な時間にわたりコードの多くのローカルセクションにまたがって観察しない限り、データ型にアクセスしても情報が漏洩することがほとんどないようにすることである。適切な情報を持たずに変数を改ざんすれば、整合しないか間違ったデータまたは結果を得ることになる。ユーザはまた、暗号チェックサムに似たランダム化チェックサムが変数（例えばリターンアドレス）に付加される場合に、改ざんされたことがわかるように変数にフラグを付すこともできる。これにより、改ざんされた確率が高い場合には改ざんが検出される。ＯＴＬは、保護ツールを提供すると共に、セキュリティのクリティカルなコードにプログラマが特別な注意を払うようにさせる。さらにＯＴＬは、「無用な」データおよびコードを挿入して、重大なデータを隠蔽すると共に、クラッカーの注意を機密データおよびコードからそらすこともできる。このような「無用な」データおよびコードは、ＯＴＬ保護される部分を含めたアプリケーションの他の部分と密に交互配置することができる。セキュリティを最大限にするために、ＯＴＬは、忘却（ｏｂｌｉｖｉｏｕｓ）ハッシング、コード保全性チェック、区分的コード暗号化、アンチデバッギングやその他、我々が実現した他の技法と組み合わせることができる。
【０００５】
ソフトウェア難読化は、ソフトウェアベンダがその製品に対して不法にリバースエンジニアリングを試みられるのを防止するために、広く使用されている方法である。過去の取り組みは、主にコードの難読化に焦点を当てており、データは大部分が平文のままであった。クリティカルなデータを秘匿および保護するのに利用可能なツールは、常に暗号化解除−使用−暗号化のパラダイムに従い、一般に、開発者がソフトウェアを記述した後で手動または準自動で使用する。以下のサンプル１の例に、このようなシステムを使用した例を示す。これは、無料試用期間を管理するコードを示している。このコードは、呼び出される度にグローバル変数ｉＴｉｍｅＬｅｆｔをチェックする。この値が０の場合は、コードはユーザにソフトウェア登録を行うよう求める。
【０００６】
2004038966.tif 000003
【０００７】
サンプル１　無料試用期間を管理するための単純なサンプルコード
サンプル２に、典型的な暗号化解除−使用−暗号化の方法を適用することからくる変更を示す。まず、キー変数ｉＴｉｍｅＬｅｆｔを、その暗号化された（および展開された）形態で６４ビット整数として記憶する。マクロを使用して、この６４ビットデータを３２ビットの平文に暗号化解除する。次いで、平文タイムカウンタをチェックして、平文が再暗号化され記憶されてしまう前にカウンタをデクリメントする。
【０００８】
2004038966.tif 000004
【０００９】
サンプル２　従来の暗号化解除−使用−暗号化の手法
暗号化解除−使用−暗号化の手法は、２つの弱点を有する。第１に、保護される変数が暗号化解除段階と暗号化段階の間に平文で現れる。攻撃者は、適切な区切り点を設定してレジスタ内容をチェックすることにより、プログラムが何をしているかを発見することができる。ＤＲＭシステムは何らかの形態のアンチデバッギングを採用している場合が多いものの、このような手段を破ることは従来さほど難しくない。また、強力なデバッガ、シミュレータ、および回路内エミュレータによって、システム全体が攻撃者に自由に使用できるようになる可能性もある。
【００１０】
第２に、データセキュリティは後から補足として加えられる傾向があり、開発者は、マクロまたはライブラリ関数呼出しを明示的に挿入する。セキュアなデータへのアクセスが常に暗号化解除マクロと暗号化マクロで挟まれるという保証はない。実際、開発者がセキュアなデータを操作する前に暗号化解除マクロを付け忘れたためにバグが発生することもあった。暗号化解除−使用−暗号化の処理は、その手動的な性質により、プログラム中のわずかなキー変数だけにしか適用されない。
【考案の開示】
【発明が解決しようとする課題】
【００１１】
以下の基準を満たすことのできる、データ秘匿および保護のための体系化された手法が必要とされている。
【００１２】
開発者が容易に採用して効率的に利用することができるようにソフトウェアの開発サイクル中にソフトウェアに注釈を付すための、非侵入的な方法。指示された保護をサポートする、基礎をなすメカニズムおよびアルゴリズムは、モジュラー方式で独立に開発することができ、プログラミング言語ツールおよび変換メカニズム（例えばコンパイラ）として利用可能とすることができる。
【００１３】
保護されるデータオブジェクトが平文の形態で操作されることがめったにない。
【００１４】
あるデータオブジェクトに対するデータ保護が破られても、他の保護されるオブジェクトがクラッキングされることにつながらない。
【００１５】
我々のデータ保護メカニズムをリバースエンジニアリングするための自動化されたツールが存在しない。具体的には、従来型のプログラムフロー解析ツールは、保護されるアプリケーションの所与のコピー中で使用される正確な保護メカニズムの詳細を発見できるべきではない。攻撃者が元のデータオブジェクトを暴くためには、プログラム全体を通して労力を費やして（何度も）作業しなければならない。
【００１６】
忘却（すなわち明白でなく、うまく隠蔽される）データ比較（例えばＡ＝Ｂか？）、および忘却結果返却（例えばＡ＝Ｂの場合は変数Ｃ中で確率的な方式で結果を返す。Ｃが正しいプロパティを有さない場合は、保護される何らかのデータ変数を破損し、誤動作に導くことになる）。
【課題を解決するための手段】
【００１７】
本発明は、プログラミングモジュール内でセキュアな変数を提供するための方法、装置、および製品に関し、より詳細には、セキュアで不明瞭なタイプライブラリを設けて、プログラミングモジュール内でセキュアな変数を自動的に提供するためのシステム、方法、および製品に関する。
【００１８】
本発明の一態様は、セキュアで不明瞭なタイプライブラリを設けて、プログラミングモジュール内でセキュアな変数を自動的に提供するためのシステムである。このシステムは、ＯＴＬ選択モジュールと、ＯＴＬ代入モジュールと、ＯＴＬタイプライブラリデータベースと、コンパイラモジュールと、実行可能処理モジュールを生み出すためのリンカモジュールとを備える。ＯＴＬ選択モジュールは、宣言されたセキュアな変数それぞれにつき、可能な変数難読化関数のうちの１つをランダムに選択または生成する。ＯＴＬ代入モジュールは、宣言されたセキュアな変数へのあらゆる参照につき、選択された変数難読化関数の別個のインスタンスを代入する。ＯＴＬタイプライブラリデータベースは、ＯＴＬ選択モジュールから照会を受け取り、データベースに照会して、宣言されたセキュアな変数に対応する変数型に適用できる可能な変数難読化関数を識別する。
【００１９】
本発明の別の態様は、セキュアで不明瞭なタイプライブラリを設けて、プログラミングモジュール内でセキュアな変数を自動的に提供するための方法および対応するコンピュータデータ製品である。この方法は、ソースコードモジュール内でセキュア変数宣言ステートメントを識別し、データベースに照会してセキュア変数宣言ステートメントに対応する変数型に適用できる可能な変数難読化関数を識別し、データベース照会に応答して返された可能な変数難読化関数のうちの１つをランダムに選択または生成し、セキュア変数宣言に対応する選択された変数難読化関数の別個のインスタンスを生み出し、宣言されたセキュアな変数へのあらゆる参照につき、選択されたセキュア変数関数の別個のインスタンスを代入する。変数宣言ステートメントは、変数難読化関数を選択するのに使用される変数型宣言を含む。
【００２０】
本発明を特徴付ける新規性に関するこれらおよび他の利点および特徴は、本明細書に添付されその一部をなす特許請求の範囲に詳細に示す。ただし、本発明、本発明の利点、および本発明を使用することによって達成される目的がよりよく理解されるように、本発明の一部をさらになす図面および付随する説明を参照されたい。図面および説明では、本発明による装置の具体例を図示および説明する。
【発明を実施するための最良の形態】
【００２１】
本発明は、セキュアで不明瞭なタイプライブラリを設けて、プログラミングモジュール内でセキュアな変数を自動的に提供するためのシステム、方法、および製品に関する。
【００２２】
図１に、本発明の一実施形態による、オペークタイプライブラリ（ＯＴＬ、Ｏｐａｑｕｅ　Ｔｙｐｅ　Ｌｉｂｒａｒｙ）を使用してセキュアな変数を生み出すためのコンピューティングシステムを示す。ＯＴＬは、データ型（例えばＣ＋＋クラス）を集めたライブラリである。各データ型は、保護される各データにつき個別化された実装を生成するようコンパイラに指示する。ＯＴＬは、データセキュリティに対するＭＦＣとして大まかに考えることができる。ＯＴＬを使用することにより、開発者は好都合にも、設計およびコード化の段階中に、どのデータオブジェクトを保護するかを指定する。この一見単純そうなステップは、ソフトウェア設計の最初からデータ保護について考えることに開発者を関与させるという直接的な利点を有する。この単純なステップを、以下のサンプル３の例で示す。これは、試用期間テストコードがどのようにして容易に変換されるかを示しており、開発者は、ｉＴｉｍｅＬｅｆｔについての型宣言をｉｎｔ３２からＳＩｎｔ３２に変更することしか必要としなかった。さらに、ｉＴｉｍｅＬｅｆｔをテストした結果がセキュアなブールｂＴｉｍｅＴｏＲｅｇｉｓｔｅｒに代入される。セキュアなブール変数をＩＦステートメント中で使用することで、分岐を難読化して保護することがコンパイラに指示される。
【００２３】
2004038966.tif 000005
【００２４】
サンプル３　データ保護および不明瞭化のためのＯＴＬ手法
ＯＴＬシステムの大部分は、コンパイラ（またはＯＴＬバックエンド）中にあるか、あるいはそれによって使用される。これをコンパイルパイプラインにプラグインして、中間表現またはバイトコードを変換することができる。この主なタスクは、ＯＴＬオブジェクトについての個別化された表現および実装を生成することである。これは、ＯＴＬオブジェクトの種々に異なって見える各実装を生じるようにパラメータ化することのできるＯＴＬデータ型のメタ実装のライブラリを開発することによって達成される。例えば、準同形、グラフプロパティ、およびベクトル中のビットカウントを使用して、狭い範囲の整数を実装することができる。ＯＴＬバックエンドがメタ実装として準同形を選択した場合、依然として、ランダムなキーを使用して多くの準同形から正確な準同形を選択する自由を有する。一般に、任意のデータ構造に関する整数値プロパティを使用して整数を表すことができる。データ暗号化は準同形を用いて単純に行うことができ、加算および減算はそれぞれ乗算および除算の形態をとる。
【００２５】
ＯＴＬバックエンドにおけるメタ実装により、保護されるオブジェクトを、その難読化された形態で操作することができる。例えば、ＯＴＬ文字ストリングのメタ実装は、単純に対称暗号を用いてストリングを暗号化する。別のＯＴＬストリングをこのストリングに付加するには、この別のストリングの暗号化を任意の順序で１文字ずつ変更するだけでよい。
【００２６】
一実施形態では、ＯＴＬは、加算、乗算、比較の演算を伴うセキュアな３２ビットおよび６４ビット整数と、連結および文字検索の演算を伴うセキュアなストリングと、セキュアなブールとのライブラリを利用する。所与のＯＴＬ変数に対して使用される演算に対するコンパイラ解析は、強力な保護を達成するために極めて重要である。例えば、ＯＴＬ整数を保護するために準同形暗号化をむやみに適用しても、データの真の値を秘匿するには不十分である。乗算、加算、減算、比較の演算子が提供されれば、攻撃者はバイナリ検索を用いてＯＴＬ整数の真の値を知ることができる。ただし、比較演算子が与えられなければ、この攻撃を効率的に実行することは不可能な場合もある。このため、演算子の全セットをサポートするのは、注意が必要であり、種々のタイプの準同形の間で秘かに切り替えることが必要である。したがって、保護される各変数に合わせて難読化および個別化された演算子を生成するために、いくらかの複雑性が必要とされる。例えば、オフセット変数用に加算演算子のみを生成したり、ループカウンタ用にインクリメント演算子および同等性テスト演算子を生成したりするなどである。
【００２７】
ＯＴＬの顕著な特徴は、保護されるデータに対する演算を完全に難読化することである。上の例では、ＳＩｎｔ３２変数ｉＴｉｍｅＬｅｆｔに対する比較演算子（＜＝）およびデクリメント演算子（――）は、難読化された領域で直接に機能する。さらに、比較演算子の結果は難読化されたブール値として表されることになり、この場合、多くの値が真としてマッピングし、他の多くの値が偽としてマッピングする。ブールの表現は、時間およびプログラム状態に伴って変化する可能性があり（時間と共に変化するＯＴＬとも呼ぶ）、したがって、ある時点で真を表す値が後で偽を表す場合もあり、その逆の場合もある。元の平文データの値がプログラムの実行中に現れることは、全くないか、またはめったにない。
【００２８】
時間と共に変化するＯＴＬの重要な適用例の１つは、認証関数呼出しである。このモデルでは、関数にｃａｌｌ―ｂｙ―ａｕｔｈｅｎｔｉｃａｔｉｏｎ（認証によって呼び出される）と注釈を付すことができる。この関数に渡されるパラメータならびに戻り値は、マシンごとおよび時間ごとに異なる、時間と共に変化するＯＴＬを使用して保護される。リモートクライアントマシンに注入されたウイルスも、その時に使用されている符号化スキームを容易に知る方法を持たないことになり、したがって、ＯＴＬ保護された内部関数を使用して損傷を引き起こすのが防止される。
【００２９】
我々のＯＴＬシステムを比較的静的なタイプのインタフェースとコンパイル時インスタンス化段階とに区分化することは、２つの利点をもたらす。第１に、開発者は、安定したインタフェースを使用して作業することができ、アップグレードに追随するのを気にすることが少なくて済む。第２に、ＯＴＬコンパイラコンポーネントは、所与のＯＴＬ型に利用可能なメタ実装をどれでも自由に選択することができ（ランダムなキーを使用して）、また、型のインスタンス化をオブジェクト単位で自由に個別化することができる。
【００３０】
ＯＴＬは、言語レベルの概念である。ＯＴＬはプラットフォームから独立しているが、これに対し、今までの大部分のソフトウェア保護ツールは、特定のマシンプラットフォームに拘束される。既存のソフトウェア保護ツールとは異なり、ＯＴＬ対応プログラム中の型の安全性は、コンパイラによって自動的に保証される。したがって、多くのプログラムバグを回避することができる。（明示的な暗号化解除−暗号化マクロで、暗号化解除−使用−暗号化の規則を施行するためのデータフロー解析ツールを構築することもできることを指摘しておかなければならない。ただしこのようなツールはまだ入手不可能である。）
ＯＴＬは、ＭＦＣおよびＡＴＬのモデル中のリッチクラス階層を介して、あるいは増補されたＣ／Ｃ＋＋／Ｃ＃言語およびコンパイラによって、プログラミング環境にしっかりと統合させることができる。開発者が保護の必要な変数および静的定数を指定することは、比較的単純である。コンパイル時スイッチ（またはマクロ定義）が、ＯＴＬをイネーブル／ディセーブルにする。これにより、同じプログラムを、データを難読化させて、または難読化させずにコンパイルすることができ、アプリケーションコードをデバッグするのがより容易になる。
【００３１】
通常、データ難読化だけでは、ソフトウェアを保護するには不十分である。非常に多くの場合、我々の究極の目標は、侵害者またはエージェントが抜け穴を利用してデータ（例えばリターンアドレス）にアクセスしデータを変更して、システムおよびそのリソースの制御を不正使用することでコンピュータシステムのセキュリティを攻撃しようとすることによる、ソフトウェアの不正改ざんを防止することである。改ざんは、次の２つの形態のうちの一方（または両方）をとることが多い。すなわち、ソフトウェアバイナリにパッチを当ててデータを改変する。データ難読化は、プログラム内のＯＴＬ保護されたデータオブジェクトについての正しい値を攻撃者が推測するのを困難にする。さらに、各ＯＴＬオブジェクトは保全性検証のためのメカニズムを内蔵しており、これにより、攻撃者がデータを改変するのは一層困難になる。攻撃者が攻撃を行うためにどのように所与の変数を正確に変更するかを知っていたとしても、適したキーがなければ、攻撃者はどのようにそれを正確に表現するかがわからない場合がある。
【００３２】
プログラムデータにパッチを当てることができない場合、攻撃者は、バイナリにパッチを当てて、いくらかのクリティカルなコードを実行パスから除去しようとすることがある。現在の命令セットアーキテクチャはバイナリ条件を使用して分岐をトリガするので、ＯＴＬブールオブジェクトは最終的に、マシンコードによって使用される単一ビットに分解されることになる。これは、攻撃者がマシンレジスタを改変してクリティカルなコードセグメントをバイパスするには魅力的な場所になる。コード保全性検証および忘却ハッシングも、このような攻撃を検出して妨げるための効果的な方法ではあるが、我々のＯＴＬシステムは、これらの方法と共に追加の新しい保護方法を提供することができる。例えば、ＯＴＬは、変数が保護されていることがはっきりわからないようにして変数を秘匿するためのよい方法を提供する。もう１つの点として、自動的にいくつかの準同形暗号化スキームを生成して、これらを必要に応じて秘かに切り替えることができる。例えば、比較中にワンタイムパッド暗号化を利用し、同等性をチェックするために追加の加算および乗算に基づく暗号化を利用して、２つの間で切り替えることができる。これを自動的に実施することのできるプログラム解析ツールを使用することができる。いくつかの準同形暗号化システムが暗号文献において考えられてきたが、この場合、必ずしもそのような高度に強力な暗号を必要としない。認証タグ生成メカニズム（可逆的および非可逆的）をどのようにランダム生成するかはわかっており（ランダムな定数を使用して注意深く基本算術演算を構成することにより生成する）、この場合はこれらを使用して、暗号化および認証のメカニズムを自動的に選択することができる。我々の考えの１つは、分岐条件として働くＯＴＬブールオブジェクトをいくつかのオブジェクトに変換し、これらをさらに分岐の両方のターゲット中のコードでチェックすることである。ブール変数および分岐条件を難読化する方法としては、幾何学級数的な数の方法がある。ＯＴＬは、開発者にとってトランスペアレントな、分岐保護のコンパイラ時の個別化を可能にする。
【００３３】
図２を参照すると、本発明の実施形態のための例示的なコンピューティングシステムは、従来型コンピュータシステム２００の形態をとる汎用コンピューティングデバイスを含み、この汎用コンピューティングデバイスは、プロセッサユニット２０２と、システムメモリ２０４と、システムメモリを含めた様々なシステムコンポーネントをプロセッサユニット２０２に結合するシステムバス２０６とを備える。システムバス２０６は、様々なバスアーキテクチャのいずれかを用いたメモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含めた、いくつかのタイプのいずれかとすることができる。システムメモリは、読出し専用メモリ（ＲＯＭ）２０８およびランダムアクセスメモリ（ＲＡＭ）２１０を含む。ＲＯＭ２０８には、コンピュータシステム２００内の要素間における情報の転送を助ける基本ルーチンを含むＢＩＯＳ（ｂａｓｉｃ　ｉｎｐｕｔ／ｏｕｔｐｕｔ　ｓｙｓｔｅｍ）２１２が記憶されている。
【００３４】
コンピュータシステム２００はさらに、ハードディスクに対して読み書きするためのハードディスクドライブ２１２と、取外し可能磁気ディスク２１６に対して読み書きするための磁気ディスクドライブ２１４と、ＣＤ　ＲＯＭ、ＤＶＤ、または他の光学媒体など、取外し可能光ディスク２１９に対して読み書きするための光ディスクドライブ２１８とを備える。ハードディスクドライブ２１２、磁気ディスクドライブ２１４、および光ディスクドライブ２１８は、それぞれハードディスクドライブインタフェース２２０、磁気ディスクドライブインタフェース２２２、および光ドライブインタフェース２２４によってシステムバス２０６に接続される。これらのドライブおよび関連するコンピュータ可読媒体は、コンピュータ可読命令、データ構造、プログラム、およびその他のデータの不揮発性記憶域をコンピュータシステム２００に提供する。
【００３５】
本明細書で説明する例示的な環境は、ハードディスク、取外し可能磁気ディスク２１６、および取外し可能光ディスク２１９を利用しているが、データを記憶できる他のタイプのコンピュータ可読媒体をこの例示的なシステム中で使用することもできる。この例示的な動作環境で使用できるこれら他のタイプのコンピュータ可読媒体の例には、磁気カセット、フラッシュメモリカード、ディジタルビデオディスク、ベルヌーイカートリッジ、ランダムアクセスメモリ（ＲＡＭ）、読出し専用メモリ（ＲＯＭ）が含まれる。
【００３６】
ハードディスク、磁気ディスク２１６、光ディスク２１９、ＲＯＭ２０８、またはＲＡＭ２１０には、いくつかのプログラムモジュールを記憶することができる。これらのプログラムモジュールには、オペレーティングシステム２２６、１つまたは複数のアプリケーションプログラム２２８、その他のプログラムモジュール２３０、およびプログラムデータ２３２が含まれる。ユーザは、キーボード２３４、マウス２３６、その他のポインティングデバイスなどの入力デバイスを介して、コマンドおよび情報をコンピュータシステム２００に入力することができる。その他の入力デバイスの例には、マイクロホン、ジョイスティック、ゲームパッド、衛星受信アンテナ、およびスキャナを含めることができる。ハンドヘルドデバイスおよびタブレットＰＣデバイスの場合は、電子ペン入力デバイスを使用することもできる。これらおよび他の入力デバイスは、システムバス２０６に結合されたシリアルポートインタフェース２４０を介して処理ユニット２０２に接続されることが多い。ただしこれらの入力デバイスは、パラレルポート、ゲームポート、ユニバーサルシリアルバス（ＵＳＢ）など、他のインタフェースで接続することもできる。モニタ２４２または他のタイプの表示デバイスもまた、ビデオアダプタ２４４などのインタフェースを介してシステムバス２０６に接続される。モニタ２４２に加えて、コンピュータシステムは通常、スピーカやプリンタなど他の周辺出力デバイス（図示せず）も備える。
【００３７】
コンピュータシステム２００は、リモートコンピュータ２４６など１つまたは複数のリモートコンピュータへの論理接続を用いて、ネットワーク化された環境で動作することができる。リモートコンピュータ２４６は、コンピュータシステム、サーバ、ルータ、ネットワークＰＣ、ピアデバイス、またはその他の一般的なネットワークノードとすることができ、一般にはコンピュータシステム２００に関して上述した要素の多くまたはすべてを備える。ネットワーク接続は、ローカルエリアネットワーク（ＬＡＮ）２４８およびワイドエリアネットワーク（ＷＡＮ）２５０を含む。このようなネットワーキング環境は、オフィス、企業全体のコンピュータネットワーク、イントラネット、およびインターネットでよくみられる。
【００３８】
コンピュータシステム２００は、ＬＡＮネットワーキング環境で使用される場合は、ネットワークインタフェースまたはアダプタ２５２を介してローカルネットワーク２４８に接続される。ＷＡＮネットワーキング環境で使用される場合は通常、インターネットなどのＷＡＮ２５０を介した通信を確立するためのモデム２５４または他の手段を備える。モデム２５４は内蔵でも外付けでもよく、シリアルポートインタフェース２４０を介してシステムバス２０６に接続される。ネットワーク化された環境では、コンピュータシステム２００に関して示したプログラムモジュールまたはその一部をリモートのメモリ記憶デバイスに記憶することができる。図示のネットワーク接続は例示的であり、コンピュータ間に通信リンクを確立する他の手段を使用することもできることは理解されるであろう。
【００３９】
図３に、本発明の一実施形態による、ＯＴＬ変数を使用したプログラムモジュールのブロック図を示す。以下に説明するいくつかの例では、図３に示すプログラミングモジュールの構造を利用する。この例で、プログラミングモジュール３００は、ヘッダ３０１、変数宣言セクション３０２、メインプロシージャセクション３０３、メソッドおよび関数セクション３０４を含むセクションセットからなる。ヘッダセクション３０１は、ソースコードファイルから実行可能モジュールが生み出された後でプログラミングモジュールのコンパイル時パラメータおよび実行時パラメータを指定するのに必要とされる、必要な宣言およびメタデータを提供するのに使用することができる。変数宣言セクション３０２は、任意の変数、特に本発明によるＯＴＬライブラリを利用することのできるセキュアな変数を宣言することを可能にする。メインプロシージャモジュール３０３は、プログラミングモジュールの実行中に実施される命令のセットを提供する。メインプロシージャモジュール内では、様々な命令３３５〜３３６が、変数宣言セクション中で宣言される変数を参照することができる。最後に、メソッドおよび関数セクション３０４は、プログラマによって定義されるようにメインプロシージャモジュール３０３内の命令が利用することのできる関数およびメソッドの任意の追加セットを提供する。
【００４０】
図４に、本発明の一実施形態による、ＯＴＬ変数呼出しプロシージャを使用したプログラムモジュールのブロック図を示す。前述のように、図４の例は、先の図３で説明したプログラミングモジュールの４つのセクションを含む。この特定の例では、他の任意の変数が宣言されるのに加えて、３つのセキュアな変数のセットが宣言される。これらのセキュアな変数には、２つのセキュアな整数であるＳｅｃｕｒｅ＿Ｉｎｔ＿１　４２２およびＳｅｃｕｒｅ＿Ｉｎｔ＿２　４２３と、セキュアなブール変数であるＳｅｃｕｒｅ＿Ｂｏｏｌｅａｎ４２４が含まれる。このプログラムモジュール３００をＯＴＬ処理することで、これらのセキュアな変数の内容を難読化する関数の別個のインスタンスが生み出されることになる。任意の型の変数、すなわち整数、浮動、文字、ブールなどに対して、可能な関数のセットを、コンパイル時に使用されるライブラリ内に含めることができる。代替として、これらの関数をコンパイル時の間にその場で生成してもよい。
【００４１】
この例では、２つのセキュアな整数それぞれが、関数の別個のインスタンスの生成を引き起こす。これらの関数は、整数を難読化するために全く異なる演算とすることができる。例えば、Ｓｅｃｕｒｅ＿Ｉｎｔ＿１は、変数の実行時の値にランダムなオフセットを加算し、Ｓｅｃｕｒｅ＿Ｉｎｔ＿２は、ランダムなビットパターンとその実行時の値との排他的論理和をとる演算とすることができる。これらのインスタンスの両方に対して、各変数につき別個のランダム値パラメータを選択して、それに含まれるデータをさらに難読化することもできる。
【００４２】
セキュアなブール変数であるＳｅｃｕｒｅ＿Ｂｏｏｌｅａｎ４２４は、全く異なる関数セットを使用して、ハッカーに変数の内容を実行時に発見されないように変数を難読化することができる。添付の特許請求の範囲に述べる本発明の趣旨および範囲を逸脱することなく、様々な変数型で使用するために任意の数の可能な難読化関数があってよいことは、当業者なら理解するであろう。さらに、難読化関数の複雑性は、複雑な難読化プロシージャの増加に伴って課されるであろう処理オーバーヘッドに鑑みてプログラマが特定の変数を難読化するのにどれだけ労力を費やすべきかを決定するのに応じて、変動する場合がある。しかし、セキュアな変数はそれぞれ、独立して扱われ、異なる難読化関数および難読化パラメータを使用するので、難読化された変数の演算をハッカーが解読できないようにすることができる。
【００４３】
メインプロシージャセクション３０３内では、様々な命令４３５〜４３８が、上で宣言されたセキュアな変数４２２〜４２４を参照することになる。一実施形態では、これらの変数は、セキュアな変数を処理してセキュアな状態からメインプロシージャセクション３０３中で使用される平文状態にするためのセキュアな関数４４１〜４４３への参照を利用することができる。後述するようにこの実施形態は、実行時にハッカーによって気付かれる場合のあるセキュアな変数の平文バージョンが不用に生み出されるのを防止することができる。
【００４４】
図５に、本発明の一実施形態により、ＯＴＬプロシージャがプログラミングモジュールに代入される、ＯＴＬ変数を使用したプログラムモジュールに関するブロック図を示す。図４のセキュアな関数を利用するのではなく、本発明の別の実施形態では、セキュアな関数についてのコードをメインプロシージャセクション３０３のインラインコードに直接に代入することになる。例えば、Ｓｅｃｕｒｅ＿Ｉｎｔ＿１　５２２が、命令１　５３１内および命令ｍ　５６１内で参照される。同様に、Ｓｅｃｕｒｅ＿Ｉｎｔ＿２　５２３が、命令１０　５４１内で参照され、Ｓｅｃｕｒｅ＿Ｂｏｏｌｅａｎ５２４が、命令ｎ　５５１内で参照される。
【００４５】
このソースコードが処理モジュール３００のコンパイルの一部として処理される場合、セキュア変数宣言ステートメント５２２〜５２４は、セキュアな関数のインスタンスが前述のように生成されるようにする。各変数型につき、難読化関数の特定のインスタンスがランダムに選択または生成され、選択された関数によって任意のパラメータが利用される。メインプロシージャセクション３０３が処理される場合、難読化関数のこれらのインスタンスが、特定のセキュアな変数を参照する特定の命令に代入される。例えば、命令１　５３１と命令ｍ　５６１は両方とも、Ｓｅｃｕｒｅ＿Ｉｎｔ＿１　５２２への参照を含む。これらの命令が処理される場合、Ｓｅｃｕｒｅ＿Ｉｎｔ＿１へのこれらの特定の参照５３２、５６２は、Ｓｅｃｕｒｅ＿Ｉｎｔ＿１　５２２への参照を処理するのに使用するために生み出された、難読化関数のインスタンスのコピー５３３、５６３で置換される。図４の例とは異なり、この難読化関数についてのインラインコードを別々に挿入する必要がある。しかし、このインライン代入により、関数自体に対する呼出し動作がなくなり、変数はハッカーに対してさらに難読化される。メインプロシージャセクション３０３中で使用される他のセキュアな変数５２３、５２４への参照５４２、５５２に対しても、同様に関数コード５４３、５５３の代入が行われる。
【００４６】
図６に、本発明の一実施形態により、ＯＴＬプロシージャがセキュア変数参照に代入される、ＯＴＬ変数を使用したプログラムモジュールのブロック図を示す。前述のコード代入を用いることによって可能な追加の利点の１つは、変数の内容を難読化するための様々な演算を、プログラマによって指定される他の演算と組み合わせることができることである。図６には、プログラマによって生み出されたソースコード６０１中のセキュアな整数ＸおよびＹに対してこのような２つの代入を行う例を示す。この例で、プログラマは自分のコード６０１中で、Ｘ＞０に対するテスト演算６１１を指定し、Ｙ＜０に対する同様の演算６１２を指定する。ＯＴＬライブラリ６０２の特定のインスタンス中に指定された２つの難読化関数のうちで、Ｘは、Ｘ−乱数１　６２１として定義されている。同様にＹは、ライブラリの特定のインスタンス６２２中で、Ｙ　ＸＯＲ乱数２として定義されている。これらの関数がユーザのコード６０１に代入された場合、ユーザ指定の命令は、Ｘ＞乱数１　６３１の形態に最適化することができる。このため、本発明に従って生成されたコードの実行時バージョン中でＸの平文バージョンが実際に生み出されることは決してない。したがって、ハッカーがＸの値ならびにその演算および使用を解読できる状況になることはない。
【００４７】
図７に、本発明の可能な一実施形態による、ＯＴＬモジュールを使用して実行可能プログラムモジュールを生成するための処理システムを示す。好ましい一実施形態では、ＯＴＬ処理はコンパイラシステム７０１内に含められることになる。このコンパイラシステム７０１は、ソースコードファイル１１０を受け付けて、実行可能ファイル（例えばＥＸＥやＤＬＬ）を生成する。コンパイラシステム７０１は、代入モジュール７１１、コンパイラモジュール７１２、リンカモジュール７１３、および場合により追加の難読化モジュール７１４を備える。さらに、代入モジュール７１１は、ＯＴＬ選択モジュール７２２およびＯＴＬパラメータモジュール７２３を備え、これらは共にタイプライブラリデータベース７２１を利用する。
【００４８】
代入モジュール７１１は、ＯＴＬ選択モジュール７２２およびＯＴＬパラメータモジュール７２３を使用して、宣言されたセキュアな変数それぞれにつき難読化関数コードを生成する。ＯＴＬ選択モジュール７２２は、セキュアな変数の型に基づいて、また選択パラメータが入力されればそれに基づいて、宣言されたセキュアな変数それぞれにつき特定の難読化関数を、実行中に選択または構築する。ＯＴＬパラメータモジュール７２３は、宣言されたセキュアな変数それぞれにつき、選択された難読化関数に必要なランダムパラメータがあればそれを生成する。
【００４９】
コンパイラモジュール７１２は、ＯＴＬコード代入操作の後のソースコードを処理してオブジェクトコードを生成し、このオブジェクトコードをリンカモジュール７１３が他の実行可能モジュールと結合して、実行可能処理モジュールを生成する。
【００５０】
追加の難読化モジュールのセット７１４は、処理モジュールの動作をより安全にするために利用できる追加の難読化演算を実装する。過去の経験から、攻撃者はしばしば、ソフトウェアと基礎をなすオペレーティングシステムとの対話を覗き見し続けることによってソフトウェア保護メカニズムをバイパスできることがわかっている。具体的には、Ｗｉｎｄｏｗｓ（登録商標）　ＡＰＩ呼出しで渡される引数は平文である。攻撃者がＡＰＩ呼出しを傍受してそれらの引数を任意に変更することは、少しも困難ではない。この問題に対する明白な解決法は、データ難読化をＯＳの奥深くに押し込むことである。データが使用される直前にデータの難読化が一時的に解除される場合（例えば、暗号化された歌がサウンドドライバに送られる直前に暗号化解除される場合、または暗号化されたファイル名がファイルシステムモジュール内部で暗号化解除される場合）は、攻撃者がクリティカルな平文データを傍受して変更するのははるかに困難になる。
【００５１】
従来のＰＣオペレーティングシステム中にどれだけデータ難読化が投入されたとしても、攻撃者がＯＳ全体をリバースエンジニアリングすることは依然として可能である。ハードウェアによってセキュアなＰＣを支援することは、どんなソフトウェアベースの攻撃も防止する方法の１つである。Ｍｉｃｒｏｓｏｆｔ内のトラステッドウィンドウズ（登録商標）（ＴＷ、Ｔｒｕｓｔｅｄ　Ｗｉｎｄｏｗｓ（登録商標））イニシアティブは、データ保護のための優れた機会を提供する。ＴＷプラットフォーム上では、信用されるミニＯＳがハードウェアメカニズムによって保護され、このハードウェアメカニズムにより、どんなユーザもミニＯＳのメモリ内容を調べることができず、単なるソフトウェア手段ではデバッグできない。リソースの制約およびエンジニアリングの複雑性のせいで、この保護はミニＯＳだけに制限される。アプリケーションソフトウェアの大部分は、依然として信用されない領域で稼動する。この問題を、以下に説明するようにＯＴＬを用いて軽減することができる。
【００５２】
ＯＴＬで記述されたＴＷアプリケーションは、図８ａに示すように、アプリケーションバイナリとＯＴＬオブジェクトデコーダ（ＯＴＬデコーダ）の、２つのコンポーネントにコンパイルされる。ＯＴＬデコーダは、このアプリケーションについてのＯＴＬオブジェクトの難読化を解除するのに必要な情報を含む。これは、このアプリケーションのライセンス供与先である信用されるＷｉｎｄｏｗｓ（登録商標）ＰＣの公開鍵で暗号化される。アプリケーションがＴＷ　ＰＣ上にロードされると、対応するＯＴＬデコーダがミニＯＳにロードされる。アプリケーションとミニＯＳとの間における後続のすべての通信は、ＯＴＬオブジェクトを、その難読化された形態で使用する。したがって、現在のＰＣ　ＯＳに存在する一般的な脆弱性が除去される。
【００５３】
ＡＰＩ呼出しの安全を確保する際にＯＴＬを使用することは、開発者に余分な費用を課すことなく行われる。開発者は、ＡＰＩ呼出し中でｉｎｔ３２（またはＢＯＯＬなど）の代わりにＳＩｎｔ３２（またはＳＢｏｏｌなど）を渡すだけでよい。ミニＯＳ中で実行されるＯＴＬデコーダは、ＯＴＬコンパイラミドルウェアによって自動的に生成することができる。
【００５４】
プログラム中のデータアクセスパターンを保護するために、プログラムデータと補助データの両方への補助データアクセスおよびフェイクデータアクセスを挿入することを提案する。この挿入をＯＴＬコンパイラによって行う。ソフトウェアを多くのコードグループに区分化するが、各コードグループは、いくつかのグループ間で共用される何らかのグローバルデータを、ＯＴＬベースでまたは非ＯＴＬで含む。他のコードグループ中の共用データおよび補助データへのアクセスを挿入することにより、コードグループ間に模造の依存関係を生み出すことができる。これらの余分なデータアクセスは、単純なデータ解析ツールでは異質と見なすことができない。この結果、その様々なコンポーネントがヒープに対して一見ランダムなアクセスを行うソフトウェアとなる。さらに、コードグループ間における従来のツリー状のデータ依存関係は、図８ｂに示すような完全なグラフのように見える。
【００５５】
図９に、本発明の別の可能な実施形態による、ＯＴＬモジュールを使用して実行可能プログラムモジュールを生成するための処理システムを示す。第２の実施形態では、ソースコード１１０のＯＴＬ処理は、別個のプリプロセッシングモジュール９０１内で行われ、プリプロセッサの出力はコンパイラシステム７０１中に渡される。このような実施形態で、プリプロセッサ９０１およびコンパイラ７０１の動作は前述の処理と同一である。ただし、ＯＴＬプリプロセッサ９０１は、コンパイラ自体を修正する必要なしに既存のコンパイラシステムと共に使用することができる。このような構成では、新しいソースコードセットが生み出されるのに伴って追加のデータ記憶域が必要になる場合がある。しかし、ＯＴＬシステムを既存のコンパイラと共に使用するのが可能であることは、このような実施形態における追加の記憶域およびオーバーヘッドの要件に見合うだけの価値がある。
【００５６】
図１０に、本発明の別の例示的な実施形態による、ＯＴＬモジュールを使用して実行可能プログラムモジュールを生成するための動作の流れを示す。処理は１００１で開始し、モジュール１０１１で入力ソースコードを処理して、セキュア変数宣言を識別する。セキュア変数宣言が見つかれば、モジュール１０１２で、この変数のインスタンス中で使用するための可能なＯＴＬプロシージャを求めてＯＴＬデータベースに照会する。照会は、事前記憶済みのプロシージャを返してもよく、実行中に生成されたプロシージャを返してもよい。照会によって返される可能なプロシージャは、宣言ステートメント中で参照されるセキュアな変数の型によって決まる。
【００５７】
照会結果から、モジュール１０１３で、宣言されたセキュアな変数のこの特定インスタンス中で使用するための単一のプロシージャをランダムに選択または生成する。次いで、モジュール１０１４で、この宣言されたセキュアな変数についてのインスタンスを生み出し、このプロシージャに必要なランダムパラメータがあればそれを定義する。
【００５８】
モジュール１０１５で、ソースコード内に次のセキュアな変数があるかどうか判定する。次のセキュア変数宣言が見つかった場合は、処理はモジュール１０１１に戻り、次のセキュア変数宣言を処理する。テストモジュール１０１５で、処理すべきセキュア変数が他にないと判定した場合は、処理はモジュール１０２１に続き、宣言されたセキュアな変数への次の参照をソースコード中で突き止める。
【００５９】
モジュール１０２１で参照を見つけると、モジュール１０２２で、前に生み出した、参照されるセキュアな変数についての難読化関数のインスタンスを、ソースコードに代入する。テストモジュール１０２３で、ソースコード内に次のセキュアな変数参照があるかどうか判定する。次のセキュアな変数参照が見つかった場合は、処理はモジュール１０２１に戻り、次のセキュアな変数参照を処理する。テストモジュール１０２３で、処理すべきセキュアな変数が他にないと判定した場合は、処理はモジュール１０２４に続き、前述のように変数を最適化、コンパイル、リンクし、さらに難読化する。実行可能処理モジュールが生み出されれば、処理は１００２で終了する。
【００６０】
図２に、本発明を実施することのできる適した動作環境２００の例を示す。この動作環境は、適した動作環境２００の一例にすぎず、本発明の使用または機能の範囲についてどんな限定も示すものではない。本発明で使用するのに適するであろう他の周知のコンピューティングシステム、環境、および／または構成には、限定しないがパーソナルコンピュータ、サーバコンピュータ、ハンドヘルドまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な民生用電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、これらのシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれる。
【００６１】
本発明はまた、プログラムモジュールなど、１つまたは複数のコンピュータあるいはその他のデバイスによって実行されるコンピュータ実行可能命令の一般的なコンテキストで述べることもできる。一般にプログラムモジュールは、特定のタスクを実施するか特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。通常、プログラムモジュールの機能は、様々な実施形態で望むように組み合わせるか分散させることができる。
【００６２】
コンピューティングシステム２００は通常、少なくとも何らかの形態のコンピュータ可読媒体を備える。コンピュータ可読媒体は、システム２００からアクセスできる任意の利用可能な媒体とすることができる。限定ではなく例として、コンピュータ可読媒体には、コンピュータ記憶媒体および通信媒体を含めることができる。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、その他のデータなどの情報を記憶するための任意の方法または技術で実現される、揮発性および不揮発性の、取外し可能および取外し不可能な媒体が含まれる。コンピュータ記憶媒体には、限定しないがＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、ディジタル多用途ディスク（ＤＶＤ）または他の光記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶デバイスが含まれ、あるいは、所望の情報を記憶するのに使用できコンピュータ２００からアクセスできるその他の任意の媒体が含まれる。
【００６３】
通信媒体は通常、搬送波やその他のトランスポートメカニズムなど変調されたデータ信号中に、コンピュータ可読命令、データ構造、プログラムモジュール、またはその他のデータを組み入れており、任意の情報送達媒体がこれに含まれる。「変調されたデータ信号」という語は、信号中の情報が符号化される形で１つまたは複数の特性が設定されたまたは変更された信号を意味する。限定ではなく例として、通信媒体には、配線式ネットワークや直接配線式接続などの配線式媒体と、音響、無線周波、赤外線、その他の無線媒体などの無線媒体とが含まれる。以上の任意の組合せもコンピュータ可読媒体の範囲に含めるべきである。
【００６４】
本発明に関する以上の実施形態は、ユーザに対して表示される画像を改変するための処理システムを説明しているが、添付の特許請求の範囲に述べるように本発明を実施するために様々なコンピューティングアーキテクチャを用いることができることは、当業者なら理解するであろう。本発明の範囲を逸脱することなく、他の実施形態を利用することもでき、機能上の変更を加えることもできることを理解されたい。
【００６５】
本発明の例示的な実施形態に関する以上の説明は、例示および説明の目的で提示した。これらは、網羅的でもなく、開示した正確な形態に本発明を限定するものでもない。以上の教示に鑑みて、多くの修正および変形が可能である。本発明の範囲は、この詳細な説明によって限定するのではなく、本明細書に添付する特許請求の範囲によって限定する。したがって、本発明は現在、セキュアで不明瞭なタイプライブラリを設けてプログラミングモジュール内でセキュア変数を自動的に提供するための方法、装置、コンピュータ記憶媒体として実施され、あるいは、このための方法、装置、および製品を提供するためのコンピュータプログラムを含む伝搬信号として実施される。
【図面の簡単な説明】
【００６６】
【図１】本発明の一実施形態による、オペークタイプライブラリを使用してセキュア変数を生み出すためのコンピューティングシステムを示す図である。
【図２】本発明の例示的な実施形態の一部である様々なコンピューティングシステムをサポートするのに使用することのできる例示的なコンピューティングシステムを示す図である。
【図３】本発明の一実施形態による、ＯＴＬ変数を使用したプログラムモジュールのブロック図を示す図である。
【図４】本発明の一実施形態による、ＯＴＬ変数呼出しプロシージャを使用したプログラムモジュールのブロック図を示す図である。
【図５】本発明の一実施形態による、ＯＴＬプロシージャがプログラミングモジュールに代入される、ＯＴＬ変数を使用したプログラムモジュールのブロック図を示す図である。
【図６】本発明の一実施形態による、ＯＴＬプロシージャがセキュア変数参照に代入される、ＯＴＬ変数を使用したプログラムモジュールのブロック図を示す図である。
【図７】本発明の可能な一実施形態による、ＯＴＬモジュールを使用して実行可能プログラムモジュールを生成するための処理システムを示す図である。
【図８ａ】本発明の別の例示的な実施形態による、ＯＴＬプロセス内に含めることのできる追加の難読化処理を示す図である。
【図８ｂ】本発明の別の例示的な実施形態による、ＯＴＬプロセス内に含めることのできる追加の難読化処理を示す図である。
【図９】本発明の別の可能な実施形態による、ＯＴＬモジュールを使用して実行可能プログラムモジュールを生成するための処理システムを示す図である。
【図１０】本発明の別の例示的な実施形態による、ＯＴＬモジュールを使用して実行可能プログラムモジュールを生成するための動作の流れを示す図である。
【符号の説明】
【００６７】
１０３　コンピュータ
１１０　ソースコード
１１１　実行可能ファイルおよびＤＬＬファイル
１２１　ＯＴＬ処理モジュール
１２２　コンパイラモジュール
１２３　リンカモジュール
２００　コンピュータシステム
２０２　プロセッサユニット
２０４　システムメモリ
２０６　システムバス
２０８　読出し専用メモリ（ＲＯＭ）
２１０　ランダムアクセスメモリ（ＲＡＭ）
２１２　ハードディスクドライブ
２１２　ＢＩＯＳ
２１４　磁気ディスクドライブ
２１６　磁気ディスク
２１８　光ディスクドライブ
２１９　光ディスク
２２０　ハードディスクドライブインタフェース
２２２　磁気ディスクドライブインタフェース
２２４　光ドライブインタフェース
２２６　オペレーティングシステム
２２８　アプリケーションプログラム
２３０　プログラムモジュール
２３２　プログラムデータ
２３４　入力デバイス
２３６　マウス
２４０　シリアルポートインタフェース
２４２　表示装置
２４４　ビデオアダプタ
２４６　リモートコンピュータ
２４８　ローカルエリアネットワーク（ＬＡＮ）
２５０　ワイドエリアネットワーク（ＷＡＮ）
２５２　ネットワークアダプタ
２５４　モデム
３００　プログラミングモジュール
３０１　ヘッダ
３０２　変数宣言セクション
３０３　メインプロシージャセクション
３０４　メソッドおよび関数セクション
７０１　コンパイラシステム
７１１　代入モジュール
７１２　コンパイラモジュール
７１３　リンカモジュール
７１４　追加の難読化モジュール
７２１　タイプライブラリ
７２２　ＯＴＬ選択モジュール
７２３　ＯＴＬパラメータモジュール
９０１　プリプロセッサ
【図１】
2004038966.tif 000006
【図２】
2004038966.tif 000007
【図３】
2004038966.tif 000008
【図４】
2004038966.tif 000009
【図５】
2004038966.tif 000010
【図６】
2004038966.tif 000011
【図７】
2004038966.tif 000012
【図８ａ】
2004038966.tif 000013
【図８ｂ】
2004038966.tif 000014
【図９】
2004038966.tif 000015
【図１０】
2004038966.tif 000016
【外国語明細書】
2004038966.tif 000017
2004038966.tif 000018
2004038966.tif 000019
2004038966.tif 000020
2004038966.tif 000021
2004038966.tif 000022
2004038966.tif 000023
2004038966.tif 000024
2004038966.tif 000025
2004038966.tif 000026
2004038966.tif 000027
2004038966.tif 000028
2004038966.tif 000029
2004038966.tif 000030
2004038966.tif 000031
2004038966.tif 000032
2004038966.tif 000033
2004038966.tif 000034
2004038966.tif 000035
2004038966.tif 000036
2004038966.tif 000037
2004038966.tif 000038
2004038966.tif 000039
2004038966.tif 000040
2004038966.tif 000041
2004038966.tif 000042
2004038966.tif 000043
2004038966.tif 000044
2004038966.tif 000045
2004038966.tif 000046
2004038966.tif 000047
2004038966.tif 000048
2004038966.tif 000049
2004038966.tif 000050
2004038966.tif 000051
2004038966.tif 000052
2004038966.tif 000053
2004038966.tif 000054
2004038966.tif 000055
2004038966.tif 000056