関数コードを、該関数コードを有するソフトウェアプログラムのデバイスにおける実行中にメモリ内で再配置する方法であって:前記関数コードを、前記メモリの、ダミーコードを有する領域内で再配置する段階と;前記ダミーコードを予測可能な仕方で変換する段階と;以前のチェックサムに基づいて前記領域についての予測されたチェックサムを生成する段階と;前記領域に対する計算されたチェックサムを生成する段階と;前記予測されたチェックサムと前記計算されたチェックサムとを比較することによって前記関数コードの完全性を検証する段階とを含む、方法。前記領域についての前記チェックサムは、前記関数コードについてのチェックサムと前記ダミーコードについてのチェックサムとの組み合わせである、請求項1記載の方法。前記関数コードが一定のチェックサム値をもって位置独立である、請求項2記載の方法。前記予測されたチェックサムについての前記関数コードの前記チェックサムが再配置テーブルを使って計算される、請求項2記載の方法。前記ダミーコードの前記変換が置換を含む、請求項2記載の方法。前記ダミーコードの前記チェックサムが前記変換によって不変である、請求項5記載の方法。前記ダミーコードの前記変換は所定サイズの諸ブロックとしての置換を含む、請求項5記載の方法。前記変換が、前記ダミーコードの前記チェックサムに対する予測可能な効果をもち、線形である、請求項2記載の方法。前記メモリの前記領域が、やはりチェックサム値が計算されるときに使われるさらなる関数コードおよびさらなるダミーコードを有する、請求項1記載の方法。前記ダミーコードが本物のコードである、請求項1記載の方法。前記関数コードがモジュールまたは命令ブロックとして実装される、請求項1記載の方法。ソフトウェアプログラムの実行および該ソフトウェアプログラムの実行中のメモリにおける該ソフトウェアプログラムの関数コードの再配置のためのデバイスであって:メモリおよびプロセッサを有し、前記メモリは前記メモリのある領域内に関数コードおよびダミーコードを記憶し、前記プロセッサは、前記メモリの前記領域内で前記関数コードを再配置し、前記ダミーコードを予測可能な仕方で変換し、以前のチェックサムに基づいて前記領域についての予測されたチェックサムを生成し、前記領域に対する計算されたチェックサムを生成し、前記予測されたチェックサムと前記計算されたチェックサムとを比較することによって前記関数コードの完全性を検証する、デバイス。ソフトウェアプログラムの命令を記憶しているコンピュータプログラムプロダクトであって、前記命令は、メモリに記憶されてプロセッサによって実行されたときに、前記ソフトウェアプログラムの関数コードを、前記メモリの、ダミーコードを有する領域内で再配置する段階と;前記ダミーコードを予測可能な仕方で変換する段階と;以前のチェックサムに基づいて前記領域についての予測されたチェックサムを生成する段階と;前記領域に対する計算されたチェックサムを生成する段階と;前記予測されたチェックサムと前記計算されたチェックサムとを比較することによって前記関数コードの完全性を検証する段階と実行する、コンピュータプログラムプロダクト。このように、動的に再配置されるコードの完全性を検査することが問題である。自明な解決策は、再配置されたコードの範囲を入力パラメータとしてチェックサム関数に渡すことである。セキュリティの観点からは、これは、保護される関数の範囲および参照値をハッカーに対して開示するので、受け容れられるものではない。よって、再配置された関数に対するチェックサムの計算を、該関数のそのような詳細を開示することなく可能にする解決策が必要とされていることは理解されるであろう。本願はそのような解決策を提供する。第一の側面では、本発明は、関数コードを、該関数コードを有するソフトウェアプログラムのデバイスにおける実行中にメモリ内で再配置する方法に向けられる。プロセッサが関数コードを、メモリの、ダミーコードを有する領域内で再配置し、ダミーコードを予測可能な仕方で変換し、以前のチェックサムに基づいてその領域についての予測されたチェックサムを生成し、その領域に対する計算されたチェックサムを生成し、予測されたチェックサムと計算されたチェックサムとを比較することによって関数コードの完全性を検証する。ある好ましい実施形態では、領域についてのチェックサムは、関数コードについてのチェックサムとダミーコードについてのチェックサムとの組み合わせである。関数コードが一定のチェックサム値をもって位置独立であることが有利である。また、予測されたチェックサムについての関数コードのチェックサムが再配置テーブルを使って計算されることも有利である。ダミーコードの変換transformationが置換permutationを含むことがさらに有利である;好ましくはダミーコードのチェックサムが変換によって不変であり、好ましくはダミーコードの変換は所定サイズの諸ブロックとしての置換を含む。また、変換が、ダミーコードのチェックサムに対する予測可能な効果をもち、線形であることも、代替として有利である。第二の好ましい実施形態では、ダミーコードは本物のコードである。第三の好ましい実施形態では、関数コードはモジュールまたは命令ブロックとして実装される。第二の好ましい実施形態では、メモリの領域は、やはりチェックサム値が計算されるときに使われるさらなる関数コードおよびさらなるダミーコードを有する。第二の側面では、本発明は、ソフトウェアプログラムの実行および該ソフトウェアプログラムの実行中のメモリにおける該ソフトウェアプログラムの関数コードの再配置のためのデバイスに向けられる。本デバイスはメモリおよびプロセッサを有し、該メモリの領域内に関数コードとダミーコードを記憶する。前記プロセッサは、前記メモリの前記領域内で関数コードを再配置し、ダミーコードを予測可能な仕方で変換し、以前のチェックサムに基づいてその領域についての予測されたチェックサムを生成し、その領域に対する計算されたチェックサムを生成し、予測されたチェックサムと計算されたチェックサムとを比較することによって関数コードの完全性を検証する。第三の側面では、本発明は、ソフトウェアプログラムの命令を記憶しているコンピュータプログラムプロダクトに向けられる。前記命令は、メモリに記憶されてプロセッサによって実行されたときに、本発明の第一の側面の方法を実行する。図1は、本発明が実装されうる例示的なコンピューティングデバイスコンピュータ100を示している。コンピュータ100は、標準的なパーソナルコンピュータPCのような、計算を実行する機能をもつ任意の種類の好適なコンピュータまたは装置であることができる。コンピュータ100は少なくとも一つのプロセッサ110、RAMメモリ120、ユーザーと対話するためのユーザーインターフェース130および本発明の方法を実行するためのソフトウェアプログラムをデジタルデータ担体150から読むための第二のインターフェース140を有する。当業者は、図示したコンピュータは明確のため非常に簡略化されていること、本物のコンピュータはさらにネットワーク接続および持続的記憶装置といった特徴を有するであろうことを理解するであろう。図2は、本発明のある好ましい実施形態に基づく自己修正する再配置可能なコードの完全性検証を示している。図2は、二つの異なる時点tAおよびtBにおけるメモリ200の内容を示している。ここで、tAはtBより前である。tAにおけるメモリは200Aと表されており、tBにおけるメモリは200Bと表されているがこれは通常は同じ物理的メモリであることは理解されるであろう。tAは初期状態に対応する、つまり、関数コードあるいは機能コードをもとの位置にもつのでもよいが、関数コードが少なくとも一回再配置された再配置された状態に対応してもよい。tAにおいて、メモリ200Aは呼び出し命令210、ダミーコードをもつ第一の領域231A、保護された関数コード220およびダミーコードをもつ第二の領域232Aを有する。ダミーコードの領域231A、232Aおよび保護された関数コード220はメモリ中で隣接し合っており、チェックサム範囲checksumrangeとして使われる領域Rを形成している。チェックサム検証は、チェックサム関数260によって実行される。実行中に、呼び出し命令210は保護された関数220のアドレスを呼び出す240A。斜線を付した領域は、本発明の本好ましい実施形態に重要でないメモリ領域――たとえば空のまたは他の関数/機能を記憶しているメモリ領域――を示すことが意図されている。保護された関数220はたとえば、モジュール、すなわち命令のブロックの群または一つまたは複数の命令のブロックであってもよい。tBでは、保護された関数220は、メモリ200Bにおいて、第二の、好ましくはランダムな、アドレスに再配置250されている。メモリ200Bはさらに、呼び出し命令210、ダミーコードをもつ第一の領域231Bおよびダミーコードをもつ第二の領域232Bを有する。この第二のアドレスは、保護された関数220の全体がいまだ領域R内にあり、ダミーコードの領域231B、232Bおよび保護された関数コード220がメモリ中で隣接し合って領域Rを形成しているようなものである。アドレスの差はジッタJとして示されている。実行中に、呼び出し命令210が再配置された保護された関数220のアドレスすなわち第二のアドレスを呼び出す240B。チェックサム検証は、チェックサム関数260によって実行される。ダミーコードの第一の領域231A、231Bまたはダミーコードの第二の領域232A、232Bが存在しなくてもよいことは理解されるであろう。これはつまり、保護された関数が領域Rのちょうど先頭から始まる、あるいは領域Rのちょうど末尾で終わるということである。また、保護された関数コード220が再配置前と後とで同一であっても、たとえば関数呼び出しのための調整されたアドレスを有することにより異なっていてもよいことも理解されるであろう。さらに、呼び出し関数は再配置前と後で同一であっても異なって変換されていてもよいことも理解されるであろう。このように、ハードウェアブレークポイントに基づくリバースエンジニアリング攻撃は、保護される関数のアドレスのまわりにジッタJを加えることによって対抗される。保護される関数は、ダミーコードで満たされた領域R内の異なる、好ましくはランダムなアドレスに――規則的に、変化する間隔で、または少なくとも一度――再配置される。二つ以上の領域Rがソフトウェアプログラムを保護するために使われてもよい。工作防止を保証するために、領域Rはチェックサム関数260と組み合わされる。一つの言い方では、本発明は二つの役者に関わる:チェックサム関数260とコード修正エンジンである。チェックサム関数260は好ましくは、保護すべき領域R専用である。領域Rは、保護すべき関数のコードのほかダミーコードを含む。任意の時点において、Rのチェックサム値は、保護される関数コードが時間的に変化しなければ予測可能であり、一定のチェックサム値をもち、あるいは変化が予測可能であればダミーコードは時間的に、予測可能な仕方で変換されて、チェックサム値の決定論的な予測を可能にする。コード修正エンジンは、好ましくはアプリケーション内に埋め込まれており、図2に示されるように領域R内の保護される関数を再配置することによって、保護される関数の呼び出しポイントを新しいシフトされたオフセットにフィックスすることによって、およびダミーコードを変換することによって、少なくとも保護される関数コードを自動修正する。ダミーコードの変換は好ましくは、置換を実行し、および可能性としては予測可能な出力を生成する暗号化方法を使ってダミーコードを暗号化するために第二の関数を使うことを含み、それによりチェックサム値の予測を可能にする。このように、ダミーコードの完全性値は予測可能な仕方で時間とともに変化する。ある好ましい実施形態では、保護される関数のチェックサム値は、再配置後でも変化しない。これは、関数が、たとえばコンパイラーのコンパイルオプションfpicを使って生成されうる位置独立なコードを含む場合に可能である。位置独立なコードを達成する一つの方法は、たとえば、インポートアドレステーブルIATImportAddressTable中のジャンプアドレスを参照することによって、保護される関数120の呼び出しを間接的にすることである。このようにして、ジャンプアドレスがシフトされても呼び出し命令は変化せず、呼び出し側の保護された命令のチェックサム値は一定となる。しかしながら、位置独立なコードを得ることが可能でない場合、それでも、再配置された保護された関数のチェックサム値を予測することが可能である。これの欠点は、チェックサム関数がより複雑であり、アプリケーションのバイナリーヘッダウィンドウズ登録商標についてはセクションrelocに埋め込まれた再配置テーブルにアクセスする必要があるということである。この情報を使って、保護される関数の完全性を検証するために使われるチェックサム関数260に頼ることなく再配置された関数のチェックサム値を計算することが可能である。すでに述べたように、保護されたプログラムは複数の保護された領域Rをもってもよい。たとえば、重なり合わない二つの相異なる領域R1およびR2をもつことが可能である。ここで、各領域は、図2を参照して記載したような保護された関数を収容する。関数は好ましくは、少なくとも一つ好ましくはちょうど一つの入口ポイントと少なくとも一つの出口ポイントを有する一組の命令である。関数が、関数自身がトリビアルでない程度のいくつかの命令を有するが、関数が再配置するのに重くなるほど多くはない命令を有することが有利である。図3は、本発明のある好ましい実施形態に基づく、複数の範囲を使うコード保護のためのもう一つの可能性を示している。メモリ300は、第一の保護される関数321への第一の呼び出し命令311および第二の保護される関数322への第二の呼び出し命令312を有している。各保護される関数321、322は、ダミーコード331、332、333、334によって囲まれており、各関数321、322は、それぞれの呼び出し命令311、312に、保護される関数321、322のアドレスを呼び出させる341、342ことによって実行される。見て取れるように、メモリ300は二つの領域R1およびR2を含んでおり、各領域はチェックサムによって保護される。領域R1は保護された関数321および取り囲むダミーコード331、332を含む。各領域が異なる関数に対応する先述した実施形態とは異なり、領域R2は領域R1と、第二の保護される関数322とその取り囲むダミーコード333、334とを含む。領域R1とダミーコードエリア333との間の斜線を付したエリアは変化しないことが好ましいことは理解されるであろう。変化するとしたら、予測可能な仕方で変化するべきである。最も簡単な解決策は、領域R1と領域R2を隣接させることであるが、もちろん、この斜線を付したエリアが決して触れられないことを保証することも可能である。このように、チェックサム範囲は、チェックサム範囲が他の領域といかなる部分的交わりももたず、いかなる領域への呼び出しポイントも含まないのである限り、いくつかの領域を含んでいてもよい。これらの要件が満足されないのであれば、完全性値が時間的に一定ではなく、予測不可能である可能性が高い。チェックサム関数については、チェックサム予測可能性およびチェックサム整列の要件を満足させるよう選ばれることが好ましい。チェックサム予測可能性checksumpredictabilityとは、チェックサム関数が、以前のチェックサム値、すなわち最新の変換の前のチェックサム値から現在のチェックサム値を得ることができるということを意味する。これを表すもう一つの方法は、チェックサム関数は現在のチェックサム値から次のチェックサム値を得ることができるというものである。ある領域のチェックサム値は好ましくは二つのソース:ダミーコードのチェックサムと保護された関数のチェックサムの組み合わせである。先述したように、保護された関数が修正なしに再配置されうる――たとえばリナックスの再配置可能コード――場合、そのチェックサムは不変である。これは好ましい特徴である。この場合、チェックサムは再配置前と後で同じままである。しかしながら、保護される関数がチェックサム不変でない場合、チェックサム関数がプログラムの再配置テーブルに頼ってコードに対する再配置の影響を計算し、それによって正しいチェックサム値を生成できることも可能である。さらに、ダミーコードのチェックサムは決定論的deterministicでなければならない。各変換において、ダミーコードMはEで置き換えられる。n回の変換後、チェックサム値Cはに等しい。C=En=n×E0となるような単純な線形変換を選ぶことが可能である。すると、n回の変換後、Cn=CnCn=Cn×E0=A0n×B0ここで、A0はチェックサム不変な保護された関数のチェックサム値であり、B0は初期ダミーコードのチェックサムである。よって、領域Rのチェックサム値は、入力nに依存する多項式によって見出しうる。ここで、nは時間にわたる変換の数である。チェックサム整列checksumalignmentとは、保護された関数を囲む二つのあるいは可能性としては一つだけのダミーコードエリアのチェックサム値が、保護された関数が領域R内のどこに位置されようとも、つまり、保護された関数がダミーコードエリアをどのように分割しようとも、一定であることを意味する。これは、ブロックごとにチェックサム関数を選んで分割ジッタsplittingjitterJが単位チェックサムブロックサイズの倍数となるようにすることによって達成されうる。典型的には、4バイトのブロックサイズに対して作用するチェックサムは、4バイトの倍数であるアドレスをランダムに分割することを許容する。少なくともこの場合においては、関数にパディングして関数の長さが4バイトの倍数となるようにすることが必要であることがありうる。それにより、関数とダミーコードが領域R全体を占める。コード修正エンジンは、プログラムの実行中に領域R内部の保護される関数を再配置するよう適応される。これを行うために、コード修正エンジンは、保護された関数が呼び出される呼び出し点を知るべきである。これは、ポストビルドツールによって達成されうる。該ポストビルドツールは:コンパイル時においてプログラムの静的解析を実行して呼び出しグラフcallgraphおよび命令ブロックを推定し、保護された関数への前記呼び出しグラフ中の呼び出し点invocationpointsを決定し、各領域のチェックサム参照値を計算し、実行時においてコード修正エンジンが保護された関数を再配置するとき、関数への呼び出し命令呼び出し点のオフセットをもフィックスするべきである。典型的には、各変換において、コード修正エンジンは:ランダムオフセットを生成し、ランダムオフセットを使って領域R内部で保護された関数をシフトし、特定の変換アルゴリズムを用いて領域R内部のダミーコードを変換し本稿ですでに述べたように、保護される関数のすべての呼び出し点のオフセットをランダムオフセットにフィックスし、現在の変換の番号nを、好ましくはセキュアな場所に、記憶する。この番号は、のちにチェックサムルーチンによって、ダミーコードのチェックサム値を計算するために使われうる。実際上は、変換中に、ダミーコード、関数またはダミーコードと関数の両方を一時的に記憶することが、どれかが他のものによって上書きされないことを保証するために必要になることがありうることは理解されるであろう。チェックサム関数は好ましくはコード修正エンジンとは独立である;チェックサムが計算されるときは常に、それは設計によって不変である。好ましくは、プログラム中の追加的なスレッドによって複数のチェックサム関数が、ランダムな間隔で、あるいは所定の諸実行ポイントにおいて、呼び出される。ポストビルドツールは、チェックサム検証を可能にするために、いかなる変換も行う前に保護された各領域について初期チェックサム値をプログラム中に注入するべきである。図4は、本発明のある好ましい実施形態に基づく保護されたプログラム実行のための方法のフローチャートを示している。プログラムはステップ410において通常通りに実行される。所与の点において、一つまたは複数の保護される関数が、本稿において先述したように、再配置420される。次いで、本稿において先述したように、再配置された関数のチェックサムが計算430される。チェックサム関数260が再配置された関数の完全性を少なくとも一回検証440することが好ましい。次いでステップ410において通常のプログラム実行が再開される。当業者は、本発明によって保護されるプログラムが自動修正的automodifyingであることを理解するであろう:諸領域の内容は時間にわたって変換され、これが典型的なトランスレーションルックアサイドバッファTLBtranslationlookasidebuffer攻撃に対して耐性にすることができる。ここでは、ハードウェアが物理アドレスで機能するのに対してプログラムは仮想アドレスを操作する。TLBは、そのようなアドレス間の変換translationを許容するテーブルである。当業者はまた、本発明が関数の開始アドレスに何らかのジッタを加えることをも理解するであろう。これは、関数をハードウェアブレークポイントおよびリプレイ攻撃に対して耐性にする。当業者は、本発明が保護される関数のまわりの何らかのダミーコードを使うことをも理解するであろう。これは、コードのディスアセンブルに対抗することができる。当業者はまた、ソフトウェア完全性が内緒であるstealthyことができることをも理解するであろう。関数マッピングのランダム化は、ヒープではなく、コードのセクションにおいて起こる。別の実装では、関数をmallocで割り当てられたバッファーにおいてヒープ中のランダムなアドレスにおいて再配置することも可能であるが、その場合、内緒な仕方で関数の完全性を計算することはより難しくなる。本発明のある好ましい実施形態によれば、保護される領域は他のレガシーコード内部に挿入され、当該領域の始点および範囲を明示的に述べることなく、当該領域を包含するより大きなエリアに対してチェックサム範囲を適用することが可能になる。当業者はまた、領域の完全性が決定論的であり、設計により予測可能であることをも理解するであろう。コード修正および完全性属性はリンクしていない。任意の時点でクロスオーバーできる複数のチェックされる範囲をもって完全性を実装することが可能である。というのも、領域の完全性値はたとえランダム化されていても予測可能だからである。当業者はまた、本稿において使われるところのダミーコードという表現が、ランダムに生成された無意味コードに近いランダムまたは擬似ランダムなデータであってもよいが、本物の機能コードたとえばもはや使用されない古いプログラムから取られたものであってもよいことをも理解するであろう。ダミーコードは本物のコードに似ていることが好ましい。そのほうが攻撃者にとってメモリの内容を解析するのが難しいからである。もう一つの見方は、ダミーコードは、機能コードに対応しない領域中のデータである、つまり非機能データであり、チェックサムは機能コードを含まない領域の部分について生成されるというものである。本発明が、再配置されたソフトウェアコードの完全性を検証する方法を提供できることは理解されるであろう。本記述および適切な場合には請求項および図面において開示される各特徴は、独立して設けられても、いかなる適切な組み合わせにおいて設けられてもよい。ハードウェアにおいて実装されると記載されている特徴はソフトウェアにおいて実装されてもよく、逆にソフトウェアにおいて実装されると記載されている特徴はハードウェアにおいて実装されてもよい。請求項に現れる参照符号は単に例示のためであって、請求項の範囲に対する限定する効果はもたない。