(57)【特許請求の範囲】
【請求項１】
１つの区別化されたセクションが他の区別化されたセクション上で利用できない機能を実行できる、少なくとも２つの区別化されたセクションを有するプロセッサ上で実行されるソフトウェアに耐タンパー性を与える方法であって、
前記ソフトウェアが、前記プロセッサに、前記他の区別化されたセクションに与えられるかまたは当該セクションにアクセス可能にされた第１の疑似ランダム２進シーケンス（以下「ＰＲＢＳ」と表記）ジェネレータをインクリメントするステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記１つの区別化されたセクションの前記機能を、前記他の区別化されたセクションから呼び出すステップを実行させ、
前記ソフトウェアと協働して動作するコンパニオン・モジュールが、前記プロセッサに、前記機能を実行することにより、前記１つの区別化されたセクションに与えられるかまたは当該セクションにアクセス可能にされ且つ前記第１のＰＲＢＳジェネレータと同じＰＲＢＳ値をインクリメンタルに出力するように設定された第２のＰＲＢＳジェネレータをインクリメントするステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記第１のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出すとともに、前記１つの区別化されたセクションで利用できる付加的な機能を、前記他の区別化されたセクションから呼び出すステップを実行させ、
前記コンパニオン・モジュールが、前記プロセッサに、前記付加的な機能を実行することにより、前記第２のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出し且つ当該ＰＲＢＳ値を前記他の区別化されたセクションに戻すステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記第１および前記第２のＰＲＢＳジェネレータのＰＲＢＳ値を比較するステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記比較するステップの結果によって、当該ソフトウェアの実行を制御するステップを実行させる、方法。
【請求項２】
１つの区別化されたセクションが他の区別化されたセクション上で利用できない機能を実行できる、少なくとも２つの区別化されたセクションを有するプロセッサ上で実行されるソフトウェアに耐タンパー性を与える方法であって、
前記ソフトウェアが、前記プロセッサに、前記他の区別化されたセクションに与えられるかまたは当該セクションにアクセス可能にされた第１の疑似ランダム２進シーケンス（以下「ＰＲＢＳ」と表記）ジェネレータをインクリメントするステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記１つの区別化されたセクションの前記機能を、前記他の区別化されたセクションから呼び出すステップを実行させ、
前記ソフトウェアと協働して動作するコンパニオン・モジュールが、前記プロセッサに、前記機能を実行することにより、前記１つの区別化されたセクションに与えられるかまたは当該セクションにアクセス可能にされ且つ前記第１のＰＲＢＳジェネレータと同じＰＲＢＳ値をインクリメンタルに出力するように設定された第２のＰＲＢＳジェネレータをインクリメントするステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記第１のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出すとともに、前記１つの区別化されたセクションで利用できる付加的な機能を、前記他の区別化されたセクションから呼び出すステップを実行させ、
前記コンパニオン・モジュールが、前記プロセッサに、前記付加的な機能を実行することにより、前記第１のＰＲＢＳジェネレータからのＰＲＢＳ値を呼び出し且つ前記第２のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出すステップを実行させ、
前記コンパニオン・モジュールが、前記プロセッサに、前記第１および第２のＰＲＢＳジェネレータからのＰＲＢＳ値を前記１つの区別化されたセクションにおいて比較するステップを実行させ、
前記コンパニオン・モジュールが、前記プロセッサに、前記比較するステップの結果によって、前記ソフトウェアの実行を制御するステップを実行させる、方法。
【請求項３】
１つの区別化されたセクションが他の区別化されたセクション上で利用できない機能を実行できる、少なくとも２つの区別化されたセクションを有するプロセッサ上で実行されるソフトウェアに耐タンパー性を与える方法であって、
前記ソフトウェアが、前記プロセッサに、前記他の区別化されたセクションに与えられるかまたは当該セクションにアクセス可能にされた第１の疑似ランダム２進シーケンス（以下「ＰＲＢＳ」と表記）ジェネレータをインクリメントするステップを実行させ、
前記ソフトウェアが、前記プロセッサに、一のアルゴリズムおよび前記第１のＰＲＢＳジェネレータのＰＲＢＳ値を用いて、前記ソフトウェアのデータを変更するステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記１つの区別化されたセクションの前記機能を、前記他の区別化されたセクションから呼び出すステップを実行させ、
前記ソフトウェアと協働して動作するコンパニオン・モジュールが、前記プロセッサに、前記機能を実行することにより、前記１つの区別化されたセクションに与えられるかまたは当該セクションにアクセス可能にされ且つ前記第１のＰＲＢＳジェネレータと同じＰＲＢＳ値をインクリメンタルに出力するように設定された第２のＰＲＢＳジェネレータをインクリメントするとともに、当該インクリメントされた第２のＰＲＢＳジェネレータの新しいＰＲＢＳ値を前記他の区別化されたセクションに戻すステップを実行させ、
前記ソフトウェアが、前記プロセッサに、前記一のアルゴリズムと逆の機能を有する他のアルゴリズムおよび前記第２のＰＲＢＳジェネレータのＰＲＢＳ値を用いて、前記一のアルゴリズムによって変更されたデータを復元するステップを実行させ、
前記第２のＰＲＢＳジェネレータのＰＲＢＳ値と前記第１のＰＲＢＳジェネレータのＰＲＢＳ値とが同じであると、前記一のアルゴリズムによって変更されたデータが正確に復元される、方法。
【請求項４】
前記少なくとも２つの区別化されたセクションは、互いに異なる少なくとも２つの特権レベルである、請求項１ないし３の何れか１項に記載の方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、一般に、コンピュータのソフトウェア・アプリケーションのセキュリティの形成に関し、特に、無許可の人によるアプリケーション・プログラムの動作の読み取りを防ぐための方法に関する。
【０００２】
【従来の技術】
コンピュータのアプリケーション・ソフトウェアの数および多様性は、過去数年の間に拡大されてきた。コンピュータのハードウェア開発は、このようなアプリケーション・プログラムのファンクション（以下、「機能」または「オペレーション」とも称する）を著しく拡大させ、従って、書かなければならないコードの量および他の開発コストが、著しく増大した。同じ時期に、無許可の複製によって失われるこのようなプログラムの価値に対するソフトウェアのベンダーの認識が増大してきている。従って、今日、ソフトウェア・ベンダーが、個々のプログラムのコピーの登録を要求したり、あるいは、特定のユーザにサイト・ライセンスを販売したり、また、プログラム・コピーが登録されている人以外の人による、アプリケーションまたはアプリケーションの主要部分の実行を防ぐ機能を、プログラムに含ませることは、通常行われていることである。
【０００３】
ソフトウェアの登録は、一般に、登録によってアクセスが許可される場合を除いては、ソフトウェアの大部分を使用不可にすることによって行われる。殆ど同様に、潜在的な購入者がソフトウェアを買うか否かを決定するのに十分なほど実行することができるデモストレーション・コピーの機能と同様の削減機能を有する形態で、ユーザに、可能な限りオンラインで、ソフトウェアを提供することによって、ソフトウェアの販売を促進することは、通常行われていることである。その際、初期的には使用不可のファンクションを使用可能にすることが、購入，支払い，および登録の際に遠隔的に行われる。また、このような変換可能な形態のソフトウェアの配布は、デモンストレーション・コピーとして個別バージョンを作製する必要性を回避するという利点と、概してかかるコピーを破壊する可能性とを与える。
【０００４】
しかしながら、このような特徴は、精巧さおよび複雑さのレベルを拡大し、良好なレベルのセキュリティを実現する一方、このような特徴が、アプリケーション・プログラムの変更によって無効にされて、このような特徴が活用されなくなることは自明のことである。プロテクトされたソフトウェアのファンクション、およびプロテクトされたファンクションへのアクセスを復元するプロセスは、一般に、“ハッキング（ｈａｃｋｉｎｇ）”と呼ばれ、ハッキングはまた、一般に、パスワードのプロテクション，ユーザーの識別または認証などを無効にする。プログラム変更のプロセスは、しばしば、“パッチング（ｐａｔｃｈｉｎｇ）と呼ばれる。ハッキングによるプログラムの変更を困難にする特性は、“耐タンパー性（ｔａｍｐｅｒ  ｒｅｓｉｓｔａｎｃｅ）と呼ばれる。もちろん、“耐タンパー性”は、データベースおよびアプリケーション・プログラムのような多くの種類のソフトウェアにとって望ましい特性である。
【０００５】
耐タンパー性ソフトウェアの作製は、しばしば、プロセッサに含まれる特権レベルと、いわゆる特権命令との概念を含む。特権命令は、一般に、プロセッサ・アーキテクチャの制限された機能へのアクセスを許可するために必要とされる。例えば、特権命令または特権ファンクションは、プロセッサ内のプロテクトされた専用デバッグ・レジスタのロードおよびアンロードと、割り込みベクトルのフックと、重要なオペレーティング・システム（ＯＳ）メモリ領域および入力／出力（Ｉ／Ｏ）ファンクションのオペレーションとを含むことができる。これらの特権ファンクションは、低い特権レベルのアプリケーションによってコントロールされる（例えば、要求される）が、実際には、より多くの特権が与えられたオペレーティング・システム要素を通してのアプリケーション・プログラムの通常オペレーションの際には、より高い特権レベルの他の構造またはソフトウェアによって行われる。特に、Ｉ／Ｏファンクションの実行はＯＳの最高特権レベルに限定され、より低い特権レベルで動作または実行するアプリケーションによっては実行されることはできず、要求されるにすぎない。
【０００６】
すなわち、ソフトウェア開発要求に調和させて、アプリケーション・ソフトウェアを、より安全にするためには、アプリケーションと協働して動作し、より低い特権アプリケーションに代わってこれらの特権オペレーションを行う特権コンパニオン・ソフトウェア・モジュール（通常は、デバイス・ドライバの形態で）を開発する必要がある。アプリケーションが、システム保全性を検証するか、あるいは、特定の種類のタンパリング（ｔａｍｐｅｒｉｎｇ）が生じたか否かを判断する必要性を有する（あるいは、プログラマーによって判断されるときに、必要性を有するべきである）場合に、アプリケーションは、特権モジュールを呼び出して、これらのサービスを実行することができる。残念なことに、このような機構およびそのかなり広範囲の使用は、アプリケーションと特権モジュールとの間のインターフェースを、セキュリティ機能を無効にしようとするアタック（ａｔｔａｃｋ）の論理的箇所とする。例えば、特権モジュールへのセキュリティ関連の呼び出しをパッチアウトすることは、多くの場合、耐タンパー性および実行することが意図される保全性検査の機能を無効にするであろう。
【０００７】
いかなる形態の耐タンパー性も完全に安全ではないが、耐タンパー性は、一般に、アプリケーションおよび対応する特権モジュール内の、このような手段で（例えば、より多くの技術，トラップ，および相互依存性によって）与えられる複雑さのレベルが増大するにつれて、与えられた時間と労力の範囲で、それら手段を無効にすることに成功し、アプリケーションまたはデータ保全性を損い、あるいは、含まれるシークレットへのアクセスを得る可能性は低下する。残念なことに、このような複雑さはまた、ソフトウェア・アプリケーションの信頼性および／または安定性（すなわち、例えば、データベースおよび／またはエラー回復システムの頑強性）、およびソフトウェア自体の実行速度および効率を損なう。従って、今日まで、アプリケーションの実行効率と、アプリケーション自体およびそのデータのセキュリティとの間には、避けられないトレード・オフ（ｔｒａｄｅ−ｏｆｆ）がある。
【０００８】
【発明が解決しようとする課題】
従って、本発明の目的は、タンパリングの検出と、タンパリングが検出されるときのファイルの実行の終了とによって、ソフトウェアのセキュリティを増大する方法を提供することにある。
【０００９】
本発明の他の目的は、ソフトウェアの実行効率を大きく低下させることなしに、ソフトウェアの有効なセキュリティを提供することにある。
【００１０】
本発明のさらに他の目的は、無許可の人によるソフトウェア動作の読み取りを防ぐことにある。
【００１１】
本発明のさらに他の目的は、ソフトウェアの使用不可またはプロテクトされた部分の、無許可の使用可能化または読み取りを防ぐことにある。
【００１２】
【課題を解決するための手段】
本発明のこれらのおよび他の目的を実現するために、１つの区別化されたセクションが他の区別化されたセクション上で利用できない機能を実行できる、少なくとも２つの区別化されたセクションを有するプロセッサ上で実行されるソフトウェアに耐タンパー性を与える方法が提供される。この方法は、前記ソフトウェアが、前記他の区別化されたセクションに関連する第１の疑似ランダム２進シーケンス（以下「ＰＲＢＳ」と表記）ジェネレータをインクリメントするステップと、前記ソフトウェアが、前記１つの区別化されたセクションの前記機能を、前記他の区別化されたセクションから呼び出すステップとを含み、前記機能は、前記１つの区別化されたセクションに関連し且つ前記第１のＰＲＢＳジェネレータと同じＰＲＢＳ値をインクリメンタルに出力するように設定された第２のＰＲＢＳジェネレータをインクリメントするためのものであり、前記ソフトウェアと協働して動作するコンパニオン・モジュールが、前記機能を実行することにより、前記第２のＰＲＢＳジェネレータをインクリメントするステップと、前記ソフトウェアが、前記第１のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出すとともに、前記１つの区別化されたセクションで利用できる付加的な機能を、前記他の区別化されたセクションから呼び出すステップとを含み、前記付加的な機能は、前記第２のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出し且つ当該ＰＲＢＳ値を前記他の区別化されたセクションに戻すためのものであり、前記コンパニオン・モジュールが、前記付加的な機能を実行することにより、前記第２のＰＲＢＳジェネレータからのＰＲＢＳ値を取り出し且つ当該ＰＲＢＳ値を前記他の区別化されたセクションに戻すステップと、前記ソフトウェアが、前記第１および第２のＰＲＢＳジェネレータのＰＲＢＳ値を比較するステップと、前記ソフトウェアが、前記比較するステップの結果によって、当該ソフトウェアの実行を制御するステップとをさらに含む。
【００１３】
本発明の他の形態によれば、１つの区別化されたセクションが他の区別化されたセクション上で利用できない機能を実行できる、少なくとも２つの区別化されたセクションを有するプロセッサ上で実行されるソフトウェアに耐タンパー性を与える方法が提供される。この方法は、前記ソフトウェアが、前記他の区別化されたセクションに関連する第１の疑似ランダム２進シーケンス（以下「ＰＲＢＳ」と表記）ジェネレータをインクリメントするステップと、前記ソフトウェアが、一のアルゴリズムおよび前記第１のＰＲＢＳジェネレータのＰＲＢＳ値を用いて、前記ソフトウェアのデータを変更するステップと、前記ソフトウェアが、前記１つの区別化されたセクションの前記機能を、前記他の区別化されたセクションから呼び出すステップとを含み、前記機能は、前記１つの区別化されたセクションに関連し且つ前記第１のＰＲＢＳジェネレータと同じＰＲＢＳ値をインクリメンタルに出力するように設定された第２のＰＲＢＳジェネレータをインクリメントするとともに、当該インクリメントされた第２のＰＲＢＳジェネレータの新しいＰＲＢＳ値を前記他の区別化されたセクションに戻すためのものであり、前記ソフトウェアと協働して動作するコンパニオン・モジュールが、前記機能を実行することにより、前記第２のＰＲＢＳジェネレータをインクリメントするとともに、当該インクリメントされた第２のＰＲＢＳジェネレータの新しいＰＲＢＳ値を前記他の区別化されたセクションに戻すステップと、前記ソフトウェアが、前記一のアルゴリズムと逆の機能を有する他のアルゴリズムおよび前記１つの区別化されたセクションに関連する第２のＰＲＢＳジェネレータのＰＲＢＳ値を用いて、前記一のアルゴリズムによって変更されたデータを復元するステップとをさらに含み、前記第２のＰＲＢＳジェネレータのＰＲＢＳ値と前記第１のＰＲＢＳジェネレータのＰＲＢＳ値が同じであると、前記一のアルゴリズムによって変更されたデータが正確に復元される。
【００１４】
【発明の実施の形態】
前述のおよび他の目的，態様，利点は、本発明の好適な実施例の以下の詳細な説明から、図面を参照することによってより理解されるであろう。
【００１５】
図面、特に図１，図２，図３は、高レベルの概略ブロック図の形態で、本発明の一実施例１００を示す。図１には、矢印１０４で示すように、任意のタイム・スケール（左から右へ）が与えられ、実線のブロックは、ハードウェアまたはソフトウェアのいずれかで実施することができる機能的要素を示すことに注意すべきである。点線で示すブロックは、プロテクションが望まれるソフトウェア・シーケンスを示す。図２および図３では、シーケンスは、上から下に進み、示された各ファンクションが実行されるソフトウェアは、図１が、特権レベルを分ける点線１０６で分けられているのと同様に、左または右に分離されている。従って、図１と図２および図３とは、同じ内容を異なる強調および観点で示すものである。対応する参照符号は、可能なところで用いられている。（図４および図５についても、同様である。）
疑似ランダム２進シーケンス（ＰＲＢＳ）ジェネレータは、当業者によって認識されているように、周知であり、多くの形態で用いられ、実現されている。一般に、ＰＲＢＳジェネレータは、複数の記憶デバイスを含むことができる論理アレイとして実施される。しばしば用いられるＰＲＢＳジェネレータの形態は、シフトレジスタの性質上、直列に接続されたフリップフロップの列を用いる。種々の長さのこのようなシフトレジスタでは、真値または補数値のいずれかとしての、あるステージの出力の他のステージへのフィードバックは、他のステージの出力と論理的に組み合わされ（より一般には、マスクと呼ばれる）、真のランダム値とほぼ同じの統計的特性を有する長い論理値列を作成することができることが分かっている。もちろん、このようなハードウェアによる実現は、技術上周知の方法で、ソフトウェアでシミュレートすることができ、また、しばしばシミュレートされる。（実際には、以下に詳細に説明するように、本発明の実施には、ソフトウェアによる実現が、極めて好適である）。
【００１６】
ＰＲＢＳジェネレータの繰り返し周期は、与えられた記憶ステージの数に対して極めて長くすることができる。ＰＲＢＳジェネレータの出力は、単一のステージから直列に、あるいは、内部タップから並列に任意の長さのバイト（最大記憶ステージの数まで）で並列に引き出すことができる。任意の長さとすることができる多数の２進数の後に、ＰＲＢＳは繰り返すが、シーケンスの開始ポイントは、例えば、ＰＲＢＳ内の記憶デバイスの初期記憶状態として、ＰＲＢＳジェネレータに最初に与えられる特定の値によって任意のポイントで開始することができる。これら初期状態は、集合的に、シード値と呼ばれる。従って、ＰＲＢＳジェネレータから引き出すことができる固有シーケンスの数は、繰り返しシーケンスにおける２進数の数に等しい。
【００１７】
さらに、ＰＲＢＳジェネレータにおける各々異なる論理アレイ相互接続またはマスク（例えば、個々のステージの出力のフィードバックまたは論理的組合せ）は、固有の２進シーケンスを与える。さらに、同じ２進シーケンスは、同じマスク，同じ記憶ステージの数を有し、同じシード値で初期化される、機能的に同一のＰＲＢＳジェネレータから引き出されるのみである。従って、ＰＲＢＳシーケンスは、これらのパラメータの予備知識なしに複製することは困難である。
【００１８】
本発明は、原則的には、２つの同一のＰＲＢＳジェネレータ１１０および１２０（すなわち、同じマスクおよび同じステージ数ｎを有している。）を使用し、これらは、同じシード値で初期化され、それぞれ、特権呼び出しの要求および実行の際にインクリメントされる。これら同一のＰＲＢＳジェネレータのうちの１つは、特権レベルの各々において与えられ、もしくは、特権レベルの各々にアクセス可能にされ、これらの特権レベルの間には、本発明の原理によって耐タンパー性が与えられている。ＰＲＢＳジェネレータからのＰＲＢＳは、より高い特権レベルまたはより低い特権レベルのいずれか（あるいは、異なる特権レベルの両方において当該各レベルにおけるＰＲＢＳに基づいて実行される他のファンクション）において比較される。また、実行の割り込み、およびより高い特権ファンクションの結果の中断は、個々のＰＲＢＳ信号が同一でないときに常に実行される。オペレーションのこの基本モードは、非常に高速に実行することができ、頻繁に繰り返されても、ソフトウェアの実行効率を大きく低下させず、また、図４および図５を参照して、以下により詳細に説明するように、容易に拡張することができる。
【００１９】
図１，図２，図３には、各々、個々のＰＲＢＳジェネレータ１１０または１２０を有する２つの特権レベルが示されていることが分かる。これらの特権レベルは、Ｗｉｎｄｏｗｓ−Ｉｎｔｅｌ環境の用語と調和するリング３（低い特権レベル）およびリング０（高い特権レベル）として示される。しかし、本発明は、異なるファンクションが、異なる特権レベルで実行されるか、あるいは、特定の分離されたハードウェア，ソフトウェア，またはファームウェアによる実行に限定される、あらゆる環境に十分適合できることを理解すべきである。例えば、コマンドの実行のために、特定のデータ・パスまたはレジスタを要求することができる。
【００２０】
すなわち、意図した目的を与える本発明の成功的実施については、プロセッサまたはその周辺機器、あるいはドライバが、個別の同一の（あるいは、同一に構成されて初期化されている）ＰＲＢＳジェネレータに関連させることができる区別化されたオペレーショナル・セクションを有する（あるいは、有するように構成できる）ことが必要とされるだけである。１つのこのような区別化されたセクションは、他の区別化されたセクションでは利用できないファンクションを実行することができる。従って、用語“区別化されたセクション（ｄｉｆｆｅｒｅｎｔｉａｔｅｄ  ｓｅｃｔｉｏｎ）”は、これらの条件を満たす全てのそのような可能な構成を含むものと理解すべきである。
【００２１】
この点については、ＰＲＢＳジェネレータをソフトウェアで実現することが、原則的には好適であることが分かる。なぜなら、ハードウェア・アクセスは、低い特権レベルでは拒否されうるからである。このため、好適には、ソフトウェアによるＰＲＢＳジェネレータの実現が必要とされるであろう。さらに、ＰＲＢＳジェネレータのソフトウェアによる実現は、アプリケーションと、そのコンパニオン・デバイス・ドライバまたはより高い特権レベルのソフトウェアとの両方において、同一のＰＲＢＳジェネレータの形成、および、ＰＲＢＳジェネレータの初期化を容易にする。また、本発明は、ＰＲＢＳジェネレータ自体をプロテクトするのに用いることができ、また用いるべきであることが分かるであろう。
【００２２】
以下の説明のために、点線の矢印２００で示すように、アプリケーションまたは他のソフトウェアが、本発明によって保護されていないファンクションを実施および実行しているものと仮定する。また、ＰＲＢＳジェネレータ１１０，１２０が、同じシード値，同じマスク，および同じｎ値に初期化され、従って、同じ値を出力し、同期しているとみなすことができるものと仮定する。
【００２３】
保護することが望まれるプログラムのセクションに先立つプログラム命令のリスト内のある箇所で、オペレーションのシーケンスＡ（および／またはＢおよび／またはＸ）が挿入されている。これらのオペレーションは、即時シーケンスで実行することは必要とされないが、これらのオペレーションの間に他のオペレーションを挿入させて、これらのオペレーションの目的が無許可の人に認識できないようにすることができる。本発明の説明のため、命令のシーケンスＡは、３つのオペレーションＡ１，Ａ２，Ａ３からなるものとして示されている。これらのオペレーションの各々は、複数のコマンドを含むことができる。
【００２４】
プログラム内のシーケンスＡに到達して、異なる特権レベルまたは特定のハードウェアで実行される１つ以上の後続するオペレーション（例えば、Ａ２）を保護する場合、２０２で示すように、オペレーションＡ１は、ＰＲＢＳジェネレータ１１０をインクリメントし、プロテクトされたオペレーションＡ２に進む。オペレーションＡ２は、２０４で示すように、特権リング０（例えば、デバイス・ドライバ内の）での所望のファンクションＡ（ＦｎＡ  ）を呼び出す。次に、ファンクションＡは、ＰＲＢＳジェネレータ１２０をインクリメントする。次に、２０８で示すように、ファンクションＡは、所望のオペレーションを実行し、アプリケーションに戻る。
【００２５】
次に、アプリケーションは、オペレーションＡ３に進み、２１０で示すように、ＰＲＢＳジェネレータ１１０の出力を取り出し、２１２で示すように、Ｆｎｐ  を呼び出して、ＰＲＢＳジェネレータ１２０の出力を取り出し、２１４で示すように、出力をアプリケーションに戻す。次に、オペレーションＡ３は、２１６で示すように、ＰＲＢＳジェネレータ１１０および１２０の出力を比較する。それらの出力は共に、最初に同期化され、共にシーケンスＡ内で一度インクリメントされたので、その比較は成功し、アプリケーションは、２１８で示すように続く。
【００２６】
シーケンスＢは、同様に動作し、個別に説明する必要はない。オペレーションＢ３（オペレーションＡ３に対応する）で、ＰＲＢＳ出力の比較が成功すると、アプリケーションは、２８２で示すように続く。
【００２７】
しかしながら、例えば、アプリケーションが登録されていないために、リング０へのアクセス、または、リング０内の全てのファンクション（または当該ファンクションによって実行されるオペレーション）が拒否されたという理由で、オペレーションＡ２が許可されなかったならば、アプリケーションは、進むことができない。無許可のユーザが、オペレーションＡ１（２０２）をパッチアウトすることによって、このアクセスの拒否を無効にしようと試みるならば、オペレーションＡ２は、ＰＲＢＳジェネレータ１１０をインクリメントすることなく、ＰＲＢＳジェネレータ１２０をインクリメントし、その結果、オペレーションＡ３（２１６）での比較は、失敗するであろう。
【００２８】
逆に、アクセスの拒否を無効にしようとする試みが、オペレーションＡの間の、ＰＲＢＳジェネレータ１２０のインクリメントをパッチアウトすることによって行われる場合、オペレーションＡ３（２１６）での比較は、失敗するであろう。また、（コードの比較のために）アプリケーションの後続するセクションへのアクセスの拒否を無効にしようとする試みが、ファンクションＡをパッチアウトすることによって（例えば、オペレーションＡ２を削除するか、またはこれを“ノー・オペレーション（ＮＯ−ＯＰ）”とすることによって）行われる場合も、オペレーションＡ３（２１６）での比較は、失敗するであろう。というのは、ＰＲＢＳジェネレータ１１０は、インクリメントされるが、ＰＲＢＳジェネレータ１２０は、インクリメントされないからである。さらに、アクセスの拒否を無効にしようとする試みが、ＰＲＢＳジェネレータ１２０および１１０に対するインクリメントまたはデクリメントをパッチインすることによって行われる場合も、オペレーションＡ３（２１６）での比較は、失敗するであろう。というのは、ＦｎＡ  および他の特権ファンクションは、本発明によれば、当該ファンクションを実行する前に、ＰＲＢＳジェネレータ１２０をインクリメントするからである。
【００２９】
たとえ、特権ファンクションが実行されても、アプリケーションへ結果を報告する前に、比較が行われる。比較２１６が失敗すると、アプリケーションの実行は、プログラマーによって所望される全ての方法で、例えば、記憶装置から、またはアプリケーションをコンピュータ上にロードした記憶媒体から、アプリケーション、またはアプリケーションの多かれ少なかれ重要な部分の削除を含む所望のサブルーチンに分岐することによって、終了することができる。
【００３０】
特権ファンクションへのアクセスの拒否を無効にするためには、最小２つのパッチが、同時かつ正確に実行されなければならず、また、アプリケーションの動作の予備知識を有さない無許可のユーザによってうまく行われることはないであろう。システムの動作を読み取ることは、本発明が防止しようとするタンパリングの典型的なタイプであることを思い出すべきである。従って、本発明は、たとえ、アプリケーションにおいて多数回用いられても、あるいは繰り返されても、簡単で高速に実行可能であるが、無許可の人にアプリケーションの動作を暴露するタンパリングに対するプロテクションを与えるのに非常に有効であることが分かる。
【００３１】
どこで比較が行われるのか、あるいは、比較を行う際に特権ファンクションでもよい付加的なファンクションが実行されるのかは、本発明の基本原理の実施にとっては重要ではない。しかし、次に、図１および図３の保護されたオペレーションＸについて説明されるような付加的なファンクションを実行することによって、付加的なプロテクションを与えることができる。この場合は、２２２で示すオペレーションＸ１が、オペレーションＡ１で前述したように、ＰＲＢＳジェネレータ１１０をインクリメントする。オペレーションＸ２は、前述したように、Ｆｎｘ  を呼び出し（２２４）、ＰＲＢＳジェネレータ１２０をインクリメントする（２２６）。上述したように、再度、アプリケーションへ戻る（２２８）。
【００３２】
次に、オペレーションＸ３は、ＰＲＢＳジェネレータ１１０からＰＲＢＳ値を取り出すが（２３０）、ここで、オペレーションＦｎｐ′を呼び出し、ＰＲＢＳジェネレータ１１０からのＰＲＢＳ値をデバイス・ドライバに与える（２３２）。次に、特権ファンクションＦｎｐ′が、ＰＲＢＳジェネレータ１２０からＰＲＢＳ値を取り出し、比較を行う。Ｆｎｐ′は、ＰＲＢＳジェネレータ１２０をインクリメントしないように、これを構成することができる。あるいは、その代替案として、ＰＲＢＳジェネレータ１１０および１２０をそれぞれさらにインクリメントするように、Ｘ３およびＦｎｐ′の両方を構成することができる。このオペレーションは、比較がより高い（あるいは、少なくとも異なる）特権レベルで行われることを除いては、オペレーション・シーケンスＡと同じである。しかし、実際の効果は、オペレーションＡ３および他の特権ファンクションと比較すると、無許可の人によってパッチが不正確に適用され得るより多くのロケーションが与えられ、そして、規約上の不整合がＸ３またはＦｎｐ′のいずれかに与えられる、ということである。
【００３３】
次に、図４および図５を参照して、本発明の拡張を説明する。上述した本発明の実施例は、ＰＲＢＳ出力の比較が失敗した後に、アプリケーションの終了、または、ファイルの消滅または破壊を開始できるのに対して、図４および図５に示す本発明の拡張は、耐タンパー性の一部としてファイルの破壊および復元を含み、従って、性能において共により頑強であり、タンパリングが検出される前の早い時期に、プロテクト・アクションを生じさせる。この拡張は、上述の保護されたオペレーションＡの変形Ａ′として説明される。
【００３４】
オペレーションＡ１は、前述したように、ＰＲＢＳジェネレータ１１０をインクリメントするために行われる。しかし、４０２で示すように、インクリメントされたＰＲＢＳ値は、アプリケーションに戻される。オペレーションＡ２′は、４０４に示されるアルゴリズムＸと、ＰＲＢＳジェネレータ１１０からの現在のＰＲＢＳ値とを用いて、データおよび／またはアプリケーション・プログラム・コードを意図的に消滅または破壊させるために実行される。次に、オペレーションＡ３′は、ＰＲＢＳジェネレータ１２０をインクリメントし、新しいＰＲＢＳ値を戻した後に、オペレーションＡ′を実行するために、特権ファンクションＦｎＡ′を呼び出す。次に、（ＰＲＢＳジェネレータ１１０のＰＲＢＳ値と現在は同じであるべき）ＰＲＢＳジェネレータ１２０からの新しいＰＲＢＳ値と、（アルゴリズムＸの逆である）アルゴリズムＸ′とを用いて、４１０に示すように、４０４で破壊されたデータまたはコードを復元するためのオペレーションＡ４が実行される。
【００３５】
この場合、個別の比較は行う必要はない。というのは、データまたはコードの不正確な復元は、アプリケーションを休止するか、あるいは、不正確で意味のない結果を戻す（データまたはコードは、完全にランダムな２進コード・シーケンスによって破壊されたので）からである。さらに、データの破壊および復元以外の特権オペレーションは、オペレーションＡ′内で実行される必要はなく、実際には、プログラム動作を読み取ろうと試みる無許可の人は、アプリケーションから情報を得ることができない。この拡張は、単独で、あるいは、上述したＡ，Ｂ，またはＸのような特権ファンクションの特定の例の代わりに、比較を用いる特権ファンクションと共に用いることができる。
【００３６】
上述したことから、本発明は、単独かつ高速に実行されるが、一例では、非常に高度の耐タンパー性を与えることが分かる。耐タンパー性手順に対し、本発明の複数の例を与えることができ、特に、変形（例えば、図３）および拡張（例えば、図５）は、アプリケーションの実行速度を低下させることなく、実際に破ることのできないプロテクションを与える。
【００３７】
本発明を、１つの好適な実施例によって説明したが、当業者によれば、本発明が、特許請求の範囲の趣旨および範囲内の変更を含んで実施できることが分かるであろう。
【図面の簡単な説明】
【図１】  本発明の好適な実施例の高レベル・ブロック図であり、そのオペレーションを示す図である。
【図２】  図１に示す本発明の実施例のオペレーションを示すフローチャートである。
【図３】  図１に示す本発明の実施例のオペレーションを示すフローチャートである。
【図４】  図１の実施例の好適な拡張を示す高レベル・ブロック図である。
【図５】  図４に示す本発明の拡張を示すフローチャートである。
【符号の説明】
１００  本発明の一実施例
１０４  タイム・スケール
１０６  特権レベルを分ける点線
１１０，１２０  ＰＲＢＳジェネレータ
【図１】
0003721085.tif 000002
【図２】
0003721085.tif 000003
【図３】
0003721085.tif 000004
【図４】
0003721085.tif 000005
【図５】
0003721085.tif 000006