(57)【特許請求の範囲】
【請求項１】
攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、
前記ソフトウェアアプリケーションの中間コンパイラ表現から、アプリケーション関数を含む元のデータおよびプログラム依存関係の重要なアセットを識別する工程と、
ユーザ固有の基準に従って前記重要なアセットの優先順位を決める工程と、
前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させる工程と、
前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを受け取る工程と、
前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに基づいて、少なくとも一つの依存関係キャリアおよび少なくとも一つの依存関係バインディングを前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成する工程と、
前記代替の中間表現から変換済みソフトウェアアプリケーションを生成する工程とを含み、
前記少なくとも一つの依存関係キャリアはコードを含み、前記少なくとも一つの依存関係バインディングは前記少なくとも一つの依存関係キャリアを前記アプリケーション関数の一つに関連付け、
前記変換済みソフトウェアアプリケーションは、改善された依存関係ネットワークを含むことにより、前記ネットワークを変更すると前記変換済みソフトウェアアプリケーションが予期されない挙動を生じる、方法。
【請求項２】
前記挿入する工程が、アセットの重要性と、前記プログラムにおける関係と、性能トレランスとに基づいて、代替の依存関係についてデータおよびコードを識別する工程をさらに含む、請求項１に記載の方法。
【請求項３】
元の演算を等価の依存関係関数と置き換えることにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、またはコードとコードとの間に作り出される、請求項２に記載の方法。
【請求項４】
前記元の関数と同様に、ただし加えられた依存関係に基づいて機能するように、前記等価の依存関係関数が混合ブール算術演算で構築される、請求項３に記載の方法。
【請求項５】
前記等価の依存関係関数が、外部データを用いた関数演算処理の一部として構成され使用される外部データ依存関係を含み、前記外部データの変化または除去が、前記ソフトウェアアプリケーションの異常な挙動を引き起こすようにする、請求項４に記載の方法。
【請求項６】
定数データを演算処理するための演算を挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項５に記載の方法。
【請求項７】
関数呼び出しを挿入することにより、前記代替の依存関係が、データとコードとの間に作り出される、請求項５に記載の方法。
【請求項８】
ハッシュ、チェックサム、または特性有効チェックを挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項５に記載の方法。
【請求項９】
使用時点でデータを複製することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項５に記載の方法。
【請求項１０】
関数統合により、前記代替の依存関係が、少なくとも第１の関数と第２の関数との間にさらに作り出される、請求項５に記載の方法。
【請求項１１】
新たなコードおよび関数呼び出しを挿入することにより、前記代替の依存関係が、少なくとも第１の関数と第２の関数との間にさらに作り出される、請求項５に記載の方法。
【請求項１２】
等価の依存関係関数を挿入することにより、前記代替の依存関係が、少なくとも第１の関数と第２の関数との間にさらに作り出される、請求項５に記載の方法。
【請求項１３】
前記外部データが、特性基本命令のライブラリとして提供された一つ以上の所定のプログラム特性を含む、請求項５に記載の方法。
【請求項１４】
前記外部データが、前記ソフトウェアアプリケーションのコンパイラ分析の結果として提供された一つ以上の所定のプログラム特性を含む、請求項５に記載の方法。
【請求項１５】
攻撃耐性をソフトウェアアプリケーション全体に提供するシステムであって、前記システムは、
前記ソフトウェアアプリケーションの重要なアセットのユーザ仕様書と、
ソフトウェアに実現された自動プログラム変換メカニズムとを含み、
前記自動プログラム変換メカニズムは、
前記ソフトウェアアプリケーションの中間コンパイラ表現から、アプリケーション関数を含む元のデータとプログラムの依存関係とを識別し、
ユーザ固有の基準に従って前記重要なアセットの優先順位を決め、
前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させ、
前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを受け取り、
前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに基づいて、少なくとも一つの依存関係キャリアおよび少なくとも一つの依存関係バインディングを前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成し、かつ
前記代替の中間表現から変換済みソフトウェアアプリケーションを生成し、
前記少なくとも一つの依存関係キャリアはコードを含み、前記少なくとも一つの依存関係バインディングは前記少なくとも一つの依存関係キャリアを前記アプリケーション関数の一つに関連付け、
前記変換済みソフトウェアアプリケーションは、改善された依存関係ネットワークを含むことにより、前記ネットワークを変更すると前記変換済みソフトウェアアプリケーションが予期されない挙動を生じる、システム。
【請求項１６】
少なくとも一つの依存関係キャリアおよび少なくとも一つの依存関係バインディングを挿入するように構成された前記ソフトウェアは、アセットの重要性と、前記プログラムにおける関係と、性能トレランスとに基づいて、代替の依存関係についてデータおよびコードを識別するようにさらに構成される、請求項１５に記載のシステム。
【請求項１７】
元の演算を等価の依存関係関数と置き換えることにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、またはコードとコードとの間に作り出される、請求項１６に記載のシステム。
【請求項１８】
前記元の演算と同じ機能を実行するように、前記等価の依存関係関数が混合ブール算術演算で構築される、請求項１７に記載のシステム。
【請求項１９】
前記等価の依存関係関数が、外部データを用いた関数演算処理の一部として構成され使用される外部データ依存関係を含み、前記外部データの変化または除去が、前記ソフトウェアアプリケーションの異常な挙動を引き起こすようにする、請求項１８に記載のシステム。
【請求項２０】
定数データを演算処理するための演算を挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項１９に記載のシステム。
【請求項２１】
関数呼び出しを挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項１９に記載のシステム。
【請求項２２】
ハッシュ有効チェックを挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項１９に記載のシステム。
【請求項２３】
使用時点でデータを複製することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項１９に記載のシステム。
【請求項２４】
関数統合により、前記代替の依存関係が、少なくとも第１の関数と第２の関数との間にさらに作り出される、請求項１９に記載のシステム。
【請求項２５】
新たなコードおよび関数呼び出しを挿入することにより、前記代替の依存関係が、少なくとも第１の関数と第２の関数との間にさらに作り出される、請求項１９に記載のシステム。
【請求項２６】
等価の依存関係関数を挿入することにより、前記代替の依存関係が、少なくとも第１の関数と第２の関数との間にさらに作り出される、請求項１９に記載のシステム。
【請求項２７】
特性基本命令のライブラリをさらに含み、前記外部データが、前記ライブラリに設けられた一つ以上の所定のプログラム特性を含む、請求項１９に記載のシステム。
【請求項２８】
前記ソフトウェアアプリケーションのコンパイラ分析用に構成されたソフトウェアをさらに含み、前記コンパイラ分析は、前記ソフトウェアアプリケーションからの一つ以上の所定のプログラム特性を識別して前記外部データを形成する、請求項１９に記載のシステム。
【請求項２９】
攻撃耐性をソフトウェアアプリケーション全体に提供する方法をコンピュータに実行させるためのコンピュータ読み取り可能な命令を含むプログラムであって、
前記プログラムは、
前記ソフトウェアアプリケーションの中間コンパイラ表現から、アプリケーション関数を含む元のデータおよびプログラム依存関係の重要なアセットを識別する工程と、
ユーザ固有の基準に従って前記重要なアセットの優先順位を決める工程と、
前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させる工程と、
前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを受け取る工程と、
前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに基づいて、少なくとも一つの依存関係キャリアおよび少なくとも一つの依存関係バインディングを前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成する工程と、
前記代替の中間表現から変換済みソフトウェアアプリケーションを生成する工程と、
をコンピュータに実行させるための命令を含み、
前記少なくとも一つの依存関係キャリアはコードを含み、前記少なくとも一つの依存関係バインディングは前記少なくとも一つの依存関係キャリアを前記アプリケーション関数の一つに関連付け、
前記変換済みソフトウェアアプリケーションは、改善された依存関係ネットワークを含むことにより、前記ネットワークを変更すると前記変換済みソフトウェアアプリケーションが予期されない挙動を生じる、プログラム。
【請求項３０】
請求項２９に記載のプログラムを記録した、コンピュータ読み取り可能なプログラム記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
（著作権覚書）
本特許文献の開示の一部は、著作権保護に従うべき題材を含む。前記著作権保有者は、公認された特許包袋や特許記録に記載された通りであれば、特許文献または特許開示を誰が複写しようが異議を唱えないが、それ以外の場合はいかなる著作権もすべて保有する。
【０００２】
本発明は概して、隠匿および改ざん防止によるソフトウェア保護に関する。特に、本発明は、隠匿および改ざん防止技術を組み合わせて、保護されたアプリケーション全体にアグレッシブな依存関係群を自動的に張り巡らせる高度に依存したコードを形成し、それによって攻撃に対する耐性を強化する、ソフトウェアアプリケーションの保護に関する。
【背景技術】
【０００３】
ますます発展するコンピュータソフトウェア産業において、アタッカー（例えば，ソフトウェアハッカー）が高価かつ繊細なソフトウェアアプリケーションを無許可または無認可で不正使用する例が多数存在する。さらに、本分野で新たなソフトウェアアプリケーションが展開されにつれ、その基礎となるプログラムコードのモジュール式であり関数ベースである構造によって、かかるソフトウェアアプリケーションが簡単にコードリフティングおよびデータリフティング攻撃の対象となってしまうことがよくある。
【０００４】
現在のソフトウェア保護技術は、主として、隠匿および改ざん防止という、防御の二つの主要な領域を中心とする。隠匿には、一般的に、高精度のアセットおよび関数をアタッカーから隠すためのメカニズムを提供することが含まれる。改ざん防止には、一般的に、保護されたソフトウェアの一部がアタッカーによって改変されたら、前記ソフトウェアがそれぞれ異なる反応をするようなメカニズムを提供することが含まれる。しかし、これら技術のいずれも、コードリフティングおよびデータリフティング攻撃に適切に対処していない。
【０００５】
例えば、単にアタッカーのアプリケーションから使用可能な関数を起動するだけで、動的リンクライブラリ（ＤＬＬ）は容易に特定同定され不正に再使用されるだろう。また、関数またはコード断片は、元のプログラムからリフトされ、アタッカーのプログラムで再使用されるだろう。さらに、アタッカーによって一度データ使用が特定されると、どんなデータも、使用されるデータ量にかかわらず、実行ファイルの前記セクションから、またはデータファイルから、容易に抽出され、ハッカーのアプリケーションから読み込まれ使用されるだろう。さらに、ソフトウェアアプリケーションの設計者がプログラムの構造をわかりにくくできたとしても、アタッカーはそうしようと思えばきっと前記関数を起動するアセンブリコードをリフトするであろうし、その後アタッカー自身の不正ソフトウェアアプリケーションで前記コードを再実行するだろう。前記ソフトウェアを攻撃するこのプロセスを支援するハッカーツール（例えば，逆アセンブラや逆コンパイラ）がある。
【０００６】
ソフトウェア保護の別の例には、プログラムを特定の装置に結合させる公知のノードロッキングの手法がある。この手法では、固有の識別子（ＩＤ）がハードウェアから取得され、プログラムが当該ＩＤに依存させられる。これは、媒体アクセス制御（ＭＡＣ）アドレスのようなハードウェア識別子、ハードウェアディスクＩＤ、指紋情報の使用によって構築されるデバイスキーの算出であってもよい。前記キーを生成するためにこれら識別子を使用するアルゴリズムは、関数およびデータの精巧なプロセスであろう。しかし結局のところ、コードおよびデータ群全体としては、リフティング攻撃にたいして脆弱である。
【０００７】
したがって、改良された改ざん防止および隠匿特性を備える攻撃耐性を提供することが望まれる。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明は、従来のソフトウェア保護メカニズムの少なくとも一つの欠点を取り除く、または軽減することを目的とする。
【課題を解決するための手段】
【０００９】
本発明には、ソフトウェアアプリケーションの攻撃耐性を強化することを目的として、当該ソフトウェアアプリケーション全体に依存関係ネットワークを提供するシステムおよび方法が含まれる。前記システムおよび方法は、かかるソフトウェアアプリケーションの基礎となる高度に依存したコードの生成を提供し、攻撃に耐性のある、改ざん防止と隠匿とを組み合わせたメカニズムを含む。概して、ソフトウェアアプリケーション全体に自動的に張り巡らされるアグレッシブな依存関係群が、本発明によって提供される。さらに重要なことには、これら依存関係は、前記所与のソフトウェアアプリケーションのどの部分も（すなわち，コード部分やソフトウェアモジュールなどを含む部分も）そのままで用いられないようにする。改ざん防止特性に加えて、本発明の技術は、前記所与のソフトウェアアプリケーションに挿入されている依存関係を特定し取り除くことを困難にする隠匿特性を備えている。
【００１０】
第１の態様において、本発明は、攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、前記ソフトウェアアプリケーションの重要なアセットを識別する工程であって、前記重要なアセットは一つ以上の所定のプログラム特性により成る工程と、プログラム特性関数を、前記重要なアセットのうちの対応する一つに関連付ける工程と、ユーザ定義のトレランスに従って前記関連付ける工程を調整する工程と、前記ソフトウェアアプリケーションの一つ以上のポイントで、前記プログラム特性関数から演算処理されたプログラム特性を生成する工程と、前記一つ以上の所定のプログラム特性のうちの対応する１つに対して前記演算処理されたプログラム特性を検証する工程とを含む、方法を提供する。
【００１１】
さらなる態様において、本発明は、攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、前記ソフトウェアアプリケーションの中間コンパイラ表現からの元のデータおよびプログラム依存関係とともに、重要なアセットを識別する工程と、ユーザ固有の基準に従って前記重要なアセットの優先順位を決める工程と、前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させる工程と、前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを取得する工程と、前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに関して、新たなデータおよびプログラム依存関係要素を前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成する工程と、前記代替の中間表現から変換済みソフトウェアアプリケーションを生成する工程とを含み、前記変換済みソフトウェアアプリケーションは、強化された攻撃耐性を提供する改善された依存関係ネットワークを含む、方法を提供する。
【００１２】
さらに別の態様において、本発明は、攻撃耐性をソフトウェアアプリケーション全体に提供するシステムであって、前記ソフトウェアアプリケーションの重要なアセットのユーザ仕様書と、ソフトウェアに実現された自動プログラム変換メカニズムとを含み、前記自動プログラム変換メカニズムは、前記ソフトウェアアプリケーションの中間コンパイラ表現からの元のデータおよびプログラム依存関係を識別し、ユーザ固有の基準に従って前記重要なアセットの優先順位を決め、前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させ、前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを取得し、前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに関して、新たなデータおよびプログラム依存関係要素を前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成し、かつ、前記代替の中間表現から変換済みソフトウェアアプリケーションを生成し、前記変換済みソフトウェアアプリケーションは、強化された攻撃耐性を提供する改善された依存関係ネットワークを含む、システムを提供する。
【００１３】
本発明のその他の態様および特徴は、当業者が添付の図とともに本発明の特定の実施形態についての以下の記載を参照すれば、明らかになるであろう。
【図面の簡単な説明】
【００１４】
添付の図を参照して本発明の実施形態が示されるが、これらはあくまでも例示である。図は以下のとおりである。
【図１】図１は、本発明の変換プロセスの一般化されたフロー図である。
【図２】図２は、本発明の関数呼び出しの挿入およびデータ依存関係を示す図である。
【図３】図３は、本発明のプログラム変換を示す図である。
【図４】図４は、本発明のプログラム変換用の方法工程のフローチャートである。
【図５】図５は、装置フィンガープリンティングの従来技術例を示す図である。
【図６】図６は、図５に示された装置フィンガープリンティング例にさらに本発明の変換を適用したものを示す図である。
【発明を実施するための形態】
【００１５】
概して言えば、本発明は、ソフトウェアアプリケーション（または単に「プログラム」と記載する）の一部から以前は無関係であった別の部分への従属関係を、自動的に伝搬させる方法およびシステムを提供する。前記プロセスは、所望の回数、反復されてもよい。
【００１６】
より詳しくは、本発明には、前記プログラムの他の部分への必須コード関数およびデータの伝搬が含まれる。本発明は、一般的な算術関数を、プログラムの既存の部分に結合している混合ブール演算（ＭＢＡ）式と置き換える。前記プログラムはまず、コンパイラレベルで分析され、プログラム中に保持されている特性を特定する。その後、これら特性に基づいて条件を構築し、データおよび演算中の条件を暗号化する公式へ暗号化する。そしてこれが、実際の依存関係をアプリケーション全体に作り出すために使用され、もし依存関係が壊れた場合に前記プログラムが正常に機能しなくなるようにする。
【００１７】
本発明は、実行されると、ユーザが重要なプログラムアセットの識別を行うようにしてもよく、または、所定のプログラム特性基本命令群がライブラリに確立されて、アナライザが自動的にユーザのプログラムに当てはまる特性基本命令群を特定するようにしてもよい。どちらの場合も、依存関係キャリアおよびバインディングが依存関係のウェブを作り出すために用いられてもよく、これは前記プログラム特性の条件が持続することを要する。もしソフトウェアリフティング攻撃がコードの一部になされたら、プログラム特性の持続の見込みが小さくなり、条件が持続しなくなり、前記依存関係を保持する前記プログラムの一部は正常に動作しなくなる。
【００１８】
図１において、本発明の変換プロセス１００の一般化されたフロー図が示される。ここに、本発明のプロセスへの３つの入力１１０、１１３、１１４が示されている。まず、ソースコード形式のアプリケーションプログラム１１４が提供される。次に、前記プログラムの重要なアセットのユーザ仕様書１１０（または、上述のようなユーザのプログラムに適用される特性基本命令群のライブラリでもよい）が提供される。このユーザ仕様書（または特性基本命令ライブラリ群）は、重要なアセットの相対的な優先順位を示す、元のアプリケーションのマークアップである。前記マークアップは、様々な形態をとってもよい。たとえば、プログラミング言語自体の上の言語拡張；前記プログラムを参照する別の記載；またはユーザが前記プログラムの領域を強調できるグラフィカル・ユーザー・インターフェース（ＧＵＩ）であってもよい。前記第３の入力は、アプリケーションの安全性、性能、およびサイズ目標間でのトレードオフをユーザが特定できるようにする制御オプション（すなわち，トレランス）１１３を含む。これら入力１１０、１１３、１１４は自動プログラム変換ツール１１１によって処理され、プログラム依存関係が挿入された変換済みアプリケーションプログラムを作成する。得られた変換済みプログラム１１２は、正常な動作条件下では、元の入力プログラムと同じ挙動をする。ただし、重要なアセットが敵対者による攻撃にさらされているという条件下では、前記プログラムは期待されたようには挙動しない。かかる攻撃には、アプリケーションデータ値を他のデータ値と置き換える、コードまたはプログラムの一部を別のコードと置き換える、前記プログラムの制御のフローを別のソースへ向ける、または別のソースから導く、前記プログラムの、別のコンテクストで使用するための部分をリフティングする、などがあるが、これらに限定されるわけではない。
【００１９】
重要なアセットのユーザによる識別が含まれる本実施形態に関して、本発明はコンパイラベースの変換ツールを提供するが、この変換ツールは、重要なアセットから開始し、演算、関数呼び出し、およびデータ使用を挿入することによって前記アセットに対して依存関係の長大なウェブを築く。演算および関数は、アプリケーションの既存の関数にアグレッシブに統合される。前記アプリケーションからのデータは、分析され可能ならば再使用される。また、作り出されたデータは前記アプリケーションに使用されるデータ構造に統合される。依存関係のウェブは、ユーザのサイズおよび性能トレランスの範囲内でできるだけ広く拡張される。上記に示唆した通り、本発明は安全性と性能とをトレードオフするための自由度を提供する。高性能のためには、性能に影響の大きいコードを避けて安全性の目標を維持するように依存関係のウェブを調整してもよい。前記依存関係のウェブの端点は、安全性と性能とのトレードオフを最適化するために戦略的に設定されてもよい。極端な場合、前記依存関係のウェブはアプリケーション全体をカバーし、これは重要なアセットが例外なく依存関係にあることを意味する。
【００２０】
さらに、ライブラリに確立された所定のプログラム特性基本命令群が含まれる実施形態に関して、本発明は、ユーザのプログラムに適用される特性基本命令群を自動的に特定するアナライザを提供する。プログラム中の一つのソース点から別の対象点へ従属関係を広げ、各基本命令のアプリケーションに基づいて、前記プログラムが変更される。対象点では、もとは前記ソース点由来の一定の条件へ依存するように、前記プログラムに対して依存関係バインディングが作り出される。前記プログラム中の前記ソース点が変更によって直接的に攻撃されると、前記対象点で前記プログラムの演算中に副次的効果が発生することが、上記の依存によって確実になる。その結果、アタッカーの期待するパラメータ内で挙動しないプログラムが得られる。
【００２１】
多数の種類の特性基本命令があり、また、プログラムが特性基本命令に基づいて変更される方法もさらに多数ある。特性基本命令は各種それぞれ、一定の特徴を有する。例えば、積分定数特性とは、プログラムの実体が、プログラムの全実行寿命について定数を保持していることを意味する。この特徴は、前記実体がプログラム使用の時点で前記積分定数値を有していなければならず、かつ、決して他の値は取らないことを示唆する。これに基づいたプログラム操作の例としては、以下に示すものがあるが、これらに限定されるわけではない：元の定数値についてプログラム実体を複製する；プログラム中の他の値を演算処理するために定数値を使用する；イニシャライズ時間での定数値の演算処理；プログラムの他のフロー全体で定数値を演算処理し、プログラム中、使用時点で正しい値を含むことだけを確実にする；または、プログラム中の適切な時間に有効性を保持するという条件（例えば、equal（等しい）、greater-than（〜より大きい）、less-than（〜より小さい）など）（すなわち,プログラムの寿命、または前回点に記載された演算処理に従った使用時点）で実体を使用する、など。
【００２２】
図２は、本発明の関数呼び出し、およびデータ依存関係の挿入を示す、アプリケーションに対する変換の一般的な例である。変換は、元のアプリケーション側２００と変換済みアプリケーション側２０１の間に示された大きな黒い矢印によって表されている。元のアプリケーション２００は左に示され、呼び出しグラフを介して相関している関数（Ｆｌ、Ｆ２、Ｆ３、Ｆ４、Ｆ５）２２１〜２２５の群を含む。前記関数呼び出しグラフは、そのノードが関数を表し、その有向エッジ（関数から関数への矢印）が一つの端部の関数呼び出し元（矢印の元）と、他方の端部（矢印の先）の関数呼び出し先とを表すグラフである。図２のグラフはまた、有向エッジ（データから関数への矢印）を介した、メモリ（Ｄｌ、Ｄ２、Ｄ３）２１１〜２１３へのデータ依存関係を示す。この例は、読み出し専用（定数）データを示しているが、前記プロセスが読み取り・書き込みデータにも使用されてもよく、前記データの寿命は周知であるか、または分析されてもよい。図２は、右に変換済みアプリケーション２０１を示す。元の呼び出しグラフ依存関係２２１〜２２５およびデータ依存関係２１１〜２１３に加えて、新たな項目が挿入されている（破線に示される項目）。これら新たな項目には、下記に示す項目が含まれるが、これらに限定されるわけではない：
・元の依存とは異なる、データからコードおよび／または関数への依存関係
・元の依存とは異なる、コードおよび／または関数の間の依存関係を有する新たなデータ
・元のプログラムには存在しなかった、関数呼び出し依存関係
・関数統合、これは以前は関係が無かった二つの関数について共用関数ＡＰＩを効果的に作り出す
・データ複製、これはデータ攻撃の有意な変形の危険を減少させる
・コード複製、これは、望ましいプログラム挙動を強制する試みにおいてコードを変更するというアタッカーの能力を低減する
・実行の際に、後にコードパスで使用されるであろうデータに必要なアドレスを演算処理する、ハッシュ・アルゴリズムの呼び出しの挿入
【００２３】
上記の項目リストは、プログラムを、当該プログラムよりも多くの依存関係を有する新たなプログラムに変換する手段のサンプルを提供している。
【００２４】
ただし、本発明では、プログラム特性とは、事前に（例えば，開発時、設置時、または初回実行時に）演算処理され、後の時点で（例えば、ランタイム時に）検証されるプログラムのなんらかの特徴として定義される。プログラム特性の例をいくつか挙げると、以下のものがある（ただし、これらに限定されるわけではない）：
・プログラムの一部または全体における、コード片のハッシュ値
・プログラムの特定の実行状態における変数の特定の値
・プログラムのコード片にある命令の絶対的または相対的なアドレス
・プログラム中のコード片またはデータ片のうちいずれかのサイズ
・プログラムのレイアウト中の命令の種類と配置
・プログラム中の断片のサイズと配置
・プログラム中の関数の数とアドレス配置
・プログラム中のシステム呼び出しの数とアドレス配置
・プログラム中の命令の相対的なオフセット
【００２５】
本発明では、プログラム特性は特に重要である。具体的には、これら特性はある時点で演算処理され、その他の一つまたは複数の時点で検証されてもよい。前記検証をパスすることが期待される；さもなければ改ざん（例えば，逆行分析攻撃、コードおよびデータ変形例攻撃、コードおよびデータリフティング攻撃など）が推測され、検出される。依存関係としてのプログラム特性をプログラム全体に伝搬させると、最終的に得られるものは、影響を受けていないプログラム特性に依拠する、しっかりと結合されたプログラムである。プログラムが正常に機能するかどうかは、プログラム特性によるところが大きくなる。上述のように、前記プログラム特性関数は所与のプログラムに対してソフトウェア保護を適用する技術者が使用できるよう、特性基本命令のライブラリが開発者によってハンドコードされる方法か、またはコンパイラ解析フェーズがプログラムへの自動注入用の特性基本命令を決定する方法かの二つの方法で作成できる。なお、これら選択可能なアプローチはどちらも本発明の不可欠の要件である。
【００２６】
依存関係キャリアに関しては、かかるキャリアは、単純な変数から暗号化された値の計算を含む複合データ構造まですべてを含んでもよい。加えて、キャリアはデータに限定されず、依存関係はかわりに同様にプログラムコードに担持されてもよい。通常、本発明の依存関係キャリアは、個別の値を設定し、演算および／または条件を評価し、実行の異なる時点でその結果を使用し、また、設定されている元のデータ値を隠すように設計されたコード公式およびデータを備える。プログラム全体でデータとして担持されている依存関係は、好適には、変換済みの形態で暗号化され、元の値がアタッカーにわからないようにされる。このように、これらは簡単に逆行分析のような攻撃をかけられることはない。依存関係キャリアは、関連付けられたランダムな定数を有する様々な変換ファミリーを用いて暗号化される。暗号化方法のこの多様性により、依存関係が逆行分析されてプログラムから除去されるのを防ぐ一定レベルの曖昧性が提供される。デザイン志向に応じて、様々な公知の暗号化方法が、本発明の意図する範囲から外れることなくこの目的のために使用されてもよい。データ依存関係を暗号化する方法として可能なものは、米国特許第６，５９４，７６１号、第６，８４２，８６２号、および第７，３５０，０８５号に記載されている。参照文献の内容は当該参照により本明細書に包含される。
【００２７】
前記値は、上述のように、以下の通り暗号化されてもよい。ある関数をＦとすると、
y=F（x）
であり、逆関数をF-1とすると
x=F-1（y）
である。この場合、Fは、xを依存関係キャリアyに暗号化する手段として用いることができる。さらに、FおよびF-1が、それら演算にさらにパラメータをいくつ取ろうとも、同じ全体的効果が得られる。加えて、xおよびyは、最も単純な場合、それぞれ単独の変数である。ただし、それらはまた、関数および逆関数の全体的効果が維持される限り、以下に示すもののいずれであってもよい：多数の変数、条件、データ構造、配列、大きな整数など。
【００２８】
さらなるバリエーションとして、演算が既存のプログラムコードと混ざり合って関数および逆関数の境界が不明になってもよい。例えば、Fを、
F（x）=c（b（a（x）））
とし、F-1を、
F-1（y）=a-1(b-1(c-1(y））
とする。
【００２９】
前記関数a-＞b-＞c-＞c-1-＞b-1-＞a-1は、全体として、依存関係を担持するというジョブを行い、最終的にその順序で実行されなければならない。ただし、関数および逆関数の関連を絶って、いくつかのサブ関数にする能力は、重要である。サブ関数は、ソース（すなわち,依存関係の発生元）によって対象（すなわち,コードの挙動が依存関係に依存しているところ）に対して離間されているコード位置の何個分に注入されてもよい。依存関係キャリアとして機能するサブ関数は、以下のようであってもよい。
・―起動数が適切になるような条件制御下で、呼び出しグラフの様々なレベル、例えば、メインレベル、呼び出された関数、リーフ関数などに設けられてもよい
・単一のコードとして統合されてもよい。例えば、もし演算においてbおよびb-1が同じまたは類似なら、それらは単一の関数に統合されてもよい
・既存のアプリケーション関数に統合されてもよい
・公知の特性（例えば、定数、その他の特性基本命令）で構築されてもよく、新たな依存関係キャリアおよびバインディングを、挿入される特性とする
・アプリケーションコードとブレンドしてもよい。例えば、a-1という最後の演算は、コードと区別がつかないように、値xの最終使用とブレンドしてもよい
【００３０】
依存関係キャリアのさらなる態様は、「状態」の概念である。依存関係キャリアは、一つの元の値の初期状態以上を担持してもよい。例えば、二つの初期値をxとx’とし、依存関係キャリアをyとすると、
y=F（x、x’）
である。ここで、以下の４つの初期状態がありうる：
１．  何も設定されていない
２．  xが設定されている
３．  x’が設定されている
４．  xおよびx’の両方が、設定されている
【００３１】
さらに、「演算」の概念が、依存関係キャリア状態に付加されてもよい。例えば、xおよびx’の等価条件に関心があるという状況を考えると、下記の演算によって、５番目の状態が定義される：
５．  等価条件の評価。
同様に、さらにいくつかの暗号化演算または逆演算を、中間状態として考えることができる。これら暗号化は、算術演算またはブール演算から公式化できる。何らかの形式で情報が保有されている限り、前記データは、望ましい数の中間状態をとってもよい：
６．  中間状態
・・・
ｎ．  中間状態。
【００３２】
なお、上記は一例であり、したがって、入力が一つや、入力が二つの、算術演算、ブール演算、条件付き演算のいずれも、新たなキャリア状態と考えられることは、容易に理解できよう。キャリア状態は、キャリア情報を元のアプリケーションプログラムのフローとブレンドするために重要である。概して、前記依存関係キャリア状態は、どんな数の入力値や、その値についてのどんな数やタイプの演算からも計算できる。依存関係キャリアの結果とその演算は、依存関係バインディングを介してアプリケーションプログラムと組み合わせられるが、それは以下に記載する通りである。
【００３３】
依存関係バインディングは、依存関係キャリアから情報を取得し、データおよび演算の結果をプログラム中の対象点に結合させる。ここでも、本発明の意図する範囲を逸脱することなく依存関係バインディングを作り出す方法がいくつかある。一つの可能な方法は、依存関係キャリアに基づいて演算処理された値を有するデータ実体を提供することである。演算処理された値は、プログラムの重要な演算の必須部分となる。さらに複雑なバインディングは、基本アルゴリズムの部分用の対象位置として必要なポインタの表をファイルすることによって提供できる。
【００３４】
依存関係バインディングは、依存関係キャリアとアプリケーションコードとの間を接続させて改ざん防止するという目的を達成するために使用されるプログラム変換群である。依存関係バインディングは、以下のコード形式を考慮して様々な変換を使用する：
１．依存関係キャリア、および
２．アプリケーションプログラムコード。
【００３５】
依存関係バインディングの目的は、上述した依存関係キャリアおよびアプリケーションプログラムコードを分かりにくくして、それらの分離を非常に困難にすることである。単にバインディング点で依存関係キャリア値を用いることにより、プログラムに対する直接的な依存関係バインディングを有することが可能である一方、アタッカーがこの依存関係を切り離すことも容易であろう。したがって、依存関係バインディングの機能は、依存関係キャリアをわかりにくくしてアプリケーションコードにブレンドすることによってバインディングの存在を不明にすることである。さらに、バインディングの挙動は、改ざん防止の有益性のために一定の基準を満たさなければならない。例えば、プログラムがその挙動を大きく変えることのないように非常に小さな変更を値に加えることをアタッカーができれば、そのアタッカーが成功する可能性が増える。
【００３６】
本発明に従って、依存関係バインディングを作り出すために混合ブール演算（ＭＢＡ）式を立てるための方法を特定する。ＭＢＡ式は、望ましい挙動を計算するために組み合わせたいくつかのブール演算および／または算術演算である。依存関係バインディングは、コードの演算がアプリケーションコードとブレンドされるように構築されてもよい。さらに、バインディングはまた、依存関係キャリアが期待値を含む時に演算値が正常な挙動を呈し、かつ、依存関係キャリアが予想外の値を含む時に演算値が外れた値になる（すなわち，非常に大きい、または非常に小さい値を含む）か、または異常な挙動を呈するように構築されてもよい。
【００３７】
依存関係バインディングは、Ｃ言語のようなハイレベルのプログラミング言語に見られるような構造から構築されてもよい。これらは、ブール演算：and、or、xor、not（すなわち&、|、Λ、!）、または算術演算：add（加算）、sub（減算）、mul（乗算）、div（除算）、mod（剰余）（すなわち+、−、*、/、%）を含んでもよい。加えて、前記バインディングは、条件（すなわち、equal（等しい）、not-equal（等しくない）、greater-than（〜より大きい）、less-than（〜より小さい）、greater-than-or-equal（〜より大きいか等しい）、less-than-or-equal（〜より小さいか等しい））、または制御フロー（すなわち、ジャンプ、分岐、ループ）を含んでもよい。
【００３８】
依存関係バインディングの形態は、依存関係キャリアに担持されている特性のタイプに関連付けられている。前記キャリアは、ダウンストリーム計算に用いられる単純な定数、または、条件（例えば,等価条件）など、ある量の情報を含んでもよい。ここで、入力が一つの関数、例えば,-x、~xのような演算が用いられてもよい。入力が二つの等価タイプの依存関係については、まず入力が二つで出力が一つの関数を考えることにより、バインディングを構築する。
int dep（int x、int y）
前記関数depは、xおよびyが同じ値を有する時に正常な挙動をし、xおよびyが異なる値を有する時に非常に異なる種類の挙動をするように構築されてもよい。さらに、関数に別の入力を加えてもよい:
int dep（int x、int y、int c）
前記入力cは、演算で用いられるが、依存関係演算処理をアプリケーションプログラム自体に結合させる働きだけを行う。関数への別の入力は、何個であってもよい。
【００３９】
望ましい演算処理は、次のような方法を用いて構築される:
１．演算とそれに対応する特徴とのパレットが作成される。特徴パラメータは、演算の数を含む。演算が多ければ安全性レベルが上がり、演算が少なければ性能が上がる。
２．安全性および性能の目標を念頭におきつつ、パレットからの選択がなされる。
３．選択を組み合わせて全演算処理を作り出す。
【００４０】
演算のパレットを以下に示す:
【数１】
0005777189.tif 000002
【００４１】
演算パレットのこれら演算は、それぞれ異なる演算数で、同等に算術減算演算を行う。演算の数は、演算処理の安全性レベルおよび性能に寄与する。ハイレベルなプログラミング言語（例えば，Ｃ言語）用の算術演算およびブール演算はすべて、同じように特徴づけられてもよい。
【００４２】
加えて、演算のパレットから、恒等関数が作成される。恒等関数は、入力x、および、一つ以上の別の入力、c1、c2、・・・をとる演算処理群である。前記別の入力cl、c2、・・・はプログラム値であるが、恒等関数の演算処理中は一定でなければならない。恒等関数は、出力時に値xを生成する。恒等関数は以下のとおりである:
【数２】
0005777189.tif 000003
【００４３】
このように恒等関数を作成することで、前記別の入力cl、c2、・・・などを用いて依存関係をアプリケーションに導入することが可能になる。これら入力は、アプリケーションプログラムのなんらかの変数に結合されてもよく、それによりアタッカーの前記演算処理を切り出す能力を低減する。なぜなら、アタッカーにはプログラムの残り部分に対する依存関係の陰にあるセマンティクスが分からないからである。恒等関数は、ハイレベルのプログラミング言語（例えば、Ｃ言語）用の算術演算およびブール演算すべてについて作成される。さらに、上記の記載以外に、恒等関数を作成するために演算を組み合わせるやり方は、他に多数ある。説明用に、アプリケーションコードを保護するために使用される依存関係バインディングの例を下記に詳細に示す。ただし、かかる詳細な例は、本発明の意図する範囲を限定するものとはみなされない。
【００４４】
以下の例は、アプリケーションコードを保護するために使用される依存関係バインディングの特徴を示す。関数depは、依存関係キャリアがどのようにプログラムコードに結合され、望ましい結果を達成するかを示す。関数main（）に示されているように、定数値１９０にならなければならないプログラム特性があると想定する。前記プログラムは、変数xを使用して,ランタイム時に前記値を演算処理し、前記関数dep（）が前記結果になりそれを担持するために用いられる。二つの状況が考えられる：
１．変数xが、正しい値（すなわち,190）を含む。その結果はd1にある。
２．変数xが、正しくない値（すなわち,183）を含む。その結果はd2にある。
【００４５】
依存関係キャリア関数dep（）は以下のように働く：
・入力値aおよびbを64ビットの戻り変数に担持されるよう暗号化する。この例は、前記値が算術演算（sub）およびブール演算（xor）によって演算される非常に単純な例を使用している。
・演算処理に入力cを利用する;ただし、前記値は出力結果に影響しない。唯一の必須条件は、前記値cが演算処理中に一定であることである。これにより、アタッカーが容易に切り離せない、プログラムコード上の依存関係が提供される。
【００４６】
マクロで暗号化された、依存関係バインディング演算、BLEND1（）、BLEND2（）は、以下の属性を備えた構成である:
・入力aが入力bと同じ値を有していれば、バインディング演算は1を算出する。
・入力aが入力bとは異なる値を有していれば、バインディング演算は大きな値を算出する。
【００４７】
同様に、依存関係キャリアがゼロを生成すれば、PREBLEND（）は大きな数の定数を加算する構成であり、POSTBLEND（）はこの同じ大きさの定数を減算する構成である。一方で、依存関係キャリアが他の値を生成すれば、POSTBLEND（）は前記の大きい定数値を加算する。これら依存関係バインディングマクロは、拡張して前記演算をアプリケーションコードにブレンドするので、アタッカーが容易に除去できない。前記マクロは、特性にブレンドされた依存関係を隠しつつ等価の関数を提供する手段を、効果的に提供する。関数main（）において、１００という値になるべきkとjという二つの加算がある。なお、この加算は、アプリケーションプログラムにおける有意な演算を示している。第１の加算は、正しい値が演算処理される結果となるd1に依存し、第２の加算はd2に依存し、これは非常に大きな正しくない数が演算処理される結果となる。
【００４８】
さらに本例について、以下の３つの部分がある：
１．元のソース形態のプログラム例
２．処理前のプログラム例。これは、コードをアプリケーションプログラムにブレンドしたものを示す
３．プログラムが実行されている時のランタイム出力。前記第１の出力は、前記特性が正しいことを示している。前記第２の出力は、前記特性が正しくないことを示している。前記第３の出力は、前記特性が正しいことを示している。
【００４９】
元のソース形態のプログラム例は以下を含む：
【数３】
0005777189.tif 000004
0005777189.tif 000005
0005777189.tif 000006
0005777189.tif 000007
【００５０】
前記処理前のプログラム例は、以下を含む：
【数４】
0005777189.tif 000008
0005777189.tif 000009
【００５１】
コンパイルおよび実行後のランタイム出力は、以下を含む：
one_hundred=100
one_hundred=81964804
one_hundred=100
【００５２】
依存関係キャリアおよびバインディングは、図３に図示される。ここに、本発明のプログラム変換を示す図が示されている。前記元のプログラム側３００は、データ依存関係３１１〜３１３（またはそれ以上）、アプリケーション関数３２１〜３２４（またはそれ以上）、およびアセット３３１〜３３３（またはそれ以上）を含む。正常なプログラムフローは、矢印３７０により表されている。元のプログラム側３００から変換済みプログラム側３０１へ向かう大きな黒矢印によって示されている変換の際に、前記元のデータ依存関係、関数、およびアセットは、注入された依存関係バインディング（Ｄ−バインディング）３５１〜３５５、および依存関係キャリア（Ｄ−キャリア）３６１〜３６５の依存関係ネットワーク（点線で表されている）を含む。この依存関係ネットワークは、変更プログラムフロー３７１を効果的に作り出す。前記依存関係ネットワークは、外部データの挿入と、注入データ３１４および注入関数３２５によって提供された新たな関数とによって、さらに改善される。
【００５３】
図３に示されたかかるプログラム変換の基礎となる方法は、本発明の方法に従った一般的な工程４００を示す図４をさらに参照して、詳細に説明される。アプリケーションを依存関係ネットワークに変換する方法は、以下の工程を含む：
工程１）元のアプリケーションは、４１１でソース形態からパースされ、４１２で中間コンパイラ表現で表されている
工程２）重要なアセット（明示の、または非明示のプログラム特性を含む）が、４１３で認識され、ユーザの仕様書に基づいて優先順位が決められる
工程３）４１４で、前記アプリケーションが、元のデータおよびプログラム依存関係について解析される。解析情報は同様に、工程２からの情報に相互に関連付けられる
工程４）４１５で、ユーザが、所与のアプリケーションについての性能／サイズオプションおよび／またはトレランスを提供する
工程５）４１６で、アプリケーション内でできるだけ広く前記依存関係を拡張させることを目指して、新たなデータおよびコード依存関係の項目（上記のように）が挿入される。前記重要なアセットの優先順位（工程３）およびユーザのアプリケーションの前記性能／サイズトレランス（工程４）に基づき、トレードオフが行われる
工程６）４１７で、中間表現から変換済みアプリケーションが生成される。
【００５４】
上記工程５では、下記のサブ工程が含まれる：
サブ工程１）アセットの重要性、プログラム中の関係、および性能トレランスに基づいて、新たな依存関係についてデータおよびコードが識別される
サブ工程２）データとコードとの間で、データとデータとの間で、またはコードとコードとの間で、依存関係が作り出されるが、それは以下のいずれかによってなされる：
ａ）演算を「等価の依存関係関数」と置き換える。これら等価の依存関係関数はＭＢＡ演算で構築され、元の演算と同じ関数を行うが、外部データ依存関係も有するようになっている。前記外部データは、関数演算処理の一部であり、切り離せない状態で用いられる。前記データの変化または除去は、異常な挙動を引き起こす
ｂ）定数データを演算処理するための演算の挿入
ｃ）関数呼び出しを挿入
ｄ）ハッシュ有効性チェックを挿入
ｅ）使用時点でデータを複製
サブ工程３）関数と他の関数との間に依存関係が作り出される：
ａ）関数統合
ｂ）新たなコードおよび関数呼び出しを挿入
ｃ）等価の依存関係関数を挿入。
【００５５】
上記に参照した変換手順４００の結果は、強固に結合したプログラムであり、これは図３を参照して示され、すでに記載されている。したがって、関数およびデータが、変換プロセスを経て互いに密接に依存するようになっていることは明らかである。これは、重要なアセット、ノードロックアルゴリズム、プログラム特性演算処理、などすべてが、プログラム全体でデータおよびコードを介して、互いに密接に結合し依存するようになっていることを意味している。これは改ざん攻撃の脅威を低減し、リフティング攻撃をより困難にしている。幅広いバリエーションのプログラムの大きな部分に一片のコードまたはデータが依拠している場合、別のプログラムに使用するために前記コードおよび／またはデータを分離することはとても困難である。プログラム特性チェック、ノードロック、透かしなど、前記プログラムの個別化された特徴を考えると、アタッカーは常に、全プログラムを全体として使用することを余儀なくされ、改ざんおよびソフトウェアリフティング攻撃が無効にされる。アタッカーがプログラムを全体でとらえることを余儀なくされているので、この場合、攻撃耐性という目標が達成されている。
【００５６】
本発明の別の例は、公知の装置フィンガープリンティングとともに、本発明のシステムおよび方法を実施することを含む。概して、プログラムが、スライス間に限定的な相互依存関係を有するプログラムスライス群に分解できることは知られている。かかるプログラムスライス依存関係が、従来技術の図５に示されている。
【００５７】
従来技術の図５は、特定のコンピュータ用のＩＰアドレス５１９とHardware GUID（すなわち、General Universal Identifier（グローバル一意識別子））５１０を読み出し、その後、署名５１８およびチェックサムアルゴリズム５１１をそれぞれ実行する公知の装置フィンガープリンティングのシナリオである。この工程は、ノード許可５１４をチェックし、プログラムの他の部分を進行させるか（５１５での「中間」および５１６での「終了」）または５１２でプログラムを中断させる関数への入力として用いられる、予想されるフィンガープリント５１７を生成する。これは、ｍａｉｎプログラム５１３の一部として行われる。この装置フィンガープリンティングシナリオは、事実上、単純化されたノードロッキングアルゴリズムであり、そこではユーザは、ＩＰアドレスとHardware GUIDとの正しい組み合わせを用いた時のみコンピュータ上でプログラムを実行することが許可される。
【００５８】
安全性保護の観点から見ると、従来技術の図５に示された装置フィンガープリンティングシナリオにある主要な問題の１つは、それがプログラムスライスから成ることであり、そこでは依存関係（プログラムおよびデータの双方）のフローが一つの関数から次の関数へと向かっており予測可能になっていることである。これら依存関係は破線で示されている。この論理フローは、良好なモジュラープログラミングの実行に役立つ一方、いくつかの一目瞭然な攻撃ポイントを提供している。まず、データ（予期されたフィンガープリント定数５１７）が異なるデータと置き換えられるだろう。さらに、ハードウェア関数（ＩＰアドレス読み出し５１９、ハードウェアGUID読み出し５１０）が、望ましいデータを生成するハードコードされた関数と置き換えられるだろう。また、フィンガープリント関数（署名作成５１８、チェックサム５１１）がハードコードされた関数と置き換えられるだろう。さらに、ノード許可チェック関数５１４での条件がプログラム開始を常に許可するように妨害されるだろう。さらに、ノード許可チェック関数５１４の呼び出しが除去されるだろう。かかる攻撃ポイントは、本発明を実行することによって低減されよう。
【００５９】
本発明を従来技術の図５に示された装置フィンガープリンティング実施形態に適用した後に、新たに挿入された依存関係が元のスライスすべてを相互に依存させ、プログラム全体が依存関係のネットワークになって、さらなる分解を困難なものにする。この本発明の装置フィンガープリンティング実施形態の変形例は図６に示される。これにより、本開示に記載の方法を使用して、同じ基礎となるアプリケーション例が変換され、変換済みアプリケーション６００が生成される。この例では、依存関係キャリアおよびバインディングは、単純なデータ変数であり、使用は下流のプログラム点である。この例は、上述の効果的な依存関係キャリアおよびバインディングを考慮した、依存関係が効果的に配置される場所を点線によって示している。前記の例のように、外部データと挿入データ６１０によって提供された新たな関数との挿入によって、依存関係ネットワークがさらに改善される。
【００６０】
従来技術の図４に関連する元のプログラムコードは次のように実施される：
【数５】
0005777189.tif 000010
0005777189.tif 000011
0005777189.tif 000012
0005777189.tif 000013
0005777189.tif 000014
【００６１】
先の段落に記載された、この元のコードの例は、変換図６に一般的に示された本発明の変換の時は、以下のように示される：
【数６】
0005777189.tif 000015
0005777189.tif 000016
0005777189.tif 000017
0005777189.tif 000018
0005777189.tif 000019
【００６２】
本発明の上記の実施形態は、あくまでも例示である。当業者であれば、本明細書に添付の請求項によってのみ定義される本発明の範囲を逸脱することなく、前記特定の実施形態に改変、変更、およびバリエーションを加えるであろう。
【図１】
0005777189.tif 000020
【図２】
0005777189.tif 000021
【図３】
0005777189.tif 000022
【図４】
0005777189.tif 000023
【図５】
0005777189.tif 000024
【図６】
0005777189.tif 000025