(57)【要約】  セキュリティ変換のオブジェクトコードモジュールへの適用が、たとえばメモリ再配置や、モジュールの多様なインスタンスからの選択、および定数の遅延結合などを介して、リンクタイムまたはロードタイムまで延期できる、リンカーまたはローダー、および関連する方法が提供される。これにより、従来のソースからソースへのセキュリティ変換よりもすぐれたいくつかの利点が提供される。この延期されたセキュリティ変換は、適用されても非常に軽く、得られた実行可能プログラムに大幅な多様性の機会をもたらし、セキュリティを向上すると同時に、実行性能、正確性への影響を最小限にし、デバッギングの複雑性を減少させる。
2013524321.tif 000002
【特許請求の範囲】
【請求項１】
ビルドタイムまたはロードタイム時に、セキュリティ変換をオブジェクトコードに適用する方法であって、
疑似乱数生成器への入力としてランダムシードを特定する工程と、
実行可能モジュールの区別可能なインスタンスを生成する工程であって、
前記ランダムシードを前記疑似乱数生成器への入力として適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスをランダムに選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定することと、
前記ランダムなレイアウトにしたがって前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、前記実行可能モジュールの前記区別可能なインスタンスを生成することと、
によってそれを行う工程と、
前記実行可能モジュールの前記区別可能なインスタンス内のシンボルを解決する工程と、
を含む方法。
【請求項２】
前記ランダムに選択することは、インスタンスが作成された複数のモジュールを含む多様的に設定されたライブラリからランダムな選択をすることを含む、請求項１に記載の方法。
【請求項３】
前記多様的に設定されたライブラリ内の、インスタンスが作成された各モジュールは、区別可能なセキュリティ特性でインスタンスが作成され、前記ランダムに選択することは、
前記複数のコンパイルされたソフトウェアモジュール用のアセット評価とコールサイトのプロファイル重みとを、前記複数のコンパイルされたソフトウェアモジュール内に埋め込むことと、
前記アセット評価と前記プロファイル重みとに基づいて前記ランダムな選択を制約することと、
をさらに含む、請求項２に記載の方法。
【請求項４】
前記ランダムなレイアウトを決定することは、前記コンパイルされたソフトウェアモジュールの選択されたインスタンスを、別々のコード部分に分割し、メモリイメージ内の前記コード部分の位置をランダム化することを含む、請求項１に記載の方法。
【請求項５】
前記コード部分の位置をランダム化することは、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのうちの、異なるいくつかのインスタンスからのコード部分を混合することを含む、請求項４に記載の方法。
【請求項６】
前記部分の位置をランダム化することは、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのうちの、異なるいくつかのインスタンスからのコード部分を、データ部分と混合することを含む、請求項４に記載の方法。
【請求項７】
前記多様化操作を適用することは、セキュリティ変換定数の遅延結合をさらに含み、
前記ランダムシードを前記疑似乱数生成器への入力として適用して、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスに適用されたセキュリティ変換に関するメタデータにしたがって、前記セキュリティ変換定数をランダムに決定することによって、前記遅延結合を行う、請求項１に記載の方法。
【請求項８】
前記セキュリティ変換は、プログラム変換である、請求項７に記載の方法。
【請求項９】
前記プログラム変換は、データフロー変換または制御フロー変換である、請求項８に記載の方法。
【請求項１０】
実行可能プログラムイメージの複数の多様なインスタンスを生成する方法であって、前記方法は、前記実行可能プログラムイメージの所望のインスタンスの各々について、
疑似乱数生成器への入力としてランダムシードを特定する工程と、
実行可能プログラムイメージの区別可能なインスタンスを生成する工程であって、
前記ランダムシードを前記疑似乱数生成器への入力として適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスをランダムに選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定することと、
前記ランダムなレイアウトにしたがって、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、実行可能プログラムイメージの区別可能なインスタンスを生成することと、によって行われる工程と、
前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルを解決する工程と、
を含む方法。
【請求項１１】
前記ランダムに選択することは、インスタンスが作成された複数のモジュールを含む多様的に設定されたライブラリからランダムな選択をすることを含む、請求項１０に記載の方法。
【請求項１２】
前記多様的に設定されたライブラリ内の、インスタンスが作成された各モジュールは、区別可能なセキュリティ特性でインスタンスが作成され、前記ランダムに選択することはさらに、
前記複数のコンパイルされたソフトウェアモジュール用のアセット評価とコールサイトのプロファイル重みとを、前記複数のコンパイルされたソフトウェアモジュール内に埋め込むことと、
前記アセット評価と前記プロファイル重みとに基づいて前記ランダムな選択を制約することと、
を含む、請求項１１に記載の方法。
【請求項１３】
前記ランダムなレイアウトを決定することは、前記コンパイルされたソフトウェアモジュールの選択されたインスタンスを、別々のコード部分に分割し、メモリイメージ内の前記コード部分の位置をランダム化することを含む、請求項１０に記載の方法。
【請求項１４】
前記部分の位置をランダム化することは、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのうちの、異なるいくつかからのコード部分を混合することを含む、請求項１３に記載の方法。
【請求項１５】
前記コード部分の位置をランダム化することは、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのうちの、異なるいくつかからのコード部分を、データ部分と混合することを含む、請求項１３に記載の方法。
【請求項１６】
前記多様化操作を適用することは、セキュリティ変換定数の遅延結合をさらに含み、
前記ランダムシードを前記疑似乱数生成器への入力として適用して、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスに適用されたセキュリティ変換に関するメタデータにしたがって、前記セキュリティ変換定数をランダムに決定することを含む、請求項１０に記載の方法。
【請求項１７】
前記セキュリティ変換は、プログラム変換である、請求項１６に記載の方法。
【請求項１８】
前記プログラム変換は、データフロー変換または制御フロー変換である、請求項１７に記載の方法。
【請求項１９】
実行可能プログラムイメージの複数の多様なインスタンスを生成する方法であって、前記方法は、前記実行可能プログラムイメージまたは前記動的ライブラリの所望のインスタンスの各々について、
疑似乱数生成器への入力としてランダムシードを特定してランダムな選択肢を生成する工程と、
前記ランダムな選択肢により決定された多様化操作を、複数のコンパイルされたソフトウェアモジュールに適用することによって、かつ、前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決することによって、前記複数のコンパイルされたソフトウェアモジュールを変換する工程と、
前記解決されたシンボルによって決定された区別可能な設定を有する、前記実行可能プログラムイメージのインスタンスを生成する工程と、
を含む方法。
【請求項２０】
前記複数のコンパイルされたソフトウェアモジュールを変換する工程は、前記シンボルを解決して、前記複数のソフトウェアモジュールのランダム化されたメモリイメージレイアウトを提供することを含む、請求項１９に記載の方法。
【請求項２１】
前記複数のコンパイルされたソフトウェアモジュールを変換する工程は、前記シンボルを解決して、前記複数のソフトウェアモジュールの区別可能なインスタンスのランダム化された選択を提供することを含む、請求項１９に記載の方法。
【請求項２２】
ビルドタイム時にカプセル化された実行可能モジュールの複数の多様な、区別可能なインスタンスを提供するリンカーであって、前記リンカーは、
プロセッサに、各実行可能モジュールの多様な区別可能なインスタンスの各々について区別可能なランダムな選択肢をランタイム時に生成させるよう構成された、疑似乱数生成器と、
前記プロセッサに複数のコンパイルされたソフトウェアモジュールを変換させるランタイムモジュールであって、
前記ランダムな選択肢により決定された多様化操作を複数のコンパイルされたソフトウェアモジュールに適用することによってそれらを変換し、
前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決し、
前記プログラムの各起動時に、前記解決されたシンボルによって決定された区別可能な設定を有する、実行可能プログラムイメージのインスタンスを生成することによって、それを行うランタイムモジュールと、
を含む、リンカー。
【請求項２３】
ランタイム時に実行可能プログラムイメージの多様な、区別可能なインスタンスを提供するローダーであって、前記ローダーは、
プロセッサに、前記実行可能プログラムイメージの多様な区別可能なインスタンスの各々について区別可能なランダムな選択肢を生成させるよう構成された、疑似乱数生成器と、
前記プロセッサに複数のコンパイルされたソフトウェアモジュールを変換させるリンキングモジュールであって、
前記ランダムな選択肢により決定された多様化操作を複数のコンパイルされたソフトウェアモジュールに適用することによって、それらを変換し、
前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決し、
前記解決されたシンボルによって決定された区別可能な設定を有する、前記実行可能プログラムイメージのインスタンスを生成することによって、それを行うリンキングモジュールと、
を含む、リンカー。
【請求項２４】
実行可能プログラムイメージの複数の多様なインスタンスを生成するローダーであって、前記ローダーは、
プロセッサに、前記実行可能プログラムイメージの所望のインスタンスの各々について区別可能なランダムな選択を生成させるよう構成された、疑似乱数生成器と、
前記プロセッサに前記実行可能プログラムイメージの区別可能なインスタンスを生成させるランタイムモジュールであって、
前記ランダムな選択を適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスを選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定し、
前記ランダムなレイアウトに準じて前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、実行可能プログラムイメージの区別可能なインスタンスを生成し、
前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルを解決することによって、それを行うランタイムモジュールと、
を含む、ローダー。
【請求項２５】
前記ランダムなレイアウトは、ランタイムローディング時のランダムなアドレス割り当てを含む、請求項２４に記載のローダー。
【請求項２６】
前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスの選択は、さらにランタイム条件に基づく、請求項２４に記載のローダー。
【請求項２７】
前記ランタイム条件は、不正な違反を検出することを含む、請求項２６に記載のローダー。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、改ざんからソフトウェアを保護する方法とシステムに関する。本開示は特に、リンキングおよびローディング時にアプリケーションソフトウェアを保護する方法とシステムに関する。
【背景技術】
【０００２】
従来より、所与のソフトウェアモジュールのためのセキュリティ変換がソースコードへ直接適用されている。たとえば、プログラム変換は、ソフトウェアへの逆行分析攻撃や改ざん攻撃への耐性を求める効果的な取り組みであった。加えて、これらセキュリティ変換の多様化は、差分攻撃、結託、その他それらに匹敵する脅威に対する防壁となっている。たとえば、２００３年７月１５日発行の米国特許第６５９４７６１号、および２００５年１月１１日発行の米国特許第６８４２８６２号は、ソフトウェアを保護するために使用できるデータフロー変換技術を記載し、また、２００４年８月１７日発行の米国特許第６７７９１１４号は、ソフトウェアを保護するために使用できる制御フロー変換技術を記載している。
【０００３】
セキュリティ変換が適用されると、まずソースファイルがプリコンパイラによって処理されるが、これによってソフトウェアモジュールのソースからソースへのセキュリティ変換が行われ、ユーザーの定めるセキュリティ決定に基づく変換を含む、変換済みソースファイルが生成される。変換済みソースファイルはその後、ネイティブコンパイラによって処理され、オブジェクトコードが生成される。この得られたネイティブオブジェクトコード（静的ライブラリとしてパッケージ化されることもある）はエンドユーザにとってはイミュータブルであり、実行可能バイナリライブラリまたは動的ライブラリにされるにはリンカーによって処理されなければならない。ライブラリはリンカーによってプログラムに統合される。リンカーの出力（特に、メモリ内のソフトウェアモジュールのレイアウト）は自動的に生成され、それはランタイム性能のために最適化された入力ソフトウェアモジュールの確定関数である。メモリレイアウトを変更することが望ましければ、リンカーの大半は複合メタデータの使用を必須とするが、これは一般的には、最上級のユーザーは別として、ユーザーができる範囲を超えている。
【０００４】
もしソフトウェアモジュールのセキュリティ決定を修正する必要があれば、またはモジュールの多様なインスタンスの作成が望ましかったとしても、プリコンパイル、コンパイル、およびリンキング／ローディングというステップを繰り返す以外に選択肢は無い。これは、関与するビルドタイムの点だけではなく、品質保証の観点からも、費用がかかる。ソフトウェアモジュールを再構築するためは、得られた実行可能／動的ライブラリの性能（速度、サイズなど）と正確さが再検証されなければならない。
【０００５】
従って、セキュリティ決定の変更が必要な時や、多様なインスタンスを作成する必要がある時などに、ソフトウェアモジュールの再構築を不要にするセキュリティ変換を適用するための、改善された方法とシステムとを提供することが望ましい。
【発明の概要】
【０００６】
本開示は、得られた実行可能／動的ライブラリにおける多様性によってセキュリティを提供するいくつかのやり方でバイナリ出力コードの内容を変更できるソフトウェアリンカーまたはソフトウェアローダーを提供する。３つの具体的な実施形態が開示されている。第一は、メモリイメージ再配置が関与する。リンカーの結果が、再配置可能なセグメントまたはセクションの各々についての、ランダム化されたベースアドレス割り当ておよびレイアウトであり、これは従来のリンカーによってなされる決定論的結論とは対照的である。この試みは、セクションの予測可能な位置に基づく攻撃に対する、大きな障壁となり得る。第二は、選択的構築が関与する。個別のコードモジュールが、大容量のライブラリ中に、多数の多様な形式で作成でき、分けて設定される。リンカーは、最終的な実行可能ファイルについてランダムにコードインスタンスを選択する。この試みは、差分攻撃を防ぐことができる。第三は、定数の遅延結合が関与する。データおよび制御フローセキュリティ変換などのプログラム変換は、選択された定数で特徴づけられた操作パラメータを有する。これらパラメータは、同様に処理されて再配置アドレスとなり、リンクタイム時に選択され、その結果、実行時の変換の多様化がもたらされる。この試みはまた、差分攻撃に対しても使用でき、また、組織化されたアップデートによって更新できるようにもする。
【０００７】
前記リンカーまたはローダーの態様は、この動作の範囲を制御するというオプションや、予測可能に多様なアウトプットイメージの作成を可能にするランダムシードパラメータを受け入れる。リンカーが全く同じ入力ソフトウェアモジュールと、同じランダムシードとで二度起動されると、アウトプットイメージも同じであろう。多様なアウトプットイメージを生成するためには、区別可能なランダムシードが選択されなければならなかったであろう。
【０００８】
第一の態様において、ビルドタイム時またはロードタイム時に、オブジェクトコードにセキュリティ変換を適用する方法が提供される。前記方法は、疑似乱数生成器への入力としてランダムシードを特定する工程を含む。次に、前記ランダムシードを前記疑似乱数生成器への入力として適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスをランダムに選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定することによって、実行可能モジュールの区別可能なインスタンス、または実行可能プログラムイメージが生成される。前記ランダムなレイアウトにしたがって前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、前記実行可能モジュールの前記区別可能なインスタンスを生成する。前記実行可能モジュールの前記区別可能なインスタンス内でシンボルが解決される。
【０００９】
さらなる態様において、実行可能プログラムイメージの複数の多様なインスタンスを生成する方法が提供される。前記実行可能プログラムイメージの所望のインスタンスの各々について、疑似乱数生成器への入力としてランダムシードが特定される。そして、前記ランダムシードを前記疑似乱数生成器への入力として適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスをランダムに選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定することにより、実行可能プログラムイメージの区別可能なインスタンスが生成される。前記ランダムなレイアウトにしたがって、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせ、実行可能プログラムイメージの区別可能なインスタンスを生成する。前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルが解決される。
【００１０】
前記ランダムに選択することは、インスタンスが作成された複数のモジュールを含む多様的に設定されたライブラリからランダムな選択をすることを含みうる。前記多様的に設定されたライブラリ内の、インスタンスが作成された各モジュールは、区別可能なセキュリティ特性でインスタンスが作成され、前記ランダムに選択することは、前記複数のコンパイルされたソフトウェアモジュール用のアセット評価とコールサイトのプロファイル重みとを、前記複数のコンパイルされたソフトウェアモジュール内に埋め込むことと、前記アセット評価と前記プロファイル重みとに基づいて前記ランダムな選択を制約することと、をさらに含みうる。
【００１１】
前記ランダムなレイアウトを決定することは、前記コンパイルされたソフトウェアモジュールの選択されたインスタンスを、別々のコード部分に分割し、メモリイメージ内の前記コード部分の位置をランダム化することを含みうる。前記コード部分の位置をランダム化することは、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのうちの、異なるいくつかからのコード部分を、データ部分と混合することを含みうる。
【００１２】
前記多様化操作を適用することは、セキュリティ変換定数の遅延結合をさらに含んでもよく、前記ランダムシードを前記疑似乱数生成器への入力として適用して、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスに適用されたセキュリティ変換に関するメタデータにしたがって、前記セキュリティ変換定数をランダムに決定することによって、前記遅延結合を行う。前記セキュリティ変換は、プログラム変換、特にデータフロー変換または制御フロー変換から選択できる。
【００１３】
さらなる態様において、実行可能プログラムイメージの複数の多様なインスタンスを生成する方法が提供される。前記実行可能プログラムイメージまたは前記動的ライブラリの所望のインスタンスの各々について、疑似乱数生成器への入力としてランダムシードが特定され、ランダムな選択肢が生成される。前記ランダムな選択肢により決定された多様化操作が、複数のコンパイルされたソフトウェアモジュールに適用することによって、かつ、前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決することによって、前記複数のコンパイルされたソフトウェアモジュールが変換される。前記解決されたシンボルによって決定された区別可能な構成を有する、前記実行可能プログラムイメージのインスタンスが生成される。前記複数のコンパイルされたソフトウェアモジュールを変換する工程は、前記シンボルを解決して、前記複数のソフトウェアモジュールのランダム化されたメモリイメージレイアウトを提供することを含む。
【００１４】
さらに別の態様において、ビルドタイム時にカプセル化された実行可能モジュールの複数の多様な、区別可能なインスタンスを提供するリンカーまたはローダーが提供される。前記ローダーまたはリンカーは、プロセッサに、各実行可能モジュールの多様な区別可能なインスタンスの各々について区別可能なランダムな選択肢をランタイム時に生成させるよう構成された、疑似乱数生成器と、前記プロセッサに複数のコンパイルされたソフトウェアモジュールを変換させるランタイムモジュールとを含む。前記変換は、前記ランダムな選択肢により決定された多様化操作を複数のコンパイルされたソフトウェアモジュールに適用することによってそれらを変換し、前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決し、前記プログラムの各起動時に、前記解決されたシンボルによって決定された区別可能な構成を有する、実行可能プログラムイメージのインスタンスを生成することによって、達成される。
【００１５】
別の態様において、実行可能プログラムイメージの複数の多様なインスタンスを生成するローダーが提供される。前記ローダーは、プロセッサに、前記実行可能プログラムイメージの所望のインスタンスの各々について区別可能なランダムな選択肢を生成させるよう構成された、疑似乱数生成器と、前記プロセッサに前記実行可能プログラムイメージの区別可能なインスタンスを生成させるランタイムモジュールとを含む。前記区別可能なインスタンスは、以下の工程によって行われる：前記ランダムな選択肢を適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスを選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定し；前記ランダムなレイアウトに準じて前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、実行可能プログラムイメージの区別可能なインスタンスを生成し；前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルを解決する。前記ランダムなレイアウトは、ランタイムローディング時のランダムなアドレス割り当てを含みうる。前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスの選択は、不正な違反の検出など、ランタイム条件に基づいてもよい。
【００１６】
本発明のさらなる様態と特徴は、当業者には、添付の図面とともに本発明の具体的な実施形態についての下記の記載を参照すれば明白になるであろう。
【図面の簡単な説明】
【００１７】
本発明の実施形態を、あくまでも例として、添付の図面を参照して説明する。
【図１】図１は、多様性によって保護したプロダクトバイナリのビルドタイムリンキングを示す。
【図２】図２は、セキュリティ／性能ターゲットのミックスマッチ選択を最適化するためのフローチャートである。
【図３】図３は、変換定数の遅延結合を示す。
【図４】図４は、ランタイムローディングでの多様なモジュールの選択を示す。
【図５】図５は、ランタイムローディングでのランダムなアドレス割り当てを示す。
【図６】図６は、代替の多様なモジュールを備えた動的ライブラリの構築を示す。
【発明を実施するための形態】
【００１８】
本開示は、リンクタイムまたはロードタイムまでにソフトウェアモジュールのセキュリティ変換を延期できる方法であって、従来のソースからソースへのセキュリティ変換と比べて優れた点をいくつも提供する方法について記載する。これら延期されたセキュリティ変換は適用されても非常に軽く、得られる実行可能プログラムに多様性を与える機会を多く作り、セキュリティを改善すると同時に、実行性能と正確さに対する影響を最小限にし、デバッギングの複雑性を減少させる。
【００１９】
ソフトウェアリンカーとリンカー技術とは、長年存在し、従来コンパイルされていたソフトウェアモジュールの集合体を単一の実行可能バイナリまたは動的ライブラリにまとめることを可能にしている。リンカーのもともとのジョブは、コンパイルされたソフトウェアモジュールを、単一のメモリイメージにまとめ、各モジュールがメモリ中のどこに存在すべきか決定し、前記選択されたメモリレイアウトの場合にモジュール間のアドレス参照（サブルーチンコールなど）が正しくあるようにそれらを「手配する（fixing up）」すなわち移転させる（たとえばJ. Levine, Linkers and Loaders（リンカーとローダー）, Morgan Kaufmann Publishers, 2000参照）。リンカー技術は何年にもわたって、その主要な改良が、性能の向上、様々なプロセッサやオペレーティングシステムをターゲット化する能力の提供、および高度なプログラミング言語の支援に限定されてきた。
【００２０】
従来のソフトウェアリンカーは、ネイティブオブジェクトコードをたいていの場合イミュータブルなものとして扱い、入力ソフトウェアモジュール（オブジェクトコード形式）を組み合わせて単一のバイナリライブラリまたは動的ライブラリにするために必要な絶対最小限に、変更を制限する。リンカーまたはリンクエディターは、コンパイラによって生成される一つ以上のオブジェクトを使用して、それらを単一の実行可能プログラムに組み合わせるプログラムである。コンピュータプログラムは、通常、数個のパーツまたはモジュールを含む。それらすべてのパーツ／モジュールが、単一のオブジェクトファイル内に含まれなくてもよく、かかる場合、シンボルによって互いに参照しあう。通常、オブジェクトファイルは以下の３種類のシンボルを含むことができる：定義済みシンボル、オブジェクトファイルが他のモジュールからコールされるようにするもの；未定義シンボル、これらシンボルが定義される前記その他のモジュールをコールするもの；および局所シンボル、前記オブジェクトファイル中で使用され再配置を容易にするもの。プログラムが多数のオブジェクトファイルを含んでいる場合、リンカーは、シンボルを解決しながら、これらファイルを組み合わせて統合された実行可能プログラムにする。
【００２１】
リンカーは、ライブラリと称されるオブジェクトまたはサブルーチンの集合から、オブジェクトを取り出すことができる。リンカーには、その出力に全ライブラリを含めないものもあり、他のオブジェクトファイルやライブラリから参照されたシンボルのみを含む。前記リンカーは、プログラムのアドレス空間中にオブジェクトを配置するという処理も行う。これには、別のベースに対する特定のベースアドレスをとるコードを再配置することが含まれてもよい。コンパイラはオブジェクトが置かれる位置を知っていることがほとんどないので、固定ベース位置（たとえば、ゼロ）をとることが多い。マシンコードを再配置することには、たとえば、絶対ジャンプ、ロード、ストアの再ターゲット化などが含まれる。リンカーの実行可能出力は、実行直前に、それが最終的にメモリにロードされる時に、別の再配置パスを必要としてもよい。
【００２２】
動的リンキングには、コンパイルタイム時にライブラリのサブルーチンをリンキングするのではなく、ランタイム時にアプリケーションプログラムにロードすることが含まれる。前記サブルーチンはディスク上で個別のファイルのままである。コンパイルタイム時には、リンカーによって最小限の量の作業が行われる。プログラムが必要とするライブラリルーチンと、ライブラリ中の前記ルーチンのインデックス名または番号のみを記録する。前記リンキング作業の大半は、アプリケーションがロードされる時間（ロードタイム）または実行中（ランタイム）に行われる。ローダーと称される、前記必要なリンキング機能性は、実質的には、基礎となるオペレーティングシステムの一部である。適切な時に、前記ローダーはディスク上の関連するライブラリを見つけ、前記ライブラリからの関連するデータを前記プロセスのメモリスペースに追加する。
【００２３】
リンカーは通常、ビルドプロセスの最終ステップなので、シンボル解決、レイアウト決定、およびアドレスバインディングという従来のジョブを超える機会がある。前記リンクステップは、多様なインプリメンテーションを多数組み合わせる手段として使用されてクラスアタックの一群に対抗し、従来のリンカー技術を再検討するための基礎を提供する。リンクタイム時に多様性を導入することには、軽量化の利点がある。高価なコンパイルステップを再び実行させる必要が無く、莫大な多様なインスタンスを正しく生成することを実用化する。各インスタンスは、予測可能な性能を有する。コードはたいてい固定化されている（すでにコンパイルされている）ので、この種の多様性は実行性能に大幅な変動をもたらすことはあまりない。これはまたテストの試行を減少することになる。なぜなら、多様なインスタンスの一つのコードは、それ以外の多様なインスタンス全ての挙動を代表するからである。多様なインスタンスの一つを全面的にテストすることは、それ以外の多様なインスタンス全ての動作を代表するとみなすことができる。
【００２４】
本開示は、いくつかの方法でバイナリ出力コードの内容を生成できる、ソフトウェアリンカーまたはソフトウェアローダーと、関連するリンキングおよびローディング法とを提供するが、これらすべては、その結果得られる実行可能／動的ライブラリの多様性によってセキュリティを提供する。オブジェクトコードに適用できる３つの具体的な多様化操作が記載される。前記多様化操作は、設計要件に応じたふさわしい方法で、個別に適用されても、組み合わせて適用されてもよい。拡張されたリンカーツーリングは、その動作の範囲を制御するオプションと、疑似乱数生成器（ＰＲＮＧ）への入力としてのシードとを受領し、これによって予測可能に多様なアウトプットイメージの生成が可能になる。全く同じ入力ソフトウェアモジュールと同じシードとでリンカーが２回起動されると、アウトプットイメージは同じになる。多様なアウトプットイメージを生成するためには、区別可能なシードが選択される。
【００２５】
図１は、以下に詳細に記載する３つの多様化操作を実行するようにされる、セキュリティ駆動リンカー１００を示す。３つの多様化操作とは、多様なインスタンスが作成されたライブラリおよびオブジェクトモジュール１０６に基づく、メモリ再配置１０２、選択的構築１０４、ならびに変換定数の遅延結合１０８であり、これらはすべて、ＰＲＮＧに対するシード、任意のセキュリティターゲットおよび性能の制約などの入力１１０に従って決定される。前記多様化操作の結果は、改ざんに対して耐性のあるプロダクトバイナリ若しくはアウトプットイメージのセキュリティ改善インスタンス１１２、または、前記入力１１０を変更することによって決定されたアウトプットイメージの、多数の様々なインスタンス１１２である。前記アウトプットイメージ１１２は内容に応じて、実行可能プログラムイメージ、メモリイメージ、実行可能モジュール、または動的ライブラリと記載される。
【００２６】
メモリイメージ再配置
従来のリンカーは、コマンドライン上でのその順序付けに基づいて、かつその相互依存性（どのモジュールが他のどのモジュールを参照するか）に基づいて、出力メモリイメージにその入力ソフトウェアモジュールを予測可能に配置する。さらに、通常、たとえば一つのメモリセグメント中に定数ストリングデータのすべてを置くなど、メモリセグメントの同じような種類のものがグループ化されるようにする。これがなされるのは、簡便性（簡易な再配置アルゴリズム）、デバッギングの容易さなどのため、かつ、キャッシュの局所性の結果得られた実行可能イメージのランタイム性を最大にするためである。
【００２７】
図１を参照すると、本発明の第一の多様化操作には、メモリイメージ再配置１０２が関与する。リンカーの結果は、0x...A, 0x...Fなどのランダム化された基底アドレス割り当て、および、再配置可能なコードの各セグメントまたはセクションのランダム化されたレイアウトであり得るが、これは従来のリンカーによって作成された決定論的結論とは対照的である。この試みは、セクションの予測可能な配置に基づく攻撃への重要な障壁となり得る。リンカー１００は、要求に応じて、かつ、ＰＲＮＧ用のシードなどの入力１１０に基づき、確実に、各アウトプットイメージ１１２が完全に新しいメモリイメージレイアウトを有する（すなわち、再配置可能なコードの各セグメントまたはセクションが、ランダムシードパラメータによってランダムに決定されている）ようにすることができ、さらに、メモリイメージ全体で、様々なタイプのメモリセグメントを混合する（intermix, or intermingle）ことができる。これによって、ソフトウェアモジュールの個々の機能のコードを決定論的に再配置することができるというだけの、リンカーの従来の再配置機能が、コードおよびデータを自由に混合するという能力をリンカー１００に与えることにより拡張される。データおよびコードを混合するということは、IDA Pro（登録商標）などのバイナリイメージ逆アセンブラ／分析機の正確な操作に対する障害として作用する。
【００２８】
理想的には、前記実行可能アウトプットイメージ１１２の正確な機能的挙動がメモリレイアウトの多様なインスタンスの全てに対して同じであるべきである。基本的な実行性能はキャッシュ局所性という問題に影響されるが、メモリレイアウトアルゴリズムの適切な選択により、性能の変動は最小限に低減できる。その結果、メモリイメージ再配置を使用した際に、前記拡張されたリンカーによって作成された全ての多様なインスタンスにわたって、性能および正確性が維持されよう。
【００２９】
選択的構築
従来のリンカーを使用すると、外から見えるエンティティ（機能やグローバル変数など）の各々は、入力ソフトウェアモジュールの一群の中に一度だけ提供されなければならない。さもなくば、前記エンティティは「多重定義されている」とみなされ、エラーが発行される。当該リンカー１００において、第二の多様化操作には、「ミックスアンドマッチ」リンキング、すなわち、各ライブラリ１０６内の多様なインスタンスが作成されたオブジェクトモジュールに基づく選択的構築１０４が関与する。
【００３０】
ライブラリ１０６は、複数のインプリメンテーションモジュールで作成できる。たとえば、プログラムモジュールの多数のバージョン、すなわちインスタンス（Mod A1, Mod A2, …; Mod B1, Mod B2, …; Obj1, Obj2, …）が作成できる。所与のプログラムモジュールの各インスタンスは、同じ機能的挙動を行う。前記多数の多様なインスタンス（Mod A1, Mod A2, … Mod B1, Mod B2,…; Obj1, Obj2, …）は、大容量ライブラリ中に分かれて設けることができる。全インスタンスは同じ機能性を呈するので、当該リンカー１００は、最終実行ファイル用の特定のインスタンスをランダムに選択することができる。この試みは、比較により情報を得ようとする差分攻撃を阻むことができる。前記リンカー１００は、外から見える所与のエンティティ（通常は、機能）の多数の多様なインスタンスの一群のうちの一つが、同じくシードによって決定されるランダム選択に基づいて選択されるモードを支援することができる。もし多くの多様なインスタンス（セキュリティ変換の独自の一群をそれぞれ備えている）において多くの機能があるなら、考えられうる多様なアウトプットイメージの数は、かかる機能とインスタンスの数の積である。これは、多数の多様なインスタンスを作成するための驚異的な範囲を提供し、さらに、各インスタンスには個々の機能の非常に様々なインプリメンテーションが関与し得るので、一つのインスタンスを逆行分析することから得られる知識を他のインスタンスに適用する能力が最小化される。
【００３１】
前記多数のインスタンスは、差分解析を阻むための多様なインプリメンテーションを有することができるだけではない。様々な性能および／またはセキュリティ特性を有するように作成することもできる（入力１１０参照）。たとえば、前記リンカー１００は、暗号学的ハッシュを行う機能のためには、タイムクリティカルでない領域またはプロセス中で、高度に保護されてはいるけれども遅いインプリメンテーションを使用することを選択できる。タイムクリティカルな領域またはプロセスでは、前記リンカーは、高度な性能のインプリメンテーションのためにセキュリティの面をトレードオフすることも選択できる。セキュリティと性能のターゲットを正しく入力すると、設計検討によって判断されたように、インプリメンテーションとアルゴリズム解析情報の適切な特性評価とを組み合わせられ、前記リンカー１００は機能的インプリメンテーションのミックスマッチによって制約の釣り合いをとる機会を得る。
【００３２】
図２は、セキュリティ対性能の釣り合いをとるための最適化方法を示す。前記方法は、次のように進められる。ステップ２００で、ユーザーがアプリケーション内の高価値アセットについての情報を提供する。これは、クリティカルなアセット対あまりクリティカルでないアセットの評価（すなわち、アセット評価）を追加することを含む。これらクリティカルなアセットの例としては、システムにおける暗号化キー、ノードロック計算、および権利管理ロジックなどがある。ステップ２０２で、プロファイリングに基づいてコールサイトに重み付けが割り当てられる。動的または静的ソースレベルプロファイリングが、機能および基礎ブロックレベルでアプリケーションのために作成される。動的プロファイリングが好ましい。しかしそれが無ければ、ソースレベルのアナライザ（たとえば、コンパイラやプリコンパイラ）によって、コールグラフを通じてループ頻度についての推測を伝えることで、静的プロファイリングが作成できる。アプリケーションに見られる機能コールサイトそれぞれに、プロファイル重みが関連付けられてもよい。ステップ２０４で、前記アセット評価とプロファイル重みとが適切なオブジェクトとライブラリモジュールとに埋め込まれる。たとえば、作成されてアセット評価とプロファイル重みとに含められた情報は、コンパイルとライブラリ作成との段階を通して保持され、ライブラリ中のモジュールに関連付けられた追加情報として埋め込まれる。ステップ２０６で、リンカー１００はモジュールを選択するために埋め込まれた情報を使用し、制約ベースの解法アルゴリズムを利用して前記セキュリティ／性能ターゲット用に最適化する。制約解決へのアプローチは公知のものが多数ある。
【００３３】
変換定数の遅延結合
従来のソフトウェアリンカーは、入力ネイティブオブジェクトコード中の、そのリンカーの最終メモリイメージレイアウト決定に基づいて「固定（fixed up）」（または再配置）されなければならない位置を特定する。それらは通常、他のソフトウェアモジュールに見られる、外から見えるシンボルへのリファレンスである。かかる再配置は通常、ネイティブオブジェクトコードの、リンキングプロセスによって実際に変更される唯一の部分である。コードおよびデータについてのセキュリティ変換には、よく固有の定数が使用される。たとえば、データ変換には、データ操作および位置の両方を数学的空間へ変換する、数学的マッピング機能を使用するが、これは２００３年７月１５日発行の米国特許第６５９４７６１号、および２００５年１月１１日発行の米国特許第６８４２８６２号に記載されており、この参照によりその内容すべてをここに包含する。これを行うためには、マッピングツール（すなわち「トランスコーダ」）が、各マッピングについて機能ファミリーの一群と多数の固有の定数を使用する。同様に、制御フロー変換（２００４年８月１７日発行の米国特許第６７７９１１４号（この参照により全体をここに包含する）に記載されたような）が、フローを制御する多数の機能を使用して、所与のプログラムを新たな制御フロー形式にマップする。これら機能はまた、選択された定数の一群を伴う。  
【００３４】
これらの場合のそれぞれにおいて、前記定数はランダムに（かつ互いに一貫して）選択される。定数の一群は、プログラムインスタンスの特徴的な因子となり、前記プログラムが正しく機能するために必要である。これら定数の正確な値は、変換関数の特性に基づき、マッピングツール（すなわちトランスコーダ）によって選択される。さらに、互いに一貫するよう選択された、アプリケーション全体に見られる多数の相互に関連したセキュリティ変換定数があってもよく、一つの定数を変更するには、何らかの一貫した方法で多数のその他の定数を変更することが必要になってもよい。
【００３５】
オブジェクトコードに適用できるさらなる多様化操作として、プログラム変換に使用される定数の遅延結合、特にデータおよび制御フローの変換を行うことが可能である。前記定数の一群が、第２の定数の群（ランダムに選択された）と置き換えられてもよいが、この第２の定数の群は一貫して機能しなければならない一方で前記プログラムインスタンスの第二の特徴的な因子を示す。これら定数は、再配置アドレスに対して同様に処理されることができ、リンクタイムに選択でき、実行タイムでの変換の多様化をもたらす。かかる変更は、さらに差分攻撃に対する防御となり、また、組織化されたアップデートによって更新できるようにもする。
【００３６】
前記リンカーは、従来のリンカーの再配置機能と同様に、データおよび制御フローの変換などのプログラム変換用の固有の定数の群を変更する。これら群は、シードによって初期化されるＰＲＮＧ（疑似乱数生成器）によって生成される。各群の定数は、非常に様々な値であり、得られる実行可能または動的ライブラリの多様性が非常に大きくなる。図３を参照すると、リンクタイムに定数を選択する方法が示されている。リンカー３００は、複数のソフトウェアモジュール（モジュールＡ１，モジュールＡ２…）を提供するライブラリＡとやりとりする。各ソフトウェアモジュールは、セキュリティ変換の特性に関する定数セクション３０２およびメタデータ３０４を含む。前記リンカー３００はまず、モジュールを選択し（ステップ３１０）、その後、選択されたモジュールと関連付けられたメタデータ３０４を読み込む（ステップ３１２）。メタデータに基づいて、リンカー３００が新たな定数を選択し（ステップ３１４）、前記定数セクションを、プロダクトバイナリ３２２内の新たな定数の群３２０と置き換える。
【００３７】
定数の各群はアプリケーションの正常な挙動に影響を与えないので（前記群がメタデータ内に与えられた数学的制約を満たすと仮定する）、かかる多様なインスタンスの性能／正確さの検証は容易である。定数の一貫した群は、定数の別の群と同じ挙動をすると予想される。リンクタイム多様性のこの形式は、ユーザーにとっての最小のオーバーヘッドと差分攻撃に対抗する最大のセキュリティとの間の、良好なトレードオフを示す。それはまた、実施されているアプリケーションに更新性を提供するためには理想的であり、そこでは、アプリケーションバイナリが新たな固有の定数群で周期的に更新され、これは、いかなるアタッカーにとっても固定されたバイナリイメージを解析する余裕がない、ということを意味する。
【００３８】
ランタイムローディング
ローダーは、ランタイム時に起動されるリンカーとも考えられる。ビルドタイム、またはロードタイムのリンキング特性機能について記述した上記技術すべては、ランタイム時に起動されるとも考えられる。ランタイム時のかかる特性機能を行うことの利点は、他の安全な防御技術を挿入できることと、フィールドでの条件に対応できることである。ローダーは図４、５に示されている。図４は、プロダクトバイナリへロードされるモジュールの多様なインスタンスからの選択を示し、図５は、ランタイムローディング時のランダムなアドレス割り当てを示す。
【００３９】
図４の実施形態において、ソフトウェアモジュールの多数の多様なインスタンス（Mod A1, Mod A2, Mod A3, Mod A4 …, Mod B1, Mod B2, Mod B3, Mod B4 …)を、動的ライブラリＡおよび動的ライブラリＢなどの動的ライブラリに分けて設定できる。前記インスタンスは、個別のインプリメンテーション因子または基準によってさらに特徴づけることができる。たとえば、あるインスタンスは、「Strong Protection（強力な保護）」のモジュールMod A1およびMod A2のように、高セキュリティレベルを特徴としてもよい、または、「Fast（高速）」なモジュールMod A3、Mod A4のように、その実行速度を特徴としてもよい。
【００４０】
ランタイム時の多様性を提供するためには、ローダー４００は、ランタイムエントロピーソース４０２と疑似乱数生成器（ＰＲＮＧ）とを必要とし、これが疑似乱数の決定を行うために多様モジュールセレクタ４０４を制御し、ランタイムローダーの挙動、すなわち出力実行ファイル４０６が、各起動ごとに異なるようにする。ランタイムローダー４００は、ランタイム条件に基づき、動的ライブラリ中に見られる様々なインプリメンテーションからの選択を行う。たとえば、違反管理モジュールが、攻撃の発生を発見すると（たとえば、プロセスがエミュレートされた、デバッグされた、など）、最高セキュリティレベルのインプリメンテーションと現在のプロテクション能力とをロードするようローダーに伝達できる（すなわち、モジュールMod A1およびMod A2や、Mod B1およびMod B2からのランダム化された選択）。他の条件に基づけば、他の決定がなされる。たとえば、アプリケーションが繰り返し起動されると、ローダーは、そのクリティカルな実行ポイントへは決して到達せずに、通常よりも細かい粒度にランダムなインプリメンテーションをロードすることを選択してもよい。これによって、差分攻撃を妨げ、反復性と予測可能性に依拠している敵対者は阻止されるだろう。
【００４１】
図５に示された実施形態においても、ソフトウェアモジュールの多数の多様なインスタンス（Mod A1, Mod A2, Mod A3, Mod A4 …, Mod B1, Mod B2, Mod B3, Mod B4 …、およびMod C1, Mod C2, Mod C3, Mod C4 …)を、動的ライブラリＡ、動的ライブラリＢ、動的ライブラリＣなどの動的ライブラリに分けて設定でき、ランタイムローダー５００もランタイムエントロピーソース５０２と疑似乱数生成器（ＰＲＮＧ）とを含み、これが疑似乱数の決定を行うために多様モジュールセレクタ５０４を制御する。本実施形態においては、前記多様セレクタモジュール５０４はメモリイメージ再配置と選択的構築に関して上記のように機能するようインプリメントされる。モジュールの特定の多様なインスタンスが選択され、選択された各モジュールにはランタイム時にロードされる時にランダムアドレスを割り当てることができる。前記実行ファイル５０６は、その機能性の大半が動的ライブラリモジュールで成立するように構成できる。モジュールが様々な実行時にロードされるので、モジュールが多様な選択肢群から選択されることに加え、前記モジュールもまたメモリ中のランダムアドレスにロードされる。これは、デバッギングまたはエミュレーションのセッションをアタッカーが行うことを阻む大きな障害となる。プログラムが実行されるにつれ、予測不可能な種々のモジュールがロードされるだけでなく、前記モジュールの配置も予測不可能であり、繰り返されない。
【００４２】
動的ライブラリの構築
動的ライブラリ（たとえば、Windows（登録商標）やLinux（登録商標）のdll、Macのdylibなど）は、通常ネイティブリンカーによって生成され、直接実行可能イメージと密接に比較される。従来、動的なエンティティにおけるシンボルの大半は、前記動的ライブラリが生成される時までに解決されている。動的ライブラリが生成されるときまでにプログラムの実行は準備される。他方で、動的ライブラリは、プログラムの実行前に、実行するプログラムにロードされている必要がある。ローダーが動的ライブラリの実行前にいくつかのシンボルを移動させる機会はこのときである。動的ライブラリにおける全ての未解決のシンボルは、プログラムの実行直前に解決される。前記動的ライブラリは、リンカーによって生成されているので、曖昧に定義されたシンボルを含みようがない。少数の再配置されたシンボルは別として、前記ライブラリはほぼ実行が可能な状態である。
【００４３】
しかし、図６に示されるように、多様性はまた、プロダクト動的ライブラリの構築においても導入できる。動的ライブラリの作成メカニズムは、AltMod A1, AltMod A2, AltMod B1, AltMod B2…といった多数の代替のモジュール（すなわち、機能とデータ）を提供する。各代替モジュールは、元のそれぞれのモジュールのインスタンス（Mod A1, Mod A2, …; Mod B1, Mod B2, …; Obj1, Obj2, … ）と等価のオプションである。前記ライブラリの作成には、代替モジュールを前記プロダクト動的ライブラリ６０２にカプセル化するリンカー６００が必要である。それはまた、代替モジュールを示すテーブルを備える。上記に詳述したように、その後ランタイム時に、適宜インプリメントされたローダーが前記テーブルに問い合わせることによって、代替の多様なモジュールからランダムな選択を行うことができる。
【００４４】
上記の記載では、実施形態の全面的な理解を提供するために、説明を目的として数々の詳細が述べられた。しかし、これら特定の詳細は必須ではないことは、当業者に明らかであろう。理解を妨げないように、公知の電気構造や回路はブロック図で示されていることもある。たとえば、本明細書中で記載された実施形態がソフトウェアルーチンか、ハードウェア回路か、ファームウェアか、またはそれらの組み合わせかでインプリメントされるかどうかについては、具体的な詳細は述べられていない。
【００４５】
本開示の実施形態は、機械が読み取り可能な媒体（コンピュータが読み取り可能媒体、プロセッサが読み取り可能な媒体、または、コンピュータが読み取り可能なプログラムコードを実施させるコンピュータ使用可能な媒体、とも呼ばれる）に記憶されたコンピュータプログラム製品としてあらわされることができる。前記機械が読み取り可能な媒体は、ディスケット、読み取り専用のコンパクトディスクメモリ（ＣＤ−ＲＯＭ）、記憶装置（揮発性または不揮発性）、または同様の記憶機構などの、磁気的、光学的、又は電気的な記憶媒体を含む、なんらかの適切な、非一時的な有形の媒体である。前記機械が読み取り可能な媒体は、インストラクション、コードシーケンス、コンフィグレーション情報や、その他のデータを含むことができ、これらは実行されたときに、プロセッサに本開示の実施形態に準じた方法のステップを行わせる。前述されたインプリメンテーションをインプリメントするために必要なその他のインストラクションやオペレーションの、前記機械が読み取り可能な媒体への記憶が可能であることも、当業者であれば理解できるであろう。前記機械が読み取り可能な媒体に記憶されたインストラクションは、プロセッサやその他の適切な処理装置によって実行可能であり、上述されたタスクを行うための回路構成とのインターフェースともなり得る。
【００４６】
本発明の前記の実施形態は、単なる例示である。当業者によって、添付のクレームによってのみ定義される本発明の範囲を逸脱することなく、前記特定の実施形態に変更、変形、変種がもたらされるであろう。
【図１】
2013524321.tif 000003
【図２】
2013524321.tif 000004
【図３】
2013524321.tif 000005
【図４】
2013524321.tif 000006
【図５】
2013524321.tif 000007
【図６】
2013524321.tif 000008
【国際調査報告】
2013524321.tif 000009
2013524321.tif 000010
2013524321.tif 000011