(57)【特許請求の範囲】
【請求項１】
プログラムコード部を改ざんから保護するための耐タンパ方法であり、コンピュータ上で実行される前記耐タンパ方法であって：
前記耐タンパ方法は、耐タンパシステムによって操作可能であり、耐タンパシステムはコンピュータ読取可能な記録媒体を含み、前記耐タンパ方法は、
前記プログラムコード部を複数のコードセグメントに分割する工程と；
前記コードセグメントからコードセグメントのシーケンスを定義する工程であって、ここで、コードセグメントの該シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含む、工程と；
各サブコードセグメントに、ターゲットコードセグメントの完全性をチェックするための完全性チェック部を提供する工程であって、任意のサブコードセグメントの前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と；
を含み、
ここで、任意のサブコードセグメントの完全性チェック部は、前記対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、前記実行時結果を前記任意のサブコードセグメントに含まれる参照結果と比較するように操作可能であり、
前記コンピュータ読取可能な記録媒体は、記録されたプログラムコード部の複数のプログラムコードセグメントを有する、耐タンパ方法。
【請求項２】
１つの前記サブコードセグメントの前記完全性チェック部が、前記ターゲットコードセグメント上でチェックサム手順を実施することを含むチェック手順を定義する、請求項１に記載の耐タンパ方法。
【請求項３】
前記チェックサム手順が、巡回冗長チェックを含む、請求項２に記載の耐タンパ方法。
【請求項４】
参照結果演算処理プロセスを、各サブコードセグメントに対して１つの前記参照結果を取得するために実施する工程であって、前記参照結果演算処理プロセスは、任意のサブコードセグメントに対して、インプリメンテーションチェック手順を前記対応するターゲットコードセグメント上で実施することを含む工程、をさらに含む、請求項１から３のいずれか１項に記載の耐タンパ方法。
【請求項５】
前記参照結果演算処理プロセスが：
第一のサブコードセグメントに対して１つの前記参照結果を取得するための第一のインプリメンテーションチェック手順であって、第一のサブコードセグメントが、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントであり、ここで、前記第一のインプリメンテーションチェック手順が、保護すべきプログラムの属性を指定する前記ルートコードセグメントの部分上で実施される、第一のインプリメンテーションチェック手順を含み：
サブコードセグメントの前記シーケンスの各サブコードセグメントに対する連続するインプリメンテーションチェック手順であって、各サブコードセグメントに対する前記インプリメンテーションチェック手順が、前のインプリメンテーションチェック手順の間に取得された参照結果を指定する対応するターゲットコードセグメントの部分上で実施される、連続するインプリメンテーションチェック手順をさらに含む、
連続するプロセスである、請求項４に記載の耐タンパ方法。
【請求項６】
前記プログラムコード部が、各セグメントが前記プログラムコード部の機能を含むようにコードセグメントへ分割される、請求項１から５のいずれか１項に記載の耐タンパ方法。
【請求項７】
前記ルートコードセグメントが、プログラムの指定された属性を定義する属性指定部を含む、請求項１から６のいずれか１項に記載の耐タンパ方法。
【請求項８】
複数のコードシーケンスを、１もしくは２つ以上のセグメントが２つ以上のコードシーケンスの一部分を形成するように定義することを含む、請求項１から７のいずれか１項に記載の耐タンパ方法。
【請求項９】
複数のコードセグメント内の前記シーケンスに含まれる前記コードセグメントの配列を表すためのトポロジーを定義する工程を含む、請求項１から８のいずれか１項に記載の耐タンパ方法。
【請求項１０】
前記プログラムコード部が、ソースコードを含む、請求項１から９のいずれか１項に記載の耐タンパ方法。
【請求項１１】
前記プログラムコード部が、コンパイルされたコードを含む、請求項１から１０のいずれか１項に記載の耐タンパ方法。
【請求項１２】
改ざんからプログラムコード部を保護するための耐タンパシステムであって、前記耐タンパシステムは、プログラムコード部の複数のプログラムコードセグメントがその上に記憶されたコンピュータ読み取り可能記憶媒体を含み、前記プログラムコードセグメントは、コードセグメントのシーケンスを定義し、ここで、コードセグメントの前記シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含み；
ここで、各サブコードセグメントは、ターゲットコードセグメントの完全性をチェックするための完全性チェック部を含み、任意のサブコードセグメントに対する前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントであり；
ならびに、ここで、任意のサブコードセグメントの前記完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、そして前記実行時結果を、前記任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である、耐タンパシステム。
【請求項１３】
各サブコードセグメントが、前記対応するターゲットコードセグメント上でインプリメンテーションチェック手順を実施して、そのサブコードセグメントに対して１つの前記参照結果を取得するように操作可能であるインプリメンテーションチェック部をさらに含む、請求項１２に記載の耐タンパシステム。
【請求項１４】
前記チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接する第一のサブコードセグメントである前記サブコードセグメントの前記インプリメンテーションチェック部が、保護すべきプログラムの属性を指定する前記ルートコードセグメントの部分上で第一のインプリメンテーションチェック手順を実施するように操作可能であり、ならびに：
各連続するサブコードセグメントの前記インプリメンテーションチェック部が、前のインプリメンテーションチェック部によって取得された参照結果を指定する前記対応するターゲットコードセグメントの部分上で連続するインプリメンテーションチェック手順を実施するように操作可能である、請求項１３に記載の耐タンパシステム。
【請求項１５】
プログラムコード部を改ざんから保護するための耐タンパ方法であり、耐タンパ方法は耐タンパシステムによって操作可能であり、前記耐タンパシステムはコンピュータ読取可能な記録媒体を含み、コンピュータ上で実行される前記耐タンパ方法は：
前記プログラムコード部を複数のコードセグメントに分割する工程と；
前記コードセグメントからコードセグメントのシーケンスを定義する工程であって、ここで、コードセグメントの前記シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含む、工程と；
参照結果演算処理プロセスを、各サブコードセグメントに対して参照結果を取得するために実施する工程であって、ここで、前記参照結果演算処理プロセスは、任意のサブコードセグメントに対して、インプリメンテーションチェック手順をターゲットコードセグメント上で実施することを含み、任意のサブコードセグメントの前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と、
を含み、
前記コンピュータ読取可能な記録媒体は、記録されたプログラムコード部の複数のプログラムコードセグメントを有する、耐タンパ方法。
【請求項１６】
前記参照結果演算処理プロセスが：
第一のサブコードセグメントに対して１つの前記参照結果を取得するための第一のインプリメンテーションチェック手順であって、第一のサブコードセグメントが、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントであり、ここで、前記第一のインプリメンテーションチェック手順が、保護すべきプログラムの属性を指定する前記ルートコードセグメントの部分上で実施される、第一のインプリメンテーションチェック手順を含み：
サブコードセグメントの前記シーケンスの各サブコードセグメントに対する連続するインプリメンテーションチェック手順であって、各サブコードセグメントに対する前記インプリメンテーションチェック手順が、前のインプリメンテーションチェック手順の間に取得された参照結果を指定する前記対応するターゲットコードセグメントの部分上で実施される、連続するインプリメンテーションチェック手順をさらに含む、
連続するプロセスである、請求項１５に記載の耐タンパ方法。
【請求項１７】
複数のコードセグメントを含むプログラム部の完全性をチェックするためのコンピュータ上で実行される完全性チェック方法であって、前記プログラム部は、ルートコードセグメントおよび複数のサブコードセグメントを含むコードセグメントの少なくとも１つのシーケンスを有し、前記完全性チェック方法は、耐タンパシステムによって操作可能であり、前記耐タンパシステムはコンピュータ読取可能な記録媒体を含み、前記完全性チェック方法は、任意のコードセグメントに対して：
ｉ）ターゲットコードセグメントの完全性をチェックして実行時結果を取得する実行時チェック手順を実施する工程であって、前記任意のサブコードセグメントに対する前記ターゲットコードセグメントが、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と；
ｉｉ）前記実行時結果を参照結果と比較する工程と、
を含み、
前記コンピュータ読取可能な記録媒体は記録されたプログラムコード部の複数のプログラムコードセグメントを有する完全性チェック方法。
【請求項１８】
前記完全性チェック方法が：
第一のサブコードセグメントに対して１つの前記実行時結果を取得するための第一の実行時チェック手順であって、第一のサブコードセグメントは、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントであり、ここで、前記第一の実行時チェック手順が、保護すべきプログラムの属性を指定する前記ルートコードセグメントの部分上で実施される、第一の実行時チェック手順を含み：
サブコードセグメントの前記シーケンスの各サブコードセグメントに対する連続する実行時チェック手順であって、各サブコードセグメントに対する前記実行時チェック手順が、前の実行時チェック手順の間に取得された実行時結果を指定する前記対応するターゲットコードセグメントの部分上で実施される、連続する実行時チェック手順をさらに含む、
連続するプロセスである、請求項１７に記載の完全性チェック方法。
【請求項１９】
プログラム部の完全性をチェックするための完全性チェックシステムであって、耐タンパシステムは、前記プログラム部の複数のプログラムコードセグメントがその上に記憶されたコンピュータ読み取り可能記憶媒体を含み、前記プログラムコードセグメントは、コードセグメントのシーケンスを定義し、ここで、コードセグメントの前記シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含み、前記耐タンパシステムはさらに；
ターゲットコードセグメントの完全性をチェックして実行時結果を取得するよう操作可能であり、任意のサブコードセグメントに対する前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントであり；ならびに、前記実行時結果を、前記任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である、実行時チェック部、を含む完全性チェックシステム。
【請求項２０】
第一のサブコードセグメントの実行時チェック部であって、第一のサブコードセグメントが、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントである、前記第一のサブコードセグメントの実行時チェック部が、保護すべきプログラムの属性を指定する前記ルートコードセグメントの部分上で第一実行時チェック手順が実施されるように操作可能であり、ならびに：
各連続するサブコードセグメントの前記実行時チェック部が、前の実行時チェック部によって取得された実行時結果を指定する前記対応するターゲットコードセグメントの部分上で連続する実行時チェック手順が実施されるように操作可能である、
請求項１９に記載の完全性チェックシステム。
【請求項２１】
コンピュータにロードされた場合に、請求項１７から２０のいずれか１項に記載の完全性チェック方法を前記コンピュータに実施させる、コンピュータプログラム。
【請求項２２】
キャリア媒体によって保持される、請求項２１に記載のコンピュータプログラム。
【請求項２３】
前記キャリア媒体が、記録媒体である、請求項２２に記載のコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアセキュリティの分野全般、および不正な改ざんに対するコンピュータプログラムの耐性を高めるための技術全般に関する。特に、本発明は、プログラムコードに対する不正な改変および／またはアクセスからのある程度の保護を提供することを目的とするプログラム保護技術に関する。
【背景技術】
【０００２】
エンドユーザーのハードウェア上で実行するためのソフトウェアアプリケーションをリリースする場合、プログラム開発業者は、実質的に、そのアプリケーションのプログラムコードに対する完全なアクセスをユーザーに提供している。残念ながら、エンドユーザーの中には、例えば、不法コピーの入手、特定の機能に対する無許可のアクセスの取得、アプリケーションからのＩＰの盗用、悪質なコードの挿入、またはオンラインゲームでの不正行為の目的で、ソフトウェアアプリケーションを脅かそうと試みる者がいることは事実である。実際、ネットワーク上にて何百、何千というプレーヤーを同時にサポートすることが求められることの多いオンラインゲームに関して、オンライン上の不正行為の発生は、善良なプレーヤーによるゲームでの体験を著しく損ない得るものである。無許可のユーザーにより実行用コードへ自由にアクセスされると、多くの場合知的財産の喪失を招く可能性があり、セキュリティの脆弱性についてそのアプリケーションを調べる容易な手段をそのユーザーに提供することになる。さらに、アプリケーションが逆行分析（ｒｅｖｅｒｓｅ  ｅｎｇｉｎｅｅｒｅｄ）され、そして改変され、測定（ｍｅｔｅｒｉｎｇ）または利用管理が再コンパイルの前に取り除かれる場合があり、最終的には、コードの提供者にとっての収入が失われる結果となり得る。
【０００３】
従って、発行元が自分たちのプログラムをリリースする環境は、敵対的なものであると見なすことができる。従って、不正な改変および／もしくはコピーが関与する場合がある改ざんまたは悪用からのプログラムの保護に対する要求が存在する。
【０００４】
ハッキングをしようとする者の阻止、または改変および／もしくはコピーからのコンピュータプログラムの保護のために、数多くの耐タンパ技術がこれまでに提案されてきた。例えば、ソフトウェアプログラムに対してコピープロテクト技術を利用すること、または、例えば、パスワードもしくはシリアルナンバーアクセスを必要とするか、コピーを阻止するか、またはある方法でのプログラムの利用を限定するといった制限をプログラムにコードすること、が公知である。
【０００５】
ソフトウェアコードを「難読化する（ｏｂｆｕｓｃａｔｉｎｇ）」技術も提案されている。難読化されたコード、または覆い隠された（ｓｈｒｏｕｄｅｄ）コードとも称されるこのコードは、実行可能コードの一種であり、読み取りおよび理解を意図的に非常に困難にしている。プログラムフォールディング（ｐｒｏｇｒａｍ‐ｆｏｌｄｉｎｇ）として知られる難読化のサブセットを用いることも知られており、例えば、電気機器中のファームウェアの保護を試みるためのものである。プログラムフォールディングは、ソースコード内のランダムな位置からルーチンを呼び出し、それによって、実質的に、プログラムを実行中に飛び回らせることを含む。難読化コードは、逆行分析を阻止することはできるが、そのコードが読み取られ、理解され、従って改変され得るという可能性は依然として明確に存在する。このように、難読化コードは、低いレベルのセキュリティ手段を提供するに過ぎず、暗号化を例とする追加のセキュリティ手順と組み合わせて使用する必要のある場合が多い。さらに、最も一般的なソフトウェア逆行分析は、ターゲットであるコピープロテクトスキームを攻撃する。このようなスキームは、一般に、既存のオペレーティングシステム手順の呼び出しに大きく依存しており、このことにより、非難解化コードと共に用いられる同一のツールを用いることで、基本的なコードの難解化が容易にバイパスされる。さらに、読み取りおよび理解が困難である難解化コードは、ソフトウェアを悪用しようとする者だけでなく、ソフトウェアの作製者自身にとっても問題であり、それは、難解化コードのデバッグが本質的に非常に困難であるためである。その結果、多くの場合、コードのバージョンを２種類保持する必要があり：デバッグ用の非難解化コード、および配布用の難解化コードである。得られるセキュリティのレベルが低いことから、この追加の労力は、難解化コードの利点を上回ると見なされる場合が多く、従って、別の選択肢としての方法が求められている。
【発明の概要】
【課題を解決するための手段】
【０００６】
本発明の好ましい実施形態は、プログラムまたはその一部分に、そのプログラム開発者によって指定された属性に対する、これらの属性が可能な限り長期間にわたって実効性を有することを確保するよう試みるための、ある程度の保護を提供することを目的とする。好ましい実施形態は、さらに、プログラムの改変を例とする、元の作成者またはプログラム開発者の意思に反するコンピュータプログラムの不正な改ざんに対する保護も目的とする。より詳細には、本発明の好ましい実施形態は、利用／アクセス／配布の方針に実効性を持たせる役目を有する機能を例とするプログラムの属性をエンドユーザーが無効とすることを阻止するために、アプリケーションおよび／またはデータの不正な改変に対するある程度の保護を提供することを目的とする。
【０００７】
本発明の第一の局面によると、改ざんに対するプログラムコード部の保護のための耐タンパ方法が提供され、この耐タンパ方法は：
該プログラムコード部を複数のコードセグメントに分割する工程と；
該コードセグメントのシーケンスを定義する工程であって、ここで、該コードセグメントのシーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含む、工程と；
各サブコードセグメントに、ターゲットコードセグメントの完全性をチェックするための完全性チェック部（ｉｎｔｅｇｒｉｔｙ  ｃｈｅｃｋｉｎｇ  ｐｏｒｔｉｏｎ）を提供する工程であって、任意のサブコードセグメントの該ターゲットコードセグメントは、該ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と；
を含み、
ここで、任意のサブコードセグメントの完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、該実行時結果を参照結果と比較するように操作可能である。
【０００８】
読者には、コードセグメントの「シーケンス」が、順々に続くコードセグメント、すなわち、チェーンを形成するコードセグメントの連続または一連のコードセグメントを意味することは理解されるであろう。従って、サブコードセグメントの各々に組み込まれた完全性チェック機能は、実質的にセグメントを互いに結合させ、連結されたチェックのチェーンを形成する。
【０００９】
本発明に関して、連続的に隣接するコードセグメントが、コードシーケンスの定義されたシーケンス内の隣接するコードセグメントを意味するものであり、必ずしも物理的な隣接コードセグメントを意味するものではないことは理解されたい。
【００１０】
その、または各々のシーケンスは、開発者によって設定された属性を指定するプログラム部を定義する属性を有する少なくとも１つのセグメントを含むことが好ましい。例えば、この属性は、プログラムの利用を限定または管理するための規則、利用の要求事項、または制限を定義するものであってよい。従って、本発明の好ましい実施形態は、有利に、海賊ユーザー（ｐｉｒａｔｅ  ｕｓｅｒｓ）に対する保護されたアプリケーションのアップセリング（ｕｐ  ｓｅｌｌｉｎｇ）等のビジネスモデルをサポートする能力を含む、候補プログラムに対して魅力的な様々な保護を適用可能とすることができる。さらに、通常はアプリケーションの適正利用の方針を定義する、属性を定義するプログラム部の内容を適切に選択することにより、本発明の実施形態は、クライアントの保護；ＤＲＭの保護；ライセンス管理；ＩＰ保護；海賊版配布（ｐｉｒａｔｅ  ｄｉｓｔｒｉｂｕｔｉｏｎ）の追跡など、広い範囲の保護の要求に対して適用することができる。
【００１１】
コンピュータゲームに関しては、プログラムは、例えば、３０日間のトライアル期間を定めてよく、またはコンピュータゲームの利用をレベル５までに制限してもよい。従って、このような状況では、本発明の実施形態によると、トライアル期間の長さがシーケンスによって保護されるべき１つの属性を形成するコードシーケンスを定義することができる。従って、ハッカーは、トライアル期間を長くするか、またはプレイが許容される上限レベルを上げるようにプログラムコードを変えることを試みたいと考える可能性がある。しかし、本発明を具体化する耐タンパ方法によって保護されたプログラム部の場合、固有の完全性チェックシステムに失敗することなくこれを達成しようとすれば、ハッカーは、属性を定義するプログラム部のコードだけでなく、任意のターゲットコードセグメントに対して得られた実行時結果が、保存された参照結果に照らして確認されることが可能であることを確実にするために、コードシーケンス内のすべてのコードセグメントに対するコードも改変しなければならなくなる。この方法でのコードセグメント各々の改変は特に困難ではない可能性があるものの、この保護を破るためにシーケンス内のすべてのサブコードセグメントに重大な変化を起こすこのプロセスは、極めて労力と時間を費やすものであり、任意のアプリケーション内に埋め込まれたチェックのシーケンスの数、および各シーケンスに含まれるコードセグメントの数に応じて、何百時間、またはさらには何千時間が必要となり得る。
【００１２】
好ましくは、ルートコードセグメントは、プログラムの属性を定義するプログラム部を含む。コードセグメントのシーケンスは、ルートコードセグメントが任意の属性を指定するもしくは定義するコードまたはメモリを含むか、またはこれと関連するように定められることが好都合であるが、シーケンスの属性を定義するセグメントは、サブコードセグメントを含むいずれのコードセグメントであってもよいことは理解されたい。
【００１３】
好ましい実施形態によると、耐タンパ方法は、プログラムコード部に埋め込まれたチェックの分布または「トポロジー」を確立することを含む。定義されたトポロジーは、実行時に各完全性チェック部が指定されたターゲットコードセグメント上でチェック手順を実施するという意味で、コードセグメントが、分割されたソースコードまたはコンパイルされたコードの範囲内にて互いに実質的に「連結」される方法を表す。好ましくは、トポロジーは、そのプログラム部のコードセグメントがコードセグメントの複数のシーケンスを定義する候補プログラム部に対して確立され、ここで、１若しくは２つ以上のコードセグメントが、２つ以上のコードシーケンスの一部を形成する。トポロジーの確立は、１若しくは２つ以上のサブコードセグメントが、従って実行時に２つ以上のターゲットコードセグメント上でチェック手順を実施するようにそのサブコードセグメントが操作可能であるように定義された複数のターゲットコードセグメントを持つ完全性チェック部を含むように行うことができる。特に好ましい実施形態によると、トポロジーは、いわゆる「逆ツリー構造（ｉｎｖｅｒｔｅｄ  ｔｒｅｅ  ｓｔｒｕｃｔｕｒｅ）」を含む任意のプログラム部に対して確立することができる。そのような実施形態によると、サブコードセグメントは、この構造の異なる「レベル」を形成すると見なすことができ、ルートコードセグメントがツリーの「最上部（ｔｏｐ）」を定義し、ここで、任意のレベルのサブコードセグメントはすべて、「その上にある」（ルートコードセグメントに向かって）レベルに含まれる各サブコードセグメント上にてチェック手順を実施するよう操作可能である。
【００１４】
本発明の実施形態による耐タンパ方法の実施は、通常、各サブコードセグメントのその、もしくは各々の参照結果が演算処理される、参照結果演算処理プロセス（ｒｅｆｅｒｅｎｃｅ  ｒｅｓｕｌｔ  ｃｏｍｐｕｔａｔｉｏｎ  ｐｒｏｃｅｓｓ）を含む。このプロセスは、好ましくは、演算処理のシーケンスを実施して、コードセグメントの定義されたシーケンスの各々に対する参照結果を取得することを含む。
【００１５】
本発明の実施形態による任意のコードシーケンスに対して実施することができる参照結果演算処理プロセスについて簡単に説明する。チェック方向とは逆の方向へルートコードセグメントに連続して隣接する第一のサブコードセグメントに対する参照結果は、サブコードセグメントの完全性チェック部によって定義されるインプリメンテーションチェック手順（ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｃｈｅｃｋｉｎｇ  ｐｒｏｃｅｄｕｒｅ）を、その定義されたターゲットコードセグメント、すなわちルートコードセグメント上で実施することによって取得される。これは、保護すべきプログラムの属性を指定するルートコードセグメントのコードまたはメモリ上で巡回冗長チェックを実施して、第一の値、または第一の「参照結果」を取得することを含んでよい。実行時には、完全性チェック部は、第一の「実行時結果」を取得するために、ルートコードセグメントのメモリのあらかじめ定義された領域上で実行時チェック手順を実施するように操作可能であり、さらに、この実行時結果をそれと関連する参照結果と比較するようにも操作可能である。ルートコードセグメントの完全性は、この比較によって確認され、確認には、実行時結果が参照結果と等しいか、またはある所定の関係によって関連性を有することを必要としてよい。
【００１６】
同様に、チェック方向とは逆の方向へ第一のサブコードセグメントに連続して隣接する第二のサブコードセグメントに対する参照結果は、インプリメンテーションチェック手順を、その定義されたターゲットコードセグメント、すなわち第一のサブコードセグメント上で実施することによって取得される。インプリメンテーションチェック手順は、例えば、第一の参照結果を指定する第一のコードセグメントのメモリまたはコード上で実施される。このようにして、第二の参照結果（第一の参照結果に依存する）が取得される。実行時には、第二のサブコード部の完全性チェック部は、第一の参照結果に対するものとしての第一の実行時結果の値を指定するメモリまたはコード上で実行時チェック手順を実施するように操作可能であり、さらに、得られた第二の実行時結果を第二のサブコードセグメントと関連する第二の参照結果と比較するようにも操作可能である。
【００１７】
この参照結果演算処理プロセスは、シーケンスに含まれる各サブコードセグメントに対するその（もしくは各々の）参照結果が定義されるまで、この方法で継続される。
【００１８】
本発明の第二の局面によると、複数のコードセグメントを含むプログラム部の完全性をチェックするための完全性チェック方法が提供され、該プログラム部は、ルートコードセグメントおよび複数のサブコードセグメントを含むコードセグメントの少なくとも１つのシーケンスを持ち、この完全性チェック方法は、任意のコードセグメントに対して：
ｉ）ターゲットコードセグメントの完全性をチェックして実行時結果を取得する実行時チェック手順を実施する工程であって、該任意のサブコードセグメントに対する該ターゲットコードセグメントが、該ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と；
ｉｉ）該実行時結果を参照結果と比較する工程と、
を含む。
【００１９】
本発明の第一の局面の実施形態によって得られたアプリケーションまたはプログラム部が、コンピュータの実行環境または実行システム内で実行される場合、プログラムは、実行時に、第二の局面の実施形態による完全性チェック方法を実施するように操作可能である。任意のサブコードセグメントに対して定義された実行時チェック手順は、そのサブコードセグメントがプログラム部の一部分として実行される場合に起動されることは理解されたい。
【００２０】
本発明の好ましい実施形態は、有利に、プログラム部を改ざんから保護する強固で効果的な手段を提供する。例えばプログラムの適正利用を定義する属性を改変する目的で、本発明の実施形態によって提供される保護を破るかまたは弱めるためには、本発明の好ましい実施形態による耐タンパ方法によって保護されたプログラムの場合、エンドユーザーは、その定義された属性と関連するコードシーケンスに含まれる一つ一つのコードセグメントすべてのプロパティを識別して変更する必要があろう。従って、すべてのチェックを除去することによってのみ、アプリケーションの自由な改変が可能となる。これは不可能な作業ではないが、完了させるのに何百時間、またはさらには何千時間が必要となり得る極めて労力と時間を費やすものである。本発明の実施形態は、ハッカーがアプリケーションに検出されない改変を施すことを阻止する効果的な保護メカニズムを提供するという点で有利である。
【００２１】
特に、本発明の好ましい実施形態は、提供者によって指定されたプログラムの１若しくは２つ以上の属性を、プログラムおよびそれ自体の完全性を確認する単純で相互に連結する多数のチェックという手段により、不正な改ざんから保護することを可能とする。このチェックは、各々が別のものをチェックし、最終的には巨大なチェックのウェブを提供するという意味で、「相互に連結」している。これは、互いに自己強化（ｓｅｌｆ‐ｂｕｔｔｒｅｓｓｉｎｇ）する分散した完全性チェックメカニズムとなる。エンドユーザーによって施されたいかなる不正な改変も、有利に、このシステムによって検出され、好ましくは、これらのチェックを迂回しようとする試みが阻止される。
【００２２】
チェック手順に適するであろうチェックアルゴリズムまたは機能は、数多くの種類が存在する。好ましくは、一つの該サブコードセグメントの完全性チェック部は、ターゲットコードセグメント上でのチェックサム手順の実施を含むチェック手順を定義する。これは、例えば巡回冗長チェックであってよい。
【００２３】
特定の好ましい実施形態によると、候補アプリケーション、またはプログラムコード部は、各セグメントがプログラムコード部の機能を含むようにコードセグメントに分割される。これは、アプリケーションの極めて重要なコンポーネントが確実に完全性チェック手順に掛けられるという点で有利である。このセグメントは、好ましくは、定義されたセグメントの一部分を形成しないプログラム部のコードが存在しないことを確実にするために、機能に隣接するコードを含むように定義される。
【００２４】
本発明の好ましい実施形態は、任意のプログラム部またはアプリケーション内に、例えばサイズが数メガバイトであるアプリケーション内で一千個から一万個までの間といった、非常に数多くのチェックを挿入することを含むことが想定される。プログラムコード部は、１若しくは２つ以上のセグメントが２つ以上のコードシーケンスの一部分を形成するように、複数のコードシーケンスを含んでよい。
【００２５】
本発明の第三の局面によると、改ざんからプログラムコード部を保護するための耐タンパシステムが提供され、この耐タンパシステムは、そこにプログラムコード部の複数のプログラムコードセグメントが記憶されたコンピュータ読み取り可能記憶媒体を含み、該プログラムコードセグメントは、コードセグメントのシーケンスを定義し、ここで、コードセグメントの該シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含み；
ここで、各サブコードセグメントは、ターゲットコードセグメントの完全性をチェックするための完全性チェック部を含み、任意のサブコードセグメントに対する該ターゲットコードセグメントは、該ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントであり；
ならびに、ここで、任意のサブコードセグメントの完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、そして該実行時結果を、該任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である。
【００２６】
本発明の第一の局面の実施形態によると、必要なチェックコードまたは完全性チェック機能、すなわち、各サブコードセグメントに対する完全性チェック部および参照部（ここに参照結果が含まれる）を、ソースコードレベルにて、すなわち、直接ソースコードへ挿入することが可能である。別の選択肢として、チェックコードを、アプリケーションのコンパイルを行った後に続いてアプリケーションに挿入することが可能である。従って、第一の局面の一つの実施形態の耐タンパ方法によると、プログラム部は、ソースコードを含む。別の選択肢として、本発明の第一の局面の別の実施形態の耐タンパ方法によると、プログラム部は、コンパイルされたコードを含む。
【００２７】
基本アプリケーション（ｕｎｄｅｒｌｙｉｎｇ  ａｐｐｌｉｃａｔｉｏｎ）またはプログラム部へ、ソースコードまたはオブジェクトコードのいずれかとしてチェック部を挿入することは、多くの方法で達成することができる。例えば、チェックをコード内へ手作業で挿入することが可能であり、そこでは、プログラム開発者が、定義されたプログラムコードセグメントへチェックコードを挿入する。しかし、これは、非常に労力を必要とする。別の選択肢として、この目的で作成された１若しくは２つ以上のマクロの使用を含む前処理技術によって、完全性チェック部および参照結果をサブコードセグメントへ挿入することが可能である。
【００２８】
さらに別の選択肢として、メタプログラミング技術が、チェックのネットワークをソースコードレベルで適用するのに有用であり得る。そのような技術は、チェック部のアプリケーションへの挿入の自動化が可能となることから、特に有利であり得る。特に、抽象構文ツリー（ＡＳＴ）等のデータ構造を利用するメタプログラミング技術では、改変を行いやすい形の任意のプログラムコード部またはアプリケーションの解析が可能となる。従って、完全性チェック部および参照結果は、好都合に、アプリケーションの分割されたセグメント全体を通してインストールすることが可能である。この手法は、ソースコードレベルで適用される挿入されたチェックがアプリケーションコードでコンパイルされるために、これらが自然に隠されるか難読化されるという点でも有利である。従って、ソースコードレベルのメタプログラミング手法を用いることは、完全性チェックコードに基本アプリケーションコードを点在させる得られたソースコード上で実行される最適化コンパイラにより、挿入されたチェックを隠すことが可能となるという点で有益である。
【００２９】
上記の実施形態または局面のいずれにおいても、種々の機能は、ハードウェアにて、または１若しくは２個以上のプロセッサ上で実行されるソフトウェアモジュールとして実現することができる。一つの局面または実施形態の機能は、その他の局面または実施形態のいずれにも適用することができる。
【００３０】
本発明は、本明細書で述べる技術を実現するためのコンピュータプログラムまたはコンピュータプログラム製品、ならびに本明細書で述べる技術を実現するためのプログラムをその上に記憶させたコンピュータ読み取り可能記憶媒体も提供する。本発明を具体化するコンピュータプログラムは、コンピュータ読み取り可能媒体上に記憶されていてよく、または、例えば、インターネットウェブサイトから提供されるダウンロード可能データシグナル等のシグナルの形であってもよく、または、その他のいずれの形であってもよい。
【図面の簡単な説明】
【００３１】
本発明をより深く理解するために、およびそれを実施することができる方法を示すために、例として、添付の図面を参照する。
【００３２】
【図１】図１は、本発明の実施形態による耐タンパシステムを示す図である。
【００３３】
【図２】図２は、図１に示す耐タンパシステムのコードシーケンスを示す図である。
【００３４】
【図３】図３は、本発明の実施形態による参照結果演算処理プロセスＰ、および実行時に実施される完全性チェックプロセスを示す図である。
【００３５】
【図４】図４は、本発明を具体化し、逆ツリー構造を有する耐タンパシステムの概略図を示す。
【００３６】
【図５】図５は、本発明を具体化し、メタプログラミングを利用する耐タンパ方法に従って含まれる工程を示す図である。
【発明を実施するための形態】
【００３７】
図１は、３個のルートコードセグメントＡ、Ｂ、およびＣ、ならびにコードセグメントの８個のシーケンスを形成する複数のサブコードセグメントＳを含む複数のコードセグメントに分割されたプログラムコード部を示す。この実施形態では、プログラムコード部はコンパイルされており、従って、サブコードセグメントの位置は、コンパイルされたアプリケーション全体を通してのその分布を表す。
【００３８】
この実施形態では、ルートコードセグメントは、開発者によって指定されたプログラムの適正利用の属性を定義する手段を含むコードのセグメントを表す。３つの属性を含んでよく、例えば：プログラムの利用に科された制限、または、プログラムのユーザーがアプリケーションの完全バージョンを購入したか、もしくはアプリケーションを利用するライセンスを有しているかのチェック等、プログラムによって実施されることになるチェック、である。
【００３９】
セグメントの網掛けの違いは、アプリケーションコード内のチェックコードの存在を隠すために用いられた方法を表す。任意のサブコードセグメントからの各矢印は、チェック方向へその任意のサブコードセグメントに連続して隣接するターゲットコードセグメントに向かっている。例えば、サブコードセグメントＳ１のターゲットコードセグメントは、サブコードセグメントＳ２である。さらに、サブコードセグメントＳ３のターゲットコードセグメントは、ルートコードセグメントＡである。矢印の太さは、元のコードセグメントの完全性チェック部によって用いられるチェックプロセスの種類を表している。従って、この実施形態では、２種類のチェック手順が用いられる。これらは、例えば、値を得るためにターゲットコードセグメントの定義された領域のチェックサムを取得するように操作可能である巡回冗長チェック、またはその他のある種のチェックサム、またはその他のチェック方法であってよい。
【００４０】
図２は、ルートコードセグメントＢに関連する図１の実施形態のシーケンスの一つを示す。サブコードセグメントＢａからＢｇの各々に対する参照結果の演算処理のために、参照結果演算処理プロセスが実施される。これは、以下で述べるようにして実現することができる。
【００４１】
具体的には、本実施形態によると、サブコードセグメントＢａに対する参照結果を、そのターゲットコードセグメント、すなわちルートコードセグメントＢ上にてインプリメンテーションチェック手順を実施することで取得する。これは、ルートコードセグメントＢと関連し、プログラムの属性を指定するメモリの所定部上で巡回冗長チェック（例えば）を実施して、第一の値または第一の「参照結果」を取得することを含む。実行時は、完全性チェック部が、第一の「実行時結果」を取得するために、ルートコードセグメントＢのメモリの定義された部分上で実行時チェック手順を実施するように操作可能であり、さらにこの実行時結果をそれと関連する参照結果と比較するようにも操作可能である。ルートコードセグメントの完全性は、この比較によって確認され、確認には、実行時結果が参照結果と等しいか、またはある所定の関係によって関連性を有することを必要してよい。
【００４２】
同様に、第二のサブコードセグメントＢｂに対する参照結果は、インプリメンテーションチェック手順を、そのターゲットコードセグメント、すなわちサブコードセグメントＢａ上で実施することによって取得される。インプリメンテーションチェック手順は、第一の参照結果を含むサブコードセグメントＢａと関連するメモリのあらかじめ定義された領域上で実施される。このようにして、Ｂａに対する第一の参照結果に依存するＢｂに対する参照結果が得られ、続いて記憶される。実行時には、サブコードセグメントＢｂの完全性チェック部は、第一の実行時結果（第一の参照結果に対するものとして）を記憶するＢａと関連するメモリの一部分上で実行時チェック手順を実施するように操作可能であり、さらに、得られた第二の実行時結果をサブコードセグメントＢｂと関連する第二の参照結果と比較するようにも操作可能である。
【００４３】
この参照結果演算処理プロセスは、サブコードセグメントＢａからＢｇの各々に対するその（もしくは各々の）参照結果が得られ、記憶されるまで、この方法で継続される。
【００４４】
図３の左側は、ルートコードセグメントＣならびにサブコードセグメントＣａおよびＣｂを含むコードシーケンスに対する本発明の実施形態による参照結果演算処理プロセスＰを示す。参照結果演算処理プロセスＰは、サブコードセグメントＣａの参照結果Ｒ１を定義するための第一の参照結果演算処理プロセスＰ１、およびこれに続くサブコードセグメントＣｂの参照結果Ｒ２を得るための第二の参照結果演算処理プロセスＰ２を順に実施することを含む。プロセスＰ１は、インプリメンテーションチェックプロセスを実施することを含み、そこでは、チェックサム手順がルートコードセグメントＣのメモリ部Ｍｃ上で実施される。メモリ部Ｍｃは、例えばプログラム開発者によって定義された属性Ａを指定する。チェックサム手順は、第一の参照値Ｒ１として用いられる値を得る。値Ｒ１は、メモリ部ＭｃａＲ１に記憶／書き込みされる。第二の参照結果演算処理プロセスＰ２は、サブコードセグメントＣｂに対して実施され、ここで、チェックサムを含むインプリメンテーションチェックプロセスがサブコードセグメントＣａのメモリ部ＭｃａＲ１上で実施され、第二の参照値Ｒ２として用いられる値が得られる。Ｒ２の値はメモリ部ＭｃｂＲ２に記憶される。
【００４５】
図３の右側は、実行時にサブコードセグメントＣａおよびＣｂによって実施される完全性チェック方法を示す。従って、サブコードセグメントＣａの完全性チェック部は、サブコードセグメントの実行の開始時、または開始の直後に起動される完全性チェック方法を実施するように操作可能である。Ｃａによって実施されることになる完全性チェック方法に従って、実行時チェックプロセスが実施され、そこでは、ルートコードセグメントＣのメモリ部Ｍｃ上でチェックサム手順が実施され、実行時結果ｒ１が取得される。この結果は、メモリ部Ｍｃ１Ｒ１に記憶された参照結果Ｒ１と比較される。この比較の結果に従って、完全性チェック手順は、通過または失敗となる。さらに、実行時結果ｒ１は、メモリ部Ｍｃａｒ１に書き込まれる。メモリ部Ｍｃａｒ１上で実施されるチェックサム手順では、ｒ１がＲ１と等しい場合、メモリ部Ｍｃ１Ｒ１上で実施される同一のチェックサム手順と同じ結果が得られる。
【００４６】
サブコードセグメントＣｂの完全性チェック部は、完全性チェック手順を実施するように操作可能であり、これは、サブコードセグメントＣｂのメモリ部Ｍｃａｒ１をチェックして、実行時結果ｒ２を取得することを含む。従って、ｒ２の値は、サブコードセグメントＣａの完全性チェック部によって取得されたｒ１の値に依存する。
【００４７】
さらに、ｒ２とＲ２との比較が「通過」するのは、ｒ１とＲ１との比較も通過の場合だけである。
【００４８】
本発明の実施形態の利点は、ハッカーが属性Ａを、例えばＡ’となるように改変しようとした場合にどうなるかを考えることで理解することができる。この場合、実行時にＣａによって実施される完全性チェック手順が失敗することを防ぐために、ハッカーは、参照値Ｒ１の値も改変して、実行時結果ｒ１とＲ１との比較が都合良く進むようにする必要がある。さらに、メモリ部Ｍｃａｒ１に記憶された情報の有効性がサグコードセグメントＣｂによってチェックされるため、次に実行時にＣｂによって実施される完全性チェック手順が失敗とならないことを確実にするために、ハッカーは、参照値Ｒ２の値を改変して、実行時結果ｒ２とＲ２との比較が都合良く進むようにする必要がある。実質的に、ルートコードセグメント（例えば）内で指定された属性を改変するためには、ハッカーは、そのルートコードセグメントと連結したすべてのサブコードセグメントの追跡および改変を行う必要がある。
【００４９】
図４は、複数のコードセグメントに分割された候補プログラム部の概略図を示し、ここで、チェック手順のトポロジーは、逆ツリー構造の形で定義される。従って、ルートコード部Ｄは、２つの一次レベルサブコードセグメント（ｐｒｉｍａｒｙ  ｌｅｖｅｌ  ｓｕｂ‐ｃｏｄｅ  ｓｅｇｍｅｎｔｓ）Ｄａ１およびＤａ２によって実行時にチェックされる。さらに、Ｄａ１およびＤａ２は、４つの二次レベルサブコードセグメント（ｓｅｃｏｎｄａｒｙ  ｌｅｖｅｌ  ｓｕｂ‐ｃｏｄｅ  ｓｅｇｍｅｎｔｓ）Ｄｂ２からＤｂ４の各々によって実行時にチェックされる。従って、この例では、Ｄａ１がコードセグメントの４つのシーケンスの一部分を形成し、Ｄｂ２がコードセグメントの４つのシーケンスの一部分を形成して、コードセグメントのシーケンスを合計で８つ定義することができる。
【００５０】
図５は、ターゲットアプリケーションを改ざんから保護するための本発明を具体化する耐タンパ方法に含まれる工程を示す。図５に示すように、アプリケーションのソースコードは、構文解析されて、抽象構文ツリー（ＡＳＴ）としてのその表現（ｒｅｐｒｅｓｅｎｔａｔｉｏｎ）が作り出される。小サイズのメタプログラムを次に用いて、チェックコードを無理なく挿入可能であるターゲット機能一式をコンパイルする。ここで用いられる基準としては：挿入されたチェックを十分に隠すホストコードの能力；例えば、ターゲット機能内のコードが時間制約型内部ループ（ｔｉｍｅ‐ｃｒｉｔｉｃａｌ  ｉｎｎｅｒ  ｌｏｏｐ）の一部分であるかどうか、を例とする性能に関する適切性；アプリケーションによってその機能が呼び出される回数、が挙げられる。
【００５１】
ターゲット機能は、基本ターゲットアプリケーションが分割されるコードセグメントの基礎を形成する。完全性チェックネットワークのトポロジーが決定される。
【００５２】
小サイズのメタプログラムを用いて、ターゲット機能へチェックコードが挿入される。挿入されたコードは、実行時には、チェックされるべき機能に対する参照を含んでいるべきである。この段階では、ダミー値がチェックすべきメモリの領域に挿入され、そのチェックが作り出すべき値である。
【００５３】
コード（挿入されたチェックを含む）が、例えば、標準的なＣ＋＋コンパイラを用いて、実行可能（ＥＸＥ）ファイルへコンパイルされる。コンパイルのリンキングフェーズ（ｌｉｎｋｉｎｇ  ｐｈａｓｅ）では、いわゆるＭＡＰファイルが作成され、これには、最終的にＥＸＥ中のどこに各アプリケーション機能に対するコードが存在するようになったかについての情報が含まれる。これから、実行時メモリ中のどこにこれらの機能が存在するかを推測することが可能である。
【００５４】
チェックを挿入されたターゲットコードセグメントの各々に対して、数多くの工程が実施される：
‐これらのコードセグメントに対するコンパイルされたコードが、ＭＡＰファイルからのデータを用いて検出される；
‐このチェックがターゲットとすべきコードセグメントが確立される（上記で決定されたトポロジーから）；
‐そのコードセグメントに対するコードが、ＭＡＰファイルを用いて検出される；
‐その機能に対するコードのチェックサム（またはその他の完全性チェック手順）が演算処理される；
‐このチェックがトポロジーによって要求されたものを確かにターゲットとするように、上記で挿入されたダミー値にパッチを施す。さらに、実行時チェックが見つけ出そうとするはずである値として演算処理されたチェックサムを挿入する。この値が実行時に見つけられない場合、問題のコードセグメントは改変されており：ハッキングが行われたということである。
【００５５】
このプロセスにより、保護されたＥＸＥ、すなわち、保護されプログラム部、または本発明を具体化する耐タンパシステムが得られる。
【００５６】
チェックに正しい順序でパッチを施すことが重要であり、すなわち、ルートコードセグメントを有するコードシーケンスの「最上部」から開始し、下へ向かって作業を行う。最上部のパッチを施された機能は、それより下部のチェックのために、それ自体がチェックサムを受けるべきである。
【００５７】
いくつかの実施形態および例によって本発明を図示および説明してきたが、本発明の原理から逸脱することなく、種々の方法での本発明の変更、具体化、加工、または応用が可能であることは明らかであるはずである。本発明は、携帯記憶媒体上に記憶されたソフトウェアプログラムおよびデータ構造への組み込みが可能であり、デジタル通信もしくはその他の伝送媒体によって伝送可能であり、またはコンピュータメモリ内に記憶可能である。そのようなプログラムおよびデータ構造をコンピュータ上で実行することで、本発明を具体化する方法を実施し、および本明細書で述べる能力を有する機械として、もしくは装置の一部分として動作させることが可能である。
【図１】
0005455914.tif 000002
【図２】
0005455914.tif 000003
【図３】
0005455914.tif 000004
【図４】
0005455914.tif 000005
【図５】
0005455914.tif 000006