(57)【要約】  コンピュータプログラムの権限のない使用が、単にプログラムをマシンコードにコンパイルするというよりプロセッサをコンパイルすることにより困難にされる。プロセッサがマシン命令に応答すべき方法、即ち該プロセッサの翻訳データが、入力としての任意のビット列Ｂ及びプログラムＰから計算される。上記所与のビット列Ｂをマシン命令のソースとして使用する際にプログラムＰにより定義される処理を実行するプロセッサの翻訳データが計算される。プロセッサは、マシン命令を上記翻訳データに従って実行するように構成される。この場合、他のプログラムＰ’は、当該プロセッサに対するマシン命令Ｂ’にコンパイルされ、該プロセッサにより実行される。ビット列Ｂ及び元のプログラムＰを知らなければ、マシン命令Ｂ’を別のプロセッサが上記他のプログラムＰ’を実行するように修正することは困難である。
2015523635.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサを構成する方法であって、
−  ビット列Ｂ及びプログラムＰを入力するステップと、
−  プロセッサを、該プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合にプログラムＰを実行するように構成するステップと、
を有する、方法。
【請求項２】
前記プログラムＰが一連の基準マシン命令を定義し、前記構成するステップが、
−  前記ビット列Ｂ及び前記一連の基準マシン命令から、前記プロセッサを該プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に前記プログラムＰを実行するように構成するための翻訳データを計算するステップと、
−  前記プロセッサを前記翻訳データにより構成するステップと、
を有する、請求項１に記載の方法。
【請求項３】
前記翻訳データを計算するステップが、
−  前記ビット列Ｂを、前記プロセッサにより各マシン命令として使用するための連続する部分に分割するステップと、
−  前記ビット列の前記部分を前記一連の基準マシン命令における対応する位置の基準マシン命令に翻訳するための翻訳を決定するステップと、
を有する、請求項２に記載の方法。
【請求項４】
前記翻訳データが、前記部分の異なる下位部分を、基準マシンプログラムにおける対応する位置の基準マシン命令のオペコード、オペランド及び結果コードのうちの少なくとも１つに翻訳する、
請求項３に記載の方法。
【請求項５】
前記翻訳データが、基準マシン命令を得るために前記ビット列Ｂの前記部分をルックアップするためのルックアップデータを有する、請求項３に記載の方法。
【請求項６】
前記ビット列における前記連続する部分が基準マシン命令の長さより大きな長さを有する、請求項３に記載の方法。
【請求項７】
前記プロセッサにより実行される場合の、前記ビット列の異なる部分に対応するプログラムカウンタ値を決定するステップと、
前記ビット列の前記部分を前記プログラムカウンタ値から導出される情報と組み合わせて、明確にされた部分を得ると共に、該明確にされた部分を前記基準マシン命令に翻訳するための翻訳を決定するステップと、
を有する、請求項３に記載の方法。
【請求項８】
前記翻訳データにより定義される翻訳の下で前記基準マシン命令に翻訳するオリジナルを有さない基準マシン命令を決定するステップと、
前記オリジナルを有さない基準マシン命令に対して前記翻訳データにおいて既に定義されたオリジナルとは異なるオリジナルを選択すると共に、前記プロセッサを構成するための前記翻訳データを、該プロセッサが前記選択されたオリジナルをマシン命令のソースとして使用する場合に前記構成されたプロセッサが前記決定された基準マシン命令を実行するように拡張するステップと、
を有する、請求項２に記載の方法。
【請求項９】
前記翻訳データにより構成されたプロセッサのためのコンパイラに対して前記翻訳データを利用可能にさせるステップと、
前記コンパイラにより他のプログラムＰ’をコンパイルして、前記プロセッサのためのコンパイルされたマシン命令のプログラムを生成するステップと、
前記コンパイルされたマシン命令のプログラムを前記プロセッサにより実行するステップと、
を有する、請求項２又は請求項８に記載の方法。
【請求項１０】
前記プログラムＰが他のプロセッサをシミュレーションするためのプログラマブルプロセッサのシミュレータプログラムであり、
前記プログラマブルプロセッサのシミュレータプログラムが、
−  他のビット列及び他のプログラマブルプロセッサのシミュレータプログラムを入力するステップと、
−  前記他のプログラマブルプロセッサのシミュレータプログラムにより定義される処理を、他のプログラマブルプロセッサが前記他のビット列をマシン命令のソースとして使用する場合に実行する該他のプログラマブルプロセッサの他の翻訳データを計算するステップであって、該他の翻訳データが入力としての前記他のビット列及び前記他のプログラマブルプロセッサのシミュレータプログラムから計算されるステップと、
により得られる、請求項９に記載の方法。
【請求項１１】
オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２のオブジェクトコードを前記ビット列Ｂとして使用するステップとを有する、請求項１に記載の方法。
【請求項１２】
オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２を透かしＣと組み合わせるステップと、該第２部分Ａ２及び透かしＣの組み合わせを前記ビット列Ｂとして使用するステップとを有する、請求項１に記載の方法。
【請求項１３】
前記プロセッサが合成可能なハードウェア記述により表される、請求項１ないし１２の何れか一項に記載の方法。
【請求項１４】
前記ビット列Ｂの部分が、テキストの表現、標示及び計算環境から動的に収集される情報のうちの少なくとも１つである、請求項１ないし１３の何れか一項に記載の方法。
【請求項１５】
前記入力されるビット列の如何なる変更も、オリジナルのアプリケーションが正しく動作することを妨げる、請求項１ないし１４の何れか一項に記載の方法。
【請求項１６】
プロセッサを構成する装置であって、前記装置が、
−  一連の基準マシン命令を定義するプログラムＰ及びビット列Ｂを入力する入力部と、
−  構成プロセッサと、
を有し、前記構成プロセッサが、
−  前記ビット列Ｂ及び前記一連の基準マシン命令から、前記プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に該プロセッサが前記プログラムＰを実行するように該プロセッサを構成するための翻訳データを計算し、
−  前記プロセッサを、該プロセッサが前記翻訳データに従ってマシン命令を実行するように構成する、
装置。
【請求項１７】
−  ビット列Ｂをマシン命令のソースとして記憶するプログラムメモリと、
−  前記ビット列Ｂからの命令に対する当該プロセッサの応答を定義する翻訳データを記憶する命令デコード制御メモリと、
−  前記プログラムメモリの出力端に結合され、該プログラムメモリからのマシン命令の基準マシン命令への翻訳を前記命令デコード制御メモリからの前記翻訳データに依存して行う命令デコーダと、
を有する、プロセッサ。
【請求項１８】
コンピュータにより実行された場合に該コンピュータに、
−  一連の基準マシン命令を定義するプログラムＰ及びビット列Ｂを入力させ、
−  前記ビット列Ｂ及び前記一連の基準マシン命令から、プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に該プロセッサが前記プログラムＰにより定義された処理を実行するように該プロセッサを構成するための翻訳データを計算させ、
−  前記プロセッサを構成するための構成データを前記翻訳データに従って発生させる、
命令のプログラムを有する、コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのリバースエンジニアリング及び／又は改竄に対する保護をサポートするコンピュータプログラムの実行を行う方法に関すると共に、プログラムを実行する装置及びシステムに関する。
【背景技術】
【０００２】
今日、インターネットはデジタルコンテンツに対する便利且つユビキタスなアクセス手段を提供している。参加する装置（例えば、ＰＣプラットフォーム）の開放性のため、インターネットを機密的コンテンツに対する分配媒体として使用することは、コンテンツ提供者の利益を確保するための不可避的難題を生じる。特に、ＰＣ又はアンドロイド・オペレーティングシステム等のプラットフォームの場合、ユーザは、当該コンテンツに対するアクセス並びに如何なるコンテンツ保護メカニズムをも攻撃及び迂回するための無制限な量の時間及び資源を提供するハードウェア及びソフトウェアの完全な制御を有することが前提とされねばならない。
【０００３】
アプリケーションの一律の実行のために、インターネットは所謂仮想マシン（例えば、Java（登録商標）ＶＭ）を実行する受信側プラットフォームを必要とする。これらの仮想マシンは、開放型で、一律で且つ良く文書化された実行環境を提供する。結果として、アプリケーションのリバースエンジニアリング及び改竄の防止は困難となるので、インターネットの分配媒体としての脆弱性は増幅される。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
本発明の目的は、なかでも、解放型環境で実行されるアプリケーションのリバースエンジニアリング及び改竄攻撃に対する保護を向上させることにある。
【課題を解決するための手段】
【０００５】
本発明は、独立請求項により定義される。従属請求項は有利な実施態様を定義している。
【０００６】
一態様によれば、プロセッサを構成（configure）する方法が提供され、該方法は、
−  ビット列（bit string）及びプログラムを入力するステップと、
−  プロセッサを、該プロセッサが上記ビット列をマシン命令のソースとして使用する場合に上記プログラムを実行するように構成するステップと、
を有する。
【０００７】
このようにして、上記の構成されたプロセッサに対する他のプログラムの許可されない（権限のない）使用は困難にされる。攻撃者は当該プロセッサがどの様に構成されているかを知る必要があるが、このことは、該構成が当該プロセッサを構成するために使用されたプログラムに依存し、このプログラムは該攻撃者には未知であり得るので、困難である。
【０００８】
本発明は、通常のコンパイラが行うことと逆のことを行うコンパイラで実現することができる。即ち、所与の（仮想）プロセッサに対するマシン命令プログラムを、より高いレベルのプログラムからコンパイルするというより、該コンパイラは（仮想）プロセッサをマシン命令プログラム及び一層高いレベルのプログラムからコンパイルする。これは、上記のコンパイルされた（仮想）プロセッサのために一層高いレベルのプログラムから他のプログラムをコンパイルするコンパイラと組み合わせることができる。
【０００９】
好ましい実施態様において、本方法は、プログラムを一連の基準マシン命令（reference machine instructions）に翻訳するステップと、前記ビット列及び前記一連の基準マシン命令から、プロセッサを該プロセッサが前記ビット列をマシン命令のソースとして使用する場合に該プロセッサがプログラムを実行するように構成するための翻訳データを計算するステップと、プロセッサを該プロセッサがマシン命令を前記翻訳データに従って実行するように構成するステップとを有する。
【００１０】
前記翻訳データは、前記ビット列の一部から、例えば加算、減算、ロード、記憶（ストア）及びジャンプ命令（operation）等のためのオペコード等の、マシン命令のオペコードへの翻訳を定義するデータを含むことができる。
【００１１】
プロセッサを構成するために、仮想マシンを実施化する如何なる既知の方法も用いることができる。例えば、構成されたプロセッサのソフトウェアエミュレーションは、例えばジャバ（ＪＡＶＡ（登録商標））仮想マシンエミュレーションに関して知られている技術を用いることができる。また、前記基準命令は仮想マシンのための命令とすることができる。
【００１２】
他の例として、プロセッサは、該プロセッサに当該処理を実行させるためにマシン命令をプロセッサ用の制御信号に翻訳するデータをルックアップテーブルにロードすることにより、当該翻訳を実行するようにプログラマブルロジックアレイ等の翻訳回路を構成することにより、翻訳データに従ってマシン命令に対応する処理を実行するように設計された論理回路構造を備えた処理回路を有する集積回路を製造することにより、又は仮想マシンをサポートする何らかの他の方法により構成することもできる。
【００１３】
プロセッサの構成は、当該構成の反復的適用により更に隠蔽することができる。
【００１４】
一実施態様において、当該方法は、前記ビット列を前記プロセッサにより各マシン命令として使用するための連続する各部分に分割するステップ、及び上記ビット列の上記各部分を前記一連の基準マシン命令における対応する位置の基準マシン命令に翻訳するための翻訳を決定するステップを有する。上記ビット列を連続する部分に分割することにより、これら部分は前記一連の基準マシン命令における対応する各マシン命令と１対１の対にされ得る。部分ビット列とマシン命令との各対に対して、翻訳を、例えばルックアップテーブルの形態で又はブール関数の一部として導出することができる。
【００１５】
複数の異なるビット列が同一の基準命令に翻訳されねばならないことが起こる可能性があるが、これは問題ではない。翻訳データは、複数の異なるビット列を同一の基準命令に単にマッピングすればよい。ビット列の２以上の部分が同一であるが、異なる基準命令にマッピングされることを要する逆の状況は、多数のやり方で解決することができる。
【００１６】
例えば、ビット列の連続する各部分を、基準マシン命令の長さより大きな長さを有するように選択することができる。例えば、全ての基準マシン命令は特定の数のビット長とすることができる一方、ビット列の連続する全ての部分は幾らか大きな数のビット長とする。ビット列に割り当てられた各追加のビットにより、衝突の機会が減少される。
【００１７】
衝突を解決するための第２の方法として、当該方法はプロセッサにより実行される際の下位ビット列の異なる部分に対応するプログラムカウンタ値を決定するステップを有することができる。例えば、当該プログラムの基準プロセッサへのロードをシミュレーションし、各命令がロードされるアドレスを決定することができる。基準命令に対応する部分は、同一のプログラムカウンタ値を有すると決定される。一部分から命令への翻訳データを決定する前に、ビット列の部分はプログラムカウンタ値から導出された情報と組み合わされ、かくして、明確にされた部分を得る。当該翻訳は明確にされた部分から基準マシン命令へとなされる。
【００１８】
例えば、プログラムカウンタの１以上の最下位ビットを当該部分に連結することができる。例えば、プログラムカウンタ値を一層少ない数のビットに要約（hash）し、該一層少ない数のビットを当該部分に付加することができる。
【００１９】
プログラムカウンタ値の十分に多くの情報を各部分と組み合わせれば、翻訳データが大きくなることを犠牲にして、常に斯かる各部分を明確にすることに成功する。
【００２０】
翻訳は一層小さな規模で決定することができる。例えば、翻訳データは当該部分の異なる下位部分を、当該基準マシンプログラムにおける対応する位置の基準マシン命令のオペコード（operation code）、オペランド及び／又は結果コードに翻訳する。
【００２１】
例えば、基準命令の一部のために必要とされる複数の翻訳を複数のオペコードに対して別途実施することができ、次いで当該翻訳をオペコード毎に実施することができる。
【００２２】
当該ビット列における複数の部分が、当該プログラムにおける複数の基準命令より短いことが起こり得る。このことは、該ビット列に詰め物をすることにより解決することができる（即ち、当該ビット列に値零を持つビットを挿入する）。このことは、この部分に関してビット列を無視し、プログラムカウンタのみに依存することにより解決することもできる。しかしながら、部分の数は少なくとも基準命令の数であることが好ましい。例えば、一実施態様において、Ｂにおけるビットの数は、少なくとも基準命令の数程度に大きいことが必要とされる。
【００２３】
興味深いことに、上記ビット列を入力し、上記翻訳データに従う翻訳を適用する場合に上記基準命令を実行するようなプロセッサが得られる。更に、該プロセッサはそれでもプログラマブルであり、任意のプログラムを実行することができる。例えば、当該方法は、前記翻訳データにより定義される翻訳の下で前記基準マシン命令に翻訳するオリジナルを有さない基準マシン命令を決定するステップと、前記オリジナルを有さない基準マシン命令に対して前記翻訳データにおいて既に定義されたオリジナルとは異なるオリジナルを選択すると共に、前記プロセッサを構成するための前記翻訳データを、該プロセッサが前記選択されたオリジナルをマシン命令のソースとして使用する場合に前記構成されたプロセッサが前記決定された基準マシン命令を実行するように拡張するステップとを有する。
【００２４】
上記翻訳データは、該翻訳データにより構成されたプロセッサのためのコンパイラに対して利用可能にさせることができる。このことは、上記コンパイラにより他のプログラムをコンパイルし（該コンパイルは上記プロセッサのためのコンパイルされたマシン命令のプログラムを生成する）、上記のコンパイルされたマシン命令のプログラムを該プロセッサにより実行することを可能にする。
【００２５】
本発明の一態様は、プロセッサを構成するための装置に関するものであり、該装置は、
−  ビット列及びプログラムを入力する入力部と、
−  構成プロセッサと、
を有し、前記構成プロセッサは、
−  前記プログラム（Ｐ）を一連の基準マシン命令に翻訳し、
−  前記ビット列及び前記一連の基準マシン命令から、前記プロセッサが前記ビット列をマシン命令のソースとして使用する場合に該プロセッサが前記プログラムを実行するように該プロセッサを構成するための翻訳データを計算し、
−  プロセッサを、該プロセッサが前記翻訳データに従ってマシン命令を実行するように構成する、
ように構成される。
【００２６】
一態様によれば、プロセッサを構成する方法が提供され、該方法は、
−  ビット列Ｂを供給するステップと、
−  プログラムＰを入力するステップと、
−  前記ビット列Ｂをマシン命令のソースとして使用する場合に前記プログラムＰにより定義される処理を実行するプロセッサの演算的意味（operational semantics）を計算するステップであって、該演算的意味が入力としての前記ビット列Ｂ及び前記プログラムＰから計算されるステップと、
−  プロセッサを、該プロセッサがマシン命令を前記演算的意味に従って実行するように構成するステップと、
を有する。
【００２７】
このようにして、他のプロセッサ上の前記構成されたプロセッサに対する他のプログラムの権限のない使用は困難にされる。攻撃者は、そのようにするためには上記構成されたプロセッサの演算的意味を決定する必要があり、このことは、当該プロセッサを構成するために使用された上記ビット列及びプログラムが分からない場合は困難である。
【００２８】
従来のコンパイラが行うのとは逆を行うコンパイラが提供される。即ち、より高いレベルのプログラムから所与の（仮想）プロセッサのためのマシン命令プログラムをコンパイルするというより、該コンパイラはマシン命令プログラム及び一層高いレベルのプログラムから（仮想）プロセッサをコンパイルする。このことは、該コンパイルされた（仮想）プロセッサのための他の高いレベルのプログラムから、他のプログラムをコンパイルするコンパイラと組み合わせることができる。
【００２９】
プロセッサの演算的意味は、 加算、減算、ロード、記憶（ストア）及びジャンプ命令等のためのオペコード（operation codes）のような、マシン命令のオペコードに対応する処理を定義するデータを含むことができる。仮想マシンを実施化する如何なる既知の方法も、当該プロセッサを所与の演算的意味に従って構成するために使用することができる。例えば、演算的意味のソフトウェアエミュレーションを、例えばジャバ（ＪＡＶＡ（登録商標））仮想マシンエミュレーションに関して知られている技術を用いて使用することができる。他の例として、プロセッサは、プロセッサに当該処理を実行させるためにマシン命令を該プロセッサ用の制御信号に翻訳するデータをルックアップテーブルにロードすることにより、当該翻訳を実行するようにプログラマブルロジックアレイ等の翻訳回路を構成することにより、当該演算的意味に従ってマシン命令に応答して対応する処理を実行するように設計された論理回路構造を備えた処理回路を有する集積回路を製造することにより、又は仮想マシンをサポートする何らかの他の方法により構成することもできる。
【００３０】
上記プロセッサの構成は、当該構成の反復的適用により更に隠蔽することができる。
【００３１】
コンピュータプログラムの許可されない使用は、単にプログラムをマシンコードにコンパイルするというよりプロセッサをコンパイルすることにより困難にされる。当該プロセッサがマシン命令に応答すべき方法、即ち該プロセッサの演算的意味が、入力としての任意のビット列Ｂ及びプログラムＰから計算される。プロセッサが上記所与のビット列Ｂをマシン命令のソースとして使用する際に上記プログラムＰにより定義される処理を実行する該プロセッサの演算的意味が計算される。プロセッサは、該プロセッサが上記演算的意味に従ってマシン命令を実行するように構成される。この場合、他のプログラムＰ’を、当該プロセッサのためのマシン命令Ｂ’にコンパイルすることができ、該プロセッサにより実行することができる。上記ビット列Ｂ及び元のプログラムＰを知らなければ、マシン命令Ｂ’を別のプロセッサが上記他のプログラムＰ’を実行するように修正することは困難である。
【００３２】
一実施態様において、当該方法は、前記演算的意味を持つプロセッサのためのコンパイラにより他のプログラムＰ’をコンパイルするステップであって、該コンパイルが該プロセッサのためのコンパイルされたマシン命令のプログラムを生成させるステップと、該コンパイルされたマシン命令のプログラムを前記プロセッサにより実行するステップとを有する。
【００３３】
一実施態様において、前記プログラムＰは、他のプロセッサをシミュレーションするための、プログラマブルプロセッサのシミュレータプログラムである。
【００３４】
一実施態様において、前記プログラマブルプロセッサのシミュレータプログラムは、他のビット列を供給するステップと、他のプログラマブルプロセッサのシミュレータプログラムを入力するステップと、前記他のプログラマブルプロセッサのシミュレータプログラムにより定義される処理を、他のプログラマブルプロセッサが前記他のビット列をマシン命令のソースとして使用する場合に実行する該他のプログラマブルプロセッサの他の演算的意味を計算するステップであって、該他の演算的意味が入力としての前記他のビット列及び前記他のプログラマブルプロセッサのシミュレータプログラムから計算されるステップとにより得られる。
【００３５】
一実施態様において、前記ビット列Ｂ及び前記他のビット列は互いに異なる。
【００３６】
一実施態様において、当該方法は、オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２のオブジェクトコードを前記ビット列Ｂとして使用するステップとを有する。
【００３７】
一実施態様において、当該方法は、オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２を透かし（watermark）Ｃと組み合わせるステップと、該第２部分Ａ２及び透かしＣの組み合わせを前記ビット列Ｂとして使用するステップとを有する。
【００３８】
一実施態様において、結果としてのプロセッサＰは合成可能なハードウェア記述として表される。
【００３９】
一実施態様において、前記ビット列Ｂの部分は、知的所有権を主張するテキスト又は標示の表現である。
【００４０】
一実施態様において、前記ビット列Ｂの部分は、ユーザを識別するテキストの表現である。
【００４１】
一実施態様において、前記ビット列Ｂの部分は、計算環境から動的に収集される。
【００４２】
一実施態様において、入力される上記ビット列の如何なる変更も、オリジナルのアプリケーションαが正しく動作することを妨げる。
【００４３】
本発明の一態様は、コンピュータプログラム製品に関するものであり、該コンピュータプログラム製品は、コンピュータにより実行された場合に該コンピュータに：プログラムＰを入力させ；ビット列Ｂをマシン命令のソースとして使用する場合に前記プログラムＰにより定義された処理を実行するプロセッサの演算的意味を計算させ（該演算的意味は入力としての前記ビット列Ｂ及び前記プログラムＰから計算される）；プロセッサを、該プロセッサがマシン命令を前記演算的意味に従って実行するように構成するための構成データを発生させる命令のプログラムを有する。
【００４４】
上記及び他の目的並びに有利な態様は、添付図面を使用する例示的実施態様の説明から明らかとなるであろう。
【図面の簡単な説明】
【００４５】
【図１】図１は、プログラムを実行するシステムを示す。
【図２】図２は、プロセッサのアーキテクチャを示す。
【図３】図３は、変形コンパイルを示す。
【図４】図４は、変形コンパイルを示す。
【図５】図５は、変形コンパイルを示す。
【図６】図６は、変形コンパイルを示す。
【図７】図７は、変形コンパイルを示す。
【図８】図８は、変形コンパイルを示す。
【図９】図９は、他の実施態様を示す。
【図１０】図１０は、他の実施態様を示す。
【図１１】図１１は、他の実施態様を示す。
【発明を実施するための形態】
【００４６】
図１は、プログラムを実行するための例示的システムを示す。図示された実施態様は本発明を限定するというよりも解説するために提示されていることを強調しておく。例えば、本発明は該図に示されたもの以外のタイプのプロセッサにより実施化することもできる。該システムは、構成コンパイラ（configuration compiler）１０、プログラムコンパイラ１１及びプロセッサ１２を有している。構成コンパイラ１０及びプログラムコンパイラ１１は、コンピュータ（明示的に示されていない）上で動作するコンピュータプログラムにより実施化することができる。
【００４７】
プロセッサ１２は、プログラムメモリ１２０、プログラムカウンタ１２２、命令デコーダ１２４、命令デコード制御メモリ１２６、実行回路１２８及びデータメモリ１２９を有している。コンパイラ１０は、プログラムＰを入力するための入力端を有すると共に、プログラムメモリ１２０及び命令デコード制御メモリ１２６に結合されて、マシンコードプログラムＢ及び該マシンコードプログラムＢからの命令に対するプロセッサ１２の応答を定義するデータＱをプログラムメモリ１２０及び命令デコード制御メモリ１２６に各々記憶させるための出力端を有している。命令デコーダ１２４は、命令（プログラム）メモリ１２０の出力端と実行回路１２８の制御入力端との間に結合されている。プログラムカウンタ１２２は命令メモリ１２０のアドレス入力端及び命令デコーダ１２４に結合されている。実行回路１２８はデータメモリ１２９及び実行回路１２６のＩ／Ｏ端子に結合されている。
【００４８】
構成コンパイラ１０、プログラムコンパイラ１１及びプロセッサ１２は単一のシステムの一部として図示されているが、これらは直接結合される必要はないと理解されるべきである。プロセッサ１２は、該プロセッサ１２がプログラムを実行するコマンドを受けた場合に、半導体メモリ、磁気又は光ディスク等のコンピュータ読取可能な媒体から該プロセッサ１２に構成コンパイラ１０及びプログラムコンパイラ１１の出力をロードすることができ、又は例えばプロセッサ１２の製造の間のような早期にロードすることもできる。構成コンパイラ１０及びプログラムコンパイラ１１は出力データをコンピュータ読取可能な媒体上に直接書き込むことができ、又は、次いで、プロセッサ１２に到達する前に如何なる回数でも送信及び／又はコピーすることもできる。
【００４９】
プロセッサ１２は、命令デコード制御メモリ１２６からのデータに依存して、プログラムメモリ１２０からのマシン命令を命令デコーダ１２４により実行回路のための制御コードに翻訳する。一実施態様において、マシン命令は演算コード（オペコード）を含むと共に、オプションとして１以上のオペランドコードを含む。オペランドコードはオペコードにより示される演算のための入力データを伴うレジスタのアドレス及び該演算からの出力データが記憶されるべきレジスタのアドレスを識別することができる。アドレスの代わりに、オペランドコードはリテラルデータを示すことができるか、又はオペランドデータのアドレスを記憶するレジスタのアドレスを示すこともできる。一実施態様において、上記の翻訳された制御コードも、同様に、実行回路１２８により解釈及び実行されるべきオペコード及びオペランドコードを有することができるが、代わりに、斯かる制御コードは実行回路１２８の構成要素を直接制御するためのマイクロコードとすることもできる。
【００５０】
異なるタイプのプロセッサは同一の演算を示すために異なるオペコードの使用を必要とし、これらはオペランドデータ及び結果の記憶位置を示すための異なる方法を必要とし得る。特定のタイプのプロセッサが命令に対して付与する解釈は、即ち、特定のタイプのプロセッサが個々の命令に応答する方法は、このタイプのプロセッサの演算的意味（operational semantics）Ｑと呼ばれる。本明細書で使用される場合、演算的意味とは、プロセッサ１２がマシン命令に対してどの様に応答するかを定義するデータを指す。異なるタイプのプロセッサは、異なる演算的意味Ｑ及びＱ’を有し得る。記号Ｑは、演算的意味Ｑを持つプロセッサを指すためにも、即ち、当該プロセッサが演算的意味Ｑと一貫性のある命令を実行するように構成される場合に、使用される。
【００５１】
図２は、プログラムメモリ、命令フェッチャ、命令デコーダ、実行ユニット、プログラムカウンタ（ＰＣ）、レジスタファイル及びデータメモリを有する、より一般的なプロセッサアーキテクチャを示す。上記命令フェッチャは、プログラムカウンタ値を入力し、プログラムメモリからビットパターンを取り出す。このビットパターン（命令）は上記命令デコーダに供給される。該命令デコーダは上記実行ユニットを操作するための実行ビットを発生する。これらの実行ビットは、マイクロ命令のように複雑なもの及びレジスタインデックスのための単項エンコーディングのような簡単なものを含み得る。該実行ユニットは、該実行ビットを実行する。即ち、該実行ユニットは、これらのビットの制御の下で演算（処理）を実行する。上記実行ビットの制御の下で、該実行ユニットはレジスタファイル／データメモリからデータを取り出し、前記プログラムカウンタを更新することができる。
【００５２】
前記プログラムメモリに保持される命令は、しばしば、“マシンコード”と呼ばれる。これらは、しばしば、アセンブリ命令と１対１の関係を持つビットパターンである。これらビットパターンは、前記実行ユニットにおける実行のパターンにつながる。この実行パターンはプログラムの実行挙動を決定する。該実行パターンを、プログラムの意味と称する。
【００５３】
図２の例において、演算的意味Ｑは前記命令デコーダ及び／又は実行ユニットにより定義することができる。図１の例において、演算的意味Ｑは前記命令デコード制御メモリ１２６に記憶された情報により適応的に定義することができる。
【００５４】
命令デコーダ１２４は二進パターンを、例えば命令メモリ１２０から入力される命令のオペコードを、実行回路１２８に供給するための命令デコード制御メモリ１２６における翻訳されたオペコードをルックアップするために使用することにより翻訳することができる。元（オリジナル）のオペコード及び翻訳されたオペコードは同一の長さ（例えば、８ビット）を有することができるが、これは必要ではない。元のオペコードは、翻訳されたオペコードよりも長くても良く、又は説明されるように短くてさえもよい。同様にして、命令デコーダ１２４は、入力された命令のオペランド及び結果レジスのタアドレス、リテラルデータ及び／又は他のデータを、該入力された命令の一部を、実行回路１２８に供給するための命令デコード制御メモリ１２６における翻訳されたアドレス又はデータをルックアップするために使用することにより翻訳することができる。元のオペランド／結果レジスタアドレス／データ及び翻訳されたオペランド／結果レジスタアドレス／データは同一の長さを有するが、前記オペコードの場合と同様に、これは必要ではない。
【００５５】
プログラムコンパイラ１１は、コンパイルモードにおけるコンパイルをサポートするように構成された通常のコンパイラとすることができ、該コンパイラ１１はプログラムＰ’を、命令メモリ１２０に記憶するための特別に構成されたプロセッサ１２用のマシン命令の系列に翻訳する。構成コンパイラ１０はコンパイルモードをサポートするように構成され、該コンパイルモードにおいて該構成コンパイラ１０はマシンコードプログラムＢ及びプログラムＰを入力すると共に、第２コンパイルモードにおける命令に対するプロセッサ１２の応答を定義するデータＱを発生する。このコンパイルモードにおいて、構成コンパイラ１０は該演算的意味Ｑを命令デコード制御メモリ１２６にプロセッサ１２の命令に対する応答を定義するデータとして記憶する。
【００５６】
［変形コンパイルの基本原理］
プロセッサ等のプログラム可能な装置は、多様なソフトウェアプログラムを実行することができる。実行することが可能なプログラムの数は、通常、利用可能な時間及びメモリ等の資源の制限によってのみ制限される。プロセッサ上で動作するプログラムは、当該プロセッサにより解釈されるビットパターンとして符号化される。例示的実施態様において、ビットパターンは一連のマシン命令を有する。コンパイラは、プログラムの高レベル記述を、これらのビットパターンに変換する。高レベル記述は、通常、Ｃ、ジャバ、フォートラン等のプログラミング言語を用いて作成される。この変換において重要なことは、当該ビットパターンのプロセッサの解釈が、当該高レベルプログラムの当該プログラミング言語の仕様に従う意味に等しいということである。他の実施態様では、コンパイラは、アセンブリレベルのプログラム等の低レベルプログラム又はジャババイトコードのプログラム等の仮想マシンのためのプログラムを変換することができる。
【００５７】
オリジナルのプログラムをＰ、ビットパターンをＢ、言語標準解釈（又は表示的意味：denotational semantics）をＭ、及びプロセッサの解釈（又は演算的意味）をＱと呼ぶならば、正しいコンパイラは：
Ｍ(Ｐ)＝Ｑ(Ｂ)
を成立させなければならない。
【００５８】
このように、Ｐ及びＭが与えられた場合、正しいコンパイラＣは上記等式を満足させるビットパターンＢ＝Ｃ(Ｐ)を生成するであろう。言い換えると、プログラムＢの実行は、言語標準解釈が付与されたプログラムにより定義される入力データに対するプロセッサ応答を生成しなければならない。等式Ｍ(Ｐ)＝Ｑ(Ｂ)は、例えば、プログラムＰの基準マシン言語プログラムへの翻訳における及びビット列Ｂにおける対応する位置の全ての命令が、Ｍ(ＯＢ)＝Ｍ(ＯＰ)を満足する、即ち、これらの命令が同一の演算を参照すること、並びに該命令におけるオペランド／結果コードにより示される記憶位置の間に１対１のマップが存在すること、及び／又はリテラルデータが等しいことを満足するオペコードＯＢ、ＯＰを有する場合に、満たされ得る。
【００５９】
Ｍはプログラミング言語に依存することに注意されたい。プログラムＰは、異なるプログラミング言語に対して異なる意味を有し得る。同様に、Ｑはアプリケーションを実行する実際のプロセッサに依存する。同一のビットパターンは、異なるプロセッサにより実行された場合、異なる結果を有し得る。例えば、インテル・プロセッサによりウェブブラウザとして解釈されるビットパターンは、ＡＲＭプロセッサ上では有効な解釈は有さないであろう。異なる演算的意味Ｑ及びＱ’を有する異なるタイプのプロセッサに対しては、通常、Ｍ(Ｐ)＝Ｑ(Ｂ)及びＭ(Ｐ)＝Ｑ’(Ｂ’)なる条件を満たす異なるビットパターンＢ及びＢ’が必要とされる。
【００６０】
従来のコンパイラの場合、通常、Ｍ及びＱは固定であり、所与のＰに対してＢが計算されることが分かる。時には、Ｍが固定され、前記式が成り立つように、ツールが特注ハードウェアＱ及び付随するビットパターンＢを発生する。Ｂを変更することにより、ハードウェアＱ上で新たなプログラムＰを実行することができるが、これらのプログラムの選択は、発生されたＱが少ないビットパターンしか解釈することができないという点で制限される。この場合、特注の非プログラマブル設計の話をしている。
【００６１】
変形コンパイル（metamorphic compilation）においては、Ｐ及びＢは固定され、Ｑが発生される。このように、変形コンパイラは所与のビットパターンＢをプログラムＰとして解釈するプロセッサを作製する。このことは、Ｂを無視する特注のハードウェアを発生することにより容易に達成することができる。非プログラマブル設計とは対照的に、変形コンパイラは、プロセッサＱにより実行することが可能なアプリケーションの範囲がメモリ及び時間資源によってのみ制約されるという点でプログラマブルであるプロセッサＱを発生する。
【００６２】
変形コンパイルの間に発生されるプロセッサＱは、他の実行プラットフォーム上でエミュレーションされる仮想マシンであり得るか、又は例えば合成可能なヴェリログ（Verilog）又はＶＨＤＬにより表されるハードウェア設計であり得る。この方法を支援するために、変形コンパイラはコンパイラＣＱも発生し、このコンパイラＣＱはプロセッサＱ上で実行するために該コンパイラＣＱにより受け入れられるプログラミング言語で書かれた任意のプログラムＰ’をコンパイルするものである。
【００６３】
要約すると、変形コンパイルを、古典的なハードウェア及びソフトウェアコンパイルと以下のように対比することができる：
−  ソフトウェアコンパイルは、任意のプログラム及び固定のプロセッサに対してビットパターンを発生する；
−  ハードウェアコンパイルは、固定のアプリケーションに対してビットパターン及びプロセッサを発生する；
−  変形コンパイルは、固定のビットパターン及び任意のプログラムに対してプロセッサ及びコンパイラを発生する。
【００６４】
これを、図３〜８を用いて説明する。“Ｐ”をプログラムとする。“Ｂ”を、命令メモリ内の当該プログラムに対してコンパイラ“Ｃ”により作成される二進イメージとする。“Ｓ”を、“Ｂ”により発生される前記実行ユニット内の実行パターンとする（図３参照）。
【００６５】
“Ｐ＿１”を別のプログラムとする。同一のコンパイラ“Ｃ”が“Ｐ＿１”を別の二進イメージ“Ｂ＿１”に変換する。この二進イメージは、同一のプロセッサ内に新たな実行パターン“Ｓ＿１”を発生させる（図４参照）。
【００６６】
変形コンパイルにおいては、図２の命令デコーダを置換する。“Ｚ”を、ユーザにより選択される二進パターンとする。これは、例えば画像、テキストファイル又は何らかの他のデータを表すパターン等の、如何なる二進パターンとすることもできる。図２における命令デコーダを、命令メモリから読み取り、実行ビットを生成する別のデコードdecode_2により置換する。decode_2が“Ｚ”を含む命令メモリから発生するビットは、二進イメージ“Ｂ”に対して元の命令デコーダにより発生される実行ビットと等しい。従って、“Ｚ”により発生される実行パターンは、“Ｂ”により発生される実行パターンと同一である。図５における“MM_processor”は、該新たな命令デコーダを使用するプロセッサである。発生される実行パターンが等価である限りにおいて、正確に同一の実行ビットを発生する必要はない。当該例示的構成においては、同一の実行ビットを発生する。
【００６７】
“Ｚ”はユーザにより選択されるので、これは、例えば単に“０”を含むメモリ等の如何なるものでもよい。同一の系列の実行ビットを発生することができるように、当該命令デコーダは、適切な実行ビットを発生するためにプログラムカウンタのビットパターン（これは、プログラムメモリ内の各命令に対して固有である（これは命令アドレスである））を使用することができる。このことは、使用するプロセッサテンプレートがデコードユニット内でプログラムカウンタを使用することを意味する。図６を参照されたい。
【００６８】
decode_2は、多様な実行ビットパターンを発生することができる。decode_2を用いて構築されるプロセッサは、依然としてプログラマブルである。図２における通常のコンパイラと同様にプログラムメモリのためのビットパターンを発生するコンパイラを作成することができる。この新たなソフトウェアコンパイラ（Ｄ）は、元のプログラム“Ｐ”をビットパターン“Ｚ”にコンパイルする。図７を参照されたい。
【００６９】
プログラム“Ｐ＿１”を、先に見たものと同一の実行パターン“Ｓ＿１”を発生させる新たな二進イメージ（例えば、“Ｂ＿２”）にコンパイルすることも可能である（図８参照）。
【００７０】
［変形コンパイルの一実施態様］
図１を参照することにより説明したタイプのプロセッサを使用する実施態様において、構成コンパイラ１０は一連のステップにおいて変形コンパイルを実施することができる。第１ステップにおいて、構成コンパイラ１０はプログラムＰを、基準実行回路のための一連の基準マシン命令（reference machine instructions）に翻訳することができる。第２ステップにおいて、構成コンパイラ１０は、入力されたビット列Ｂを、各々が対応するマシン命令として使用することができる一連の部分に分割することができる。
【００７１】
第３ステップにおいて、構成コンパイラ１０は、基準マシン命令を、上記一連の基準マシン命令及び上記ビット列Ｂの各々における対応する位置のビット列Ｂの部分と比較する。この比較から、構成コンパイラ１０は、対応する位置において上記ビット列の部分を基準マシン命令に翻訳するために必要とされる翻訳を決定する。例えば、上記部分の異なる下位部分を、基準マシンプログラムにおける対応する位置の基準マシン命令のオペコード並びにオペランド及び結果コードと比較することができる。このことから、上記下位部分におけるビット列Ｂからの情報のためのルックアップデータを、基準マシン命令から抽出することができる。第４ステップにおいて、構成コンパイラ１０は、結果としての情報（例えば、上記ルックアップデータ）をプログラムコンパイラ１１に対して利用可能にさせ、その結果、プログラムコンパイラ１１は発生された演算的意味を持つプロセッサに対してプログラムＰ’をコンパイルするように構成される。第５ステップにおいて、構成コンパイラ１０は、結果としての情報（例えば、上記ルックアップデータ）が、命令デコード制御メモリ１２６に記憶されるようにさせる。
【００７２】
一実施態様においては、重なり合わない下位部分が使用される。しかしながら、重なり合う下位部分を使用することも可能である。例えば、上記基準マシン命令プログラムにおける特定の演算は、特定のレジスタオペランドを含み得る。この場合、構成コンパイラ１０は、対応する基準マシン命令を調べることにより、ビット列Ｂにおける上記特定のレジスタオペランドを必要とする全ての部分（“Ｂ命令”）を検索することができる。構成コンパイラ１０は、上記基準マシンプログラムにおける対応する命令に対して、“Ｂ”における命令が該特定のオペランドを必要とするか、又は必要としないか（又は、可能性として、どちらでもよい）を示すルックアップテーブルを発生することができる。ルックアップテーブルの代わりに、構成コンパイラ１０は、基準マシンプログラムにおける対応する命令に適用された場合に、この特定のオペランドが必要とされるか否かを示す結果となるブール式を導出することもできる。ルックアップテーブルに基づいてブール式を発生する方法自体は既知である。プログラムの実行の間において、当該命令がオペランドを必要とするか否かを決定するために、このブール式をＢの各部分（“Ｂ”命令）に適用することができるか、又は各部分をルックアップテーブルに対する入力として使用することができる。該ブール関数は、Ｂの部分の下位部分を入力として必要とする。他のブール関数を、命令の他の特徴（例えば、オペコード）をＢの部分の別の下位部分（可能性として重なっても良いが）を用いて決定するために導出することができる。
【００７３】
ビット列Ｂ及びプログラムＰの内容に依存して、ビット列の異なる下位部分における同一の内容は異なる方法で翻訳されることを要し得るという点で、曖昧さ（不明確さ）が生じ得る。構成コンパイラ１０は斯様な曖昧さを種々の方法で解決することができる。一実施態様において、コンパイラは、斯様な曖昧さを防止し又は斯かる曖昧さの数を減少させるために、命令として扱われるビット列Ｂの部分の長さ、及び、オプションとして、オペコード又はオペランド／結果データ／アドレスとして使用される下位部分の長さを増加させることができる。
【００７４】
一実施態様において、命令デコーダ１２４は翻訳を明確にするためにプログラムカウンタ値を使用するように構成することができる。例えば、命令デコーダ１２４は翻訳をルックアップするために、命令メモリ１２０からの命令の一部又は部分と組み合わせて該プログラムカウンタ値から導出される情報を供給するように構成することができる。コンパイラ１０は、プログラムカウンタ値から導出される情報及びビット列Ｂの部分からデータの異なる組み合わせの翻訳を選択するために、部分列の異なる部分に対応するプログラムカウンタ値を決定するように構成することができる。
【００７５】
他の実施態様において、命令デコーダ１２４はプログラムカウンタからの情報の構成可能な抽出を行うことができる。この実施態様において、構成コンパイラ１０は、使用される情報を定義するために、命令デコーダ１２４の構成を選択するように構成することができる。例えば、コンパイラ１０は、ビット列Ｂの同一の下位部分に付与されるべき全ての異なる翻訳を収集し、プログラムカウンタ値から情報を導出する複数の所定の方法のうちの、これら翻訳を明確にするために十分な情報を提供する１つを選択し、命令デコーダ１２４が該選択された情報導出方法を使用するよう構成されるようにすることができる。この条件を満たすと共に最小限の量の情報しか必要としない情報導出方法を選択することができる。例えば、異なる情報導出方法は、プログラムカウンタ値のうちの異なる数の可変最下位ビットを使用することができる。
【００７６】
同様の明確化法を、曖昧な翻訳を有するビット列Ｂの複数の下位部分に適用することができる。構成コンパイラ１０は、明確化のために、ビット列Ｂの一層長い部分を命令として使用することと、プログラムカウンタの一層多くを使用することとの間での取引を用いることができる。更に、曖昧さの量は、翻訳を定義するためにプログラムＰの一部のみを使用すると共に、該プログラムの残部に対しては通常のコンパイルを用いることにより低減することができる。
【００７７】
勿論、幾つかの可能性のある基準マシン命令、オペコード又はオペランドコードは、可能性のある基準マシン命令に翻訳する（転換する）オリジナルのものを有さないかもしれない。このことは、これらの可能性のある基準マシン命令、オペコード又はオペランドコードが当該プログラムのためのマシンプログラムに発生しない場合には、該プログラムにとり問題ではない。しかしながら、他のプログラムを実行するためには、これらのマシン命令、オペコード又はオペランドコードに対して任意のオリジナルのものを選択することができる（これらが既に選択されたオリジナルのものから異なる限りにおいて）。オプションとして、このようなオリジナルは、ビット列Ｂの使用されない部分に基づいて選択することができる。
【００７８】
このようにして、プロセッサの演算的意味Ｑ（この演算的意味を持つプロセッサも、プロセッサＱと称する）は、プログラムＰ及びビット列Ｂに基づいて定義することができる。構成コンパイラ１０の一例を図１のシステムの前後関係において示したが、他の実施態様も可能であることに注意すべきである。例えば、命令の翻訳はソフトウェア制御の下で実行することもできる。即ち、エミュレーションを用いることができる。この場合、命令デコーダ１２４及び命令デコード制御メモリ１２６の機能は、エミュレーションプログラムにより実施化することができる。他の例として、コンパイラ１０は、ビット列Ｂの一連の部分を入力することに応答して一連の基準マシン命令を実行するプロセッサの、例えば合成可能なヴェリログ又はＶＨＤＬ記述により表されたハードウェア設計を発生するように構成することもできる。
【００７９】
ビット列Ｂが入力される一例を説明したが、他の例として、構成コンパイラ１０がビット列Ｂを、例えば乱数発生により又はプログラムＰとは異なる他のプログラムＰ’の翻訳として発生することもできると理解されるべきである。
【００８０】
要約すると、演算的意味Ｑを持つプロセッサがビット列Ｂからとられる一連の命令を実行する場合、該プロセッサはプログラムＰを有効に実行するという特性により、ビット列ＢがプログラムＰから演算的意味Ｑを決定するために用いられる。このことは、プログラムコンパイラ１１を構成すると、即ち、如何なるプログラムＰ’をも演算的意味Ｑに従って翻訳するための固有のコンパイラＣＱを、言い換えると、如何なるプログラムＰ’をも、該演算的意味を持つプロセッサにより実行された場合に該プロセッサに該プロセッサが該プログラムＰ’を有効に実行するようにさせるようなマシン命令に翻訳する固有のコンパイラを作成すると言うこともできる。
【００８１】
［改竄防止、難読化及び透かし入れのための変形コンパイルの適用］
プロセッサＱによるＢの解釈がアプリケーションＡと意味的に等価となるように任意のビットパターンＢを用いてアプリケーションＡをプロセッサＱに変形させる場合に、２つのことが起きる。第１に、プロセッサＱ（仮想マシン又は１つのハードウェア）の表現及び二進オブジェクトＢは極めて制限され、ＱもＢもオリジナルのアプリケーションＡを損なうことなしに変更することはできないということを意味する。第２に、オリジナルのアルゴリズムＡの符号化（エンコーディング）は、ここでは、２つの部分に分割される。該アルゴリズムの一方の部分はビットパターンＢを用いてエンコードされ、他方の部分はプロセッサＱにエンコードされる。
【００８２】
プロセッサＱはプログラマブルである。結果として、如何なる任意のアプリケーションに対しても、コンパイラＣＱは、Ｑによる解釈が該任意のアプリケーションの実施となるようなコードを発生する。従って、Ｑの表現を単独で調べることが、オリジナルのアプリケーションＡに関する如何なる情報も明らかにすることにはならない。また、Ｂはランダムに選択されたものであるから、該ビットパターンＢを調べることも、アプリケーションＡに関する如何なる情報も明らかにすることにならない。オリジナルのアプリケーションＡに関して何かを知るためには、攻撃者は、Ｑにより実行されるプログラムＢの実行痕跡を観察することによりプロセッサＱのアーキテクチャ及び命令セットを導出しなければならない。このことは、解放型プラットフォーム上で実行されるアプリケーションをリバースエンジニアリングすることよりも大幅に困難な挑戦である。
【００８３】
ビットパターンＢは自由に選択することができると共にプロセッサＱに対して切り離せないほど結合され、且つ、オリジナルのアプリケーションを損なうことなしに変更することはできないという事実は、Ｂを透かし（ウォーターマーク）として使用することができることを意味する。例えば、Ｂが（他にも情報はあるが）実施許諾者のロゴ及び著作権文書（テキスト）、又は実施権者の名称及び組織を含むことが可能である。このようにして、オリジナルのアプリケーションは、不明化されるのみならず、法的所有者及び実施権者の権利を記述する法的文書に切り離せないほど結合される。
【００８４】
変形コンパイルの他の魅力的な応用例は、アプリケーションの一部を不明化（隠蔽）すると共に、残部を改竄自由にすることである。これを達成するために、オリジナルのアプリケーションＡを２つの部分Ａ１及びＡ２に分割し、Ａ１が不明化したい全てのコードを含むようにする（例えば、ライセンスチェックコードを隠蔽する又は独自仕様のアルゴリズムのリバースエンジニアリングを防止するため）。変形コンパイルを、Ａ１を仮想マシンＱに変形するためにＡ１をプログラムＰとして用い、Ａ２のオブジェクトコードをプログラムコードとして用いて適用する。この場合、Ａの実施は２つの部分からなる。即ち、一方の部分はＡ２のオブジェクトコードをプログラムコードとして使用する仮想マシンＱのシミュレータであり、結果として部分Ａ１の実施は不明化される。第２の部分Ａ２は、アプリケーションＡのホストプラットフォームのための標準のオブジェクトコードとして実施される。
【００８５】
ここで、Ａ２のオブジェクトコードは、ホストマシン用のコード及びアプリケーション部分Ａ１を実行する責任を負う仮想マシンＱのためのコードの両方として働く。攻撃者はアプリケーション部分Ａ２のオブジェクトコードをリバースエンジニアリングすることができるかも知れないが、これを変更することはアプリケーション部分Ａ１に関する実施の挙動も変化させてしまう。結果として、全体のアプリケーションに影響を与えることなくソフトウェアをローカルに変更することは、最早、不可能である。このことは、変形されたアプリケーションに対する攻撃を困難にさせる。
【００８６】
不明化及び抗改竄性の組み合わせに加えて、当該アプリケーションに対して透かし入れも用いることができる。これは、ここでも、オリジナルのアプリケーションプログラムＡを２つの部分Ａ１及びＡ２に分割し、Ａ１が不明化したい全てのコードを含み、Ａ２が抗改竄的にのみしたいと欲するコードを含むようにする。当該変形コンパイルを、Ａ１を仮想マシンＱに、透かしＣと組み合わされたＡ２のオブジェクトコードをプログラムコードとして用いて変形するために使用することができる。前述したように、この場合、プログラム部分Ａ１の実施は不明化され、プログラム部分Ａ２は改竄抵抗性のものにされ、且つ、透かしＣが追加され、該透かしはアプリケーション部分Ａ１の実行を損なうことなく除去又は変更することはできない。
【００８７】
もっと関連のある変形コンパイルの利用は、層状の自己適用である。変形コンパイルの１つの結果は、任意のビットパターンＢを実行することができる仮想マシンＱである。該仮想マシンＱ自体は、プログラムＰＱにより実施される。この場合、プログラムＰＱに対して変形コンパイルをビットパターンＢ又は更に他の自由に選択されたビットパターンの何れかを用いて適用することができる。この処理は、自由に選択される二進パターンを用いて数回適用することができる。各層は不明化及び抗改竄性を向上させると共に、異なる透かしを適用することを可能にする。
【００８８】
要約すると、変形コンパイルは：
−  プログラムに変更又は削除することができる透かしを追加する；
−  アプリケーションの異なる部分に対して異なるレベルの保護を用いる；
−  攻撃者が当該実施を変化させ得ることを防止するために、アプリケーション部分を抗改竄性にさせる；
−  攻撃者が当該実施を変化させ得ると共に該実施を理解／リバースエンジニアリングし得ることを防止するために、アプリケーション部分を不明化させる、
ことを可能にする。
【００８９】
解放型環境において実行されるアプリケーションの、リバースエンジニアリング及び改竄攻撃に対する保護を向上させる手段としての変形コンパイルの方法を提案する。変形コンパイルは：（ａ）（複数の）仮想マシンを層化することによりプログラム実行を不明化すること；（ｂ）アプリケーション及び実行環境を切り離せないほど結び付けること；並びに（ｃ）アプリケーションコード、仮想マシン及びアプリケーションデータに法的情報を公然と埋め込むこと；のうちの１以上を達成するために使用することができる。変形コンパイルの性質は、仮想マシン、アプリケーション又はアプリケーションデータの何れかを変化させることが、当該アプリケーションを役立たなくさせることを保証する。
【００９０】
図９は、上記変形コンパイラがユーザ指定イメージ“Ｚ”及びユーザ指定プログラム“Ｐ”をどの様に取り込むかを示している。該プログラム“Ｐ”は、通常は、通常のプロセッサにおける実行パターン“Ｓ”を生じさせるビットパターン“Ｂ”（図示略）にコンパイルされるであろうものである。
【００９１】
図１０は、当該変形プロセッサ内で二進イメージ“Ｚ”により実行パターン“Ｓ”がどの様に発生されるかを示す。
【００９２】
当該変形コンパイラが新たな命令デコーダのソフトウェア的構成を発生した場合、該ソフトウェア的構成は、当該プロセッサの残部のソフトウェア的構成と一緒に、プログラムを形成する。このプログラムは当該プロセッサ上で実行パターン“ＮＳ”を生じさせる。
【００９３】
当該変形コンパイラは、オリジナルのユーザイメージがprocessor_2上で実行パターン“ＮＳ”を生じさせるような新たなdecoder_2を発生させることができる。
【００９４】
図１１に示されるように、processor_2は、イメージ“Ｚ”を実行することができると共に、プログラム“Ｐ”に関連させる実行パターンであるパターン“Ｓ”を生じさせると共にイメージ“Ｚ”を実行するprocessor_1のためのシミュレータである実行パターン“ＮＳ”を生じさせることができる。
【００９５】
単一のプラットフォーム上で実行しているので、実行パターン“Ｎ”及び“ＮＳ”は該プラットフォーム上で混ぜ合わせることができる。
【００９６】
［形式的表記］
このことは、形式的に下記の表記法により示すことができる。アプリケーションは、ギリシャ文字α、β、γにより示され、当該アプリケーションの何らかのプログラミング言語でのソースコード表現を示す。プログラマブルなプロセッサは大文字Ｙ、Ｚ等により示される。プログラマブルプロセッサにより入力として使用されるビット列は小文字ａ、ｂ及びｃにより表される。言語標準に従うアプリケーションαの表示的意味は、表現Ｍ(α)により示される。プロセッサＹ上で実行される二進情報ａの演算的意味は、表現ＭＹ(ａ)により表される。ＣＹ(α)は、ＭＹ(ＣＹ(α))＝Ｍ(α)による、プロセッサＹのためにコンパイラＣによって発生される二進情報の表現である。
【００９７】
この表記法において、アプリケーションα及び任意のビット列ａが与えられると、プログラマブルプロセッサＹ及びコンパイラＣＹは、ＭＹ(ａ)＝Ｍ(α)なる特性で発生される。任意のアプリケーションβに対して、該コンパイラＣＹは、ＭＹ(ＣＹ(β))＝Ｍ(β)となるようなビット列ＣＹ(β)を発生する。
【００９８】
一実施態様において、アプリケーションαは、プロセッサＺａ及び対応するコンパイラを発生させるプログラマブルなプロセッサのシミュレータＺである。他の実施態様において、結果としてのプログラマブルプロセッサＹは導出ステップを任意の回数適用することにより導出される。
【００９９】
ここで使用される場合、プロセッサの演算的意味なる用語は、加算、減算、ロード、記憶（ストア）及びジャンプ操作（演算）等のマシン命令のオペコードに対応する操作（演算）を定義するデータを含む。このデータは、実際のプロセッサ又は該実際のプロセッサ若しくはシミュレーションプロセッサが当該オペコードに従って動作するようにさせるために使用されるべきプロセッサシミュレーションプログラムの他のオペコードを定義することができ、該データは実行回路において使用するための回路制御信号値のセットであって、該実行回路が上記オペコードに従って動作するようにさせるために使用されるべき回路制御信号値のセットを含むことができる。ここで使用される場合、プロセッサを該プロセッサが前記演算的意味に従ってマシン命令を実行するように構成するとは、斯様なデータをプロセッサに記憶させる、斯様なデータに従って動作させる自動的に発生された回路構成を備えるプロセッサを製造する、及び／又は該データに従ってオペコードに応答するプロセッサをシミュレーションするためのシミュレーションプログラムを発生することを含む。ここで使用される場合、マシン命令とは、例えば加算、ロード、記憶及びジャンプ命令等を含む、プロセッサ又はプロセッサシミュレーションプログラムにより個々に実行することができる命令である。
【０１００】
尚、上述した実施態様は本発明を限定するというよりは解説するものであり、当業者であれば添付請求項の範囲から逸脱することなく多くの代替実施態様を設計することができることに注意すべきである。また、請求項において、括弧内の如何なる符号も、当該請求項を限定するものと見なしてはならない。また、“有する”なる文言は、請求項に記載されたもの以外の構成要素又はステップの存在を排除するものではない。また、単数形の構成要素は、複数の斯様な構成要素の存在を排除するものではない。本発明は、幾つかの別個のエレメントを有するハードウェアにより、及び／又は適切にプログラムされたプロセッサにより実施化することができる。幾つかの手段を列挙する装置の請求項において、これら手段の幾つかは１つの同一のハードウェア品目により実施化することができる。特定の手段が相互に異なる従属請求項に記載されているという単なる事実は、これら手段の組み合わせを有利に使用することができないということを示すものではない。
【図１】
2015523635.tif 000003
【図２】
2015523635.tif 000004
【図３】
2015523635.tif 000005
【図４】
2015523635.tif 000006
【図５】
2015523635.tif 000007
【図６】
2015523635.tif 000008
【図７】
2015523635.tif 000009
【図８】
2015523635.tif 000010
【図９】
2015523635.tif 000011
【図１０】
2015523635.tif 000012
【図１１】
2015523635.tif 000013
【手続補正書】
【提出日】平成26年2月28日(2014.2.28)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサを構成する方法であって、
−  ビット列Ｂ及びプログラムＰを入力するステップと、
−  プロセッサを、該プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合にプログラムＰを実行するように構成するステップと、
を有する、方法。
【請求項２】
前記プログラムＰが一連の基準マシン命令を定義し、前記構成するステップが、
−  前記ビット列Ｂ及び前記一連の基準マシン命令から、前記プロセッサを該プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に前記プログラムＰを実行するように構成するための翻訳データを計算するステップと、
−  前記プロセッサを前記翻訳データにより構成するステップと、
を有する、請求項１に記載の方法。
【請求項３】
前記翻訳データを計算するステップが、
−  前記ビット列Ｂを、前記プロセッサにより各マシン命令として使用するための連続する部分に分割するステップと、
−  前記ビット列の前記連続する部分を前記一連の基準マシン命令における対応する位置の基準マシン命令に翻訳するための１対１翻訳を決定するステップと、
を有する、請求項２に記載の方法。
【請求項４】
前記翻訳データが、前記ビット列の前記連続する部分の各部分の異なる下位部分を、前記一連の基準マシン命令における対応する位置の基準マシン命令のオペコード、オペランド及び結果コードのうちの少なくとも１つに翻訳する、
請求項３に記載の方法。
【請求項５】
前記翻訳データが、基準マシン命令を得るために前記ビット列Ｂの前記部分をルックアップするためのルックアップデータを有する、請求項３に記載の方法。
【請求項６】
前記ビット列における前記連続する部分が基準マシン命令の長さより大きな長さを有する、請求項３に記載の方法。
【請求項７】
前記プロセッサにより実行される場合の、前記ビット列の異なる部分に対応するプログラムカウンタ値を決定するステップと、
前記ビット列の前記部分を前記プログラムカウンタ値から導出される情報と組み合わせて、明確にされた部分を得ると共に、該明確にされた部分を前記基準マシン命令に翻訳するための翻訳を決定するステップと、
を有する、請求項３に記載の方法。
【請求項８】
前記翻訳データにより定義される翻訳の下で前記基準マシン命令に翻訳するオリジナルのオペランドコードを有さない基準マシン命令を決定するステップと、
前記オリジナルのオペランドコードを有さない基準マシン命令に対して前記翻訳データにおいて既に定義されたオリジナルのオペランドコードとは異なるオリジナルのオペランドコードを選択すると共に、前記プロセッサを構成するための前記翻訳データを、該プロセッサが前記選択されたオリジナルのオペランドコードをマシン命令のソースとして使用する場合に前記構成されたプロセッサが前記決定された基準マシン命令を実行するように拡張するステップと、
を有する、請求項２に記載の方法。
【請求項９】
前記翻訳データにより構成されたプロセッサのためのコンパイラに対して前記翻訳データを利用可能にさせるステップと、
前記コンパイラにより他のプログラムＰ’をコンパイルして、前記プロセッサのためのコンパイルされたマシン命令のプログラムを生成するステップと、
前記コンパイルされたマシン命令のプログラムを前記プロセッサにより実行するステップと、
を有する、請求項２又は請求項８に記載の方法。
【請求項１０】
前記プログラムＰが他のプロセッサをシミュレーションするためのプログラマブルプロセッサのシミュレータプログラムであり、
前記プログラマブルプロセッサのシミュレータプログラムが、
−  他のビット列及び他のプログラマブルプロセッサのシミュレータプログラムを入力するステップと、
−  前記他のプログラマブルプロセッサのシミュレータプログラムにより定義される処理を、他のプログラマブルプロセッサが前記他のビット列をマシン命令のソースとして使用する場合に実行する該他のプログラマブルプロセッサの他の翻訳データを計算するステップであって、該他の翻訳データが入力としての前記他のビット列及び前記他のプログラマブルプロセッサのシミュレータプログラムから計算されるステップと、
により得られる、請求項９に記載の方法。
【請求項１１】
オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２のオブジェクトコードを前記ビット列Ｂとして使用するステップとを有する、請求項１に記載の方法。
【請求項１２】
オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２を透かしＣと組み合わせるステップと、該第２部分Ａ２及び透かしＣの組み合わせを前記ビット列Ｂとして使用するステップとを有する、請求項１に記載の方法。
【請求項１３】
前記プロセッサが合成可能なハードウェア記述により表される、請求項１ないし１２の何れか一項に記載の方法。
【請求項１４】
前記ビット列Ｂの部分が、テキストの表現、標示及び計算環境から動的に収集される情報のうちの少なくとも１つである、請求項１ないし１３の何れか一項に記載の方法。
【請求項１５】
プロセッサを構成する装置であって、前記装置が、
−  一連の基準マシン命令を定義するプログラムＰ及びビット列Ｂを入力する入力部と、
−  構成プロセッサと、
を有し、前記構成プロセッサが、
−  前記ビット列Ｂ及び前記一連の基準マシン命令から、前記プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に該プロセッサが前記プログラムＰを実行するように該プロセッサを構成するための翻訳データを計算し、
−  前記プロセッサを、該プロセッサが前記翻訳データに従ってマシン命令を実行するように構成する、
装置。
【請求項１６】
コンピュータにより実行された場合に該コンピュータに、
−  一連の基準マシン命令を定義するプログラムＰ及びビット列Ｂを入力させ、
−  前記ビット列Ｂ及び前記一連の基準マシン命令から、プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に該プロセッサが前記プログラムＰにより定義された処理を実行するように該プロセッサを構成するための翻訳データを計算させ、
−  前記プロセッサを構成するための構成データを前記翻訳データに従って発生させる、
命令のプログラムを有する、コンピュータプログラム。
【手続補正書】
【提出日】平成26年6月4日(2014.6.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサを構成する方法であって、
−  ビット列Ｂ及びプログラムＰを入力するステップと、
−  プロセッサを、該プロセッサが前記ビット列Ｂを少なくとも２つのマシン命令のソースとして次から次に使用する場合にプログラムＰを実行するように構成するステップと、
を有し、
前記プロセッサがマシン命令のソースとして前記ビット列Ｂを使用しない場合に前記プロセッサは前記プログラムＰを実行しない、
方法。
【請求項２】
前記構成するステップが、
−  前記プログラムＰを少なくとも２つの基準マシン命令に次から次に翻訳するステップと、
−  前記ビット列Ｂ及び前記少なくとも２つの基準マシン命令から次から次に、前記プロセッサを該プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に前記プログラムＰを実行するように構成するための翻訳データを計算するステップと、
−  前記プロセッサを前記翻訳データにより構成するステップと、
を有する、請求項１に記載の方法。
【請求項３】
前記翻訳データを計算するステップが、
−  前記ビット列Ｂを、前記プロセッサにより各マシン命令として使用するための連続する部分に分割するステップと、
−  前記ビット列の前記連続する部分を前記少なくとも２つの基準マシン命令における対応する位置の基準マシン命令に次から次に翻訳するための１対１翻訳を決定するステップと、
を有する、請求項２に記載の方法。
【請求項４】
前記翻訳データが、前記ビット列の前記連続する部分の各部分の異なる下位部分を、前記少なくとも２つの基準マシン命令における対応する位置の基準マシン命令のオペコード、オペランド及び結果コードのうちの少なくとも１つに次から次に翻訳する、
請求項３に記載の方法。
【請求項５】
前記翻訳データが、基準マシン命令を得るために前記ビット列Ｂの前記部分をルックアップするためのルックアップデータを有する、請求項３に記載の方法。
【請求項６】
前記ビット列における前記連続する部分が基準マシン命令の長さより大きな長さを有する、請求項３に記載の方法。
【請求項７】
前記プロセッサにより実行される場合の、前記ビット列の異なる部分に対応するプログラムカウンタ値を決定するステップと、
前記ビット列の前記部分を前記プログラムカウンタ値から導出される情報と組み合わせて、明確にされた部分を得ると共に、該明確にされた部分を前記基準マシン命令に翻訳するための翻訳を決定するステップと、
を有する、請求項３に記載の方法。
【請求項８】
前記翻訳データにより定義される翻訳の下で前記基準マシン命令に翻訳するオリジナルのオペランドコードを有さない基準マシン命令を決定するステップと、
前記オリジナルのオペランドコードを有さない基準マシン命令に対して前記翻訳データにおいて既に定義されたオリジナルのオペランドコードとは異なるオリジナルのオペランドコードを選択すると共に、前記プロセッサを構成するための前記翻訳データを、該プロセッサが前記選択されたオリジナルのオペランドコードをマシン命令のソースとして使用する場合に前記構成されたプロセッサが前記決定された基準マシン命令を実行するように拡張するステップと、
を有する、請求項２に記載の方法。
【請求項９】
前記翻訳データにより構成されたプロセッサのためのコンパイラに対して前記翻訳データを利用可能にさせるステップと、
前記コンパイラにより他のプログラムＰ’をコンパイルして、前記プロセッサのためのコンパイルされたマシン命令のプログラムを生成するステップと、
前記コンパイルされたマシン命令のプログラムを前記プロセッサにより実行するステップと、
を有する、請求項２又は請求項８に記載の方法。
【請求項１０】
前記プログラムＰが他のプロセッサをシミュレーションするためのプログラマブルプロセッサのシミュレータプログラムであり、
前記プログラマブルプロセッサのシミュレータプログラムが、
−  他のビット列及び他のプログラマブルプロセッサのシミュレータプログラムを入力するステップと、
−  前記他のプログラマブルプロセッサのシミュレータプログラムにより定義される処理を、他のプログラマブルプロセッサが前記他のビット列をマシン命令のソースとして使用する場合に実行する該他のプログラマブルプロセッサの他の翻訳データを計算するステップであって、該他の翻訳データが入力としての前記他のビット列及び前記他のプログラマブルプロセッサのシミュレータプログラムから計算されるステップと、
により得られる、請求項９に記載の方法。
【請求項１１】
オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２のオブジェクトコードを前記ビット列Ｂとして使用するステップとを有する、請求項１に記載の方法。
【請求項１２】
オリジナルのアプリケーションＡを入力するステップと、該オリジナルのアプリケーションＡを第１部分Ａ１及び第２部分Ａ２に分割するステップと、前記第１部分Ａ１を前記プログラムＰとして使用するステップと、前記第２部分Ａ２を透かしＣと組み合わせるステップと、該第２部分Ａ２及び透かしＣの組み合わせを前記ビット列Ｂとして使用するステップとを有する、請求項１に記載の方法。
【請求項１３】
前記プロセッサが合成可能なハードウェア記述により表される、請求項１ないし１２の何れか一項に記載の方法。
【請求項１４】
前記ビット列Ｂの部分が、テキストの表現、標示及び計算環境から動的に収集される情報のうちの少なくとも１つである、請求項１ないし１３の何れか一項に記載の方法。
【請求項１５】
プロセッサを構成する装置であって、前記装置が、
−  プログラムＰ及びビット列Ｂを入力する入力部と、
−  構成プロセッサと、
を有し、前記構成プロセッサが、
−  前記プログラムＰを少なくとも２つの基準マシン命令に次から次に翻訳し、
−  前記ビット列Ｂ及び前記少なくとも２つの基準マシン命令から次から次に、前記プロセッサが前記ビット列Ｂを少なくとも２つのマシン命令のソースとして次から次に使用する場合に該プロセッサが前記プログラムＰを実行し、前記プロセッサがマシン命令のソースとして前記ビット列Ｂを使用しない場合に前記プロセッサは前記プログラムＰを実行しないように該プロセッサを構成するための翻訳データを計算し、
−  前記プロセッサを、該プロセッサが前記翻訳データに従ってマシン命令を実行するように構成する、
装置。
【請求項１６】
コンピュータにより実行された場合に該コンピュータに、
−  プログラムＰ及びビット列Ｂを入力させ、
−  前記プログラムＰを少なくとも２つの基準マシン命令に次から次に翻訳し、
−  前記ビット列Ｂ及び前記少なくとも２つの基準マシン命令から次から次に、プロセッサが前記ビット列Ｂをマシン命令のソースとして使用する場合に該プロセッサが前記プログラムＰを実行し、前記プロセッサがマシン命令のソースとして前記ビット列Ｂを使用しない場合に前記プロセッサは前記プログラムＰを実行しないように該プロセッサを構成するための翻訳データを計算させ、
−  前記プロセッサを構成するための構成データを前記翻訳データに従って発生させる、
命令のプログラムを有する、コンピュータプログラム。
【国際調査報告】
2015523635.tif 000014
2015523635.tif 000015
2015523635.tif 000016