(57)【特許請求の範囲】
【請求項１】
コードのコンパイルの一環として、前記コードの一部を難読化するための１つまたは複数の変更を生成するために、開発プロジェクト用の前記コードをコンパイラ内で変更することと、
前記コードの一部を難読化するために前記コンパイラ内で生成された前記変更を有する前記コードのコンパイル済みのバージョンを、前記コンパイラによって形成することと、
を含む方法において、
前記変更することは、
前記開発プロジェクト用のソースコード（２０２）と前記ソースコードに行うための前記変更を示すソース難読化コードとを結合する中間言語コード（２１０）を生成するために、前記コードをフロントエンドコンパイラでプリコンパイルすることによって、前処理することと、
前記コードのコンパイル中に前記コンパイラ内で前記中間言語コード（２１０）に前記変更を適用することによって、前記コードを難読化することと、
を含むことを特徴とする方法。
【請求項２】
難読化により保護する前記ソースコードの特定の部分を指定し、前記部分についての変更を定義する難読化記述を取得することであって、前記難読化記述は、コンパイル中にソースコードの前記指定された部分についての前記変更を実装するようにコンパイラモジュール（１１４）に指示するのに適切な命令により構成されることと、
前記変更を生成するために、前記難読化記述を前記コードに適用することと、
をさらに含む、請求項１に記載の方法。
【請求項３】
前記難読化記述に基づいて前記コードの部分を選択的に難読化することをさらに含み、前記難読化記述が、保護すべき前記コードの１つまたは複数の部分と、前記１つまたは複数の部分に行うべき１つまたは複数の変更とを指定するように構成される、請求項２に記載の方法。
【請求項４】
前記変更を生成するために、前記コードのコンパイルの一環として、１つまたは複数の難読化アルゴリズムをオンザフライで形成することをさらに含み、異なる難読化アルゴリズムは、前記コードの少なくとも２つの異なる部分のために形成され、前記コードの少なくとも２つの異なる部分に適用される、請求項２に記載の方法。
【請求項５】
複数の部分の保護を個別化するために、前記難読化記述中の前記指示文によって指示されるように、異なる難読化機能および変更を前記複数の部分に個々に適用することを含む、前記コードのコンパイルの一環として前記コードの前記複数の部分を変更すること、
をさらに含む、請求項２に記載の方法。
【請求項６】
前記変更が、
コードブロックの並べ替え、コール転送、クローン関数の作成、シンボル属性および挙動への変更、コードブロックのセグメント化、コールの置換、前記コードの異なる部分間の絶対参照の設定、前記コードへのエントリポイントの変更、
チェックサム、検証モジュール、もしくは検証コードの挿入、
前記コードの一部の暗号化および復号化／再暗号化コードの付加、または、
ランタイムにおいて難読化された形式で実行させるための少なくとも１つの関数の仮想化、
のうちの１つまたは複数を含む、請求項１に記載の方法。
【請求項７】
コンピューティングデバイスによって実行される場合にコンパイラモジュールを実装する命令を記憶する、１つまたは複数のコンピュータ読取可能な記憶媒体であって、前記コンパイラモジュールは、
コンパイル中に発生する難読化を定義する指示文を取得すること（４０２）であって、前記指示文は、保護すべき開発プロジェクト用のソースコードの部分を示し、前記示される部分を難読化するために行うべき変更を示す、取得することと、
前記ソースコードと前記指示文を実装するためのコードとを結合する中間言語コードを形成するために、前記ソースコードをフロントエンドコンパイラでプリコンパイルすることによって、前処理すること（４０４）と、
前記コンパイラモジュールによる前記中間言語コードのコンパイル中に、前記指示文に従って前記示される部分を変更するために、前記指示文を前記中間言語コードに適用すること（４０６）と、
前記指示文の前記中間言語コードへの適用によって生成されたコードをコンパイルすること（４０８）と、
前記コンパイラモジュールによって前記中間言語コードの前記コンパイル中に難読化が生成された、前記開発プロジェクト用の保護されたコンパイル済みコードを出力すること（４１０）と、
を含む動作を実行するように構成される、１つまたは複数のコンピュータ読取可能な記憶媒体。
【請求項８】
コンピューティングデバイスによって実行される場合にコンパイラモジュールを実装する命令をさらに記憶するコンピュータ読取可能な記憶媒体であって、前記コンパイラモジュールが、前記ソースコード２０２に関連付けられる難読化記述２０４を生成するために難読化モジュール（１１６）を呼び出すように構成され、前記難読化記述（２０４）は、難読化すべき前記ソースコード２０２の少なくともいくつかの部分を指定し、これらの部分に行う変更を定義するように構成され、前記難読化記述２０４は、対応する難読化を実装するために前記コンパイラモジュール１１４によって実行され得る前記指示文２０６を含む、請求項７に記載のコンピュータ読取可能な記憶媒体。
【請求項９】
コンピューティングデバイスによって実行される場合にコンパイラモジュールを実装する命令をさらに記憶するコンピュータ読取可能な記憶媒体であって、前記コンパイラモジュールが、前記中間言語に拡張されるのに適切なフォーマットの指示文（２０６）を有するランタイムファイルを生成するために、前記難読化記述（２０４）を構文解析し、解釈するように構成された機能性を含む、請求項７に記載のコンピュータ読取可能な記憶媒体。
【請求項１０】
コンピューティングデバイスによって実行される場合にコンパイラモジュールを実装する命令をさらに記憶するコンピュータ読取可能な記憶媒体であって、前記コンパイラモジュールが、開発者によって適切なインターフェースを通じて行われる選択に応じて、指示文（２０６）を自動的に作成し、前記指示文（２０６）は、前記開発者によって保護のために選択される前記ソースコード（２０２）の部分を識別するように構成される、請求項７または８に記載のコンピュータ読取可能な記憶媒体。
【請求項１１】
コンピューティングデバイスによって実行される場合にコンパイラモジュールを実装する命令をさらに記憶するコンピュータ読取可能な記憶媒体であって、前記指示文（２０６）が、種々のタイプの変更、難読化アルゴリズム、設定、および前記変更を実現するためにコンパイル中に解釈され、適用され得る他のパラメータを定義するようにさらに構成される、請求項１０に記載のコンピュータ読取可能な記憶媒体。
【請求項１２】
処理システムと、
請求項１に記載の方法を実行するように構成された統合開発環境（ＩＤＥ）を実装するために前記処理システムのハードウェアにより少なくとも部分的に動作可能である１つまたは複数のモジュール（１１４、１１６）と、
を備える、コンピューティングデバイス。
【請求項１３】
ソフトウェア開発プロジェクト用のソースコード（２０２）の作成を可能にするための開発インターフェースを公開すること（５０２）
をさらに備える、請求項１２に記載のコンピューティングデバイス。
【請求項１４】
前記統合開発環境（ＩＤＥ）が、難読化モジュール（１１６）とコンパイラモジュール（１１４）とを備え、前記難読化モジュール（１１６）は、前記難読化記述を生成し、前記難読化記述モジュールを前記コンパイラモジュール（１１４）による実行のために供給するように動作可能であり、前記コンパイラモジュール（１１４）は、コンパイル中に前記ソースコード（２０２）の対応する変更を実装するために前記難読化モジュール（１１６）によって供給される前記難読化記述を取得し、解釈することを含めて、保護されたコンパイル済みコードを生成するために前記ソースコード（２０２）をコンパイルするように動作可能である、請求項１２または１３に記載のコンピューティングデバイス。
【発明の詳細な説明】
【背景技術】
【０００１】
アプリケーションおよび他のコードを開発することに関連付けられる１つの挑戦は、コードの影響を受けやすい部分を、変更され、無効化され、またはリバースエンジニアリングされることから保護することである。例えば、アプリケーションモジュールについての電子ライセンス化および／またはデジタル著作権管理を実装するように設計されるコードの部分の保護は、第三者がアプリケーションモジュールを違法に使用し、および／または配布するためにコードに対処することを阻止するために実行され得る。開発者は、アプリケーションをソースコードする間に、何らかの保護手段を直接追加し得るが、これは、開発者にとって非常に煩わしく、時間がかかり得る。別のアプローチは、コンパイラによってバイナリファイルが出力された後に、コンパイル済みのバイナリファイルに保護を適用することを伴う。しかしながら、既にコンパイル済みのバイナリを難読化することは、いくつかのバイナリを不安定にし、利用可能な難読化およびコード最適化のタイプを限定し、開発プロセスに複雑さおよび時間を追加し得る。さらに、従来の難読化のために使用されるいくつかの技法は、特に、洗練されたハッカーによって、ディスク上のバイナリのランタイムまたは静的解析を通じて検出することがかなり容易である。従来の難読化技法のこれらおよび他の複雑さは、開発者が自身のコードに効果的な保護を追加することを非効率的にし、または禁止し得る障害として作用する。
【発明の概要】
【課題を解決するための手段】
【０００２】
コンパイラベースの難読化が説明される。コードプロジェクトの一部を難読化により保護するために、コードは、コンパイルプロセスの一環として、当該コードを難読化する１つまたは複数の変更を生成するために、コンパイラ内で変更される。コードのコンパイル済みのバージョンは、コンパイラ内で生成される変更を有して形成される。１つのアプローチにおいて、コンパイラは、保護すべきコードの部分を示し、示される部分に対して行うべき変更を指定する難読化記述を実行するように構成される。コードの様々な異なる変更は、対応する難読化機能を実装するために、コンパイルプロセス中に実行され得る。例えば、コンパイラ内で行われる変更は、コードの改ざん検出、アンチデバッギング、および／または暗号化を可能にするように設計される変更を含み得るが、これらに限定されない。
【０００３】
本概要は、詳細な説明において以下にさらに説明される概念の集まりを簡略化された形式で紹介するために提供される。本概要は、特許請求の範囲に記載される重要な特徴または本質的な特徴を識別することを意図されず、特許請求の範囲に記載される主題の範囲を判定する際の補助として使用されることも意図されない。
【０００４】
詳細な説明は、添付の図面を参照しつつ説明される。図面において、参照符号の最左端の桁は、その参照符号が最初に現れる図を識別する。説明中の異なるインスタンスおよび図面における同じ参照符号の使用は、同様または同一の項目を示し得る。
【図面の簡単な説明】
【０００５】
【図１】コンパイラベースの難読化技法を採用するように動作可能である例示的な実装における環境の図である。
【図２】難読化により保護されるコンパイル済みコードを生成するために発生し得る動作を表す例示的なコンパイラベースの難読化を描く図である。
【図３】難読化により保護されるコンパイル済みコードが開発プロジェクト用のコードをコンパイルすることの一環として生成される例示的な実装における手続きを描くフロー図である。
【図４】コンパイルプロセスの一環として難読化されたコードを生成するために変更が中間言語コードに対して行われる例示的な実装における手続きを描くフロー図である。
【図５】コンパイラベースの難読化が統合開発環境により実行される例示的な実装における手続きを描くフロー図である。
【図６】本明細書において記載される技法の実施形態を実装するために採用され得る例示的なシステムおよび当該システムの構成要素を例示する図である。
【発明を実施するための形態】
【０００６】
概要
第三者がコードを不法に使用し、または配布することを防止するために、開発者が従来の難読化技法を使用して自身のコードに効果的な保護を追加することは困難であるか、または禁止され得る。ソースコーディング中またはコンパイラによって出力されるコンパイル済みバイナリのいずれかに適用される従来の難読化技法は、限られた保護オプションを提供し、ランタイムにおいて検出することがかなり容易である技法を使用し、および／または、時間／複雑さ／コストを開発プロセスに追加し得る。
【０００７】
コンパイラベースの難読化が本明細書において説明される。難読化によりコードプロジェクトの一部を保護するために、コンパイルプロセスの一環としてコードを難読化する１つまたは複数の変更を生成すするために、コードは、コンパイラ内で変更される。コードのコンパイル済みのバージョンは、コンパイラ内で生成される変更を有して形成される。１つのアプローチにおいて、コンパイラは、保護すべきコードの部分を示し、示される部分に対して行うべき変更を指定する難読化記述を実行するように構成される。コードの様々な異なる変更は、対応する難読化機能を実装するためのコンパイルプロセス中に実行され得る。例えば、コンパイラ内で行われる変更は、コードの暗号化、アンチデバッギング、および／または改ざん検出を可能にするように設計される変更を含み得るが、これらに限定されない。
【０００８】
以下の議論において、本明細書において記載されるコンパイラベースの難読化技法を採用し得る例示的な環境が、まず説明される。次に、コンパイラベースの難読化の例示的な詳細を示す例示的なプロセスフローシナリオが説明される。次いで、例示的な環境および他の環境において実行され得る例示的な手続きが説明される。その結果として、例示的な手続きの実行は、例示的な環境に限定されず、例示的な環境は、例示的な手続きの実行に限定されない。最後に、コンパイラベースの難読化の１つまたは複数の実装において採用され得る例示的なシステムおよび当該システムの構成要素が説明される。
例示的な動作環境
図１は、本明細書において記載される技法を採用するように動作可能である例示的な実装における環境１００の図である。例示される環境１００は、ネットワーク１０６を介して通信可能に結合されるコンピューティングデバイス１０２とウェブサービス１０４とを含む。コンピューティングデバイス１０２は、ネットワーク１０６上でウェブサービス１０４を介して利用可能とされる多様なリソース１０５（例えば、コンテンツおよびサービス）にアクセスし、相互作用するように構成され得る。コンピューティングデバイス１０２およびウェブサービス１０４は各々、幅広いコンピューティングデバイスによって実装され得る。
【０００９】
例えば、コンピューティングデバイス１０２は、デスクトップコンピュータ、移動局、エンターテインメント機器、タブレットまたはスレートデバイス、サーフェイスコンピューティングデバイス、表示デバイスに通信可能に結合されるセットトップボックス、モバイル通信デバイス（例えば、無線電話）、ゲーム機などの、ネットワーク１０６上で通信することが可能なコンピュータとして構成され得る。コンピューティングデバイス１０２は、様々な処理システムを採用する任意の適切なコンピューティングシステムおよび／またはデバイスとして構成されることができ、そのいくつかの付加的な例は、図６の例示的なシステムに関連して議論される。
【００１０】
コンピューティングデバイス１０２は、オペレーティングシステム１０８を含むものとしてさらに示される。一般的に言えば、オペレーティングシステム１０８は、コンピューティングデバイス１０２上で実行可能であるコンピューティングデバイス１０２の基本的な機能性をアプリケーション１１０に抽象化するように構成される。例えば、オペレーティングシステム１０８は、「どのように」この基本的な機能性が実装されるのかをアプリケーション１１０が知得せずに書き込まれ得るように、コンピューティングデバイス１０２の処理、メモリ、ネットワーク、および／または表示機能性を抽象化し得る。アプリケーション１１０は、例えば、表示デバイスによってレンダリングおよび表示されるべきデータを、どのようにこのレンダリングが実行されるのかを理解せずに、オペレーティングシステム１０８に提供し得る。オペレーティングシステム１０８は、アプリケーション１１０がシステム機能を利用するために呼び出し得る様々なサービス、インターフェース、および機能性を提供し得る。いくつかの例を挙げれば、ブラウザ、オフィス生産性アプリケーション、電子メールクライアント、マルチメディア管理プログラム、デバイス管理ソフトウェア、ソフトウェア開発環境、およびネットワーキングアプリケーションを含むが、これらに限定されない、幅広い機能性をコンピューティングデバイス１０２に提供するための多様なアプリケーション１１０が予期される。
【００１１】
コンピューティングデバイス１０２は、アプリケーション１１０の開発のための統合開発環境（IDE:integrated development environment）を提供するように動作可能な機能性を表す開発モジュール１１２も含む。開発モジュール１１２は、一般に、設計、開発、テスト、および／またはアプリケーションの展開のためのサポートを含むアプリケーションライフサイクル管理を提供する。開発モジュール１１２は、アプリケーション開発を簡略化するために、種々のプログラミング言語をサポートし、コードエディタ、１つまたは複数のコンパイラ、ビルドオートメーションツール、デバッガなどの種々の構成要素を統合し得る。したがって、開発モジュール１１２は、開発者がプロジェクトのためのソースコンテンツ／コードを作成／編集し、アプリケーション１１０を構築するためにソースコンテンツ／コードをコンパイルするための機能性を提供する。
【００１２】
本明細書において記載される技法によれば、開発モジュール１１２は、本明細書において記載されるように動作するコンパイラモジュール１１４と難読化モジュール１１６とをさらに含み、または、さもなければ、これらを利用し得る。コンパイラモジュール１１４は、開発プロジェクトのためのソースコードファイルを機械語コードおよび実行ファイル（例えば、オブジェクトコード、バイナリファイル、実行可能なファイルなど）へ変換するためのコンパイルプロセスを実装するように動作可能な機能性を表す。コンパイラモジュール１１４は、複数の別個のサブモジュール、処理工程、および／またはコンパイルステージを含み得る。例えば、コンパイラモジュールは、フロントエンドコンパイラとバックエンドコンパイラとの両方を含み得る。スタンドアロンモジュールとして例示されるが、難読化モジュール１１６は、コンパイラモジュール１１４と一体化された構成要素としても提供され得る。さらに、いくつかの実装において、開発モジュール１１２、コンパイラモジュール１１４、および／または難読化モジュール１１６のうちの１つまたは複数は、クライアントにネットワーク１０６上でアクセス可能とされるウェブサービスとして（例えば、「クラウド中の」開発サービスまたは難読化サービスとして）構成され得る。この例において、開発者は、オンライン上で利用可能なリソース１０５として、コード難読化ツール／インターフェースを含むアプリケーション開発ツールを提供するウェブサービス１０４との相互作用を通じて、アプリケーションを開発することが可能となり得る。
【００１３】
難読化モジュール１１６は、コンパイラモジュール１１４によって実行されるコンパイルプロセスの一環としてコード難読化技法を可能にするように動作可能な機能性を表す。一般的に言えば、本明細書において使用される難読化は、コードを理解することを困難にするためにコードを種々の手法で変更することを言う。難読化は、コードが平文で傍受され、見られたとしても、コードの意味と目的とを隠すために採用され得る。これは、コードを改ざんし、またはリバースエンジニアリングすることを試行し得る「ハッカー」に対する、ある程度の保護を作成する。従来の技法とは対照的に、難読化は、コンパイルプロセス中に発生する。そのため、コンパイラモジュール１１４は、ソースコードの少なくともいくつかの部分を難読化するために変更を適用するために、コンパイル中に難読化モジュール１１６を呼び出し、相互作用し、または、さもなければ、利用するように構成され得る。少なくともいくつかの実装において、開発者は、難読化により保護すべきソースコードの特定の部分を指定するため、および当該部分についての変更を定義するための難読化記述を生成するために、開発モジュール１１２および／または難読化モジュール１１６と相互作用し得る。難読化記述は、コンパイル中にソースコードの指定された部分について変更を実装するようにコンパイラモジュール１１４に指示するのに適切な命令により構成され得る。コードを難読化するための様々な異なる種類の変更および技法が予期され、その例は、以下の図面に関連して説明される。
【００１４】
例示的な動作環境は検討したので、ここで、１つまたは複数の実施形態に係るコンパイラベースの難読化のためのいくつかの例示的な詳細を検討する。
コンパイラベースの難読化の詳細
以下の議論は、前述されたシステムおよびデバイスを利用して実装され得るコンパイラベースの難読化技法の実装上の詳細を説明する。コンパイラベースの難読化の態様は、図２に描かれる例示的なシナリオを参照しつつ説明される。具体的には、図２は、２００において、いくつかの実装によってコンパイル中にコードを難読化することによって保護されたコンパイル済みコードを生成するために採用され得る開発モジュール１１２の構成要素および動作に関する詳細を全体的に描く。
【００１５】
作業において、開発者は、アプリケーションのためのプロジェクトにおいて、ソースコード２０２（例えば、コードモジュール、コンテンツ、スクリプト、画像、スタイル、注釈など）を設計し、定義し、作成し、編集するために開発モジュール１１２を使用し得る。開発モジュール１１２は、１つまたは複数の異なるプログラミング言語でのソフトウェアプログラミングをサポートし得る。一般に、本明細書において記載されるコンパイラベースの難読化技法は、様々な異なるプログラミング言語、ＩＤＥ、コンパイラなどと共に採用され得る。
【００１６】
開発プロジェクトの一環として、難読化モジュール１１６は、ソースコード２０２と関連付けられる難読化記述２０４を生成するために呼び出され得る。１つのアプローチにおいて、開発者がソースコード２０２の一部について難読化記述２０４を生成するために選択を行うことを可能にするインターフェースが公開され得る。上述されたように、難読化記述２０４は、難読化すべきソースコード２０２の少なくともいくつかの部分を指定し、それらの部分について行うべき変更を定義するように構成される。１つのアプローチにおいて、難読化記述２０４は、対応する難読化を実装するためにコンパイラモジュール１１４によって実行され得る様々な指示文２０６を含み得る。難読化モジュール１１６は、開発者によって適切なインターフェースを通じて行われた選択に応じて指示文２０６を自動的に形成するように構成され得る。
【００１７】
指示文２０６は、開発者によって保護のために選択されるソースコード２０２の部分を識別するために多様な手法で構成され得る。指示文２０６は、変更を生じさせるためにコンパイル中に解釈され、適用され得る種々のタイプの変更、難読化アルゴリズム、設定、および他のパラメータを定義するようにさらに構成され得る。いくつかの実装において、指示文２０６は、ソースコード２０２の選択された部分について指定される１つまたは複数の変更を実装するためのソースコードの部分を含むように作成される。変更は、一般に、コードを何らかの手法で難読化するためにコードを操作するように設計される。これは、コードの歪み、シンボル／構文の置換、ブロックまたはモジュールの並べ替え、コードへの挿入、分岐、関数の再構成、ジャンプ命令の追加、レイアウトおよびプログラムフローの操作、影響を受けやすいコード部分の暗号化などを含み得るが、これらに限定されない。
【００１８】
変更は、ランタイムにおいて難読化された形式で実行される１つまたは複数の関数の仮想化も含み得る。ここで、仮想実行環境は、変更され、難読化された形式で表されるコマンド／命令を解釈する少なくとも１つの関数について定義される。変更され、難読化された命令の表現は、平文で傍受されたとしてもハッカーが解釈することが困難なバイトコード値であり得る。ランタイムにおいて、実行中の仮想実行環境は、変更され、難読化された形式で表される命令の動作をシミュレートし、またはエミュレートする。このようにして、表される基本的な命令の公開が回避される。
【００１９】
コンパイラモジュール１１４は、ソースコード２０２をスキャンすること、コードを構文解析すること、構文を検証すること、ソースコードを中間言語（IL:intermediate language）コードに変換すること、コードとレイアウトとを最適化すること、およびコンパイル済みの出力ファイル（例えば、バイナリファイル、アセンブリコード、オブジェクトコードなど）を生成することを含む動作を実行するように構成され得る。このプロセスの一環として、コンパイラモジュール１１４は、対応する変更を実装するために、指示文２０６によって指定される選択された難読化アルゴリズムを適用し得る。コードの難読化のためにコードの適当な変更を生成する任意の適切なアルゴリズムが、採用され得る。コードの少なくともいくつかの部分が、指示文２０６によって難読化のために選択され得る一方で、当該コードの他の部分は、難読化されない／変更されないままであり得る。１つまたは複数の異なるアルゴリズムが、難読化のために選択されるコードの各部分に適用され得る。１つのアプローチにおいて、難読化を実装するための異なるアルゴリズムまたは多様なアルゴリズムは、コンパイルプロセスの一環としてオンザフライで（例えば、オンデマンドで動的に）形成される。したがって、異なる技法およびアルゴリズムが、コードの異なる部分を難読化するために採用され得る。異なるコード部分について異なるアルゴリズムを使用することは、コードをリバースエンジニアリングしようとする試行をさらに複雑化する。なぜならば、ハッカー／悪意のある者は、各難読化されたコード部分に使用される各個々の技法およびアルゴリズムを発見し、復号することなしには、コードの目的および／または意味を完全に理解することが不可能となり得るためである。
【００２０】
さらに、難読化は、部分ごとに個別化され得る。例えば、暗号化は、いくつかの影響を受けやすいデジタル著作権コード部分に適用されるのに対して、コードの並べ替えおよびレイアウト変更は、異なるそれぞれのレベルの保護を提供するために、より影響を受けにくいコードに対して使用され得る。ジャンプ命令およびシンボル置換は、さらなる保護された部分に選択的に適用され得る。難読化を暗号化／復号化するためのさらなる異なるキーの組および／または置換パターンは、異なる保護された部分について動的に形成され得る。異なるキーの組および／または置換パターンは、異なる保護された部分についての、および異なるプロジェクト／アプリケーションにわたるアルゴリズムスキームを変化させるために、および／または難読化アルゴリズムを個別化するために採用され得る。暗号化鍵／復号化鍵は、ランダムに形成される鍵、チェックサムまたはハッシュに基づいて得られる鍵、静的キー値などであり得る。コードの他の部分は、変更されないまま、および難読化によって保護されないままであり得る。
【００２１】
したがって、適当なレベルの保護は、各コード部分について選択され得、互いに異なる対応する技法／アルゴリズムが、個々の部分に適用され得る。各プロジェクトについて使用される特定の難読化スキームおよび各インスタンスにおいて適用される技法は、コードの任意の所要の部分について使用される保護のタイプを判定することを困難にするために、異なり得る。このようにして、異なる難読化機能および変更は、難読化定義２０４および／または指示文２０６によって指示されるように保護を個別化するために、保護されるコードの複数の部分に個々に適用され得る。
【００２２】
したがって、難読化モジュール１１６はコンパイラにおいて生成する難読化を定義する指示文２０６を生じさせるために呼び出され得る。例えば、開発者は、難読化モジュール１１６を通じて、デジタルライセンシングおよび権利管理に関連するコード部分などを保護するために、少なくともいくつかのコード部分を選択し得る。このアクションは、コンパイラによる実行のための指示文２０６を含む難読化記述２０４を生成する。次いで、プロジェクト用のソースコード２０２と指示文２０６を有する対応する難読化記述２０４とは、図２に表されるように、コンパイラモジュール１１４への入力として供給され得る。
【００２３】
一般的に言えば、コンパイラモジュール１１４は、開発プロジェクト用のソースコード２０２を、構文解析し、コードのコンパイル済みの保護された（例えば、難読化された）バージョンに変換するために、難読化モジュール１１６の影響下で動作可能な機能性を表す。前述されたように、コンパイラモジュール１１４は、複数の別個のサブモジュール、処理工程、および／またはコンパイルステージを含み得る。例えば、コンパイラモジュールは、フロントエンドコンパイラとバックエンドコンパイラとの両方、または機能性の他の部分を含み得る。
【００２４】
図２に表されるように、コンパイラモジュール１１４は、ソースコード２０２を構文解析し、ソースコード２０２を中間言語コード２１０（例えば、ＩＬコード）に変換するための前処理動作２０８を実行し得る。ＩＬコードは、ソースコードの前処理に基づいて形成される上位の命令を表す。ＩＬコードの上位の命令は、下位の機械コードを生成するために、コンパイルプロセスにおいて後に実行され得る。ＩＬコードは、難読化機能性を有効にするために、難読化記述２０４から得られるランタイム命令も組み込み得る。したがって、中間言語コード２１０は、ソースコード２０２と、コンパイルプロセスにおいて様々な変更を実装すべき、難読化記述２０４によって示されるコード部分との組み合わせを表し得る。
【００２５】
限定ではなく例として、前処理動作２０８は、難読化記述２０４からランタイム命令を得るために、トークナイザまたは同等の機能性を採用し得る。ここで、トークナイザは、中間言語に拡張されるのに適切なフォーマットで指示文２０６を有するランタイムファイルを生成するために、難読化記述２０４を構文解析し、解釈し得る。トークナイザは、コンパイル中に適用されるべき様々な変更のための構成を記述するトークンも生成し得る。トークンは、コンパイラベースの難読化のために定義されるスキーマに従った変更のための構成データを表すキー値の文字列の組として実装され得る。次いで、難読化を実装するためにコンパイル済みコードに組み込まれるべき関数、データ構造、およびアルゴリズムについてのソース難読化コードを含む前処理されたランタイムファイルを生成するために、指示文は、拡張され、トークンは、対応する中間言語コードと置換され得る。
【００２６】
さらに、前処理動作２０８は、プロジェクト用のソースコード２０２とソース難読化コードとを結合し、結合されたコードを中間言語コード２１０にプリコンパイルするためのフロントエンドコンパイラまたは同等の機能性をさらに採用し得る。言い換えれば、難読化記述２０４および／または関連付けられる指示文２０６は、ソースコードに対して行うべき変更を示すソース難読化コードを生成するために、前処理動作２０８において使用され得る。次いで、プロジェクト用のソースコードとソース難読化コードとは、フロントエンドコンパイラまたはその他により実行され得るプリコンパイルステージにおいてつなげられる。前処理動作２０８の動作の結果は、ソースコード２０２と難読化のための構成情報とを結合する中間言語コード２１０である。
【００２７】
次いで、中間言語コード２１０は、コンパイラモジュール１１４によって実装されるコンパイルプロセスの後続のステージにおいて実行され得る。図２にさらに示されるように、これは、中間言語コード２１０を入力とみなし、難読化された中間言語コード２１４を生成するために、コードをしかるべく変更する難読化プロセス２１２を含み得る。したがって、コードの既にコンパイル済みのバージョンに対して作用し、またはソースコード開発中に開発者が時間／リソース集約的な変更を実行することを必要とする従来の技法とは対照的に、難読化は、コンパイラ内で発生する。
【００２８】
次いで、難読化された中間言語コード２１４は、コードを難読化するための様々な変更を有する保護されたコンパイル済みコード２１８を生成するために、コンパイルプロセス２１６においてコンパイルされる。一般に、コンパイルプロセス２１６は、コードを、バイナリ、オブジェクトコード、アセンブリコードなどの下位の機械コードにコンバートすることを伴う。したがって、本明細書において使用されるようにコンパイルプロセス２１６は、ＩＬコードを適当な下位の機械コードに変換するための動作を言う。難読化プロセス２１２およびコンパイルプロセス２１６は、コンパイラモジュール１１４によって実装されるバックエンドコンパイラまたは他の同等の機能性により発生し得る。さらに、中間言語コードの難読化およびコンパイルは、（図示の通り）順次に、異なる保護される部分について同時に、またはその他の方法で発生し得る。
【００２９】
１つのアプローチにおいて、入力中間言語コード２１０は、コンパイラモジュール１１４（例えば、バックエンドコンパイラ）および難読化モジュール難読化モジュール１１６によって作用を受けるタプルストリームにコンバートされる。ここで、コンパイラモジュール１１４は、難読化記述２０４によって指定され、中間言語コード２１０において反映されるような変更を実装するために、様々な手法で難読化モジュール１１６と相互作用し得る。相互作用は、通信、データ交換、および、コンパイラモジュール１１４と難読化モジュール１１６との間の他の相互作用を容易にする適切なインターフェース２２０経由で発生し得る。
【００３０】
一実施形態において、コンパイラモジュール１１４は、ＩＬコードが処理されている間に、シンボル、データタイプ、状態、および関数の段階に関する構成情報を難読化モジュール１１６に渡すために、コンパイル中に難読化モジュール１１６を呼び出すように構成される。難読化モジュール１１６は、保護すべき関数およびデータを判定し、行うべき難読化および変更のタイプを確認するために、コンパイラモジュール１１４から取得される情報を利用し得る。ここで、難読化モジュール１１６は、コンパイラモジュール１１４とは別個の構成要素として実装されてもよく、そのため、指定される変更を直接行うことができないことがある。その代わりに、難読化モジュール１１６は、コンパイラモジュール１１４によって供給される構成情報を処理し、構成情報によって示される変更を認識し、難読化モジュール１１６の代わりにコンパイラモジュールに変更を行わせるように構成される、コンパイラモジュールによる受信のための命令を送る。例えば、上記および以下に説明されている例として、難読化モジュール１１６は、コンパイラモジュール１１４に、コールを挿入し、ある値を取得もしくは設定し、関数を暗号化し、および／またはコードを難読化するための他の種類の変更を行うように指示し得る。付加的にまたは代替的に、難読化モジュール１１６は、コンパイラモジュール１１４および／またはバックエンドコンパイラの構成要素として実装されてもよく、そのため、ＩＬコードに直接変更を行うように動作してもよい。
【００３１】
前述されたように、多種多様な変更が予期される。変更は、改ざん検出、アンチデバッギング、および／または暗号化などの難読化機能／機能性を実装するために使用される。一実装において、変更は、ランタイムにおけるヒープ実行、コード部分の暗号化／復号化、およびコードの検証のうちの１つまたは複数を可能にするように設計される。これらおよび他のコンパイラベースの難読化機能を実装するために採用され得る変更の非限定的な例のいくつかは、シンボル属性および挙動への変更、クローン関数の作成、コール転送、コードブロックのセグメント化、コードブロックの並べ替え、コールの置換、特定のコードセグメント間への絶対参照の設定、およびエントリポイントの変更を含む。前述のリストにおける例示的な変更のうちの１つまたは複数は、ヒープ実行および他の難読化機能を可能にするために行われ得る。変更は、検証機能を実装し、他の難読化機能を容易にするための、チェックサム、検証モジュール、および／または他の検証コードの挿入も含み得る。また、変更は、コードの指定される部分についての暗号化を実装するために、コード部分の暗号化および／または復号化／再暗号化コードの付加を含み得る。コンパイラベースのコード難読化のための技法のこれらおよび他の態様に関するさらなる詳細は、例示的な手続きの以下の議論において見出され得る。
例示的な手続き
このセクションでは、任意の適切なハードウェア、ソフトウェア、ファームウェア、またはこれらの組み合わせに関連して実装され得る、コンパイラベースの難読化のための例示的な手続きが議論される。手続きは、１つまたは複数のデバイスによって実行される動作を指定するブロックのセットとして示され、それぞれのブロックによって動作を実行するために図示される順序に必ずしも限定されない。少なくともいくつかの実施形態において、手続きは、図１の例示的なコンピューティングデバイス１０２などの適切に構成されたコンピューティングデバイスによって実装され得る。手続きの態様は、コンピューティングデバイスの開発モジュール１１２によって実装され得る。さらに、開発モジュールは、例示的な手続きに関連して説明される動作のうちの少なくともいくつかを実行するように構成される難読化モジュール１１６および／またはコンパイラモジュール１１４を含み、または利用し得る。
【００３２】
図３は、難読化により保護されるコンパイル済みコードが開発プロジェクト用のコードをコンパイルすることの一環として生成される例示的な実装における手続き３００を描く。限定ではなく例として、手続き３００は、開発モジュール１１２の１つまたは複数のコンパイラモジュール１１４により実行される例示的な動作を表し得る。コードは、コードのコンパイルの一環として、コードの一部を難読化するための１つまたは複数の変更を生成するために、コンパイラ内で変更される（ブロック３０２）。例えば、開発モジュール１１２のコンパイラ（例えば、コンパイラモジュール１１４）は、アプリケーション開発プロジェクトをコンパイルするために呼び出され得る。図２に関連して説明されたように、コンパイラは、関連付けられるソースコードをどのように難読化するかを記述する指示文２０６を有する難読化記述２０４を供給する難読化モジュール１１６を含み、または相互作用し得る。指示文２０６は、コンパイラに、ソースコードのコンパイルの一環として様々な変更を実装させるように構成される。コンパイラは、プロジェクト内の少なくともいくつかのコード部分に対して指定された変更を行うために、難読化モジュールと共に動作し得る。前述されたように、多様な変更が予期される。変更は、コードの暗号化、検証、およびヒープ実行を含むが、これらに限定されない、開発モジュールによってサポートされる種々のタイプの難読化機能を生成するために採用される。
【００３３】
コンパイラ内で生成されたコードの一部を難読化する変更を有するコードのコンパイル済みのバージョンが、コンパイラによって形成される（ブロック３０４）。例えば、様々な異なる変更によって難読化されるコードは、コンパイル済みコードを生成するために、コンパイラによってコンパイルされ得る。コンパイル済みコードは、適当な機械語のバイナリファイルまたは他の下位ファイルであり得る。コンパイラによって出力されるコンパイル済みコードは、コンパイラ自体の中で実装される難読化を含む。
【００３４】
図４は、難読化されたコードを生成するために変更が中間言語コードに対して行われる例示的な実装における手続き４００を描くフロー図である。限定ではなく例として、手続き４００は、難読化モジュール１１６を含み、または使用するコンパイラモジュール１１４により実行される例示的な動作を表し得る。保護すべき開発プロジェクト用のソースコードの部分と、示される部分を難読化するために行うべき変更とを示す指示文が取得される（ブロック４０２）。例えば、難読化記述２０４に含まれる指示文２０６は、関連付けられるソースコードのコンパイル中にコンパイラモジュール１１４による使用のために難読化モジュール１１６によって供給され得る。指示文２０６は、前述されたように、行うべき種々の変更を指定し、保護すべきコードの特定の部分を示し得る。
【００３５】
ソースコードと指示文を実装するためのコードとを結合する中間言語コードが形成される（ブロック４０４）。これは、図２に関連して説明された手法で発生し得る。例えば、難読化ソースコードを生成するために、前処理が発生し得る。難読化ソースコードは、プロジェクト用のソースコードと結合され、中間言語フォーマットにプリコンパイルされる。１つのアプローチにおいて、結合されたＩＬコードを有する単一のオブジェクトファイルが、コンパイルプロセスの後続のステージにおける対処のために出力される。
【００３６】
指示文は、示される部分を指示文に従って変更するために、中間言語コードに適用される（ブロック４０６）。次いで、指示文の中間言語コードへの適用によって生成された難読化されたコードがコンパイルされ（ブロック４０８）、開発プロジェクト用の保護されたコンパイル済みコードが出力される（ブロック４１０）。ここで、コンパイラモジュール１１４は、指定される様々な変更を実施するために結合済みのＩＬコードを処理するように動作し得る。そうするために、コンパイラは、前記で議論されたように、難読化モジュール１１６を呼び出し、および／または、さもなければ、難読化モジュール１１６と相互作用し得る。コンパイラモジュール１１４は、ＩＬコードをより下位の機械コード（例えば、バイナリ）に下げてコードをコンパイルするようにさらに構成され得る。一般に、これは、コードを構文解析すること、構文の認識および検証、シンボル置換、コードのレイアウトおよび最適化、ならびにソースコードをコンパイルするために典型的に実行される他の動作を含み得る。その結果は、第三者によるリバースエンジニアリングおよび操作から、様々な難読化によって保護される、コードのコンパイル済みのバージョンである。
【００３７】
図５は、コンパイラベースの難読化が統合開発環境により実行される例示的な実装における手続き５００を描くフロー図である。限定ではなく例として、手続き５００は、デスクトップパッケージ、オンラインウェブサービス、またはその他として利用可能な統合開発環境（ＩＤＥ）表す開発モジュール１１２により実行される例示的な動作を表し得る。ソフトウェア開発プロジェクト用のソースコードの作成を可能にするための開発インターフェースが公開される（ブロック５０２）。例えば、開発モジュール１１２は、アプリケーションまたは他のプロジェクト用にソースコードを生成するために開発者によって採用され得る。開発モジュール１１２は、コンパイラベースの難読化を実装するために本明細書において記載されるように動作する難読化モジュール１１６を含み、または使用し得る。
【００３８】
ソースコードは、ソースコードの１つまたは複数の選択された部分を難読化するためにソースコードのコンパイル中にコンパイラが行うべき変更を指定するための開発インターフェースを通じて生成された難読化記述に関連付けられる（ブロック５０４）。ここで、難読化モジュール１１６は、コードの１つまたは複数の部分について指定される変更を示す指示文２０６を含む難読化記述２０４を生成するために呼び出され得る。様々な変更は、個々のコードの部分について選択的に指定され得る。
【００３９】
ソースコードは、１つまたは複数の選択された部分を難読化するために、指定された変更を実装するための難読化記述を使用して、開発プロジェクト用の保護されたコンパイル済みコードを生成するためにコンパイルされる（ブロック５０６）。例えば、コンパイラモジュール１１４は、コンパイル中にコードの対応する変更を実装するために、難読化記述２０４を取得し、解釈し得る。コンパイラモジュール１１４は、本明細書において議論されるように、変更を直接実装してもよいし、または、変更を指示するために難読化モジュール１１６に依存してもよい。上記で議論されるような多様な変更は、結果として得られるコードを第三者が理解し、解釈し、リバースエンジニアリングすることを困難にする、１つまたは複数のタイプの難読化により保護されるコンパイル済みコードを形成するために行われ得る。
【００４０】
コンパイラベースの難読化のための例示的な手続きを検討したので、ここで、本明細書において説明される技法の実施形態を実装するために採用され得る例示的なシステムおよび構成要素の議論を検討する。
例示的なシステム
図６は、本明細書において説明される様々な技法を実装し得る１つまたは複数のコンピューティングシステムおよび／またはデバイスを表す例示的なコンピューティングデバイス６０２を含む例示的なシステム６００を例示する。コンピューティングデバイス６０２は、例えば、サービスプロバイダのサーバ、クライアント（例えば、クライアントデバイス）に関連付けられるデバイス、オンチップシステム、および／または任意の他の適切なコンピューティングデバイスもしくはコンピューティングシステムであり得る。
【００４１】
図示されるような例示的なコンピューティングデバイス６０２は、互いに通信可能に結合される処理システム６０４と、１つまたは複数のコンピュータ読取可能な媒体６０６と、１つまたは複数のＩ／Ｏインターフェース６０８とを含む。図示されていないが、コンピューティングデバイス６０２は、様々な構成要素を互いに結合するシステムバス、または他のデータおよびコマンド転送システムをさらに含み得る。システムバスは、メモリバスもしくはメモリコントローラ、周辺バス、ユニバーサルシリアルバス、および／または多様なバスアーキテクチャのうちのいずれかを利用するプロセッサもしくはローカルバスなどの、種々のバス構造のうちのいずれか１つまたはこれらの組み合わせを含み得る。制御線およびデータ線などの多様な他の例も予期される。
【００４２】
処理システム６０４は、１つまたは複数の動作をハードウェアを使用して実行するための機能性を表す。したがって、処理システム６０４は、プロセッサ、機能ブロックなどとして構成され得るハードウェア要素６１０を含むものとして例示される。これは、１つまたは複数の半導体を使用して形成される特定用途向け集積回路または他の論理デバイスなどのハードウェアにおける実装を含み得る。ハードウェア要素６１０は、それらが形成される材料またはそれらにおいて採用される処理メカニズムによって限定されない。例えば、プロセッサは、半導体および／またはトランジスタ（例えば、電子集積回路（ＩＣ））から成り得る。そのようなコンテキストにおいて、プロセッサ実行可能な命令は、電気的に実行可能な命令であり得る。
【００４３】
コンピュータ読取可能な媒体６０６は、メモリ／ストレージ６１２を含むものとして例示される。メモリ／ストレージ６１２は、１つまたは複数のコンピュータ読取可能な媒体に関連付けられるメモリ／ストレージ容量を表す。メモリ／ストレージ６１２は、（ランダムアクセスメモリ（RAM:random access memory）などの）揮発性媒体および／または（読み出し専用メモリ（ROM:read only memory）、フラッシュメモリ、光ディスク、磁気ディスクなどの）不揮発性媒体を含み得る。メモリ／ストレージ６１２は、固定媒体（例えば、ＲＡＭ、ＲＯＭ、固定ハードドライブなど）および取り外し可能な媒体（例えば、フラッシュメモリ、取り外し可能なハードドライブ、光ディスクなど）を含み得る。コンピュータ読取可能な媒体６０６は、以下にさらに説明されるように、多様な他の手法で構成され得る。
【００４４】
入力／出力インターフェース６０８は、ユーザがコマンドおよび情報をコンピューティングデバイス６０２に入力することを可能にし、様々な入力／出力デバイスを使用して情報がユーザおよび／または他の構成要素またはデバイスに提示されることをも可能にするための機能性を表す。入力デバイスの例は、キーボード、カーソル制御デバイス（例えば、マウス）、音声動作用のマイクロフォン、スキャナ、タッチ機能性（例えば、物理的なタッチを検出するように構成される容量センサまたは他のセンサ）、（例えば、ジェスチャとしてのタッチを伴わない動きを検出するための赤外振動数などの可視波長または不可視波長を採用し得る）カメラなどを含む。出力デバイスの例は、表示デバイス（例えば、モニタまたはプロジェクタ）、スピーカ、プリンタ、ネットワークカード、触覚応答デバイスなどを含む。したがって、コンピューティングデバイス６０２は、ユーザとの相互作用をサポートするために、以下にさらに説明されるような多様な手法で構成され得る。
【００４５】
様々な技法は、本明細書において、ソフトウェア、ハードウェア要素、またはプログラムモジュールの一般的なコンテキストにおいて説明され得る。一般に、そのようなモジュールは、特定のタスクを実行し、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、要素、構成要素、データ構造などを含む。本明細書において使用される、「モジュール」、「機能性」および「構成要素」という用語は、一般に、ソフトウェア、ファームウェア、ハードウェア、またはこれらの組み合わせを表す。本明細書において説明される技法の機能は、プラットフォームに依存せず、これは、多様なプロセッサを有する多様な商用コンピューティングプラットフォーム上で本技法が実装され得ることを意味する。
【００４６】
説明されたモジュールおよび技法の実装は、何らかの形式のコンピュータ読取可能な媒体上に記憶され、または何らかの形式のコンピュータ読取可能な媒体を介して送信され得る。コンピュータ読取可能な媒体は、コンピューティングデバイス６０２によってアクセスされ得る多様な媒体を含み得る。限定ではなく、例として、コンピュータ読取可能な媒体は、「コンピュータ読取可能な記憶媒体」と「通信媒体」とを含み得る。
【００４７】
「コンピュータ読取可能な記憶媒体」とは、単なる信号送信、搬送波、または信号それ自体とは対照的に、情報の記憶を可能にする媒体および／またはデバイスを言う。したがって、コンピュータ読取可能な記憶媒体は、信号担持媒体または信号それ自体を含まない。コンピュータ読取可能な記憶媒体は、コンピュータ読取可能な命令、データ構造、プログラムモジュール、論理要素／回路、または他のデータなどの情報の記憶に適した方法または技術において実装される揮発性および不揮発性、取り外し可能および取り外し不可能な媒体および／または記憶デバイスなどのハードウェアを含む。コンピュータ読取可能な記憶媒体の例は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリもしくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（DVD:digital versatile disk）もしくは他の光学ストレージ、ハードディスク、磁気カセット、磁気テープ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、または他のストレージデバイス、有形の媒体、または所望の情報を記憶するのに適しており、コンピュータによってアクセスされ得る製品を含み得るが、これらに限定されない。
【００４８】
「通信媒体」とは、ネットワーク経由など、命令をコンピューティングデバイス６０２のハードウェアへ送信するように構成された信号担持媒体を言う。通信媒体は、典型的には、コンピュータ読取可能な命令、データ構造、プログラムモジュール、または他のデータを、搬送波、データ信号、または他の伝送メカニズムなどの変調されたデータ信号において具現化し得る。通信媒体は、任意の情報配信媒体も含む。「変調されたデータ信号」という用語は、情報を信号中にエンコードするような手法でその特性のうちの１つまたは複数を設定または変更した信号を意味する。限定ではなく、例として、通信媒体は、有線ネットワークまたは直接有線接続などの有線媒体と、音響、ＲＦ、赤外線、および他の無線媒体などの無線媒体とを含む。
【００４９】
前述されたように、ハードウェア要素６１０およびコンピュータ読取可能な媒体６０６は、本明細書において説明される技法の少なくともいくつかの態様を実装するために、いくつかの実施形態において採用され得るハードウェア形式で実装される、命令、モジュール、プログラム可能なデバイスロジックおよび／または固定デバイスロジックを表す。ハードウェア要素は、集積回路またはオンチップシステム、特定用途向け回路（ASIC:application-specific integrated circuit）、フィールドプログラマブルゲートアレイ（FPGA:field-programmable gate array）、複合プログラマブルロジックデバイス（CPLD:complex programmable logic device）、およびシリコンにおける他の実装もしくは他のハードウェアデバイスの構成要素を含み得る。このコンテキストにおいて、ハードウェア要素は、ハードウェア要素によって具現化される命令、モジュール、および／またはロジックによって定義されるプログラムタスクを実行する処理デバイスとして、ならびに、実行のための命令を記憶するために利用されるハードウェアデバイス、例えば、前述されたコンピュータ読取可能な記憶媒体として動作し得る。
【００５０】
前述されたものの組み合わせも、本明細書において説明される様々な技法およびモジュールを実装するために採用され得る。したがって、オペレーティングシステム１０８、アプリケーション１１０、開発モジュール１１２、コンパイラモジュール１１４、難読化モジュール１１６、および他のプログラムモジュールを含むソフトウェア、ハードウェア、またはプログラムモジュールは、何らかの形式のコンピュータ読取可能な記憶媒体上で具現化され、および／または、１つもしくは複数のハードウェア要素６１０によって具現化される、１つまたは複数の命令および／またはロジックとして実装され得る。コンピューティングデバイス６０２は、ソフトウェアモジュールおよび／またはハードウェアモジュールに対応する特定の命令および／または関数を実装するように構成され得る。したがって、ソフトウェアとしてコンピューティングデバイス６０２によって実行可能なモジュールとしてのモジュールの実装は、少なくとも部分的にはハードウェアにおいて、例えば、処理システムのコンピュータ読取可能な記憶媒体および／またはハードウェア要素６１０の使用を通じて、達成され得る。命令および／または関数は、本明細書において説明される技法、モジュール、および例を実装するために、１つまたは複数の製品（例えば、１つもしくは複数のコンピューティングデバイス６０２および／または処理システム６０４）によって実行可能／動作可能であり得る。
【００５１】
図６においてさらに例示されるように、例示的なシステム６００は、パーソナルコンピュータ（PC:personal computer）、テレビデバイス、および／またはモバイルデバイス上でアプリケーションを実行する場合にシームレスなユーザ体験のためのユビキタス環境を可能にする。サービスおよびアプリケーションは、アプリケーションを利用している間、ビデオゲームをしている間、ビデオを鑑賞している間などに、あるデバイスから次のデバイスへ移行する場合に、共通のユーザ体験のために、３つの環境全てにおいて実質的に同様に実行される。
【００５２】
例示的なシステム６００において、複数のデバイスは、中央コンピューティングデバイスを通じて相互接続される。中央コンピューティングデバイスは、複数のデバイスに対してローカルであってもよいし、または複数のデバイスから遠隔に位置していてもよい。一実施形態において、中央コンピューティングデバイスは、ネットワーク、インターネット、または他のデータ通信リンクを通じて複数のデバイスに接続される、１つまたは複数のサーバコンピュータのクラウドであり得る。
【００５３】
一実施形態において、この相互接続アーキテクチャは、複数のデバイスのユーザに共通のシームレスな体験を提供するために、複数のデバイスにわたって配信されるべき機能性を有効にする。複数のデバイスの各々は、異なる物理的要件および能力を有し得、中央コンピューティングデバイスは、両方のデバイスに合わせられているだけでなく、全てのデバイスにも共通する体験の当該デバイスへの配信を可能にするためのプラットフォームを使用する。一実施形態においては、ターゲットデバイスのクラスが作成され、体験は、デバイスのジェネリッククラスに合わせられる。デバイスのクラスは、物理的な特徴、使用法のタイプ、またはデバイスの他の共通する特性によって定義され得る。
【００５４】
様々な実装において、コンピューティングデバイス６０２は、コンピュータ６１４、モバイル６１６、およびテレビ受像機６１８への用途など多様な異なる構成をとり得る。これらの構成の各々は、概して異なる構造と能力とを有し得るデバイスを含み、したがって、コンピューティングデバイス６０２は、異なるデバイスクラスのうちの１つまたは複数に従って構成され得る。例えば、コンピューティングデバイス６０２は、パーソナルコンピュータ、デスクトップコンピュータ、マルチスクリーンコンピュータ、ラップトップコンピュータ、ネットブックなどを含む、コンピュータ６１４のクラスのデバイスとして実装され得る。
【００５５】
コンピューティングデバイス６０２は、携帯電話、携帯音楽プレーヤ、携帯ゲーム機、タブレットコンピュータ、マルチスクリーンコンピュータなどのモバイルデバイスを含む、モバイル６１６のクラスのデバイスとしても実装され得る。コンピューティングデバイス６０２は、気軽な視聴環境において、概してより大きな画面を有し、または概してより大きな画面に接続されるデバイスを含む、テレビ受像機６１８のクラスのデバイスとしても実装され得る。これらのデバイスは、テレビ受像機、セットトップボックス、ゲーム機本体などを含む。
【００５６】
本明細書において説明される技法は、コンピューティングデバイス６０２のこれらの様々な構成によってサポートされることができ、本明細書において説明される技法の特定の例に限定されない。これは、開発モジュール１１２をコンピューティングデバイス６０２上に含めることを通じて例示される。開発モジュール１１２と他のモジュールの機能性も、以下に説明されるように、プラットフォーム６２２を用いた「クラウド」６２０上などの分散システムの使用を通じて全部または一部が実装され得る。
【００５７】
クラウド６２０は、リソース６２４についてのプラットフォーム６２２を含み、および／またはリソース６２４についてのプラットフォーム６２２を表す。プラットフォーム６２２は、クラウド６２０のハードウェアリソース（例えば、サーバ）およびソフトウェアリソースの基本的な機能性を抽象化する。リソース６２４は、コンピューティングデバイス６０２から遠隔のサーバ上でコンピュータ処理が実行される間に利用され得るアプリケーションおよび／またはデータを含み得る。リソース６２４は、インターネット上で、および／または、セルラネットワークもしくはＷｉ−Ｆｉネットワークなどの加入者ネットワークを通じて提供されるサービスも含み得る。
【００５８】
プラットフォーム６２２は、コンピューティングデバイス６０２を他のコンピューティングデバイスに接続するために、リソースおよび機能を抽象化し得る。プラットフォーム６２２は、プラットフォーム６２２を介して実装されるリソース６２４について直面する需要に対する対応するレベルのスケールを提供するために、リソースのスケーリングを抽象化するためにも役立ち得る。したがって、相互接続されたデバイスの実施形態において、本明細書において説明される機能性の実装は、システム６００の全体にわたって分散され得る。例えば、機能性は、部分的にコンピューティングデバイス６０２上に実装され、またクラウド６２０の機能性を抽象化するプラットフォーム６２２を介して実装されてもよい。
結び
本発明は、構造的な特徴および／または方法論的な動作に固有の言語において説明されてきたが、添付の特許請求の範囲において定義される本発明は、必ずしも特定の特徴または動作に限定されるとは限らないことが理解されるべきである。むしろ、特定の特徴および動作は、特許請求の範囲に記載された発明を実装する例示的な形態として開示される。
【図１】
0006490598.tif 000002
【図２】
0006490598.tif 000003
【図３】
0006490598.tif 000004
【図４】
0006490598.tif 000005
【図５】
0006490598.tif 000006
【図６】
0006490598.tif 000007