自己書換ソフトウェアコードのインテグリティをその実行中に確かめる方法であって、前記ソフトウェアコードは複数のモジュールを有し、各モジュールは、前記ソフトウェアコードの実行中に少なくとも2つのとり得る状態にあることが可能であり、該とり得る状態は暗号化された状態及び暗号化されていない状態であり、当該方法は、前記ソフトウェアコードを実行するプロセッサによって実行され、前記プロセッサに、前記複数のモジュールのうちの1つを第1の状態から第2の状態に変えることによって前記ソフトウェアコードを変更するステップと、前記変更されたソフトウェアコードについてチェックサムと前記変更されたソフトウェアコードを比較することによって前記ソフトウェアコードのインテグリティを確かめるステップとを実行させる方法。前記チェックサムはハッシュ値である、請求項1に記載の方法。前記チェックサムは、前記モジュールのインテグリティを確かめる関数に埋め込まれている、請求項1に記載の方法。前記チェックサムは、ルックアップテーブルに含まれる、請求項1に記載の方法。前記変更されたソフトウェアコードのインテグリティを確かめる関数は、前記ルックアップテーブルに含まれる前記チェックサムにアクセスするために、前記複数のモジュールの夫々の状態を示す状態変数を用いる、請求項4に記載の方法。自己書換ソフトウェアコードのインテグリティをその実行中に確かめる装置であって、前記ソフトウェアコードは複数のモジュールを有し、各モジュールは、前記ソフトウェアコードの実行中に少なくとも2つのとり得る状態にあることが可能であり、該とり得る状態は暗号化された状態及び暗号化されていない状態であり、前記ソフトウェアコードを実行し、それによって、前記複数のモジュールのうちの1つを第1の状態から第2の状態に変えることによって前記ソフトウェアコードを変更し、前記変更されたソフトウェアコードについてチェックサムと前記変更されたソフトウェアコードを比較することによって前記ソフトウェアコードのインテグリティを確かめるよう構成されるプロセッサを有する、装置。前記チェックサムはハッシュ値である、請求項6に記載の装置。前記チェックサムは、前記モジュールのインテグリティを確かめる関数に埋め込まれている、請求項6に記載の装置。前記チェックサムは、ルックアップテーブルに含まれる、請求項6に記載の装置前記変更されたソフトウェアコードのインテグリティを確かめる関数は、前記ルックアップテーブルに含まれる前記チェックサムにアクセスするために、前記複数のモジュールの夫々の状態を示す状態変数を用いる、請求項9に記載の装置。インテグリティが保護された自己書換バイナリを生成する装置であって、前記バイナリは複数のモジュールを有し、各モジュールは、前記バイナリの実行中に少なくとも2つのとり得る状態にあることができ、該とり得る状態は暗号化された状態及び暗号化されていない状態であり、プロセッサを有し、該プロセッサは、バイナリを受け取り、前記バイナリのチェックサムを、そのとり得る状態の夫々において生成し、少なくとも1つのチェックサム照合関数及び前記生成されたチェックサムを前記バイナリに挿入することによって、前記インテグリティが保護されたバイナリを生成するよう構成され、各チェックサム関数は、前記バイナリの状態を該バイナリの状態についてのチェックサムと比較することによって、前記インテグリティが保護されたバイナリの各状態のインテグリティを確かめるよう構成される、装置。前記プロセッサは、更に、入れ子式に複数のチェックサム照合関数を挿入し、それにより、実行中に、各チェックサム照合関数のインテグリティが少なくとも1つの他のチェックサム照合関数によって確かめられるようにする、よう構成される、請求項11に記載の装置。自己書換型のインテグリティが保護されたバイナリを記憶しており、プロセッサによって実行される場合に、請求項1乃至5のうちのいずれか一項に記載の方法のステップを実行するコンピュータプログラム。プロセッサによって実行される場合に、複数のモジュールを有するバイナリの各状態についてチェックサムを生成し、各モジュールは前記バイナリの実行中に少なくとも2つのとり得る状態にあることができ、該とり得る状態は暗号化された状態及び暗号化されていない状態であり、少なくとも1つのチェックサム照合関数及び前記生成されたチェックサムを前記バイナリに挿入することによって、インテグリティが保護されたバイナリを生成し、各チェックサム関数は、前記バイナリの状態を該バイナリの状態についてのチェックサムと比較することによって、前記インテグリティが保護されたバイナリの各状態のインテグリティを確かめるよう構成される命令を記憶しているコンピュータプログラム。従って、ソフトウェア、特に、自己書換型であるコード、のインテグリティを保証するための改善された解決法が必要である。本発明は、かかる解決法を提供する。第1の態様で、本発明は、自己書換ソフトウェアコードのインテグリティをその実行中に確かめる方法を対象とする。ソフトウェアコードは複数のモジュールを有し、各モジュールは、ソフトウェアコードの実行中に、少なくとも2つのとり得る状態、すなわち、暗号化された状態及び暗号化されていない状態、にあることができる。ソフトウェアコードを実行するプロセッサは、複数のモジュールのうちの1つを第1の状態から第2の状態に変えることによってソフトウェアコードを変更し、その変更されたソフトウェアコードについてチェックサムと変更されたソフトウェアコードを比較することによってソフトウェアコードのインテグリティ確かめる。第1の望ましい実施形態で、チェックサムはハッシュ値である。第2の望ましい実施形態で、チェックサムは、モジュールのインテグリティを確かめる関数に埋め込まれている。第3の望ましい実施形態で、チェックサムはルックアップテーブルに含まれる。有利に、変更されたソフトウェアコードのインテグリティを確かめる関数は、ルックアップテーブルに含まれるチェックサムにアクセスするために、複数のモジュールの夫々の状態を示す状態変数を使用する。第2の態様で、本発明は、自己書換ソフトウェアコードのインテグリティをその実行中に確かめる装置を対象とする。ソフトウェアコードは複数のモジュールを有し、各モジュールは、ソフトウェアコードの実行中に、少なくとも2つのとり得る状態、すなわち、暗号化された状態及び暗号化されていない状態、にあることができる。当該装置は、ソフトウェアコードを実行し、それによって、複数のモジュールのうちの1つを第1の状態から第2の状態に変えることによってソフトウェアコードを変更し、その変更されたソフトウェアコードについてチェックサムと変更されたソフトウェアコードを比較することによってソフトウェアコードのインテグリティ確かめるよう構成されたプロセッサを有する。第1の望ましい実施形態で、チェックサムはハッシュ値である。第2の望ましい実施形態で、チェックサムは、モジュールのインテグリティを確かめる関数に埋め込まれている。第3の望ましい実施形態で、チェックサムはルックアップテーブルに含まれる。有利に、変更されたソフトウェアコードのインテグリティを確かめる関数は、ルックアップテーブルに含まれるチェックサムにアクセスするために、複数のモジュールの夫々の状態を示す状態変数を使用する。第3の態様で、本発明は、インテグリティが保護された自己書換バイナリを生成する装置を対象とする。バイナリは複数のモジュールを有し、各モジュールは、ソフトウェアコードの実行中に、少なくとも2つのとり得る状態、すなわち、暗号化された状態及び暗号化されていない状態、にあることができる。当該装置はプロセッサを有し、プロセッサは、バイナリを受け取り、バイナリのチェックサムを、そのとり得る状態の夫々において生成し、少なくとも1つのチェックサム照合関数及び前記生成されたチェックサムをバイナリに挿入することによって、インテグリティが保護されたバイナリを生成するよう構成される。各チェックサム関数は、バイナリの状態を該バイナリの状態についてのチェックサムと比較することによって、インテグリティが保護されたバイナリの各状態のインテグリティを確かめるよう構成される。第1の望ましい実施形態で、プロセッサは、更に、入れ子式に複数のチェックサム照合関数を挿入し、それにより、実行中に、各チェックサム照合関数のインテグリティが少なくとも1つの他のチェックサム照合関数によって確かめられるようにする、よう構成される。第4の態様で、本発明は、自己書換型のインテグリティが保護されたバイナリを記憶しており、プロセッサによって実行される場合に、本発明の第1の態様に係る方法のステップを実行するコンピュータプログラムを対象とする。第5の態様で、本発明は、プロセッサによって実行される場合に、複数のモジュールを有するバイナリの各状態についてチェックサムを生成し、各モジュールは前記バイナリの実行中に少なくとも2つのとり得る状態にあることができ、該とり得る状態は暗号化された状態及び暗号化されていない状態であり、少なくとも1つのチェックサム照合関数及び前記生成されたチェックサムを前記バイナリに挿入することによって、インテグリティが保護されたバイナリを生成し、各チェックサム関数は、前記バイナリの状態を該バイナリの状態についてのチェックサムと比較することによって、前記インテグリティが保護されたバイナリの各状態のインテグリティを確かめるよう構成される、命令を記憶しているコンピュータプログラムを対象とする。本発明の実施形態によれば、ソフトウェア、特に、自己書換型であるコード、のインテグリティを保証するための改善された解決法が提供される。本発明の望ましい特徴について、添付の図面を参照して、限定されない例を用いて記載する。図1は、本発明が実施されるコンピュータデバイスコンピュータ100の例を表す。コンピュータ100は、例えば、標準のパーソナルコンピュータPCといった、計算を実行することができる如何なる種類のコンピュータ又はデバイスであってもよい。コンピュータ100は、少なくとも1つのプロセッサ110と、RAMメモリ120と、ユーザと対話するためのユーザインターフェースUI130と、デジタルデータ担体150からソフトウェアプログラムを読み出すための第2のインターフェースI/O140とを有する。当業者には明らかなように、図示されているコンピュータは、明りょうさのために簡単化されており、実際のコンピュータは、更に、ネットワーク接続や持続記憶デバイス等の機能を有する。本発明の主たる発明概念は、各状態が保護されているプログラムコードの状態に対応するところの、プログラムの実行中の有限状態機械finitestatemachineの使用である。1つの状態から他の状態に移るとき、コードの少なくとも1つのモジュールは動的に変更される。有限状態機械はそれ自体当該技術でよく知られているので、それについて詳細には記載しない。モジュールの限定されない例は、コードのサブセクション、コードのチャンクchunks、及び関数である。改ざんから保護するために、各状態についてチェックサムを計算することが可能であり、これにより、コードを改ざんすることを防ぐことができる。図2は、本発明の望ましい実施形態を表す状態図である。説明の明りょうさのために、例となる状態図は3つの状態S1、S2及びS3しか含まず、各状態はチェックサムに関連付けられており、コードは3つのモジュールM1、M2及びM3しか有さない。当業者には明らかなように、本発明は、より多くの又はより少ない状態及びモジュールにも等しく適用され、それに対応する異なった状態遷移が可能である。例において、初期状態はS1である。この状態において、コードの全てのモジュールは、それらの初期状態にあり、状態は第1チェックサム、すなわち、チェックサムV1、に関連付けられている。この第1チェックサムにより、少なくとも1つのモジュールのインテグリティ照合が可能となる。実行により状態S1から状態S2へのシフトが起こる場合、第1のモジュールM1は変更され、変更されたモジュールM’1が生成される。望ましくは、この時点でチェックサムV2を用いてチェックサムが確認されるが、その確認は、夫々の状態遷移に適用することができる、後の段階で行われてもよい。同様に、実行により状態S2から状態S3へのシフトが起こる場合、第2のモジュールM2が変更され、変更されたモジュールM’2が生成される。変更されたモジュールM’1は、その変更されていない形態M1に戻り、それにより、コードは3つのモジュールM1、M’2及びM3を有する。前に説明されたように、望ましくは、この時点でチェックサムV3を用いてチェックサムが確認される。状態S3から状態S2へ、更に状態S2から状態S1へ移ると、変更は逆方向に行われる。例えば、状態S2から状態S1に進む場合、変更されたモジュールM’1は、その変更されていない形態M1に戻る。また、かかる場合に、望ましくは、遷移後に関連するチェックサムを用いてチェックサムが確認される。図3は、本発明の望ましい実施形態に従うインテグリティ照合のための方法を表す。方法は、通常のプログラム実行から始まることができるステップ310。或る時点で、状態を変化させることが決定されるステップ320。少なくとも1つのモジュールが変更されステップ330、インテグリティがチェックされるステップ340。この後、通常のプログラム実行がステップ310で戻る。モジュールは、例えば、モジュールの解読によってその場合には、復号化キーが必要である。、又はモジュールの一部のバイトを変更することによって例えば、置換によって、変更されてよい。前者の場合、コードは、その最初の状態に戻るよう暗号化される対称的な暗号アルゴリズムでは、復号化キーと同じ暗号キーを必要とする。。後者の場合、バイトは、例えば、バックワード置換backwardspermutationによって、最初の構成に戻される。図4は、バイナリ410の保護を表す。保護エンジン420は、とり得る状態及びそれらの夫々のチェックサム値を列挙するよう機能する。これらのチェックサム値は、識別を可能にする何らかのリファレンスとともに、保護されたバイナリ430に挿入される。保護エンジン420は、例えばパーソナルPC等の如何なる種類の適切なコンピュータデバイスであってもよい。それは、望ましくは、プロセッサ及びメモリ等図示せず。を有する。コンピュータプログラムプロダクト415は、例えばCD-ROM又はUSBメモリ等であって、プロセッサによって実行される場合に本願で記載されるようにバイナリを保護する命令を記憶する。バイナリ410を保護するために、保護エンジン420は、バイナリ410を解析して、とり得る状態を計算する。この目的のために、有利に、保護エンジン420は、コールグラフ解析及び状態解析を使用する。状態が生成されると、保護エンジン420は、その状態に係るチェックサムを計算する。次いで、保護エンジン420は、少なくとも1つのチェックサム呼び出しinvocationポイント432と、チェックサムが確認される各状態ごとに1つである、チェックサムの単一値を有することができるテーブル434とを有する保護されたバイナリ430を生成する。望ましくは、チェックサムは、容易なアクセスを可能にするある種の識別子例えば、状態1、状態2といった表示、又は暗号化されたモジュール1、復号化されたモジュール2、暗号化されたモジュール3のラインに沿った表示と関連付けられる。望ましくは、チェックサムテーブル434は、保護されたバイナリの少なくとも一部についてハッシュ値の形をとるが、他のチェックサムも想定されてよい例えば、バイナリの一定範囲における特定の文字の数。チェックサムは、例えば暗号化によって、保護されるが、先に記載されたように、チェックサム照合関数を入れ子にすることが好ましく、それにより、各関数のインテグリティは少なくとも1つの他の関数によって確認される。状態のチェックサムが決定論的に前の状態のチェックサムから決定される場合に、チェックサムテーブル434を用いずに行うことも可能である点に留意すべきである。チェックサムは、また、保護されたバイナリにおいて難読化され、又は別なファイルに記憶されてもよい。次いで、以下の限定されない例を考える。記載及びその理解を容易にするよう、例は、単一コード領域チェックサム範囲と呼ばれる。が、望ましくはプログラム実行中に複数の照合ポイントで起こるチェックサム照合によって保護される場合に限定される。当業者には明らかなように、本発明は、複数のチェックサム範囲の場合に容易に拡張可能である。例は、更に、モジュールが、2つの異なった状態、すなわち、暗号化された状態及び復号化された状態、にあることができる関数に対応する特定の場合に限定される。このようにして、コードには特有の状態遷移が存在し、各状態は、望ましくは、保護されたバイナリにおける少なくとも1つの照合ポイントで確認される。例において、各関数が2つのとり得る状態暗号化された状態及び復号化された状態のうちの1つにある場合、状態変数S望ましくは、ビットストリームにおいて状態ビットSiとして状態を表すことが可能である。状態変数Sは、アプリケーションの関数コールグラフに依存して、とり得ない値を表すことができる。そのようなものとして、状態変数Sのとり得る値のサブセットのみがアプリケーションについて有効であってよい。状態変数Sの各値は、保護エンジンによって計算されるチェックサム値に対応し、これらのチェックサム値は、保護されたバイナリに有利にハッシュ値として埋め込まれる。次いで、ハッシュチェックサムは、識別子として状態変数Sを用いて調べられてよい。関数が暗号化又は復号化されるときはいつでも、すなわち、状態が変化する場合には、状態変数Sは、適切な状態ビットSiを反転flipさせることによって、更新される。図5は、状態ビットS1、S2に夫々関連付けられた2つの関数F1、F2を伴う、例となる状態遷移図を表す。各関数は、暗号化されS1、S2によって表され且つ復号化されてよく、4つの異なる状態を生ずる。S0:F1及びF2は暗号化-S1S2S1:F1は暗号化、F2は復号化-S1S2S2:F1は復号化、F2は暗号化-S1S2S3:F1及びF2は復号化-S1S2最初に、プログラムは、メイン関数510を実行する。このとき、状態SはS0=S1S2である。メイン関数は関数F1及びF2を呼び出すことができる。関数F1が呼び出される場合、暗号化されているF1は復号化される520。その後に、F1の実行530が始まる。このとき、状態SはS2=S1S2である。同様に、関数F2が呼び出される場合、暗号化されているF2は復号化され550、S2は反転する。その後に、F2の実行560が始まる。このとき、状態SはS1=S1S2である。関数F1530には2つの可能性が存在する。F1の実行が終わり、F1はF2を呼び出す。最初の場合では、F1は暗号化され540、S1は反転され、実行はメイン関数510に戻る。そして、状態はS0=S1S2に戻る。第2の場合では、F2は復号化され550、状態ビットS2は反転され、F2の実行560が始まる。しかし、メイン関数510が直接F2を呼び出す場合と対照的に、F1も復号化されている。このことは、状態がS3=S1S2であることを意味する。従って、F2の実行中、状態はS1又はS3のいずれかである。このようにして、F2の実行が終わると、F2は暗号化され570、状態ビットS2は反転され、実行は関数の呼び出しに戻る。呼び出す関数がメイン関数である場合、メイン関数510は実行を引き継ぐ。このとき、状態はS0=S1S2である。他方で、呼び出す関数がF1であった場合、F1の実行530が再開する。このとき、状態はS2=S1S2である。図5で、チェックサム呼び出しポイントは、理解を簡単にするために、省略されているが、当然、夫々の関数メイン関数、F1、F2は、望ましくは、状態に関連付けられたチェックサムを確認する場合により、暗号化/復号化関数の部分としての少なくとも1つのチェックサム呼び出しポイントを有する。チェックサム呼び出しポイントの最も簡単な実施は、プログラムが現在の状態Sを読み出し、対応するチェックサム値をチェックサムテーブルにおいて見つけ出し、記憶されているチェックサム値に対して照合されるべきチェックサムを生成することである。照合が失敗である場合、望ましくは、実行は中止される。当業者に明らかなように、攻撃者はチェックサム値を改ざんしようと試みる。このような理由で、他のチェックサムを含む呼び出し関数と同様にチェックサムテーブルを保護することが好ましく、これにより、これらは照合される。可能であればいつでも、呼び出しポイントコードにおいてチェックサム値をインラインにすることによって、セキュリティのレベルを高めることが可能である。この場合、保護エンジンは、有利に、下記の3つの場合の間を区別するようコールグラフを解析する。1.保護される関数が入力される場合、状態は一意である。すなわち、単一の実行経路が関数に通ずる。この場合、チェックサム値は一意であり、呼び出しポイントコードは、望ましくは、難読な方法でチェックサム値を埋め込むコードを有してよい。例えば、ifthen2.保護される関数が入力される場合、少数5未満のとり得る状態が存在する。この場合も、呼び出しポイントコードにチェックサム値を埋め込むことが可能である。例えば、iforifthen3.とり得る状態が多数存在する場合には、チェックサムテーブルが望ましい解決法である。例えば、ifthen明細書において、モジュールは、2つのとり得る状態例えば、暗号化及び復号化を有するとして記載されてきた。当業者に明らかなように、モジュールは複数の特に、2よりも多い状態を有することが可能である。本発明は、上記の攻撃に打ち勝つことができるマルチステートソフトウェアコードのインテグリティを確かめる方法を提供することができると認められる。明細書並びに必要に応じて特許請求の範囲及び図面で開示されている夫々の特徴は、独立して、又は何らかの適切な組合せにおいて、提供されてよい。ハードウェアで実施されると記載される特徴は、ソフトウェアでも実施されてよく、また、その逆も同様である。特許請求の範囲に現れる参照符号は、単なる例示として用いられ、特許請求の範囲の適用範囲を限定するものではない。