(57)【要約】  本発明は、プログラムのリバースエンジニアリングおよび／または改ざんを禁止する実行可能プログラムを保護する方法であって、実行可能プログラムのコピーを、実行可能プログラム内部の機能ブロックのロケーションを格納するデバッグデータベースとともに受け取るステップを含んでいる。保護コードは、実行可能プログラムに挿入されて、実行可能プログラム内部の機能ブロックの少なくとも一部を上書きする。機能ブロックの実行は保護コードを実行させ、保護コードは、上書きされた機能ブロックの少なくとも一部のコピーを実行する。【選択図】    図１
2008532113.tif 000002
【特許請求の範囲】
【請求項１】
実行可能プログラムを保護する方法であって、
実行可能プログラムのコピーを受け取るステップと、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり、
実行可能プログラムと関係するデバッグデータベースを受け取るステップと、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており、
実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するステップと、
保護コードを実行可能プログラムに挿入するステップとを含み、保護コードは機能ブロックの少なくとも一部を上書きし、
機能ブロックの実行は保護コードを実行させ、そして機能ブロックの実行はオペレーションを実行し、保護コードによって上書きされた機能ブロックの少なくとも一部のコピーを実行する、方法。
【請求項２】
保護コードを挿入するステップは、
符号化された命令を作成するために機能ブロックの少なくとも一部を符号化するステップと、
復号化ルーチンを実行可能プログラムに挿入するステップと、
実行可能プログラムの機能ブロックの少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令で置き換えるステップとを含み、
復号化ルーチンは、符号化された命令を復号化するための、および復号化された命令を実行するための実行可能命令を含む、請求項１に記載の方法。
【請求項３】
符号化は暗号化キーを用いて機能ブロックの少なくとも一部を暗号化するステップを含み、復号化は解読キーを用いて符号化された命令を解読するステップを含む、請求項２に記載の方法。
【請求項４】
暗号化キーは実行可能プログラムのコードのフラグメントから導出され、復号化ルーチンはコードのフラグメントから解読キーを導出し、符号化された命令はコードのフラグメントのいかなる破損も生じていない場合に首尾よく解読される、請求項３に記載の方法。
【請求項５】
暗号化キーは別の機能ブロックの命令から導出され、別の機能ブロックは符号化されており、復号化ルーチンは別の機能ブロックを復号化し別の機能ブロックの命令から解読キーを導出し、符号化された命令は別の機能ブロックが首尾よく復号化された場合に首尾よく解読される、請求項４に記載の方法。
【請求項６】
少なくとも１つの機能ブロックは別の機能ブロック内部のロケーションへの呼出しまたは飛越し命令を含んでおり、デバッグデータベースは実行可能プログラムの各々の呼出しまたは飛越し命令がポイントするロケーションを格納しており、機能ブロックを符号化するステップは、
機能ブロックの少なくとも一部を符号化のために選定するステップと、
機能ブロックの選定された少なくとも一部の内部のロケーションをポイントしている飛越しおよび呼出し命令をデバッグデータベースの内容から識別するステップと、
いかなる飛越しおよび呼出し命令も識別されない場合に機能ブロックの選定された少なくとも一部を符号化するステップとを含む、請求項２〜５のいずれか１項に記載の方法。
【請求項７】
保護コードを挿入するステップは、
符号化された命令の複数のセグメントを作成するために複数の機能ブロックの各々の少なくとも一部を符号化するステップと、各セグメントはそれぞれの機能ブロックに対応しており、
復号化ルーチンを実行可能プログラムに挿入するステップと、
複数の機能ブロックの各々の少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令のそれぞれのセグメントで置き換えるステップとを含み、
復号化ルーチンは符号化された命令を復号化し実行するための実行可能命令を含む、先行請求項のいずれか１項に記載の方法。
【請求項８】
保護コードを挿入するステップは、
第１の符号化された命令を作成するために第１の機能ブロックの少なくとも一部を第１の符号化アルゴリズムで符号化するステップと、
第２の符号化された命令を作成するために第２の機能ブロックの少なくとも一部を第２の符号化アルゴリズムで符号化するステップと、
第１の復号化ルーチンを実行可能プログラムに挿入するステップと、
第２の復号化ルーチンを実行可能プログラムに挿入するステップと、
第１の機能ブロックの少なくとも一部を第１の復号化ルーチンへの呼出し命令および第１の符号化された命令で置き換えるステップと、
実行可能プログラムの第２の機能ブロックの少なくとも一部を第２の復号化ルーチンへの呼出し命令および第２の符号化された命令で置き換えるステップとを含み、
第１の復号化ルーチンは、第１の符号化された命令を復号化するための、および第１の復号化された命令を実行するための実行可能命令を含み、第２の復号化ルーチンは、第２の符号化された命令を復号化するための、および第２の復号化された命令を実行するための実行可能命令を含む、先行請求項のいずれか１項に記載の方法。
【請求項９】
第１の符号化ルーチンおよび第２の符号化ルーチンは異なる、請求項８に記載の方法。
【請求項１０】
機能ブロックを逆アセンブルし逆アセンブルされたコードから１つ以上の命令を選定するステップをさらに含み、機能ブロックの少なくとも一部を符号化するステップは、選定された命令に対応する機能ブロックの１つ以上のフラグメントを符号化するステップを含む、請求項２〜９のいずれか１項に記載の方法。
【請求項１１】
復号化ルーチンは冗長命令によって占有されたロケーションで実行可能プログラムに挿入される、請求項２〜１０のいずれか１項に記載の方法。
【請求項１２】
デバッグデータベースは各機能ブロックの開始アドレスおよび各機能ブロックの終了アドレスに関する情報を格納しており、方法は、機能ブロックの終了アドレスを隣接する機能ブロックの開始アドレスと比較して２つの機能ブロック間の冗長命令を識別するステップを含む、請求項１１に記載の方法。
【請求項１３】
機能ブロックを逆アセンブルするステップと、機能ブロック内部の冗長命令を識別するために逆アセンブルされたコードを解析するステップとを含む、請求項１１に記載の方法。
【請求項１４】
機能ブロックは呼出しアドレスを有する少なくとも１つの呼出し命令を含んでおり、方法はさらに、
検証ルーチンを実行可能プログラムに挿入するステップと、
呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するステップとを含む、先行請求項のいずれか１項に記載の方法。
【請求項１５】
デバッグデータベースは実行可能プログラム内部の呼出し命令のロケーションを格納しており、保護コードを挿入するステップは、
検証ルーチンを実行可能プログラムに挿入するステップと、
実行可能プログラム内部の呼出し命令のロケーションをデバッグデータベースから識別するステップと、呼出し命令は呼出しアドレスを有しており、
呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するステップとを含む、請求項１に記載の方法。
【請求項１６】
検証ルーチンは実行可能プログラムの破損を検出するための命令を含む、請求項１４または１５に記載の方法。
【請求項１７】
検証ルーチンはいかなる破損も検出されない場合に呼出しアドレスを呼出すための命令を含む、請求項１６に記載の方法。
【請求項１８】
実行可能プログラムの少なくともフラグメントは実行中にメモリ装置に記憶され、検証ルーチンはメモリに記憶されたフラグメントの破損を検出する、請求項１４〜１７のいずれか１項に記載の方法。
【請求項１９】
検証ルーチンは、破損が検出された場合にメモリ装置に記憶された実行可能プログラムのフラグメントを破損または削除するための命令を含む、請求項１８に記載の方法。
【請求項２０】
検証ルーチンは、破損が検出された場合に実行可能プログラムの実行を終了するための命令を含む、請求項１４〜１９のいずれか１項に記載の方法。
【請求項２１】
検証ルーチンはＣＲＣアルゴリズムを使用する、請求項１４〜２０のいずれか１項に記載の方法。
【請求項２２】
検証ルーチンは、デバッグプロセスが実行中であるかどうかを検出するための、およびデバッグプロセスが検出された場合に実行可能プログラムの実行を終了するための命令を含む、請求項１４〜２１のいずれか１項に記載の方法。
【請求項２３】
仲介コードを実行可能プログラムに挿入するステップをさらに含み、仲介コードは検証ルーチンへの第１の呼出し命令および呼出しアドレスへの第２の呼出し命令を含んでおり、呼出しアドレスは仲介コードを呼出すように修正される、請求項１４〜２２のいずれか１項に記載の方法。
【請求項２４】
実行可能プログラム内部の複数の呼出し命令のロケーションをデバッグデータベースから識別するステップと、複数の呼出し命令の各々は呼出しアドレスを有しており、
複数の呼出し命令の各々について仲介コードのそれぞれのセグメントを挿入するステップと、仲介コードの各セグメントは検証ルーチンへの第１の呼出し命令、および実行可能プログラムのそれぞれの呼出し命令の呼出しアドレスへの第２の呼出し命令を含んでおり、
仲介コードのそれぞれのセグメントを呼出すために実行可能プログラムの複数の呼出し命令の各々の呼出しアドレスを修正するステップとを含む、請求項１４〜２３のいずれか１項に記載の方法。
【請求項２５】
実行可能プログラムを保護する方法であって、
実行可能プログラムのコピーを受け取るステップと、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり、
実行可能プログラムと関係するデバッグデータベースを受け取るステップと、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており、
実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するステップと、
符号化された命令を作成するために機能ブロックの少なくとも一部を符号化するステップと、
復号化ルーチンを実行可能プログラムに挿入するステップと、
実行可能プログラムの機能ブロックの少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令で置き換えるステップとを含み、
復号化ルーチンは、符号化された命令を復号化するための、および復号化された命令を実行するための実行可能命令を含む、方法。
【請求項２６】
実行可能プログラムを保護する方法であって、
実行可能プログラムのコピーを受け取るステップと、
実行可能プログラムと関係するデバッグデータベースを受け取るステップと、デバッグデータベースは実行可能プログラム内部の呼出し命令のロケーションを格納しており、
検証ルーチンを実行可能プログラムに挿入するステップと、
実行可能プログラム内部の呼出し命令のロケーションをデバッグデータベースから識別するステップと、呼出し命令は呼出しアドレスを有しており、
呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するステップとを含む、方法。
【請求項２７】
実行可能プログラムを保護するための装置であって、装置は、
実行可能プログラムのコピーを受け取るための手段と、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり、
実行可能プログラムと関係するデバッグデータベースを受け取るための手段と、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており、
実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するための手段と、
保護コードを実行可能プログラムに挿入するための手段とを備えており、保護コードは機能ブロックの少なくとも一部を上書きし、
機能ブロックの実行は保護コードを実行させ、そして機能ブロックの実行はオペレーションを実行し、保護コードによって上書きされた機能ブロックの少なくとも一部のコピーを実行する、装置。
【請求項２８】
実行可能プログラムを保護するための装置であって、装置は、
実行可能プログラムのコピーを受け取るための手段と、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり、
実行可能プログラムと関係するデバッグデータベースを受け取るための手段と、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており、
実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するための手段と、
符号化された命令を作成するために機能ブロックの少なくとも一部を符号化するための手段と、
復号化ルーチンを実行可能プログラムに挿入するための手段と、
実行可能プログラムの機能ブロックの少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令で置き換えるための手段とを備えており、
復号化ルーチンは、符号化された命令を復号化するための、および復号化された命令を実行するための実行可能命令を含む、装置。
【請求項２９】
実行可能プログラムを保護するための装置であって、装置は、
実行可能プログラムのコピーを受け取るための手段と、
実行可能プログラムと関係するデバッグデータベースを受け取るための手段と、デバッグデータベースは実行可能プログラム内部の呼出し命令のロケーションを格納しており、
検証ルーチンを実行可能プログラムに挿入するための手段と、
実行可能プログラム内部の呼出し命令のロケーションをデバッグデータベースから識別するための手段と、呼出し命令は呼出しアドレスを有しており、
呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するための手段とを備える、装置。
【請求項３０】
請求項１〜２６のいずれか１項に記載の方法を実行するための命令を含むコンピュータ。
【請求項３１】
請求項１〜２６のいずれか１項に記載の方法を実行するためにコンピュータによって実行可能なコンピュータプログラムまたはコンピュータプログラムの組。
【請求項３２】
請求項１〜２６のいずれか１項に記載の方法を実行するためにコンピュータによって実行可能なコンピュータプログラムコードを保存しているコンピュータプログラム製品。
【請求項３３】
実質的に添付図面に関して先に記載し図示した方法。
【請求項３４】
実質的に添付図面に関して先に記載し図示した方法を実行するために動作可能な装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア保護方法、より詳細には、プログラムのリバースエンジニアリングおよび／または改ざんを禁止する実行可能プログラムを保護する方法に関する。
【背景技術】
【０００２】
ソフトウェア保護の方法はソフトウェアの不法なコピーおよび配布を禁止するために絶えず探求されている。ソフトウェア保護の１形態は、ソフトウェアアプリケーションの内部に保護コードを埋め込むステップを伴う。ソフトウェアアプリケーションを実行する時点で、保護コードは、そのアプリケーションを実行しようとしているコンピュータがそれを行う許可を与えられているかどうかを判定する。残念なことに、ソフトウェア保護のこの形態は、デバッガおよび逆アセンブラによる攻撃を受けやすい。例えば、ソフトウェアアプリケーションは逆アセンブルされるかもしれず、保護コードのロケーションはアセンブリコードから識別されるかもしれない。いったん保護コードのロケーションが知られると、付加的なコードがソフトウェアアプリケーションに挿入されて、保護コードを回避するか、または保護コードを欺いてコンピュータがソフトウェアアプリケーションを実行する許可を与えられていると思わせることができる。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
ソフトウェアアプリケーションをリバースエンジニアリングから保護する方法は、アプリケーションの１つ以上のフラグメントを暗号化するステップを含む。しかしこれは、アプリケーションの必ずしも全部のフラグメントが暗号化に適するというわけではないことから、アプリケーションのソースコードについての知識を必要とする。例えば、暗号化されたコード内部のあるロケーションをポイントしているいずれかの直接飛越しまたは呼出し命令は当然、実行中に致命的エラーに終わる。その上、暗号化されているコードのロケーションにいかなる配慮も与えられていなければ、暗号化されたコードの直前の命令が間違って実行されるかもしれない。さらに、レジスタの内容は解読中に上書きされる恐れがある。従って、部分的に暗号化されたあらゆるルーチンは正しく実行されそうもない。それゆえ、そのような保護方法はソースコードが未知であるソフトウェアアプリケーションには不適格である。
【０００４】
ソフトウェアの不法なコピーおよび配布に加えて、さらなる懸念は、特に通信ネットワークによる増大するデータ交換に鑑みて、ウイルスやフィッシング（phishing）コードといった悪意のあるコードによるソフトウェアの感染である。ウイルスコードの存在についてソフトウェアをスキャンするアンチウィルスアプリケーションが存在するが、新しいウイルスは絶え間なく公開されている。従って、アンチウィルスアプリケーションは、少しでも実用的であるために頻繁な更新を必要とする。
【課題を解決するための手段】
【０００５】
第１の態様において、本発明は、実行可能プログラムを保護する方法を提供し、方法は、実行可能プログラムのコピーを受け取るステップと、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり；実行可能プログラムと関係するデバッグデータベースを受け取るステップと、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており；実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するステップと；保護コードを実行可能プログラムに挿入するステップとを含み、保護コードは機能ブロックの少なくとも一部を上書きし；機能ブロックの実行は保護コードを実行させ、そして保護コードの実行はオペレーションを実行し、保護コードによって上書きされた機能ブロックの少なくとも一部のコピーを実行する。
【０００６】
好ましくは、保護コードを挿入するステップは、符号化された命令を作成するために機能ブロックの少なくとも一部を符号化するステップと；復号化ルーチンを実行可能プログラムに挿入するステップと；実行可能プログラムの機能ブロックの少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令で置き換えるステップとを含み；復号化ルーチンは、符号化された命令を復号化するための、および復号化された命令を実行するための実行可能命令を含む。
【０００７】
有利には、符号化は暗号化キーを用いて機能ブロックの少なくとも一部を暗号化するステップを含み、復号化は解読キーを用いて符号化された命令を解読するステップを含む。
【０００８】
都合よくは、暗号化キーは実行可能プログラムのコードのフラグメントから導出され、復号化ルーチンはコードのフラグメントから解読キーを導出し、符号化された命令はコードのフラグメントのいかなる破損も生じていない場合に首尾よく解読される。
【０００９】
好ましくは、暗号化キーは別の機能ブロックの命令から導出され、別の機能ブロックは符号化されており、復号化ルーチンは別の機能ブロックを復号化し別の機能ブロックの命令から解読キーを導出し、符号化された命令は別の機能ブロックが首尾よく復号化された場合に首尾よく解読される。
【００１０】
有利には、少なくとも１つの機能ブロックは別の機能ブロック内部のロケーションへの呼出しまたは飛越し命令を含んでおり、デバッグデータベースは実行可能プログラムの各々の呼出しまたは飛越し命令がポイントするロケーションを格納しており、機能ブロックを符号化するステップは、機能ブロックの少なくとも一部を符号化のために選定するステップと；機能ブロックの選定された少なくとも一部の内部のロケーションをポイントしている飛越しおよび呼出し命令をデバッグデータベースの内容から識別するステップと；いかなる飛越しおよび呼出し命令も識別されない場合に機能ブロックの選定された少なくとも一部を符号化するステップとを含む
都合よくは、保護コードを挿入するステップは、符号化された命令の複数のセグメントを作成するために複数の機能ブロックの各々の少なくとも一部を符号化するステップと、各セグメントはそれぞれの機能ブロックに対応しており；復号化ルーチンを実行可能プログラムに挿入するステップと；複数の機能ブロックの各々の少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令のそれぞれのセグメントで置き換えるステップとを含み；復号化ルーチンは符号化された命令を復号化し実行するための実行可能命令を含む。
【００１１】
好ましくは、保護コードを挿入するステップは、第１の符号化された命令を作成するために第１の機能ブロックの少なくとも一部を第１の符号化アルゴリズムで符号化するステップと；第２の符号化された命令を作成するために第２の機能ブロックの少なくとも一部を第２の符号化アルゴリズムで符号化するステップと；第１の復号化ルーチンを実行可能プログラムに挿入するステップと；第２の復号化ルーチンを実行可能プログラムに挿入するステップと；第１の機能ブロックの少なくとも一部を第１の復号化ルーチンへの呼出し命令および第１の符号化された命令で置き換えるステップと；実行可能プログラムの第２の機能ブロックの少なくとも一部を第２の復号化ルーチンへの呼出し命令および第２の符号化された命令で置き換えるステップとを含み；第１の復号化ルーチンは、第１の符号化された命令を復号化するための、および第１の復号化された命令を実行するための実行可能命令を含み、第２の復号化ルーチンは、第２の符号化された命令を復号化するための、および第２の復号化された命令を実行するための実行可能命令を含む。
【００１２】
有利には、第１の符号化ルーチンおよび第２の符号化ルーチンは異なる。
【００１３】
都合よくは、方法は、機能ブロックを逆アセンブルし逆アセンブルされたコードから１つ以上の命令を選定するステップをさらに含み、機能ブロックの少なくとも一部を符号化するステップは、選定された命令に対応する機能ブロックの１つ以上のフラグメントを符号化するステップを含む。
【００１４】
好ましくは、復号化ルーチンは冗長命令によって占有されたロケーションで実行可能プログラムに挿入される。
【００１５】
有利には、デバッグデータベースは各機能ブロックの開始アドレスおよび各機能ブロックの終了アドレスに関する情報を格納しており、方法は、機能ブロックの終了アドレスを隣接する機能ブロックの開始アドレスと比較して２つの機能ブロック間の冗長命令を識別するステップを含む。
【００１６】
都合よくは、方法は、機能ブロックを逆アセンブルするステップと、機能ブロック内部の冗長命令を識別するために逆アセンブルされたコードを解析するステップとを含む。
【００１７】
好ましくは、機能ブロックは呼出しアドレスを有する少なくとも１つの呼出し命令を含んでおり、方法はさらに、検証ルーチンを実行可能プログラムに挿入するステップと；呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するステップとを含む。
【００１８】
有利には、デバッグデータベースは実行可能プログラム内部の呼出し命令のロケーションを格納しており、保護コードを挿入するステップは、検証ルーチンを実行可能プログラムに挿入するステップと；実行可能プログラム内部の呼出し命令のロケーションをデバッグデータベースから識別するステップと、呼出し命令は呼出しアドレスを有しており；呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するステップとを含む。
【００１９】
都合よくは、検証ルーチンは実行可能プログラムの破損を検出するための命令を含む。
【００２０】
好ましくは、検証ルーチンはいかなる破損も検出されない場合に呼出しアドレスを呼出すための命令を含む。
【００２１】
有利には、実行可能プログラムの少なくともフラグメントは実行中にメモリ装置に記憶され、検証ルーチンはメモリに記憶されたフラグメントの破損を検出する。
【００２２】
都合よくは、検証ルーチンは、破損が検出された場合にメモリ装置に記憶された実行可能プログラムのフラグメントを破損または削除するための命令を含む。
【００２３】
好ましくは、検証ルーチンは、破損が検出された場合に実行可能プログラムの実行を終了するための命令を含む。
【００２４】
有利には、検証ルーチンはＣＲＣアルゴリズムを使用する。
【００２５】
都合よくは、検証ルーチンは、デバッグプロセスが実行中であるかどうかを検出するための、およびデバッグプロセスが検出された場合に実行可能プログラムの実行を終了するための命令を含む。
【００２６】
好ましくは、方法は仲介コードを実行可能プログラムに挿入するステップをさらに含み、仲介コードは検証ルーチンへの第１の呼出し命令および呼出しアドレスへの第２の呼出し命令を含んでおり、呼出しアドレスは仲介コードを呼出すように修正される。
【００２７】
有利には、方法は、実行可能プログラム内部の複数の呼出し命令のロケーションをデバッグデータベースから識別するステップと、複数の呼出し命令の各々は呼出しアドレスを有しており；複数の呼出し命令の各々について仲介コードのそれぞれのセグメントを挿入するステップと、仲介コードの各セグメントは検証ルーチンへの第１の呼出し命令、および実行可能プログラムのそれぞれの呼出し命令の呼出しアドレスへの第２の呼出し命令を含んでおり；仲介コードのそれぞれのセグメントを呼出すために実行可能プログラムの複数の呼出し命令の各々の呼出しアドレスを修正するステップとを含む。
【００２８】
第２の態様において、本発明は、実行可能プログラムを保護する方法を提供し、方法は、実行可能プログラムのコピーを受け取るステップと、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり；実行可能プログラムと関係するデバッグデータベースを受け取るステップと、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており；実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するステップと；符号化された命令を作成するために機能ブロックの少なくとも一部を符号化するステップと；復号化ルーチンを実行可能プログラムに挿入するステップと；実行可能プログラムの機能ブロックの少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令で置き換えるステップとを含み；復号化ルーチンは、符号化された命令を復号化するための、および復号化された命令を実行するための実行可能命令を含む。
【００２９】
第３の態様において、本発明は、実行可能プログラムを保護する方法を提供し、方法は、実行可能プログラムのコピーを受け取るステップと；実行可能プログラムと関係するデバッグデータベースを受け取るステップと、デバッグデータベースは実行可能プログラム内部の呼出し命令のロケーションを格納しており；検証ルーチンを実行可能プログラムに挿入するステップと；実行可能プログラム内部の呼出し命令のロケーションをデバッグデータベースから識別するステップと、呼出し命令は呼出しアドレスを有しており；呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するステップとを含む。
【００３０】
第４の態様において、本発明は、実行可能プログラムを保護するための装置を提供し、装置は、実行可能プログラムのコピーを受け取るための手段と、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり；実行可能プログラムと関係するデバッグデータベースを受け取るための手段と、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており；実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するための手段と；保護コードを実行可能プログラムに挿入するための手段とを備えており、保護コードは機能ブロックの少なくとも一部を上書きし；機能ブロックの実行は保護コードを実行させ、そして保護コードの実行はオペレーションを実行し、保護コードによって上書きされた機能ブロックの少なくとも一部のコピーを実行する。
【００３１】
第５の態様において、本発明は、実行可能プログラムを保護するための装置を提供し、装置は、実行可能プログラムのコピーを受け取るための手段と、実行可能プログラムは複数の機能ブロックとして構成された実行可能命令を含んでおり；実行可能プログラムと関係するデバッグデータベースを受け取るための手段と、デバッグデータベースは実行可能プログラム内部の機能ブロックのロケーションを格納しており；実行可能プログラム内部の機能ブロックのロケーションをデバッグデータベースから識別するための手段と；符号化された命令を作成するために機能ブロックの少なくとも一部を符号化するための手段と；復号化ルーチンを実行可能プログラムに挿入するための手段と；実行可能プログラムの機能ブロックの少なくとも一部を復号化ルーチンへの呼出し命令および符号化された命令で置き換えるための手段とを備えており；復号化ルーチンは、符号化された命令を復号化するための、および復号化された命令を実行するための実行可能命令を含む。
【００３２】
第６の態様において、本発明は、実行可能プログラムを保護するための装置を提供し、装置は、実行可能プログラムのコピーを受け取るための手段と；実行可能プログラムと関係するデバッグデータベースを受け取るための手段と、デバッグデータベースは実行可能プログラム内部の呼出し命令のロケーションを格納しており；検証ルーチンを実行可能プログラムに挿入するための手段と；実行可能プログラム内部の呼出し命令のロケーションをデバッグデータベースから識別するための手段と、呼出し命令は呼出しアドレスを有しており；呼出しアドレスを呼出す前に検証ルーチンが実行されるように呼出し命令の呼出しアドレスを修正するための手段とを備える。
【００３３】
第７の態様において、本発明は、前記の方法を実行するための命令を含むコンピュータを提供する。
【００３４】
第８の態様において、本発明は、前記の方法を実行するためにコンピュータによって実行可能なコンピュータプログラムまたはコンピュータプログラムの組を提供する。
【００３５】
第９の態様において、本発明は、前記の方法を実行するためにコンピュータによって実行可能なコンピュータプログラムコードを保存しているコンピュータプログラム製品を提供する。
【発明を実施するための最良の形態】
【００３６】
本発明がより容易に理解され得るために、ここでその実施形態を添付図面に関して例証として説明する。
【００３７】
図１は、実行可能プログラムの保護されたコピーを提供するために保護コードが実行可能プログラムに挿入される本発明の実施形態を例示している。
【００３８】
方法は、保護されるべき実行可能プログラムのコピーを受け取るステップ１、実行可能プログラムと関係するデバッグデータベースを受け取るステップ２、デバッグデータベースの内容から実行可能プログラム内部の機能ブロックのロケーションを識別するステップ３、実行可能プログラムの１つ以上の機能ブロックを選定するステップ４、および選定された機能ブロックの各々の少なくとも一部が上書きされるように実行可能プログラムに保護コードを挿入するステップ５、を含む。
【００３９】
機能ブロックは、実行された時に特定の機能を実行する１つ以上の実行可能命令のブロックとして考えられる。
【００４０】
単純な実行可能プログラム（すなわち少数の機能ブロックおよび／または比較的単純な命令を有するプログラム）の場合、実行可能プログラムを逆アセンブルしてアセンブリコードを解析することによって、実行可能プログラム内部の機能ブロックを識別することが可能かもしれない。しかし、逆アセンブルは、機械コードに直接コンパイルするＣ＋＋のようなオブジェクト指向言語の元の関数またはクラス名といったいずれかの記号的情報を復元しない（逆に、ＪａｖａやＣ＃といったより新しい言語は、それらの中間またはバイトコード形態にコンパイルされた時の記号的情報を保持する）。記号的情報のこの欠如は、より複雑な実行可能プログラム内部の機能ブロックの開始および終了ロケーションを識別しそれらをソースコードに関連づけることを極めて困難にする。これは、例えばｘ８６命令セットといった可変長命令を使用する命令セットを有するプラットホームで実行されるプログラムに特に当てはまる。機能ブロックを識別することのこの困難さは、実行可能プログラムと関係するデバッグデータベースの備え、およびデバッグデータベースの内容から機能ブロックのロケーションを識別するステップ３によって解決される。
【００４１】
デバッグデータベースは、リンカによって、一般に実行可能プログラムを作成するためにオブジェクトをアセンブルする際にデバッグ情報を照合するオプションを選択することによって、生成される。デバッグデータベースは、とりわけ、実行可能プログラム内部の各機能ブロックの相対アドレス（すなわちロケーション）を含む。その上、デバッグデータベースは、実行可能プログラム内部の各々の直接呼出しおよび飛越し命令のアドレスだけでなく、呼出しまたは飛越し命令がポイントするアドレスも含む。
【００４２】
単に例証として、マイクロソフト（登録商標）ビジュアル・スタジオ（Visual Studio）（登録商標）は、プログラムデータベース（ＰＤＢ）ファイルと呼ばれるデバッグデータベースファイルを出力するように構成することができる。ＰＤＢファイルは、とりわけ、機能ブロックのアドレス、直接呼出しおよび飛越し命令のアドレスおよび、呼出しおよび飛越し命令がポイントするアドレスを格納している。
【００４３】
ここで、保護コードを実行可能プログラムに挿入するための２つの実施形態を説明する。
【００４４】
第１の実施形態では、図２に例示されたように、検証ルーチンが実行可能プログラムに挿入される６。検証ルーチンは、以下でさらに詳述する通り、実行可能プログラムの保全性を検証するための実行可能命令を含む。検証ルーチンは、実行可能プログラムの終わりにルーチンを追加するか、または冗長コードからなる１つ以上のロケーションで実行可能プログラム内部にルーチンを埋め込むことによって、実行可能プログラムに挿入される６。実行可能プログラム内部の冗長コードを識別する方法は以下で説明する。
【００４５】
選定された機能ブロック内部の直接呼出し命令のロケーションは（間接呼出し命令とは対照的に）その後、直接呼出し命令のロケーションおよび呼出し命令がポイントするアドレスを格納しているデバッグデータベースの内容を精査することによって識別される７。
【００４６】
各々の識別された呼出し命令について、それぞれの仲介コードが実行可能プログラムに挿入される８。検証ルーチンと同様、仲介コードは、実行可能プログラムの終わりに追加されるか、または冗長コードからなるロケーションに埋め込まれ得る。
【００４７】
仲介コードの各セグメントは２つの呼出し命令を含む。第１の呼出し命令は検証ルーチンの開始アドレスをポイントする。第２の呼出し命令は、仲介コードが対応している呼出し命令のそれと同じアドレスをポイントする。
【００４８】
それぞれの呼出し命令の仲介コードが挿入された８後、機能ブロックの呼出し命令は、呼出し命令が仲介コードの開始アドレスをポイントするように修正される９。
【００４９】
図３（ａ）は無保護の実行可能プログラム１０を例示しており、図３（ｂ）は保護コード１２の挿入後の保護された実行可能プログラム１１を例示している。実行可能プログラム１０は４つの機能ブロック１３を含む。第２の機能ブロック１３ｂは、第４の機能ブロック１３ｄをポイントする呼出し命令を含む。保護コード１２の挿入後、第２の機能ブロック１３ｂの呼出し命令はそれぞれの仲介コード１４をポイントする。仲介コード１４は２つの呼出し命令１５、１６を含み、第１の呼出し命令１５は検証ルーチン１７をポイントし、第２の呼出し命令１６は第４の機能ブロック１３ｄをポイントする。
【００５０】
保護された実行可能プログラム１１が実行され、そして引き続き第２の機能ブロック１３ｂへの呼出しがなされると、実行スレッドは仲介コード１４を呼出す。実行スレッドはその後、仲介コード１４の第１の命令１５を実行して、保護された実行可能プログラム１１の保全性を検証する検証ルーチン１７を呼出す。検証ルーチン１７の実行の後、実行スレッドは、仲介コード１４に戻り、第２の呼出し命令１６を実行し、第４の機能ブロック１３ｄを呼出す。第４の機能ブロック１３ｄの実行後、実行スレッドは第２の機能ブロック１３ｂの呼出し命令の直後のアドレスに戻り、そこで第２の機能ブロック１３ｂの残りの命令が実行される。最後に、第２の機能ブロック１３ｂの戻り命令が実行され、実行スレッドを発起呼出し命令に戻させる。
【００５１】
検証ルーチン１７は、１つ以上の冗長検査を実行することによって保護された実行可能プログラム１１の保全性を検証する。２つの異なる形式の冗長検査が検証ルーチン１７によって実行され得る。第一に、静的冗長検査がディスクに記憶された保護された実行可能プログラム１１で実行される。第二に、動的冗長検査が実行中メモリに保持された保護された実行可能プログラムで実行される。
【００５２】
保護コード１２を実行可能プログラム１０に挿入するステップ４の間に、１つ以上のＣＲＣ値または他の冗長検査データが実行可能プログラムから導出される。静的冗長検査のために、単一のＣＲＣ値が保護された実行可能プログラムの全コードから導出される。動的冗長検査のために、個々のＣＲＣ値が実行可能プログラムのコードのフラグメントから導出される。単数または複数のＣＲＣ値はその後、検証ルーチン１７による以降の使用のために保護された実行可能プログラム１１の内部に（例えば検証ルーチン１７内部のロケーションに）保存される。
【００５３】
保護された実行可能プログラム１１の以後の実行の間に、検証ルーチン１７は、実行可能プログラム１１の単数または複数のＣＲＣ値を再計算し、これらを実行可能プログラム１１の破損が起こったかどうかを検証するために以前に保存された値に照らして比較する。それゆえ、実行可能プログラム１１に挿入されたあらゆる悪意のあるコード（例えばデバッグコード、ウイルスコードおよびフィッシングコード）もただちに識別される。
【００５４】
検証ルーチン１７が保護された実行可能プログラム１１の破損を検出した場合、検証ルーチン１７は実行可能プログラム１１の実行を終了する。随意選択的に、検証ルーチン１７は、命令がメモリからディスクにダンプされるのを防ぐためにメモリに記憶された実行可能プログラム１１のあらゆるコードを破損または削除する。
【００５５】
有利には、検証ルーチン１７は、静的冗長検査および動的冗長検査の両方を実行するための命令を含む。代替として、静的冗長検査および動的冗長検査を実行するための別個の検証ルーチンが実行可能プログラムに挿入されるかもしれない。その際、実行可能プログラムの始めまたはその近辺の機能ブロックの呼出し命令は、静的冗長検査が実行可能プログラムの実行において早期に実行されるように好適に修正される。従って、保護された実行可能プログラムに存在するあらゆる悪意のあるコードは、それが実行される前に識別され得る。
【００５６】
上述した実施形態では、仲介コードは選定された機能ブロックの各呼出し命令について挿入され、各呼出し命令はそれぞれの仲介コードをポイントするように修正される。しかし、機能ブロックの個々すべての呼出し命令がこのようにして保護されることは必ずしも不可欠ではない。代わりに、機能ブロックの１つ以上の呼出し命令が保護プロセスによって不変のままとされるかもしれない。
【００５７】
仲介コードの各セグメントは２つの呼出し命令を含む。２つの隣接する呼出し命令のロケーションは、ハッカーに目標を与えるかもしれない。従って、仲介コードは、２つの呼出し命令の間に付加的な失効コードを含むことができる。例えば、仲介コードは２つの呼出し命令の間にはさまれた飛越し命令およびジャンクコードを含むかもしれず、飛越し命令は第２の呼出し命令をポイントしている。
【００５８】
上述した実施形態では、仲介コード１４の各セグメントは検証ルーチン１７への呼出し命令１５を含む。しかし代替として、仲介コードの１つ以上のセグメントの呼出し命令１５は、それぞれの検証ルーチンで置き換えられるかもしれない。検証ルーチンの命令は仲介コードの各セグメントについて異なるかもしれない。従って、もし万一ハッカーが１つの検証ルーチンのロケーションをどうにか識別できたとしても、ハッカーは必ずしも他の検証ルーチンを識別することが可能とはならないであろう。
【００５９】
上述した実施形態では、検証ルーチン１７は、保護された実行可能プログラムの起こり得る破損を検出するためにＣＲＣ検査を実行する。加えてまたは代替として、検証ルーチン１７は、デバッグプロセスが実行しているかどうか、かつ／またはデバッグまたはリバースエンジニアリングツールがインストールされているかどうかを判定するための命令を含むかもしれない。
【００６０】
この実施形態において、実行可能プログラムに挿入された保護コード１２は少なくとも１つの検証ルーチン１５および２つの呼出し命令を含むことが理解されるであろう。第１の呼出し命令は、（仲介呼出し命令によって直接的または間接的にどちらかで）検証ルーチンをポイントしており、既存の呼出し命令を上書きするために実行可能プログラムに挿入されている。第２の呼出し命令は、上書きされた呼出し命令に対応しており、それが第１の呼出し命令の後に実行されるように実行可能プログラムに挿入されている。
【００６１】
第２の実施形態では、図４に例示されたように、保護コードを実行可能プログラムに挿入するステップ４は、選定された機能ブロックの命令を符号化された命令を作成するために符号化アルゴリズムにより符号化するステップ２０、実行可能プログラムに復号化ルーチンを挿入するステップ２１、および機能ブロックを保護された機能ブロックで置き換えるステップ２２を含んでおり、保護された機能ブロックは復号化ルーチンへの呼出し命令および符号化された命令を含む。選定された機能ブロックの各々は、同様にして符号化され、それぞれの保護された機能ブロックによって置き換えられる。
【００６２】
「符号化アルゴリズム」は、機能ブロックの命令を非実行可能形態に可逆的に変形することができるあらゆるアルゴリズムを含む。詳細には、用語「符号化」および「復号化」は、とりわけ、暗号化および解読だけでなく、圧縮および伸張も含むように意図されている。
【００６３】
復号化ルーチンは、符号化された命令を復号化し復号化された命令を実行するための命令を含む。復号化ルーチンは、保護されたブロック内部の符号化された命令のロケーションを識別するために呼出し命令の戻りアドレスを使用する。
【００６４】
復号化ルーチンはさらに、上述の通り、実行可能プログラムの保全性を検証するための検証ルーチンを含むかもしれない。検証ルーチンは随意選択的に、実行可能プログラムのいかなる破損も検出されない場合にのみ復号化が生じるように、復号化のためのあらゆる命令に優先する。
【００６５】
実行可能プログラムの機能ブロックは、別の機能ブロック内部のアドレスへの飛越しまたは呼出し命令を含むかもしれない。この別の機能ブロックが符号化された命令を含む場合、致命的エラーが起きるであろう。従って、実行可能プログラムの必ずしも全部の機能ブロックが、符号化よる保護に必ずしも適するというわけではない。従って、方法はさらに、デバッグデータベースの内容を、その中にリストされた直接呼出しおよび飛越し命令のいずれかが選定された機能ブロック内部のロケーションをポイントしているかどうかを判定するために精査するステップを含む。呼出しまたは飛越し命令が選定された機能ブロック内部のロケーションをポイントしていれば、符号化による機能ブロックの保護は防止される。しかし、呼出しまたは飛越し命令が機能ブロックの開始アドレスをポイントしている場合、符号化による機能ブロックの保護は許可される。
【００６６】
保護された機能ブロック（すなわち呼出し命令および符号化された命令）のサイズは、本来の無保護の機能ブロックのサイズより大きいかもしれない。従って、本来の機能ブロックが保護されたブロックで置き換えられた場合、符号化された命令は以降の機能ブロックの命令を上書きするであろう。以降の機能ブロックを上書きすることを回避するためにいくつかの方法を使用することができる。
【００６７】
第１の方法では、選定された機能ブロックは、以下に説明する方法を用いて冗長コードを調べられる。あらゆる冗長コードはその後、有用な命令だけが符号化されるように符号化プロセスから省かれる。冗長コードを符号化プロセスから省くことによって、保護された機能ブロックのサイズは縮小される。
【００６８】
第２の方法では、保護された機能ブロックは２つ以上のフラグメントに分割される。本来の機能ブロックは、少なくとも呼出し命令を含む保護された機能ブロックの第１のフラグメントによって上書きされる。保護された機能ブロックの残りのフラグメントはその後、他のロケーションで実行可能プログラムに挿入される（すなわち追加または埋め込まれる）。保護された機能ブロックの各フラグメントは、復号化ルーチンが保護された機能ブロックの全部のフラグメントを検索できるように、次のフラグメントのアドレスへのポインタで終了しているかもしれない。代替として、保護された機能ブロックの第１のフラグメントは、保護された機能ブロックの全部の残りのフラグメントのアドレスのリストを含むかもしれない。
【００６９】
第３に、機能ブロックの保護は、対応する保護された機能ブロックがより大きいサイズのものである場合、禁止されるかもしれない。
【００７０】
図５（ａ）は無保護の実行可能プログラム１０を例示しており、図５（ｂ）は保護コード１２の挿入後の保護された実行可能プログラム１１を例示している。実行可能プログラム１０は４つの機能ブロック１３を含んでおり、それらのうちの第２のもの１３ｂが保護のために選定される。保護された実行可能プログラム１１の第２の機能ブロック１３ｂは、保護された機能ブロック２３で置き換えられており、復号化ルーチン２４が実行可能プログラム１１に挿入されている。保護された機能ブロック２３は、復号化ルーチン２４への呼出し命令２５、および符号化された命令２６を含む。
【００７１】
保護された実行可能プログラム１１が実行され、そして引き続き保護された機能ブロック２３への呼出しがなされると、実行スレッドは復号化ルーチン２４を呼出し、それは保護された機能ブロック２３の符号化された命令２６を復号化し復号化された命令を実行する。復号化された命令の最後の命令は戻り命令を含み、実行スレッドを発起呼出し命令に戻させる。
【００７２】
上述した実施形態において、選定された機能ブロックの各々は同じ符号化アルゴリズムを用いて符号化される。代替として、異なる機能ブロックを符号化するために異なる符号化アルゴリズムを使用することができ、各々の符号化アルゴリズムについて対応する復号化ルーチンが実行可能プログラムに挿入され得る。その際、符号化の異なる強さが符号化されている機能ブロックの重要性に従って使用することができる。例えば、さほど重要ではない機能ブロックには単純なＸＯＲ機能を使用することができるのに対し、より重要な機能ブロックを符号化するためには強力な暗号化アルゴリズム（例えばＤＥＳ、ＡＥＳ）を使用することができる。
【００７３】
機能ブロックの命令を符号化するステップ２０は、暗号化キーを使用する暗号化アルゴリズムで命令を暗号化するステップを含むかもしれない。暗号化キーは実行可能プログラムのコードのフラグメントから導出することができる。例えば、ＣＲＣ値が実行可能プログラムのフラグメントについて計算され、暗号化キーを形成するために使用することができる。その際、復号化ルーチンは、解読キーを形成するために実行可能プログラムの同じフラグメントのＣＲＣ値を計算するための命令を含む。従って、保護された機能ブロックの符号化された命令は、解読キーが導出された実行可能プログラムのフラグメントが破損していない場合にのみ、首尾よく解読される。
【００７４】
さらなる代替策において、特定の機能ブロックを暗号化するために使用される暗号化キーは、後にそれ自体が暗号化される別の（例えば直前の）機能ブロックの命令から導出されるかもしれない。従って、保護された機能ブロックは、別の機能ブロックもまた首尾よく解読された場合にのみ、首尾よく復号化される。
【００７５】
この実施形態において、実行可能プログラム１０に挿入された保護コード１２は、少なくとも１つの復号化ルーチン２４および少なくとも１つの保護された機能ブロック２３を含み、保護されたブロック２３は既存の機能ブロック１３ｂを上書きするために実行可能プログラム１０に挿入されることが理解されるであろう。保護された機能ブロック２３は復号化ルーチン２４への呼出し命令２５および符号化された命令２６を含み、符号化された命令２６は上書きされる機能ブロック１３ｂのそれらの命令に対応している。
【００７６】
ここまでは選定された機能ブロックの全部の命令を符号化することに言及してきた。しかし、機能ブロック内部の命令のうちの選択したものだけを符号化するステップが好ましいかもしれない。詳細には、非符号化命令が散在する符号化された命令のいくつかの小セグメントは、機能ブロックの全部の命令を暗号化するよりもいっそう頑強な保護の形態を付与するかもしれない。その上、機能ブロックの特定の命令を符号化するステップが適切または実際的ではないかもしれない。従って、代替実施形態では、機能ブロックの選定された命令だけが符号化される。その際これは、符号化のコアース（全部の命令を符号化すること）およびファイン（選定された命令だけを符号化すること）制御を提供する。
【００７７】
符号化のための命令を選定するために、機能ブロックは最初に逆アセンブルされる。機能ブロックの開始アドレスがデバッグデータベースから既知であるので、機能ブロックの逆アセンブルは、開始アドレスがわかっていない場合にそうであるよりも、よりいっそう信頼できる。結果として得られるアセンブリコードから、機能ブロックの命令が符号化のために選定される。選定された命令に対応する実行可能プログラムのコードはその後、上述のようにして符号化される。
【００７８】
保護コードを挿入するための上述した２つの実施形態は、排他的に使用される必要はなく、組合せて使用することができる。例えば、同じ機能ブロックが上述の実施形態の両方に従属することができる。
【００７９】
冗長コードによって占有されたロケーションでの実行可能プログラムへのコードの挿入について上に言及してきた。冗長コードが実行可能プログラム内部で識別され得る少なくとも２つの方法が存在する。
【００８０】
第１の方法では、実行可能プログラムと関係するデバッグデータベースが利用される。実行可能プログラムの各機能ブロックの開始アドレスを格納するステップに加えて、デバッグデータベースはさらに、各機能ブロックの終了アドレスおよび／または各機能ブロックのサイズを格納している。それゆえ、機能ブロック間の冗長コードは、１つの機能ブロックの終了アドレスと隣接する機能ブロックの開始アドレスとを比較することによって識別することができる。
【００８１】
第２の方法では、各機能ブロックが逆アセンブルされる。その際、冗長コードは、例えばノーオペレーション命令といった反復的な一連の命令、または既知のコンパイラ／リンカ埋込み命令のパターンとして、アセンブリコードから識別される。
【００８２】
本発明を具体化する方法は、１つ以上のコンピュータプログラムの組として実現することができる。プログラムの組は、保護されるべき実行可能プログラムと関係するデバッグデータベースの内容を読出し、実行可能プログラムの機能ブロックの階層リストを表示する（または別様に出力する）。このリストから、ユーザは保護されるべき１つ以上の機能ブロックを閲覧し選定することができる。ユーザが逆アセンブルのための機能ブロックを選定することを可能にするオプションが好ましくは提供される。機能ブロックが逆アセンブルに選定された場合、プログラムの組は選定された機能ブロックを逆アセンブルし、アセンブリコードのリストまたは表現を表示する（または別様に出力する）。アセンブリコードのリストまたは表現から、ユーザは保護を必要とする機能ブロックの命令を選定する。さらに、プログラムの組は随意選択的に、ユーザが選定された機能ブロック（または機能ブロックの部分）の保護のための単数または複数の方法を、さらに適切であれば符号化の形式および強さを選定することを可能にする。いったんユーザが保護されるべき機能ブロック（または機能ブロックの部分）を選定すると、プログラムの組は保護コードを実行可能プログラムの関連するロケーションに挿入して保護された実行可能プログラムを作成する。
【００８３】
本発明を具体化する方法により、実行可能プログラムは、プログラムの動作機構への保護コードの挿入によって保護することができる。これはその後、プログラムのリバースエンジニアリングおよび／または改ざんを禁止する。機能ブロックのロケーションだけでなく呼出しおよび飛越し命令のアドレスも識別するためにデバッグデータベースを使用することによって、ソースコードが未知である実行可能プログラムを保護することができる。さらに、実行可能プログラムの特定の領域を保護の対象とすることもできる。詳細には、実行可能プログラムのコードの区分が確実に逆アセンブルされ、特定の命令が識別および保護され得る。
【００８４】
この明細書および請求項において使用される場合、用語「ｃｏｍｐｒｉｓｅｓ」および「ｃｏｍｐｒｉｓｉｎｇ」ならびにそれらの変形は、指定された特徴、ステップまたは整数が含まれることを意味する。それらの用語は、他の特徴、ステップまたは構成要素の存在を除外するように解釈されるべきではない。
【００８５】
それらの特定の形態に関してまたは開示された機能を実行するための手段、または開示された結果を達成するための方法またはプロセスに関して表現された、上述の説明、または以下の請求項、または添付図面において開示された特徴は、適宜、別個に、または当該の特徴のあらゆる組合せにおいて、その多様な形態で本発明を実現するために利用することができる。
【図面の簡単な説明】
【００８６】
【図１】本発明を具体化している実行可能プログラムを保護する方法の流れ図を例示する。
【図２】本発明の第１の実施形態に従った保護コードを実行可能プログラムに挿入する方法の流れ図を例示する。
【図３】図２の方法による保護コードの挿入前後の実行可能プログラムを例示する。
【図４】本発明の第２の実施形態に従った保護コードを実行可能プログラムに挿入する方法の流れ図を例示する。
【図５】図４の方法による保護コードの挿入前後の実行可能プログラムを例示する。
【符号の説明】
【００８７】
１０  無保護の実行可能プログラム
１１  保護された実行可能プログラム
１２  保護コード
１３  機能ブロック
１４  仲介コード
１５、１６  呼出し命令
１７  検証ルーチン
２３  保護された機能ブロック
２４  復号化ルーチン
２５  復号化ルーチンへの呼出し命令
２６  符号化された命令
【図１】
2008532113.tif 000003
【図２】
2008532113.tif 000004
【図３】
2008532113.tif 000005
【図４】
2008532113.tif 000006
【図５】
2008532113.tif 000007
【国際調査報告】
2008532113.tif 000008
2008532113.tif 000009
2008532113.tif 000010
2008532113.tif 000011
2008532113.tif 000012