(57)【要約】  コンピュータ実施可能方法が、プログラムの多様なコピーを生成するフィーチャを備える命令セットアーキテクチャを提供すること、この命令セットアーキテクチャを使用して、プログラムの多様なコピーを生成すること、およびプログラムのこれらの多様なコピーの１つの実行のための仮想マシンを提供することを含む。様々な例示的な方法、デバイス、システムなどが、コードおよび／または仮想マシンを多様化するための仮想化を使用して、ソフトウェアセキュリティを強化する。
2010508583.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ実施可能方法であって、
プログラムの多様なコピーを生成するフィーチャを備える命令セットアーキテクチャ（２００）を提供するステップと
前記命令セットアーキテクチャを使用して、プログラムの多様なコピー（１５０）を生成するステップと
前記プログラムの前記多様なコピーの１つの実行のための仮想マシン（１７０）を提供するステップと
を備えることを特徴とする方法。
【請求項２】
請求項１に記載の方法において、仮想マシンを前記提供するステップは、仮想マシンダイナミックリンクライブラリ（１７２）を生成するステップを備えることを特徴とする方法。
【請求項３】
請求項１に記載の方法において、プログラムの多様なコピーを生成する前記フィーチャは、述語レジスタ（５１３）を使用して条件付き実行（５１２）を可能にする命令セマンティクス（５１０）を備えることを特徴とする方法。
【請求項４】
請求項１に記載の方法において、プログラムの多様なコピーを生成する前記フィーチャは、限られた命令セット（５１４）を有する命令セマンティクス（５１０）を備え、オプションとして、前記限られた命令セットは、「ノーオペレーション」命令を含まず（５１５）、オプションとして、前記限られた命令セットは、オペランド（５１６）の限られた表現を有し、オプションとして、前記限られた命令セットは、少なくともいくつかの条件付き分岐（５１７）を制限することを特徴とする方法。
【請求項５】
請求項１に記載の方法において、プログラムの多様なコピーを生成する前記フィーチャは、可変命令サイズ（５２２）に関する命令符号化（５２０）を備え、オプションとして、プログラムの多様なコピーを生成する前記フィーチャは、単項符号化を使用してオペレーションコードを割り当てて、物理的オーバラップをもたらすための命令符号化（５２４）を備え、オプションとして、プログラムの多様なコピーを生成する前記フィーチャは、命令に関するオペレーションコードに関して可変のビットパターンをもたらす命令符号化（５２７）を備え、オプションとして、プログラムの多様なコピーを生成する前記フィーチャは、オペレーションコードの以前の実行に基づいてビットパターンを割り当てる命令符号化（５２８）を備え、さらに、オプションとして、プログラムの多様なコピーを生成する前記フィーチャは、復号構造を再構成して、２つ以上の実行パスに沿って前記プログラムにおける或るポイントに到達することを許す命令符号化（５２９）を備え、前記ポイントにおけるビットパターンの割り当てられた意味は、前記ポイントへの実行パスに依存することを特徴とする方法。
【請求項６】
請求項１に記載の方法において、プログラムの多様なコピーを生成する前記フィーチャは、１つまたは複数のフェッチサイクルフィルタ（５４２）を備え、オプションとして、前記１つまたは複数のフェッチサイクルフィルタ（５４２）は、コードの要求される１つまたは複数のビットに情報を追加するフィルタ（５４３）を備え、オプションとして、前記情報は、ランダム値（５４４）を備え、オプションとして、前記情報は、プログラムカウンタ値（５４５）、またはプログラムカウンタ値に少なくともある程度、基づく情報を備えることを特徴とする方法。
【請求項７】
請求項１に記載の方法において、プログラムの多様なコピーを生成する前記フィーチャは、前記プログラムを表すために、スプレーツリー、リンクリスト、およびハッシュテーブルから成るグループ（５５０）から選択された少なくとも１つの構造を備えることを特徴とする方法。
【請求項８】
コンピュータ実施可能方法であって、
仮想マシンをターゲットとするコード（１１０）を提供するステップと
様々なロケーションからの前記コードの断片、および何らかの自己生成されたコードを組み合わせて、仮想マシンの実装のための管理されたコード表現をアセンブルするか、または多様化された仮想マシンｄｌｌを出力することによって、多様化された仮想マシン（１７０）を生成するステップと
を備えることを特徴とする方法。
【請求項９】
ソフトウェアセキュリティを強化するための方法であって（１０５）、前記方法は、
命令セットを備える基本仮想化層を提供するステップと
１つまたは複数のさらなる仮想化層を提供するステップであって、前記１つまたは複数のさらなる仮想化層のうち少なくとも１つは、前記基本仮想化層の前記命令セットを多様化するステップと
を備えることを特徴とする方法。
【請求項１０】
請求項９に記載の方法であって、
プログラムコードの個別化されたコピー（１５０）を生成するステップと
前記プログラムコードの個別化されたコピーの実行のための仮想マシン（１７０）を提供するステップであって、前記仮想マシンは、ランタイムにプログラムオペレーションを変更することができるステップと
をさらに備えることを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、多様化された不正操作耐性のための仮想化に関する。
【背景技術】
【０００２】
ソフトウェアプロバイダによる多大な努力にもかかわらず、ソフトウェア保護機構は、依然として、定常的に破られている。さらに、１つのコピーに対する成功した攻撃はしばしば、他のコピーに対しても自動的に再現することができる。例えば、ソフトウェアプロバイダが、或るソフトウェアの評価バージョンを配布する場合、１つのコピーから時間制限を取り除くクラッキングは、配布された他のすべてのコピーにも適用することができる。さらにまた、従来の配布モデルは、数千のユーザに急速に影響を及ぼす連続攻撃を許す可能性がある。
【０００３】
多様化は、ソフトウェアセキュリティを強化し、攻撃をくじくのに使用することができる概念である。しかし、ソフトウェアセキュリティのために開発された多様化技術は、異なる規則が適用される可能性があるので、いつもソフトウェア保護に移転可能とは限らない。例えば、セキュリティに関して導入されるランタイム多様化のほとんどは、攻撃者が、プログラムおよび実行環境への物理的アクセスを有する場合、容易にオフにすることができることになる。
【０００４】
本明細書で説明されるとおり、ソフトウェア保護のための様々な多様化技術は、例えば、ユーザごとに異なるコピーを与え、あつらえの更新で防御を更新することによって、空間的および時間的に再生可能な防御を提供する。
【発明の概要】
【０００５】
様々な例示的な技術が、コードおよび／または仮想マシン（ＶＭｓ）を多様化して、ソフトウェアセキュリティを強化するための仮想化を使用する。例えば、コンピュータ実施可能方法が、プログラムの多様なコピーを生成するフィーチャを含む命令セットアーキテクチャ（ＩＳＡ）を提供すること、この命令セットアーキテクチャを使用して、プログラムの多様なコピーを生成すること、およびプログラムのこれらの多様なコピーの１つの実行のためのＶＭを提供することを含む。また、他の様々な例示的な技術も開示される。限定的でなく、網羅的でない例を、以下の図を参照して説明する。
【図面の簡単な説明】
【０００６】
【図１】カスタム／変更された命令セットアーキテクチャ（ＩＳＡ）および／または仮想マシン（ＶＭ）として仮想化層を含むシステムおよび全体的なアーキテクチャの図である。
【図２】カスタムコードおよび／またはカスタムＶＭを生成するセキュリティモジュールを含む例示的な方法のブロック図である。
【図３】カスタムＶＭを生成するための例示的な方法のブロック図である。
【図４】コードの中のファンクションを多様化して、カスタムコードを生成するための例示的な方法のブロック図である。
【図５】図４の方法と関係する例の図である。
【図６】データおよび／またはデータ構造を多様化するための例示的な方法のブロック図である。
【図７】多様化および不正操作耐性のために使用することができる様々なフレームワーク特徴のブロック図である。
【図８】多様化および不正操作耐性のために使用することができる特徴を有する実行モデルの図である。
【図９】多様化および不正操作耐性の目的で命令セマンティクスに適用することができる様々なアプローチのブロック図である。
【図１０】多様化および不正操作耐性の目的で命令符号化に適用することができる様々なアプローチのブロック図である。
【図１１】多様化および不正操作耐性の目的でフェッチサイクルに適用することができる様々なアプローチのブロック図である。
【図１２】多様化の目的でプログラムカウンタ（ＰＣ）および／またはプログラム表現に適用することができる様々なアプローチのブロック図である。
【図１３】多様化された不正操作耐性を目的とするスプレーツリーにおけるコード断片の例の図である。
【図１４】多様化の目的で仮想マシン（ＶＭ）の実施に適用することができる様々なアプローチのブロック図である。
【図１５】例示的なコンピューティングデバイスのブロック図である。
【発明を実施するための形態】
【０００７】
（概説）
例示的な技術は、仮想マシン上、または制御することができる（例えば、或る特定の仕方で動作することができる）他のマシン上で実行するコードに関して、ソフトウェアベースのセキュリティを使用する。様々な例は、協調的な仕方でコードを変更し、データを変更し、そして／または仮想マシン動作を変更して、セキュリティを強化する。例えば、コードに関連するフィーチャを、識別して、このコードのインスタンスを多様化するのに使用することができる。様々な例には、既存のアーキテクチャの上、または変更されたアーキテクチャの上でエミュレートされるカスタム命令セットアーキテクチャ（ＩＳＡ）または変更された命令セットアーキテクチャの使用が含まれる。既存のアーキテクチャが、仮想化層（例えば、仮想マシンまたはランタイムエンジン、あるいは単に「ランタイム」）を含む場合、例示的なアプローチは、既存の仮想化層の上に別の仮想化層を追加することができる。様々な技術の実施を、基礎をなす仮想マシンの上で動作するカスタム仮想マシンの使用を介して、または変更された仮想マシン（例えば、基礎をなす仮想マシンの変更）の使用を介して行うことができる。パフォーマンスを犠牲にした、より高いセキュリティのために、そのようなプロセスを繰り返して、仮想マシンのスタックを生成することができ、仮想マシンのそれぞれは、直下のマシンの命令セットを仮想化する。
【０００８】
多様化に関して、共通の構成要素（例えば、ＤＮＡビルディングブロック）が、様々な仕方で組み立てられて、種の多様性を高める遺伝子多特性にたとえることができる。それで、悪質な因子（例えば、ウイルス）が、遺伝的に多様な種のすべてのメンバに影響を及ぼす可能性は低い。また、数百の遺伝子が、混ぜられ、合わされるタンパク質を生産することがある一部の寄生虫に関する類比も存在する。そのようなタンパク質の多様性は、そのような寄生虫が、免疫系検知を免れるのに役立つ。しかし、種における遺伝子の多様性は、しばしば、表現型の多様性（すなわち、表現または発現の多様性）に関連するが、本明細書で説明されるとおり、コードの多様性は、ユーザの体験を変えてはならない。つまり、同一の入力を与えられて、多様化されたコードのすべてのインスタンスは、同一の結果をもたらすように実行すべきである。
【０００９】
以下の一般化された式を考慮されたい。すなわち、
遺伝子型＋環境＝表現型        （１）
コード／データ＋マシン＝結果  （２）
式２において、多様化されたコードおよび／またはデータを使用して、マシンは、結果が実質的に同一であることを確実にするカスタムマシン、または変更された、または制御されたマシンであることが可能である。仮想マシン、または複数の仮想マシンが使用される場合、基礎をなすハードウェアおよび／またはオペレーティングシステムは、通常、本明細書で説明される例示的なセキュリティアプローチによる影響を受けないが、そのようなアプローチは、計算要求を増大させる可能性があることを付記しておく。
【００１０】
本明細書で説明されるとおり、コード多様化は、攻撃をくじくことによってセキュリティを強化する。さらに、コード多様性は、コードの１つのインスタンスに対して成功した攻撃の再現が、コードの「遺伝的に」異なるインスタンスに対して成功する可能性は低いので、連続攻撃をくじくことができる。さらに、データ（またはデータ構造）を多様化して、セキュリティを強化することができる。さらにまた、カスタム仮想マシンまたは変更された仮想マシンを多様化するための例示的な技術を使用して、コード多様化および／またはデータ多様化を伴って、または伴わずに、セキュリティを強化することができる。
【００１１】
様々な例は、ＭＳＩＬバイナリからの個別化されたバイトコードの生成に的を絞るが、様々な例示的な技術を、任意のプログラミング言語、任意の中間言語、任意のバイトコード、または任意の仕方で表現されたプログラムに関して使用することができる。
【００１２】
本明細書で説明されるとおり、仮想化のプロセス（例えば、仮想マシン上、または仮想環境におけるコードの実行）は、（ｉ）プログラムの異なる多くのバージョンを作成する能力、および（ｉｉ）プログラムのあらゆるインスタンスを攻撃に対する耐性を持たせる能力を助長する。様々な例示的な技術が、仮想化を使用して、ポータブルで、検証可能な管理されたＣＬＲ環境の上でカスタム命令セットアーキテクチャ（ＩＳＡ）をエミュレートする。カスタムランタイムまたは変更されたランタイムを使用して、カスタムＩＳＡをエミュレートすることができる。すなわち、何らかの仕方で、基礎をなすランタイムは、カスタムＩＳＡを介して導入された多様性を管理することができなければならない。
【００１３】
仮想化は、多様化において使用することができる自由度をもたらす。例えば、命令セットアーキテクチャ（ＩＳＡ）（例えば、および／またはマイクロアーキテクチャ）は、通常、（１）命令セマンティクス、（２）命令符号化、（３）オペレーションコード符号化、（４）コード表現およびプログラムカウンタ、ならびに、（５）仮想マシンの対応する内部実装を含む。これらの自由度を所与として、様々な例示的な方法が、様々な保護機構のいずれかを使用して、プログラムの多様なコピーを生成することができる。
【００１４】
ＩＳＡに関連する自由度は、不正操作に耐性のあるプログラムの設計および選択を可能にする。例えば、不正操作耐性は、（１）（ａ）可変の命令長、（ｂ）限られた命令セット、ならびに（ｃ）物理的オーバラップ、および（ｄ）セマンティックオーバラップを促進することを介して局所的な変更をより困難にすること、（２）前述したことのすべて、ならびにコード、データ、およびアドレスの間の境界をあいまいにすることによって、大域的な変更をより困難にすること、（３）命令セマンティクスを可変にすること、および（４）コードを絶えず再配置することの結果であることが可能である。
【００１５】
より具体的な例には、（ｉ）より小さい命令の組合せを介して命令を構築することによって命令セマンティクスをランダム化すること、（ｉｉ）より多くのセマンティックオーバラップを可能にするように命令セマンティクスを選択すること、（ｉｉｉ）従来の線形コード表現を離れて、コードを、自己適応（スプレー）バイナリツリーなどのデータ構造として表すこと、（ｉｖ）オペレーションコードおよびオペランドに可変の長さを割り当てて、逆アセンブリを複雑にし、局所的な変更をより困難にすること、（ｖ）命令セットを制限して、コードを解析し、変更する際に攻撃者に与えられるオプションをより少なくすること、および（ｖｉ）ビットパターン、オペレーションコード、およびオペランドの間のマッピングを可変にすることが含まれる。これらの例のいくつかを、以下により詳細に説明する。この詳細な説明は、現在、企図される最良の形態を含む。
【００１６】
様々な詳細を説明するのに先立って、文脈のため、図１は、一般的なシステム１００と、仮想化を含むアーキテクチャ１０５とを示す。アーキテクチャ１０５は、共通言語ランタイム（ＣＬＲ）と呼ばれる仮想マシンとの関係でカスタムの、または変更されたＩＳＡおよび／または仮想マシンをさらに示す。図１のＣＬＲは、例えば、様々なオブジェクト指向プログラミング言語（ＯＯＰＬｓ）のいずれかから導き出された中間言語コードを扱うことができるＣＬＲであり、このため、「共通」と呼ばれる。図１は、．ＮＥＴ（商標）フレームワーク（ワシントン州レドモンド所在のマイクロソフトコーポレーション）を参照して説明されるが、例示的な技術は、他のアーキテクチャで使用することもできる。
【００１７】
システム１００は、ネットワーク１０３を介して通信する様々なコンピューティングデバイス１０１、１０１’、１０２、１０２’を含む。デバイス１０１、１０１’は、クライアント（例えば、ＰＣ、ワークステーション、軽量デバイス、スマートデバイスなど）であることが可能であるのに対して、デバイス１０２、１０２’は、サーバである。アーキテクチャ１０５は、デバイス１０１、サーバ１０２’、およびネットワーク１０３に対するいくつかのリンクと共に示される。
【００１８】
．ＮＥＴ（商標）フレームワークは、２つの主な構成要素、すなわち、共通言語ランタイム（ＣＬＲ）、および．ＮＥＴ（商標）フレームワーククラスライブラリを有する。これらは、管理されたアプリケーションに関連するものとして示される。ＣＬＲは、．ＮＥＴ（商標）フレームワークの基礎にある仮想マシン（ＶＭ）である。ＣＬＲは、実行時にコードを管理するエージェントの役割をし、メモリ管理、スレッド管理、およびリモーティングなどのコアサービスを提供するのと同時に、セキュリティおよび堅牢性を促進する厳格な型安全性、および他の形態のコード正確性の執行もする。コード管理の概念は、ＣＬＲの基礎的な原理である。ＣＬＲをターゲットとするコードは、マネージドコードとして知られているのに対して、ランタイムをターゲットとしないコードは、アンマネージドコードとして知られている（アーキテクチャの右半分）。
【００１９】
．ＮＥＴ（商標）フレームワークにおいて、プログラムは、ＣＬＲによって提供される管理された実行環境内で実行される。ＣＬＲは、プログラム間のランタイム対話性、ポータビリティ、セキュリティ、開発の簡易性、言語間統合を大幅に向上させ、豊かなクラスライブラリセットのための優れた基礎を提供する。．ＮＥＴ（商標）フレームワークＣＬＲをターゲットとする各言語は、ソースコードをコンパイルし、メタデータおよびＭｉｃｒｏｓｏｆｔ（登録商標）中間言語（ＭＳＩＬ）コードを生成する。様々な例は、ＭＳＩＬについて述べるが、様々な例示的なセキュリティ技術を、他の言語コードで使用することができる。例えば、様々な技術を、たいていの低レベルアセンブラスタイルの言語（例えば、任意の中間言語（ＩＬ）コード）で使用することができる。様々な技術を、ＪＡＶＡ（登録商標）フレームワーク（カリフォルニア州サニーベール所在のサンマイクロシステムズ社）のバイトコードなどのバイトコードで使用することができる。
【００２０】
．ＮＥＴ（商標）フレームワークにおいて、プログラムコードは、通常、「メタデータ」として知られる情報、つまり、データについてのデータを含む。メタデータは、しばしば各ファンクションの実際の実装とは別に、プログラムのすべての型を含め、プログラムに関する完全な仕様を含む。これらの実装は、プログラムの命令を記述するマシンに依存しないコードであるＭＳＩＬとして格納される。ＣＬＲは、この「青写真」を使用して、．ＮＥＴ（商標）プログラムをランタイムに活性化することができ、コードをアセンブリ言語に直接にコンパイルすることに依拠する従来のアプローチで可能なものをはるかに超えるサービスをもたらす。
【００２１】
．ＮＥＴ（商標）フレームワークの他の主な構成要素であるクラスライブラリは、従来のコマンドラインアプリケーションまたはグラフィカルユーザインタフェース（ＧＵＩ）アプリケーションから、Ｗｅｂ  ＦｏｒｍｓサービスおよびＸＭＬ  ＷｅｂサービスなどのＡＳＰ．ＮＥＴによって提供される最新の技術革新に基づくアプリケーションにまで及ぶアプリケーションを開発する、再使用可能な型の包括的な、オブジェクト指向のコレクションである。
【００２２】
ＣＬＲは、アーキテクチャ１０５の管理されたアプリケーション側に示されているが、．ＮＥＴ（商標）フレームワークは、ＣＬＲをプロセスにロードし、マネージドコードの実行を開始する管理されない構成要素によってホストされて、管理されたフィーチャと管理されないフィーチャをともに活用することができるソフトウェア環境を作り出すこともできる。．ＮＥＴ（商標）フレームワークは、いくつかのランタイムホストを提供するだけでなく、第三者ランタイムホストの開発もサポートする。
【００２３】
例えば、ＡＳＰ．ＮＥＴが、ランタイム（ＲＴ）をホストして、マネージドコードのためのスケーラブルな、サーバ側の環境をもたらす。ＡＳＰ．ＮＥＴは、ランタイムと直接に協働して、ＡＳＰ．ＮＥＴアプリケーションおよびＸＭＬ  Ｗｅｂサービスを可能にする。
【００２４】
Ｉｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ（登録商標）ブラウザアプリケーション（マイクロソフトコーポレーション）が、ランタイムをホストする（例えば、ＭＩＭＥ型拡張の形態で）管理されないアプリケーションの例である。Ｉｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ（登録商標）ソフトウェアを使用して、ランタイムをホストすることにより、ユーザが、管理された構成要素、またはＷｉｎｄｏｗｓ（登録商標）フォームコントロールをＨＴＭＬ文書に埋め込むことができるようになる。ランタイムをこのようにホストすることにより、管理されたモバイルコード（Ｍｉｃｒｏｓｏｆｔ（登録商標）ＡｃｔｉｖｅＸ（登録商標）コントロールに類似した）が可能になるが、管理されたコードだけが提供することができる、半ば信頼される実行や隔離されたファイル格納などの大幅な改良が付随する。
【００２５】
本明細書で説明されるとおり、マネージドコードは、ランタイム（例えば、ランタイムが、ハードウェア（ＨＷ）の制御に通常、直接に関連する、基礎をなすオペレーティングシステム（ＯＳ）とインタフェースをとる、仮想マシン、ランタイムエンジンなど）をターゲットとする任意のコードであることが可能である。．ＮＥＴ（商標）フレームワークにおいて、マネージドコードは、ＣＬＲをターゲットとし、「自らを記述する」メタデータとして知られる追加の情報を通常、含む。マネージドコードとアンマネージドコードはともに、ＣＬＲにおいて実行することができるが、マネージドコードは、ＣＬＲが、例えば、安全な実行、および相互運用性を保証することを可能にする情報を含む。
【００２６】
マネージドコードに加えて、管理されたデータが、．ＮＥＴ（商標）フレームワークのアーキテクチャに存在する。一部の．ＮＥＴ（商標）言語は、管理されたデータをデフォルトで使用するのに対して（例えば、Ｃ＃、Ｖｉｓｕａｌ  Ｂａｓｉｃ．ＮＥＴ、ＪＳｃｒｉｐｔ．ＮＥＴ）、他の言語（例えば、Ｃ＋＋）は、そうはしない。マネージドコードとアンマネージドコードの場合と同様に、．ＮＥＴ（商標）アプリケーションにおける管理されたデータと管理されないデータの両方の使用が、可能である（例えば、ガーベッジコレクションを行われることはなく、代わりに、アンマネージドコードによって手入れをされるデータ）。
【００２７】
プログラムまたはコードは、通常、ポータブル実行可能ファイル（例えば、「ＰＥ」）として配布される。．ＮＥＴ（商標）ＰＥにおいて、ＰＥラッパ内の最初のデータブロックは、ＭＳＩＬであり、ＭＳＩＬは、既に述べたとおり、ほぼ低レベルアセンブラ言語コードのように見える。このＭＳＩＬは、従来、．ＮＥＴ（商標）フレームワークにおいてコンパイルされ、実行されるものである。ＰＥに関する第２のデータブロックは、従来、メタデータであり、ＰＥの内容（例えば、ＰＥがどのようなメソッドを提供するか、メソッドがどのようなパラメータをとるか、およびメソッドが何を戻すか）を記述する。第３のデータブロックは、マニフェストと呼ばれ、マニフェストは、実行可能ファイルが実行するために他のどのような構成要素を必要とするかを従来、記述する。また、マニフェストは、外部構成要素の公開鍵を含むことも可能であり、したがって、ＣＬＲは、外部構成要素が適切に識別される（すなわち、実行可能ファイルによって要求される構成要素）ことを確実にすることができる。
【００２８】
実行可能ファイルを実行している際、．ＮＥＴ（商標）ＣＬＲは、ジャストインタイム（ＪＩＴ）コンパイルを使用することができる。ＪＩＴコンパイルは、すべてのマネージドコードが、そのマネージドコードが実行されているシステム（ＯＳ／ＨＷ）のネイティブの機械語で実行することを可能にする。ＪＩＴによれば、実行可能ファイル内の各メソッドが呼び出されるにつれ、そのメソッドがネイティブコードにコンパイルされ、構成に依存して、同一のメソッドに対する後続の呼び出しは、必ずしも同一のコンパイルを受ける必要はなく、オーバヘッドを少なくすることができる（すなわち、オーバヘッドは、メソッド呼び出しごとに１回だけしか生じない）。ＣＬＲは、多くの標準のランタイムサービスを提供するものの、マネージドコードは、決して解釈されない。その一方で、メモリマネージャは、断片化したメモリの可能性をなくし、メモリの参照の局所性を高めて、パフォーマンスをさらに向上させる。
【００２９】
アーキテクチャ１０５を再び参照すると、ＣＬＲとクラスライブラリの関係が、アプリケーションおよび全体的なシステム（例えば、システム１００）に関して示され、マネージドコードが、より大きいアーキテクチャ内でどのように動作するかを示す。
【００３０】
ＣＬＲは、メモリ、スレッド実行、コード実行、コード安全性検証、コンパイル、およびその他のシステムサービスを管理する。これらのフィーチャは、ＣＬＲ上で実行するマネージドコードに本来備わっている。
【００３１】
セキュリティに関して、管理された構成要素に、構成要素の出所（インターネット、企業ネットワーク、またはローカルコンピュータなどの）を含むいくつかの要因に依存して、様々な度合いの信頼を与えることができる。このことは、管理された構成要素が、同一の活性のアプリケーションにおいて使用されている場合でさえ、ファイルアクセス動作、レジストリアクセス動作、または他のセンシティブな機能を実行することができることも、できないこともあり得ることを意味する。
【００３２】
ＣＬＲは、コードアクセスセキュリティを執行することができる。例えば、ユーザは、Ｗｅｂページに埋め込まれた実行可能ファイルが、スクリーン上でアニメーションを再生する、または歌を歌うことができるが、ユーザの個人データ、ファイルシステム、またはネットワークにアクセスすることはできないことを信頼することができる。このため、ＣＬＲのセキュリティフィーチャは、正当なインターネット展開ソフトウェアが、並外れてフィーチャに富んでいることを可能にする。
【００３３】
また、ＣＬＲは、共通型システム（ＣＴＳ）と呼ばれる厳密な型−コード検証インフラストラクチャを実施することによって、コード堅牢性も執行することができる。ＣＴＳは、すべてのマネージドコードが自己記述的であることを確実にする。マネージドコードは、型忠実性および型安全性を厳密に執行しながら、他の管理されたタイプおよびインスタンスを消費することができる。
【００３４】
ＣＬＲの管理された環境は、多くの共通のソフトウェア問題を解消することを目指す。例えば、ＣＬＲは、自動的に、オブジェクトレイアウトを扱い、オブジェクトへの参照を管理することができ、オブジェクトがもはや使用されていない場合、それらのオブジェクトを解放する。そのような自動メモリ管理は、２つの最もよくあるアプリケーションエラー、メモリリーク、および無効なメモリ参照を解決する。マネージドコードとアンマネージドコードの間の相互運用性は、開発者が、必要なＣＯＭ構成要素（コンポーネントオブジェクトモデル）およびｄｌｌ（ダイナミックリンクライブラリ）を引き続き使用できるようになることを可能にする。
【００３５】
．ＮＥＴ（商標）フレームワークＣＬＲは、Ｍｉｃｒｏｓｏｆｔ（登録商標）ＳＱＬ  Ｓｅｒｖｅｒ（商標）やインターネット情報サービス（ＩＩＳ）などの高パフォーマンスのサーバ側アプリケーションによってホストすることができる。このインフラストラクチャは、ランタイムホスティングをサポートする企業サーバを依然として使用しながら、ビジネスロジックを書くことのためのマネージドコードの使用を可能にする。
【００３６】
管理されたドメインにおけるサーバ側アプリケーションは、ランタイムホストを介して実施される。管理されないアプリケーションは、ＣＬＲをホストし、カスタムマネージドコードが、サーバの振舞いを制御することを可能にする。そのようなモデルは、ホストサーバのパフォーマンスおよびスケーラビリティを高めながら、ＣＬＲおよびクラスライブラリのフィーチャを提供する。
【００３７】
既に述べたとおり、様々な例示的な技術が、仮想化を使用して、ポータブルで、検証可能な、管理されたＣＬＲ環境の上でカスタムＩＳＡまたは変更されたＩＳＡをエミュレートする。このことが、ＣＬＲと管理されたアプリケーション空間の境界の上に位置する例示的なカスタムの／変更されたＩＳＡおよび／またはＶＭ１０７（破線の弧）によってアーキテクチャ１０５において示される（様々な例が、管理されないアプリケーションについても説明することを付記しておく）。このことから、カスタムの／変更されたＩＳＡが、ＣＬＲ、および基礎をなす環境、つまり、「ホスト」環境（例えば、ＯＳ／ＨＷ）の動作に干渉しないことが推測される。カスタムＩＳＡは、カスタムＩＳＡの様々なフィーチャを実施するのに必要な限りで、ＣＬＲまたは「ＶＭ」の制御を提供することができるが、様々な例は、基礎をなすＶＭの変更されたバージョン（すなわち、変更されたＣＬＲ）であることが可能な、カスタムＶＭに依拠する。このため、例示的なアーキテクチャは、単一の変更されたＶＭ、または複数のＶＭ（例えば、ターゲットとされるＶＭの上のカスタムＶＭ）を含むことが可能である。セキュリティを高めるのに、パフォーマンスをいくらか犠牲にして、最低レベルのＶＭを除くすべてのＶＭが直下のＶＭの命令セットを仮想化するような仕方で、複数のＶＭを、スタック化することができる。
【００３８】
図１において、従来のＣＬＲが、２つのタイプの仮想化ＶＭ１およびＶＭ２が上にある仮想化層を有する例と、従来のＣＬＲが、２つのスタック化された仮想化層ＶＭ１およびＶＭ３を上に有するもう一つの例とを、矢印が指し示す。そのような例において、基礎をなすＣＬＲは、追加の１つまたは複数の仮想化層がセキュリティをさらに強化するセキュリティフィーチャを有する、カスタムＣＬＲまたは独自のＣＬＲであることが可能である。例示的な方法は、各ＶＭが、直下のマシンの命令セットを仮想化する、複数のスタック化されたＶＭを含む。最低レベルのＶＭは、ハードウェアを制御するオペレーティングシステムを通常、仮想化するのに対して、他のより高いレベルのＶＭは、別のＶＭを仮想化することに留意されたい。図１に示されるとおり、様々な構成が可能である（例えば、ＶＭの上の２つのＶＭ、スタック化されたＶＭなど）。複数の「カスタム」ＶＭアプローチを、パフォーマンスをいくらか犠牲にして、より高いセキュリティを得るように仮想化を活用しているとみなすことができる。
【００３９】
遺伝的性質および環境との類比を再び参照すると、遺伝的性質は静的であると考えることができるのに対して、環境は動的であると考えることができる。同様に、不正操作耐性の様々な多様性ベースのアプローチが、静的および／または動的であってもよい。一般に、静的アプローチは、プログラムコードのコピーを多様化するのに対して、動的アプローチは、ランタイムにおける複数のＶＭまたはＶＭ動作、あるいはプログラム動作を多様化する。このため、本明細書で説明されるとおり、様々な例示的な技術は、静的に機能する、動的に機能する、および／または静的に（例えば、個別化されたプログラムコードを生成するように）も、動的に（例えば、ランタイムにプログラム動作を変えるように）も機能する仮想化を含む。
【００４０】
例示的な方法は、第１の仮想化層を含むアーキテクチャを提供すること、および第１の仮想化層の上に第２の仮想化層を提供し、第１の仮想化層の上で、第２の仮想化は、プログラムの多様化されたコピーを受け取り、第１の仮想化層を使用してプログラムの実行を許すように構成されることを含むことができる。そのような方法は、本明細書で説明される多様化技術の使用を介してソフトウェアセキュリティを強化することができる。
【００４１】
例示的な方法は、プログラムコードの個別化されたコピーを生成すること、およびプログラムコードの個別化されたコピーの実行のための仮想マシンを提供することを含むことができ、仮想マシンは、ランタイムにプログラム動作を変えることができる。そのような方法は、本明細書で説明される多様化技術の使用を介して、ソフトウェアセキュリティを強化することができる。
【００４２】
便宜上、カスタムＩＳＡおよび変更されたＩＳＡを本明細書では、カスタムＩＳＡと呼ぶ。カスタムＩＳＡは、以下の特性を有するプログラムの様々なコピー（または「バージョン」）のセットを作成するのに使用されることが可能である。すなわち、（ｉ）セットの中の各コピーは、不正操作に対する適当なレベルの防御を有し、さらに（ｉｉ）１つのコピーに対する既存の攻撃を別のコピーに対してうまく行くように向け直すことが困難である。多くの選択は、生成することができる意味的に等価なプログラムの大きい空間をもたらす。或るアプローチは、この空間全体を考慮して、より大きい多様性を可能にし、あるいは、代替として、或るアプローチは、他の部分と比べて、より不正操作耐性が高いと考えられる、またはそうであると証明された、この空間の部分だけを考慮することができる。
【００４３】
不正操作耐性特性には、（ｉ）プログラムの静的解析を防止すること、（ｉｉ）プログラムの動的解析を防止すること、（ｉｉｉ）局所的な変更を防止すること、および（ｉｖ）大域的な変更を防止することが含まれる。最初の２つは、難読化の問題と緊密に関係しているのに対して、後の２つは、より不正操作耐性指向である。しかし、インテリジェントな不正操作は、少なくともある程度のプログラム理解を要求し、そのようなプログラム理解は、静的なバイナリを観察すること、実行中の実行可能ファイルを観察すること、または前述の２つの技術の組合せおよび／または繰り返しから通常、得られる。
【００４４】
様々なＩＳＡ、例えば、ＣＩＳＣ、ＲＩＳＣ、ならびに、より新しくは、Ｊａｖａ（登録商標）バイトコードおよび管理されたＭＳＩＬが、存在する。しかし、後者の２つは、いくつかの理由で、より容易に解析される傾向がある。第１に、バイナリは、通常、ハードウェア上で直接に実行されないが、実行に先立ってエミュレートされる、またはネイティブコードに変換される必要がある。これを可能にするために、コードとデータの間の境界が、知られている必要があり、不変のデータと再配置可能なアドレスとの間で混乱があってはならない。このことには、もちろん、ポータビリティという利点が伴う。ポータビリティの他に、設計原理は、型付きのメモリ管理、および検証可能性のサポートを含む。検証可能性を保証するのに、ポインタ演算が許されず、制御フローが制限されるなどする。型付きのメモリ管理を可能にするのに、オブジェクトの型について多くの情報を、実行環境に通信する必要がある。
【００４５】
これらの設計原理のすべてが、実行環境によって解析されるのが容易であるが、攻撃者によって解析されるのも同様に容易であるバイナリをもたらした。このことが、Ｊａｖａ（登録商標）バイナリと、管理されたＭＳＩＬバイナリの両方に関して、逆コンパイラの作成につながった。
【００４６】
一般に、ＩＳＡの設計原理が、ソフトウェア保護を促進する設計原理とますます相反するようになっている傾向が、存在する。
【００４７】
本明細書で説明されるとおり、この傾向に対抗する例示的な技術は、さらなる仮想化層（または、オプションとして、複数のさらなる仮想化層）を追加する。より具体的には、仮想化を使用して、ポータブルで、検証可能な、管理されたランタイム環境の上でカスタムＩＳＡをエミュレートすることができる。以下の構成を考慮されたい。すなわち、（ｉ）ＣＬＲの上で実行する環境に関するエミュレータ（例えば、カスタム仮想マシン）を書くこと、（ｉｉ）バイナリのバイナリ表現を選び、その表現をデータとしてエミュレータに追加すること、および（ｉｉｉ）元の実行可能ファイルの入口点でメインプロシージャにエミュレーションを開始させることである。この構成を与えられて、結果は、管理された、ポータブルで、検証可能なバイナリである。さらに、このバイナリは、ネイティブバイナリの攻撃者が、容易に、そのネイティブバイナリを選び、前述の構成をたどることができるので、ネイティブバイナリと同程度に保護されている。
【００４８】
一般に、バイナリに関して、経験および直観は、平均的なＩＡ３２バイナリが、平均的な管理されたバイナリと比べて、理解し、操作するのがはるかに複雑であることを示す。根底にあるいくつかの理由には、（ｉ）可変の命令長、（ｉｉ）コードとデータの間に明確な区別がないこと、および（ｉｉｉ）不変のデータと再配置可能なアドレスの間に明確な区別がないことが含まれる。命令（オペレーションコード＋オペランド）は、可変長（例えば、１〜１７バイト）を有することができ、命令は、バイト整列されてさえいればよく、ＩＡ３２上でパディングデータまたは通常のデータと混ぜ合わせることができるので、逆アセンブラを、容易に同期しないようにすることができる。コードとデータの間の明示的な分離は存在しないので、両方が、トランスペアレントに、読み取られ、書き込まれ、互いに変更可能に使用される。これは、解析するのが困難であり、攻撃者を混乱させることでよく知られているフィーチャである、自己変更コードを可能にする。
【００４９】
コードのバイナリ表現を容易に読み取ることができるという特徴は、自己検査機構を可能にするのに使用されてきたのに対して、制御フローに対する制限の欠如は、制御フロー平坦化や命令オーバラッピングなどの技術を可能にしてきた。
【００５０】
アドレスを計算することができ、さらに、アドレスが、通常のデータと容易に区別され得ないという事実は、バイナリを不正操作することを複雑にする。例えば、攻撃者は、バイナリ全体を再配置するのに十分な情報を有さないので、局所的な変更しか行うことができない。そのような所見を利用して、ＩＳＡを解析するのが困難であると実証される例示的なカスタムＩＳＡを生成することができる。そのようなＩＳＡは、セキュリティを加えることができる。
【００５１】
例示的な技術は、ＩＳＡにおける自己変更コード、および／または制御フロー平坦化、および／または命令オーバラッピングを含むことができるのに対して、本明細書で説明される特定の例は、命令の可変長に関する規定、およびより高い不正操作耐性のためのプログラムの諸部分のバイナリ表現の使用を含み、これらは、いくつかの自己検査機構と関係すると考えることができる。
【００５２】
ソフトウェアは、制御されていない仕方で共有されることを望まない事物をしばしば、知っている。例えば、試用バージョンは、所与のタスクを実行する機能を含むことができるが、時間制限が、その機能を余りにも長い間、使用することを防止する可能性がある。デジタルコンテナにおいて、ソフトウェアは、しばしば、コンテンツへの制御されたアクセスを与えるのに使用される。モバイルエージェントは、秘密のままである必要がある暗号鍵を含むことができる。
【００５３】
攻撃をくじくのに、例示的なアプローチは、（ｉ）異なるインストールに関してプログラムを違えるようにすること、（ｉｉ）あつらえの更新を介して時とともにプログラムを違えるようにすること、および（ｉｉｉ）ランタイムランダム化を介して実行のたびにプログラムを違えるようにすることを含む。
【００５４】
図２は、仮想マシン上でポータブルな実行可能ファイルを実行するフレームワークに関連して実施される例示的なセキュリティモジュール２００を示す。セキュリティモジュール２００は、フロントエンドプロセスモジュール２１０と、バックエンドプロセスモジュール２５０とを含む。フロントエンドプロセスモジュール２１０は、ＶＭをターゲットとする実行可能バイナリファイル１１０を読み取り、元のターゲットＶＭの変更されたバージョン、つまり、カスタムＶＭをターゲットとするカスタム実行可能バイナリファイル１５０を生成する。どちらの例においても、フロントエンドプロセスモジュール２１０は、ファイル１１０を使用して、ＶＭ記述１１５などの、元のターゲットＶＭについての情報を特定することができる。バックエンドプロセスモジュール２５０は、ＶＭ記述２１５を使用して、カスタムＶＭ１７０に関するコード、ｄｌｌなどを生成することができる。例えば、従来のＶＭは、共有ライブラリまたはｄｌｌ（例えば、「ネイティブ」ライブラリ）として送り出すことができ、そのような技術を、カスタムＶＭに関して使用することができ、ＶＭが、ＶＭの上で動作する場合、基礎をなすＶＭの詳細を、カスタムＶＭの形態および／または特徴で考慮に入れることができることを付記しておく。便宜上、ＶＭに適用される「カスタム」という語には、変更されたＶＭ（例えば、コードの元のターゲットＶＭの変更されたバージョン）を含むことができる。
【００５５】
．ＮＥＴ（商標）フレームワークに向けられた例において、フロントエンドプロセスモジュール２１０は、管理されたＭＳＩＬバイナリ１１０を読み取り、コードを数回、調べて、コードのＩＳＡを特定し、ターゲットとされるＶＭのＸＭＬ記述２１５を生成する。ＩＳＡが特定されると、モジュール２１０は、元のバイナリをカスタムバイトコード言語１５０に書き換えることができる。
【００５６】
図３は、バックエンドプロセスモジュール２５０が、ＸＭＬ記述２１５を読み取り、カスタムＶＭ１７２に関する管理されたｄｌｌを作成する例示的な方法３００を示す。バックエンドとフロントエンドの分離は、多少、人為的であるが、よりモジュール性の高い設計を可能にし、さらに、デバッグを円滑にすることができる。例えば、バックエンドプロセスモジュール２５０に、ｄｌｌを直接にコンパイルする代わりに、Ｃ＃コード１７４を出力するように命令することができる（例えば、１７２を参照）。その後、コード１７４を、別個に検査して、デバッグすることができる。
【００５７】
図４は、元のバイナリの様々な部分が保持される例示的な方法４００を示す。より具体的には、元のＶＭ実行可能バイナリ１１０は、ファンクション１１５（１）〜（Ｎ）を囲むラッパ１１１を含み、フロントエンドプロセスモジュール２１０は、すべてのファンクション１１５（１）〜（Ｎ）を、必要な引数を渡してＶＭを呼び出すラッパ１１３に書き換える。そのような例では、すべての引数は、オブジェクトのアレイで渡されることが可能である。「インスタンス」ファンクションの場合、方法４００は、「ｔｈｉｓ」ポインタも含む。方法４００は、各ファンクションを単一の構造として配置するように、すべてのファンクションに対して作用するので、フロントエンドプロセスモジュール２１０は、各ファンクションの入口点のＩＤを渡すことを規定することもできる。さらに、フロントエンドプロセスモジュール２１０は、適宜、戻されたオブジェクトが元のファンクションの戻り型にキャストされることを確実にするフィーチャを提供することもできる。
【００５８】
図５は、方法４００の或る特定の実装をより詳細に示す。この例では、フロントエンドプロセスモジュール２１０は、ＶＭを呼び出すラッパを使用して、ファンクションをスタブに変換している。より具体的には、ファンクション「ｆｏｏ」が、呼び出し「ＩｎｖｏｋｅＶＭ」でラップされる。
【００５９】
既に述べたとおり、データまたはデータ構造は、多様化のための手段を提供することができる。図６は、例示的な方法４５０を示し、例示的なフロントエンドプロセスモジュール２１０が、元のデータ構造の中にデータ１１７（１）〜（Ｎ）を有するバイナリ１１０を受け取り、変更された、またはカスタムのデータ構造１５６の中にデータ１１７（１）〜（Ｎ）を有するカスタムバイナリ１５０を出力する。方法４５０は、ファンクション１１５（１）〜（Ｎ）のラッピングも示すが、例示的な方法は、コードを多様化すること、データを多様化すること、および／またはコードおよびデータを多様化することによってカスタムバイナリを生成することができる。「データの多様化」という句には、データの多様化、およびデータ構造に基づく多様化を含むことができる。
【００６０】
ファンクションごとに元のプログラムを書き換えることを含む例示的な方法は、データ構造が、依然として、元のプログラムにおけるとおりに扱われるので、ガーベッジコレクションのような事柄が問題にならないという点においてしか利点を有さない。難読化のため、多様化のため、およびデータを不正操作耐性をより高くするために技術が適用される場合、変更が、ガーベッジコレクションのようなタスクをもたらすことができる。
【００６１】
前述した図１〜図６は、仮想化を、セキュリティを強化するのにどのように使用することができるか例示する。より具体的には、フロントエンドプロセスモジュールを使用して、カスタムバイナリコードを生成することができ、バックエンドプロセスを使用して、このカスタムバイナリコードを実行するカスタムＶＭを生成することができる。後段で説明される図７〜図１４は、ＩＳＡおよび／またはＶＭの特定のフィーチャが、多様化を介してセキュリティを強化するのにどのように使用することができるか例示する。
【００６２】
本明細書で提示されるマネージドコードおよび様々な例示的な技術に関して、ＣＬＲに関する管理されたＭＳＩＬと、Ｊａｖａ（登録商標）ランタイム環境（ＪＲＥ）に関するＪａｖａ（登録商標）バイトコードの間の選択は、様々な例示的な技術を、．ＮＥＴ（商標）からＪａｖａ（登録商標）ドメインに移すことができるので、多少、人為的である。さらに、Ｊａｖａ（登録商標）バイトコードを難読化するための技術は、管理されたＭＳＩＬバイナリに適用することができる。後段の説明は、「追加された」、つまり、カスタムの仮想化層から来る例示的な技術に主に的を絞る。例えば、インターネット配信を介した、配信されるコピーの自動化された多様化が、着実に受け入れられてきている。このため、例示的な技術のいずれかのオーバヘッド導入は、ますます経済的に実行可能となっている。
【００６３】
様々な例示的な技術は、人間対話がもはや要求されないポイントで保護を自動的に導入することができる。手に負えない数の多様な、意味的に等価なプログラムを生成することは、理論上、可能である。すなわち、３００の命令を有するプログラムを考慮し、命令ごとに、その命令の先頭にノーオペレーションを追加するか否かを選択されたい。このことにより、異なる２300の意味的に等価なプログラムがもたらされ、２300は、全宇宙における粒子の推定される数である１０87より大きい。
【００６４】
しかし、一意性だけは、結果のプログラムが、１つのインスタンスから得られた情報を別のインスタンス上にマッピングすることを複雑にするのに十分なだけ多様でなければならないので、必ずしも十分ではない。さらに、もたらされるプログラムは、好ましくは、破るのがそうたやすくないようでなければならない。様々な例示的な多様化技術の変域が、すべての意味的に等価なプログラムを含むものと期待するのは無理であるが、空間が大きいほど、内部で異なるプログラムを得ることが容易になるので、ダイバーシファイアの変域を最大化するように目標を設定することができる。
【００６５】
例示的なアプローチは、セマンティクス自体というよりむしろ、セマンティクスの既存の実装から始まる。いくつかのパラメータ化可能な変換を介して、異なるバージョンが獲得される。後段の様々な例では、独立に個別化されることが可能なＩＳＡのいくつかの構成要素が、特定される。
【００６６】
図７は、バイナリ構成要素５０５およびＶＭ実装構成要素５６０としてグループ化された例示的なフレームワーク特徴５００を示す。バイナリ構成要素５０５は、命令セマンティクス５１０、命令符号化５２０、オペランド符号化５３０、フェッチサイクル５４０、およびプログラムカウンタ（ＰＣ）−プログラム表現５５０を含む。これらの構成要素を、インタフェースが守られる限り、直交する仕方で個別化することができる。構成要素５０５は、カスタムバイトコード言語でバイナリを生成するのに、すなわち、例示的なカスタムＩＳＡを特定するのに十分である。さらに、多様化は、ターゲットＶＭまたはカスタムＶＭを多様化することによって行われてもよい（例えば、ＶＭ実装構成要素５６０を参照）。
【００６７】
図８は、実行モデルおよびインタフェース８００を示す。モデル８００は、コード８０２、データ構造８０４、メソッドフレームワーク８１０、およびカスタムバイナリ１５０を含む。図８において、矢印は、インタフェース依存関係を表し、アスタリスクは、いくつかの多様化可能な部分を表す。そのようなモデルを使用する例示的なアプローチは、モジュラー設計および独立の開発を可能にする。
【００６８】
モデル８００およびフレームワーク５００によれば、多様化には、（ｉ）より小さい命令の組合せを介して命令を構築することによって命令セマンティクスをランダム化すること、（ｉｉ）より大きいセマンティックオーバラップを可能にするように命令セマンティクスを選択すること、（ｉｉｉ）従来の線形コード表現を離れて、コードを、自己適応（スプレー）バイナリツリーなどのデータ構造として表すこと、（ｉｖ）オペレーションコードおよびオペランドに可変の長さを割り当てて、逆アセンブリを複雑にし、局所的な変更をより困難にすること、（ｖ）命令セットを制限して、コードを解析し、変更する際に攻撃者に与えられるオプションをより少なくすること、（ｖｉ）ビットパターン、オペレーションコード、およびオペランドの間のマッピングを可変にすることが含まれる。
【００６９】
図８におけるコード８０２は、フェッチ実行サイクルに基づく実行エンジンの高レベルの概観を与える。ＶＭの主な内部データ構造は、メソッドフレームワーク８１０として示される。前述したとおり、矢印は、インタフェース依存関係を示す。例えば、ＤｅｃｏｄｅＯｐｃｏｄｅは、いくつかのビットをフェッチすることができるものと見込む。
【００７０】
図９は、図５の命令セマンティクス５１０と、多様化のために使用することができるいくつかのフィーチャとを示す。マイクロオペレーションの概念が、命令セマンティクスの多様化を可能にすることができる。例えば、カスタムバイトコード言語（例えば、カスタムＩＳＡに準拠する）における命令は、所定のマイクロオペレーションセットの任意のシーケンスであることが可能である。ＭＳＩＬに関して、マイクロオペレーションのセットは、現在、検証可能なＭＳＩＬ命令と、以下を行う、いくつかのさらなる命令とを含む。すなわち、（ｉ）適切な実行に要求されるメタ情報を通信すること、および（ｉｉ）セマンティクスを変えること（さらに後段でより詳細に説明される）などのさらなるフィーチャを可能にすることである。
【００７１】
以上のことは、Ｐ６マイクロアーキテクチャにおけるマイクロオペレーション（μオペレーション）の概念と比較することができる。各ＩＡ３２命令が、一連のオペレーションに変換され、次に、これらのオペレーションが、パイプラインによって実行される。また、以上のことは、スーパーオペレーターと比較することもできる。スーパーオペレーターは、高いコストのオペレーション当たりのオーバヘッドを回避するとともに、実行可能ファイルサイズを小さくするように、より小さいオペレーションの組合せから自動的に合成された仮想マシンオペレーションである。
【００７２】
例示的な方法は、マイクロオペレーションのそれぞれをエミュレートするスタブを提供することを含んでもよく、これらのスタブを連結して、カスタムバイトコード言語（例えば、カスタムＩＳＡ）におけるより表現豊かな命令がエミュレートすることができ、多くのエミュレーションファンクションは、反映に大きく依拠することができることを付記しておく。
【００７３】
以下のＭＳＩＬ命令（加算、引数をロードする、および定数をロードする）、およびこれらの命令のエミュレーションスタブ（単純化されている）を使用する例を考慮されたい。すなわち、
【００７４】
【表１】
2010508583.tif 000003
【００７５】
命令選択段階中、以下のセマンティクスを使用してカスタムバイトコード命令を作成することを所望するものと想定されたい。すなわち、
ＣｕｓｔｏｍＩｎｓ  ｎ  ｉ：第ｎ番の引数をロードし、定数ｉをロードし、これら２つの値を加算する。
次に、この命令が、大きい「スイッチ」ステートメントの中の「ケース」ステートメント（例えば、１）に割り当てられる。ケースステートメントは、マイクロオペレーションの異なるエミュレーションスタブの連結である。すなわち、
【００７６】
【表２】
2010508583.tif 000004
【００７７】
不正操作耐性に関して、命令のセマンティクスの知識の欠如が、セマンティクスが規定されたマニュアルを有するのとは対照的に、プログラム理解を複雑にする。さらに１レベル進むのに、カスタム不正操作耐性ＩＳＡは、何らかの設計原理を遵守する命令セマンティクスを選択することができる。
【００７８】
図９を再び参照すると、条件付き実行５１２を、オプションとして、述語レジスタ５１３と併せて使用して、不正操作耐性を高めることができる。条件付き実行は、わずかに異なるコードをマージすることをさらに促進することができる。条件付き実行の存在下で、命令を、述語レジスタによって述語付きにすることができる。述語レジスタが偽に設定された場合、命令は、ｎｏ−ｏｐ（ノーオペレーション）として解釈され、さもなければ、命令は、エミュレートされる。このアプローチを使用して、レジスタは、わずかに異なるコードを実行することができるように、異なる実行パス上に、または異なる実行パスに沿って設定される。
【００７９】
例示的な方法は、元のプログラムにおける異なる２つのコンテキストにおいてコードシーケンスａ、ｂ、ｃ、およびコードシーケンスａ、ｄ、ｃを提供し、次に、コードをａ、［ｐ１］ｂ、［ｐ２］ｄ、ｃにマージして、ｐ１が、「真」に設定され、ｐ２が、「偽」に設定されて、第１のコンテキストでコードを実行し、逆に、第２のコンテキストでコードを実行することを含むことが可能である。１つまたは複数の述語レジスタを異なるように設定することの結果、異なるコードを実行することができる（例えば、ａ、ｂ、ノーオペレーション、ｃ、およびａ、ノーオペレーション、ｄ、ｃ）。
【００８０】
制限された命令セット５１４を使用して、不正操作耐性を高めることができる。例えば、カスタムＩＳＡはノーオペレーション５１５を欠き、表現可能なオペランド５１６を制限し、さらに／または少なくともいくつかの条件付き分岐５１７をなくすことができる。別のアプローチは、カスタムＶＭを特定のプログラムに合わせてもよく、このため、例示的なアプローチは、ＶＭが、そのプログラムによって要求されるオペレーションしかエミュレートすることができないことを確実にすることができる。
【００８１】
ノーオペレーションのないカスタムＩＳＡ５１５を再び参照すると、このアプローチは、「望ましくない」機能（例えば、ライセンス検査、または負傷したゲームキャラクタの健康を低下させること）を、そのような機能にノーオペレーションを上書きすることによって取り除く、一般的な攻撃技術を考慮に入れる。多くの場合、カスタムＩＳＡにノーオペレーション命令を含める理由はほとんどなく、この命令を有さないことは、望ましくないコードをパディングによって消そうとする攻撃者の試みを複雑にする。
【００８２】
表現可能なオペランド５１６を制限することに関して、統計は、例えば、約６００のＪａｖａ（登録商標）プログラムからの整数リテラル（全部で１４０万行）のうち、８０％が、０〜９９までの範囲内にあり、９５％が、０から９９９までの範囲内にあり、９２％が、２のべき乗、または２のべき乗足す１もしくは２のべき乗引く１であることを示す。このため、例示的なカスタムＩＳＡは、表現可能なオペランドの数を制限することができ、やはり、攻撃の自由が制限される。
【００８３】
別の例示的なアプローチは、少なくともいくつかの条件付き分岐５１７の使用を変更する、または制限することができる。例えば、通常、各条件に関して２つのバージョンが存在する。すなわち、「条件が設定されている場合、分岐する、および条件が設定されていない場合、分岐する」である。２つの分岐の使用は冗長であるので、カスタムＩＳＡは、１つのバージョンだけが使用され、もう片方のバージョンは、ＩＳＡに含められないようにコードを書き換えることを含むことができることになる。この例示的な技術は、例えば、ライセンス検査が、通し番号の有効性に依存して条件的に分岐する場合、有用である可能性がある。それは、攻撃者が、分岐条件を単に反転させることを防止するだろう。
【００８４】
図１０は、多様化のために使用されることが可能な命令符号化の様々な態様を有する図５の命令符号化ブロック５２０を示す。より具体的には、その態様には、可変命令サイズ５２２、物理的オーバラップのための単項符号化５２４、非局所的セマンティクス５２６、および復号構造を再構成すること５２９が含まれる。
【００８５】
命令セマンティクスが特定されると、これらの命令のためのオペレーションコード符号化を特定する必要性が、存在する。従来のアーキテクチャに関するすべてのオペレーションコードのサイズは、通常、一定であり、またはわずかにしか可変でない。例えば、ＭＳＩＬオペレーションコードは、通常、１バイトであり、それほど頻度の高くない命令に関して２バイトのオペレーションコードを可能にするエスケープ値（０ｘｆｅ）を有する。制限された変動性は、テーブル解釈を介した高速のルックアップを容易にする。しかし、より一般的に、任意のプレフィックスコード（他のコードワードのプレフィックスであるコードワードは、存在しない）が、明瞭な解釈を可能にする。
【００８６】
最も一般的な形態において、オペレーションコードをセマンティクスに復号することを、バイナリツリー走査を介して行うことができる。復号は、通常、ルートノードで始まり、０ビットが読み取られると、左の子ノードへの移動が行われ、１ビットが読み取られると、右の子ノードへの移動が行われる。リーフノードに到達すると、オペレーションコードは成功して複合されている（例えば、命令のセマンティクスをエミュレートするケースステートメントへの参照を含むリーフノードを考慮されたい）。
【００８７】
カスタムＩＳＡが、任意のオペレーションコードサイズを許す場合、不正なオペレーションコードなしに、ｎ個の命令に関する可能な符号化の数は、以下の数式によって与えられる。すなわち、
【００８８】
【数１】
2010508583.tif 000005
【００８９】
式３において、この分数は、ｎ個のリーフ（カタラン数）を有する平面バイナリツリーの数を表すのに対して、階乗は、リーフへのオペレーションコードの割り当てを表す。可能な最も短い符号化、すなわち、ｌｏｇ２（ｎ）ビットを有する固定のオペレーションコードサイズが選択された場合、それは、不正なオペレーションコードを導入する可能性がある。この場合、可能な符号化の数は、以下の表現（式４）によって与えられる。すなわち、
【００９０】
【数２】
2010508583.tif 000006
【００９１】
カスタムＩＳＡが、最小限の固定オペレーションコードサイズ以外の理由で不正なオペレーションコードを許した場合、さらに多くの可能性が生じるだろう。しかし、このことは、利点をもたらすことなしに、カスタムＩＳＡにおいて書かれるバイナリのサイズを増大させる可能性がある。
【００９２】
．ＮＥＴ（商標）フレームワーク（例えば、ＭＳＩＬ）を対象とする、本明細書で提示される様々な例において、以下のモードをサポートすることができる。すなわち、（ｉ）テーブルルックアップを伴う固定長のオペレーションコード、（ｉｉ）わずかに可変の命令サイズを可能にするマルチレベルテーブル符号化（より長いオペレーションコードに関して、エスケープコードが使用される）、および（ｉｉｉ）復号のためのバイナリツリー走査を伴う任意長のオペレーションコードである。そのようなモードを、適宜、他のフレームワークに適用することができる。
【００９３】
不正操作耐性に関して、この場合も、ビットシーケンスからセマンティクスへのマッピングについて知らないことは、例えば、マニュアルの中でそのような情報を有することと比べて、攻撃者に関して或る学習曲線を導入する。不正操作耐性特性を可能にするような仕方でマッピングを選択する、いくつかのさらなるアプローチが、存在する。
【００９４】
既に述べたとおり、図１０の命令符号化ブロック５２０は、可変命令サイズアプローチ５２２を含む。例えば、カスタムＩＳＡは、ＣＩＳＣバイナリにおいて許されるよりもさらに大きい、オペレーションコードの長さの変動を生じさせてよい。また、可変命令サイズを使用して、局所的な変更をより複雑にすることもできる。一般に、より大きい命令は、より小さい命令に単に置き換わることが、そのことにより、次の命令が上書きされるため、可能でない。また、カスタムＩＳＡは、より小さい制御移行命令でない命令が、より大きい命令に置き換わることができないことを確実にすることもできる。例えば、このことは、そのような命令が、制御フローを次の命令に許すようにパディングによって消されることが可能でないことを確実にすることによって達せられることが可能である。
【００９５】
命令のそれぞれに、或る範囲のビット数（例えば、約６４ビットから約１２７ビットまでの間）の一意のサイズが割り当てられることが可能な、６４個の命令を有するコードまたはＩＳＡを考慮されたい。明らかに、より大きい命令は、より小さい命令のスペースに入らない。さらに、より小さい命令は、より大きい命令のスペースに入る。それでも、制御が、次のビットにまで抜ける際、制御が次の命令に流れることを確実にするように残りのビットをノーオペレーションで埋めるのに利用可能な命令は、存在しない。このため、このスキームの下では、制御移行命令を最長にして、攻撃者が、望むことを行うことができる別のロケーションにエスケープすることを防止することが有用である。
【００９６】
また、命令符号化ブロック５２０は、例えば、物理的オーバラップを実現する単項符号化アプローチ５２４も含む。単項符号化アプローチは、物理的オーバラップを大きくする、または最大化することによって、プログラムを込み入らせることができる。例えば、そのようなアプローチは、別の命令の途中にジャンプして入り、別の命令を復号することを始めることができる可能性がある。このアプローチを、良好な符号化を選択することによって円滑にすることができる。例えば、単項符号化を使用して、オペレーションコード（０、０１、００１、．．．０63１）を符号化することができる。この例では、命令の先頭の後に１ビット、ジャンプすると、別の命令に出会う可能性が高い。すなわち、
１：ａｄｄ
０１：ｍｕｌ
００１：ｓｕｂ
０００１：ｄｉｖ
以上、４つの命令には、単項符号化を使用してオペレーションコードが割り当てられている。この例では、復号が、分割命令（ｄｉｖ）の第２のビットで始まった場合、減算命令（ｓｕｂ）が、明らかにされる。同様に、分割命令、減算命令、および乗算（ｍｕｌ）命令の最期のビットを調べることは、加算命令を明らかにする。
【００９７】
命令符号化と関係するカスタムＩＳＡに関する別のアプローチは、非局所的なセマンティクス５２６を使用する。配布されるコピーごとに一意のバイトコード言語を有することは、攻撃者に対する相当な障壁を立てる。
【００９８】
一般に、ＩＳＡに関して、（ｉ）ビットパターンから命令へのマッピング、（ｉｉ）命令のセマンティクス、（ｉｉｉ）ビットパターンからオペランドへのマッピング、（ｉｖ）データ構造の表現などについて利用可能なドキュメントは、全く存在しない。しかし、そのようなマッピングまたは表現は、静的な点検、または動的な点検を介して攻撃者によって最終的に学習される可能性がある。攻撃をくじくのに、カスタムＩＳＡは、非局所的なセマンティクス５２４を使用して、ビットパターンが、異なる実行パスに沿って異なる意味を有することを確実にすることができる。
【００９９】
バイナリプログラムは、プロセッサによって意味を与えられる「１」と「０」のシーケンスに過ぎない。ビットパターンと解釈の間の意味は、通常、ＩＳＡによって決定される。従来のアーキテクチャ上で、或る命令のオペレーションコードが、所与のビットパターンによって表される場合、このパターンは、このパターンが現れるすべての箇所で、すべてのバイナリに関して一定である。カスタムＩＳＡは、任意の特定のビットパターンを可変にすることができ、攻撃者に対する相当な障壁を立てるのに、すべての命令ビットパターンが可変にされる必要があるわけではないことを付記しておく。このため、非局所的なセマンティクスブロック５２６は、例えば、或る命令に関するオペレーションコードに関して、可変ビットパターンブロック５２７アプローチを含む。
【０１００】
カスタムＩＳＡにおいて、ビットパターンは、以前に実行されたコードに依存して、意味が割り当てられることしか可能でない。解釈が、以前に実行されたコードに依存するようにするのに、（完全に指定された）入力に依存して、カスタムＩＳＡは、異なる実行パスに沿って或るプログラムポイントに到達することを許すことが可能である。しかし、そのようなカスタムＩＳＡは、それでも、所与のプログラムポイントにおけるビットの解釈を支配することを望む可能性がある。この変動性に対処するのに、カスタムＩＳＡは、解釈変更を、他の何らかのイベントの副次的作用として暗黙にではなく、明示的にすることができる。このため、非局所的なセマンティクスブロック５２６は、例えば、以前のコード実行に基づいて意味を割り当てる、ビットパターンブロック５２８アプローチを含む。さらに、非局所的なセマンティクスブロック５２６は、例えば、異なる実行パスに沿ってプログラムポイントに到達するように、カスタムＩＳＡにおいて明示的な解釈変更にリンクする。
【０１０１】
例示的な方法は、復号構造を再構成するように命令符号化を使用してプログラムの多様化コピーを生成して、２つ以上の実行パスに沿ってプログラムにおける或るポイントに到達することを許すことを含み、そのポイントにおけるビットパターンの割り当てられた意味は、そのポイントに至る実行パスに依存する。例えば、そのような方法は、異なる実行パスに関して異なることが可能な、以前のコード実行に基づく意味を割り当てることができる。
【０１０２】
カスタムＩＳＡは、或る特定の解釈状態における実行環境に到達することに関して複雑度を制限しないことを目指すことができる。つまり、そのようなアプローチは、異なる解釈状態における異なる実行パスから或るプログラムポイントに到達することが許される場合、異なる解釈状態がどのようなものであるかにかかわらず、或る単一のターゲット解釈状態に移ることが比較的容易であることができることを確実にすることができる。
【０１０３】
或る特定のアプローチには、構造を再構成すること５２９がかかわる。例えば、解釈を変更することは、復号ツリーを再構成することに他ならないとすることができる。以前の観察を考慮に入れて、カスタムＩＳＡは、多様化の限られた形態しか許さないことができる。この目的で、カスタムＩＳＡは、サブツリー（または他のサブ構造）があちこち動かされることが可能な選択されたレベルを有することができる。そのような選択は、どれだけの数の異なる解釈が可能であるかと、異なる可能性がある解釈状態のセットから決められた解釈に到達するのがどれだけ容易であるかとの間のトレードオフである。
【０１０４】
或る例において、ツリー構造の第３のレベルを選択することを考慮されたい。最短のオペレーションコードが３ビットであるものと想定すると、このことにより、８！個の解釈状態が可能になる一方で、いずれの解釈状態も、せいぜい８回のマイクロオペレーションで到達可能である。そのようなアプローチを、ＭＳＩＬマイクロオペレーションのセットに適用することができる。例えば、以下のマイクロオペレーションを考慮されたい。すなわち、
位置、ｐｏｓｉｔｉｏｎ１とｐｏｓｉｔｉｏｎ２においてノードを交換するＳｗａｐ（ＵＩｎｔ３  ｐｏｓｉｔｉｏｎ１，ＵＩｎｔ３  ｐｏｓｉｔｉｏｎ２）
ラベルを有する（ラベルがどこにあるかにかかわらず）ノードと、位置、ｐｏｓｉｔｉｏｎにおけるノードとを交換する、Ｓｅｔ（ＵＩｎｔ３  ｌａｂｅｌ，ＵＩｎｔ３  ｐｏｓｉｔｉｏｎ）
テーブル解釈の場合、このことは、２レベルのテーブル解釈として実施される。第１のレベルは、スワップされることが可能な他のテーブルを参照することができる。
【０１０５】
以上の例において、マイクロオペレーションは、ＭＳＩＬ命令に概ね対応し、オペランド型は、ＭＳＩＬオペランド型に概ね対応する。オペランドを使用するマイクロオペレーションエミュレーションスタブは、ファンクションコールを使用して、オペレーションコード符号化を、直交に多様化することができることを確実にする。そのようなコールバックは、呼び出し元であるカスタムＶＭ命令（例えば、命令セマンティクス５１０の例を参照）を識別する引数「ｉｎｓＮｒ」をさらに渡す。これは、異なるカスタムＶＭ命令に関し異なってオペランドを符号化することを可能にする。スタブの連結のため、任意の数のオペランドが、オペレーションコードの後に続くことができることに留意されたい。このため、オペランド符号化５３０に関するアプローチは、そのような技術を含むことが可能である。このため、オペレーションコード符号化を多様化することに関する類似したアプローチを、命令符号化の場合と同様に作成することができる。
【０１０６】
フェッチサイクルを多様化することは、「人為的な」形態の多様化と考えられることが可能である。図１１は、「フィルタ」５４２を使用する様々なアプローチを含むものとしてフェッチサイクルブロック５４０を示す。基本的な「非カスタムの」フェッチサイクルは、現在のプログラムカウンタ（ＰＣ）に依存して、単に、カスタムバイトコードバイナリからいくつかのビットを取得する。しかし、１つまたは複数のフィルタ５４２の使用が、不正操作耐性を向上させるカスタムフェッチサイクルを可能にする。そのような１つまたは複数のフィルタは、バイナリにおける実際のビットを、ＶＭによって解釈されるであろうビットに変換することができる。
【０１０７】
フェッチサイクル５４２は、要求された１つまたは複数のビットを他の情報と組み合わせることによって複雑度を増加させることが可能である。例えば、要求された実際のビットを、プログラム５４３の他の部分と組み合わせることができる。そのようにして、プログラムは、プログラムの１つの部分を変更することが、他の部分も影響を及ぼす可能性があるので、より相互依存的になる。他のフィルタアプローチは、１つまたは複数のビットをランダムな値５４４（例えば、秘密鍵から導き出された）と組み合わせるフィルタと、１つまたは複数のビットをプログラムカウンタ（ＰＣ）５４５と組み合わせるフィルタとを含んで、パターンマッチング技術を複雑にする。
【０１０８】
コードの最も慣例の表現は、バイトの線形シーケンスとしてである。そのようなアプローチでは、プログラムカウンタ（ＰＣ）は、単に、実行されるべき次のバイトをポイントし、制御移行は、相対オフセットまたは絶対アドレスとして、実行を続けるべきバイトを通常、指定する。これを、基本的に、バイトのアレイとしてコードを表す構造とみなすことができる。
【０１０９】
図１２は、プログラムカウンタ−プログラム表現ブロック５５０を、アレイ５５３、ツリー５５４、リンクリスト５５５、およびハッシュテーブル５５６を含む様々な構造的アプローチと一緒に示す。カスタムＩＳＡが、図１３のスプレーツリー１３２０および１３３０などのスプレーツリーとしてコードを表すことができる。コードは、スプレーツリーとして表してもよいが、カスタムＩＳＡに関する例示的なアプローチは、代替として、またはさらに、データをスプレーツリー、または他の選択された構造において表現して、セキュリティを強化することができる。一般に、そのようなアプローチは、従来の線形表現（例えば、図１３の線形アプローチ１３１０を参照）より容易に、多様化をもたらすことができる。
【０１１０】
スプレーツリーは、いくつかの利点を有する。すなわち、それらは、自己平衡型であり、コードの自動再配置が可能になるだろう。さらに、それらは、任意のシーケンスに関するならしコストの点で、ほぼ最適である。最後に、最も新たにアクセスされたノードは、ツリーのルートの近くにある傾向にあり、これは、ほとんどの実行可能ファイルに存在する空間的および時間的な局所性の部分的な活用を可能にする。
【０１１１】
自己平衡特性のため、コードは、或るコード断片に達した実行パスに依存して、メモリの中の多くの異なるロケーションに存在することができることになる。コード断片は、制御フロー移行のためにコード断片を参照する方法が存在し、したがって、制御が、これらのコード断片に移された際に、これらのコード断片を取り出すことができる限り、あちこち動かすことができる。例示的な構造アプローチは、制御移行が、制御が移される必要があるノードのキーを指定する場合、スプレーツリーにおけるノードのキーを使用する。そのような例では、制御フローのターゲットは、ノードであることが要求される（すなわち、ノード内に含まれるコードの途中に容易にジャンプして入ることができない）。実際上、このことは、実行が、基本ブロックごとに新たなノードを開始することを意味する。フォールスルーパスを、すべての制御フローを明示的にすることによって扱うことができる。そのような例では、すべての制御フローターゲットを、ターゲットコードを含むノードのキーとして指定することができる。さらに、ノードにおけるコードのサイズは、一定である可能性がある。さらに、ノードが基本ブロック全体を含むには小さすぎる場合、その基本ブロックは、別のノードにオーバフローして、その別のノードにおいて実行を続けることができる。
【０１１２】
図１３は、階数ファンクション「Ｆａｃ」に関する所与の線形アプローチ１３１０のためにスプレーツリー１３２０、１３３０を使用する例示的なアプローチを示す。例えば、ファンクション「Ｆａｃ」が、初めて呼び出されると、部分（２）に示されるとおり、キー１を有するノードが参照され、ルートまでパーコレートさせられる。この例で注目に値するもう１つのことは、このコードが検証を受けさせられないので、呼び出しがもはや、ファンクションシグネチャを指定しなくてもよいことである。
【０１１３】
そのような技術が、単純に実施された場合、ポインタのみが、あちこち動かされ、実際のコードは、ヒープ上で同じ場所に留まる。このことをさらに複雑にすることに、それらのノードの実際の内容（プリミティブ型の）の明示的な交換が行われる可能性があり、または代替として、新たなコードバッファの割り当てが、そのコードバッファを、割り当てられたスペースにコピーすることと一緒に行われる可能性があり、場合により、再暗号化を伴い、さらに／または異なるガーベッジパディングが伴う。
【０１１４】
図７のフレームワーク特徴５００を再び参照すると、例示的なアプローチを、ＶＭ実装５６０に適用することができる。いくつかのアプローチが、図１２に示される。所与の内部実装に関して、評価スタックは、ＩＳＡに基づいては特定されない（例えば、構成要素５０５を考慮されたい）。そのような例では、マイクロオペレーションに関するエミュレーションスタブは、「ポップ」や「プッシュ」などのいくつかのオペレーションをサポートするインタフェースだけにしか依拠しないことができる。スタックデータ構造５６２の内部実装に関する例示的なアプローチは、例えば、アレイ、リンクリストなどを介して、独立した多様性を導入する。例示的なアプローチは、オプションとして、そのようなインタフェースのいくつかの異なる実装をもたらすことができる。
【０１１５】
別のアプローチは、ＶＭ生成を多様化すること５６４を目指す。例えば、前段で規定された形態の多様化に関するパラメータが、完全に指定されると、例示的なバックエンドプロセスが、様々なロケーションからのコードスニペット、および何らかの自己生成されたコードを組み合わせて、カスタムＶＭの実装のために管理されたＣ＃表現をアセンブルすることができる。代替として、例示的なバックエンドプロセスは、ｄｌｌを直接に出力することができる。
【０１１６】
別の例示的なアプローチには、例えば、ソフトウェア最適化、ソフトウェア難読化、ソフトウェア多様化（の非仮想化ベースのアプローチ）などの、様々なドメインからの既存のコード変換のランダム化可能なバージョンを使用して、ｄｌｌを多様化すること５６６がかかわる。
【０１１７】
本明細書で説明される様々な例示的な技術は、一般に、いくらかのオーバヘッドをもたらすが、デジタル権利管理、センシティブな情報（例えば、政府の情報、専有の情報など）、ライセンスなどがかかわる場合、そのようなオーバヘッドを次いで、多様化を介してもたらされる強化されたセキュリティを所与として、許容することができる。そのような事例において、多様化技術は、通常、ターゲットとされる領域に適用され、ある程度の同時の、つまり、「リアルタイムの」実行を要求するランタイムフィーチャには適用されない可能性がある。例えば、多様化が、デジタル権利管理に関連するコードに適用され、実行に先立って何らかの形態のデジタル権利ＯＫを要求する、関連するコードには適用されない可能性がある。
【０１１８】
仮想化は、多様化と不正操作耐性の両方に関して広範な可能性を開く。実行環境を制御することは、攻撃者の作業を複雑にする相当なレバレッジをもたらす。様々な例は、仮想化の概念に基づくソフトウェア保護に関する或る特定のフレームワークを参照するが、多様性フィーチャおよび／または不正操作耐性フィーチャが、概ね独立した仕方で導入されることが可能な、様々なアプローチも、特定されてきた。モジュラー開発および／またはモジュラー展開を、使用することができる。
【０１１９】
図１５は、様々な例示的な構成要素を実装し、例示的なシステムを形成する際に使用することができる例示的なコンピューティングデバイス１５００を示す。例えば、図１のシステムのサーバとクライアントが、デバイス１５００の様々なフィーチャを含むことが可能である。
【０１２０】
非常に基本的な構成において、コンピューティングデバイス１５００は、通常、少なくとも１つの処理装置１５０２と、システムメモリ１５０４とを含む。コンピューティングデバイスの正確な構成およびタイプに依存して、システムメモリ１５０４は、揮発性（ＲＡＭのように）、不揮発性（ＲＯＭ、フラッシュメモリなどのように）、またはこの２つの何らかの組合せであってもよい。システムメモリ１５０４は、通常、オペレーティングシステム１５０５、１つまたは複数のプログラムモジュール８０６を含み、プログラムデータ１５０７を含むことができる。オペレーティングシステム１５０６は、構成要素（特性およびイベントを含む）、オブジェクト、継承、多相性、反映をサポートする構成要素ベースのフレームワーク１５２０を含み、ワシントン州レドモンド所在のマイクロソフトコーポレーションによって製造される．ＮＥＴ（商標）フレームワークのＡＰＩ（アプリケーションプログラミングインタフェース）などの、オブジェクト指向構成要素ベースのＡＰＩを提供する。また、オペレーティングシステム１５０５は、カスタムＩＳＡおよび／またはカスタムＶＭを有する例示的なフレームワークなどの、ただし、そのようなフレームワークに限定されない、例示的なフレームワーク１６００も含む。さらに、コンピューティングデバイス１５００は、カスタムＩＳＡおよび／またはカスタムＶＭを生成するためのソフトウェアモジュールを含むことができる。さらに、コンピューティングデバイス１５００は、カスタムＩＳＡおよび／またはカスタムＶＭを試験するためのソフトウェアモジュールを含むことができる。コンピューティングデバイス１５００は、少なくとも一部には、カスタムコードを実行するように、カスタムコードおよび／またはカスタムＶＭを生成するためのソフトウェアモジュールを含むことができる。デバイス１５００は、破線１５０８によって境界を画定された非常に基本的な構成のものである。この場合も、端末装置は、より少ない構成要素を有することができるが、そのような基本的構成を有することができるコンピューティングデバイスと対話する。
【０１２１】
コンピューティングデバイス１５００は、さらなるフィーチャまたは機能を有してもよい。例えば、コンピューティングデバイス１５００は、例えば、磁気ディスク、光ディスク、またはテープなどの、さらなるデータ記憶装置（リムーバブルな記憶装置、および／またはリムーバブルでない記憶装置）も含むこともできる。そのようなさらなるストレージが、リムーバブルなストレージ１５０９およびリムーバブルでないストレージ１５１０によって図１５に示される。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなどの情報の格納のために任意の方法または技術で実装された、揮発性媒体と不揮発性媒体、リムーバブルな媒体とリムーバブルでない媒体を含んでよい。システムメモリ１５０４、リムーバブルなストレージ１５０９、およびリムーバブルでないストレージ１５１０はすべて、コンピュータ記憶媒体の例である。コンピュータ記憶媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、ＤＶＤ（ｄｉｇｉｔａｌ  ｖｅｒｓａｔｉｌｅ  ｄｉｓｋｓ）または他の光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気記憶装置、あるいは所望される情報を格納するのに使用することができ、コンピューティングデバイス１５００がアクセスすることができる他の任意の媒体が含まれるが、以上には限定されない。いずれのそのようなコンピュータ記憶媒体も、デバイス１５００の一部であってよい。また、コンピューティングデバイス１５００は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイスなどの入力デバイス１５１２を有することも可能である。また、ディスプレイ、スピーカ、プリンタなどの出力デバイス１５１４を、含んでもよい。これらのデバイスは、当技術分野でよく知られており、本明細書で詳しく説明する必要はない。
【０１２２】
また、コンピューティングデバイス１５００は、デバイスが、ネットワーク（例えば、前述したＷｅｂまたはインターネットネットワーク１０３を考慮されたい）などを介して、他のコンピューティングデバイス１５１８と通信することを可能にする通信接続１５１６を含むこともできる。通信接続１５１６は、通信媒体の一例である。通信媒体は、通常、搬送波などの変調されたデータ信号、または他のトランスポート機構で、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータによって実体化することができ、通信媒体には、あらゆる情報配信媒体が含まれる。「変調されたデータ信号」という用語は、信号内に情報を符号化するように特性の１つまたは複数が設定または変更された信号を意味する。例として、限定としてではなく、通信媒体には、有線ネットワークまたは直接有線接続などの有線媒体、ならびに音響媒体、ＲＦ媒体、赤外線媒体、およびその他の無線媒体などの無線媒体が含まれる。本明細書で使用されるコンピュータ可読媒体という用語には、記憶媒体と通信媒体がともに含まれる。
【０１２３】
主題を、構造上の特徴、および／または方法上の動作に特有の言い回しで説明してきたが、添付の特許請求の範囲において規定される主題は、前述した特定の特徴または動作に必ずしも限定されないものと理解されたい。むしろ、前述した特定の特徴および動作は、特許請求の範囲を実施する例示的な形態として開示される。
【図１】
2010508583.tif 000007
【図２】
2010508583.tif 000008
【図３】
2010508583.tif 000009
【図４】
2010508583.tif 000010
【図５】
2010508583.tif 000011
【図６】
2010508583.tif 000012
【図７】
2010508583.tif 000013
【図８】
2010508583.tif 000014
【図９】
2010508583.tif 000015
【図１０】
2010508583.tif 000016
【図１１】
2010508583.tif 000017
【図１２】
2010508583.tif 000018
【図１３】
2010508583.tif 000019
【図１４】
2010508583.tif 000020
【図１５】
2010508583.tif 000021
【国際調査報告】
2010508583.tif 000022
2010508583.tif 000023