説明

耐タンパ技術

本出願は、プログラムコード部を改ざんから保護するための耐タンパ技術について記載する。記載の技術によると、ルートコードセグメントおよび複数のサブコードセグメントを持つコードセグメントのシーケンスが定義される。各サブコードセグメントは、ターゲットコードセグメントの完全性をチェックするための完全性チェック部(integrity checking portion)を備える。実行時、任意のサブコードセグメントの完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、これを参照結果と比較して、プログラムのターゲット部が改ざんされていないことを確認する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェアセキュリティの分野全般、および不正な改ざんに対するコンピュータプログラムの耐性を高めるための技術全般に関する。特に、本発明は、プログラムコードに対する不正な改変および/またはアクセスからのある程度の保護を提供することを目的とするプログラム保護技術に関する。
【背景技術】
【0002】
エンドユーザーのハードウェア上で実行するためのソフトウェアアプリケーションをリリースする場合、プログラム開発業者は、実質的に、そのアプリケーションのプログラムコードに対する完全なアクセスをユーザーに提供している。残念ながら、エンドユーザーの中には、例えば、不法コピーの入手、特定の機能に対する無許可のアクセスの取得、アプリケーションからのIPの盗用、悪質なコードの挿入、またはオンラインゲームでの不正行為の目的で、ソフトウェアアプリケーションを脅かそうと試みる者がいることは事実である。実際、ネットワーク上にて何百、何千というプレーヤーを同時にサポートすることが求められることの多いオンラインゲームに関して、オンライン上の不正行為の発生は、善良なプレーヤーによるゲームでの体験を著しく損ない得るものである。無許可のユーザーにより実行用コードへ自由にアクセスされると、多くの場合知的財産の喪失を招く可能性があり、セキュリティの脆弱性についてそのアプリケーションを調べる容易な手段をそのユーザーに提供することになる。さらに、アプリケーションが逆行分析(reverse engineered)され、そして改変され、測定(metering)または利用管理が再コンパイルの前に取り除かれる場合があり、最終的には、コードの提供者にとっての収入が失われる結果となり得る。
【0003】
従って、発行元が自分たちのプログラムをリリースする環境は、敵対的なものであると見なすことができる。従って、不正な改変および/もしくはコピーが関与する場合がある改ざんまたは悪用からのプログラムの保護に対する要求が存在する。
【0004】
ハッキングをしようとする者の阻止、または改変および/もしくはコピーからのコンピュータプログラムの保護のために、数多くの耐タンパ技術がこれまでに提案されてきた。例えば、ソフトウェアプログラムに対してコピープロテクト技術を利用すること、または、例えば、パスワードもしくはシリアルナンバーアクセスを必要とするか、コピーを阻止するか、またはある方法でのプログラムの利用を限定するといった制限をプログラムにコードすること、が公知である。
【0005】
ソフトウェアコードを「難読化する(obfuscating)」技術も提案されている。難読化されたコード、または覆い隠された(shrouded)コードとも称されるこのコードは、実行可能コードの一種であり、読み取りおよび理解を意図的に非常に困難にしている。プログラムフォールディング(program‐folding)として知られる難読化のサブセットを用いることも知られており、例えば、電気機器中のファームウェアの保護を試みるためのものである。プログラムフォールディングは、ソースコード内のランダムな位置からルーチンを呼び出し、それによって、実質的に、プログラムを実行中に飛び回らせることを含む。難読化コードは、逆行分析を阻止することはできるが、そのコードが読み取られ、理解され、従って改変され得るという可能性は依然として明確に存在する。このように、難読化コードは、低いレベルのセキュリティ手段を提供するに過ぎず、暗号化を例とする追加のセキュリティ手順と組み合わせて使用する必要のある場合が多い。さらに、最も一般的なソフトウェア逆行分析は、ターゲットであるコピープロテクトスキームを攻撃する。このようなスキームは、一般に、既存のオペレーティングシステム手順の呼び出しに大きく依存しており、このことにより、非難解化コードと共に用いられる同一のツールを用いることで、基本的なコードの難解化が容易にバイパスされる。さらに、読み取りおよび理解が困難である難解化コードは、ソフトウェアを悪用しようとする者だけでなく、ソフトウェアの作製者自身にとっても問題であり、それは、難解化コードのデバッグが本質的に非常に困難であるためである。その結果、多くの場合、コードのバージョンを2種類保持する必要があり:デバッグ用の非難解化コード、および配布用の難解化コードである。得られるセキュリティのレベルが低いことから、この追加の労力は、難解化コードの利点を上回ると見なされる場合が多く、従って、別の選択肢としての方法が求められている。
【発明の概要】
【課題を解決するための手段】
【0006】
本発明の好ましい実施形態は、プログラムまたはその一部分に、そのプログラム開発者によって指定された属性に対する、これらの属性が可能な限り長期間にわたって実効性を有することを確保するよう試みるための、ある程度の保護を提供することを目的とする。好ましい実施形態は、さらに、プログラムの改変を例とする、元の作成者またはプログラム開発者の意思に反するコンピュータプログラムの不正な改ざんに対する保護も目的とする。より詳細には、本発明の好ましい実施形態は、利用/アクセス/配布の方針に実効性を持たせる役目を有する機能を例とするプログラムの属性をエンドユーザーが無効とすることを阻止するために、アプリケーションおよび/またはデータの不正な改変に対するある程度の保護を提供することを目的とする。
【0007】
本発明の第一の局面によると、改ざんに対するプログラムコード部の保護のための耐タンパ方法が提供され、この耐タンパ方法は:
該プログラムコード部を複数のコードセグメントに分割する工程と;
該コードセグメントのシーケンスを定義する工程であって、ここで、該コードセグメントのシーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含む、工程と;
各サブコードセグメントに、ターゲットコードセグメントの完全性をチェックするための完全性チェック部(integrity checking portion)を提供する工程であって、任意のサブコードセグメントの該ターゲットコードセグメントは、該ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と;
を含み、
ここで、任意のサブコードセグメントの完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、該実行時結果を参照結果と比較するように操作可能である。
【0008】
読者には、コードセグメントの「シーケンス」が、順々に続くコードセグメント、すなわち、チェーンを形成するコードセグメントの連続または一連のコードセグメントを意味することは理解されるであろう。従って、サブコードセグメントの各々に組み込まれた完全性チェック機能は、実質的にセグメントを互いに結合させ、連結されたチェックのチェーンを形成する。
【0009】
本発明に関して、連続的に隣接するコードセグメントが、コードシーケンスの定義されたシーケンス内の隣接するコードセグメントを意味するものであり、必ずしも物理的な隣接コードセグメントを意味するものではないことは理解されたい。
【0010】
その、または各々のシーケンスは、開発者によって設定された属性を指定するプログラム部を定義する属性を有する少なくとも1つのセグメントを含むことが好ましい。例えば、この属性は、プログラムの利用を限定または管理するための規則、利用の要求事項、または制限を定義するものであってよい。従って、本発明の好ましい実施形態は、有利に、海賊ユーザー(pirate users)に対する保護されたアプリケーションのアップセリング(up selling)等のビジネスモデルをサポートする能力を含む、候補プログラムに対して魅力的な様々な保護を適用可能とすることができる。さらに、通常はアプリケーションの適正利用の方針を定義する、属性を定義するプログラム部の内容を適切に選択することにより、本発明の実施形態は、クライアントの保護;DRMの保護;ライセンス管理;IP保護;海賊版配布(pirate distribution)の追跡など、広い範囲の保護の要求に対して適用することができる。
【0011】
コンピュータゲームに関しては、プログラムは、例えば、30日間のトライアル期間を定めてよく、またはコンピュータゲームの利用をレベル5までに制限してもよい。従って、このような状況では、本発明の実施形態によると、トライアル期間の長さがシーケンスによって保護されるべき1つの属性を形成するコードシーケンスを定義することができる。従って、ハッカーは、トライアル期間を長くするか、またはプレイが許容される上限レベルを上げるようにプログラムコードを変えることを試みたいと考える可能性がある。しかし、本発明を具体化する耐タンパ方法によって保護されたプログラム部の場合、固有の完全性チェックシステムに失敗することなくこれを達成しようとすれば、ハッカーは、属性を定義するプログラム部のコードだけでなく、任意のターゲットコードセグメントに対して得られた実行時結果が、保存された参照結果に照らして確認されることが可能であることを確実にするために、コードシーケンス内のすべてのコードセグメントに対するコードも改変しなければならなくなる。この方法でのコードセグメント各々の改変は特に困難ではない可能性があるものの、この保護を破るためにシーケンス内のすべてのサブコードセグメントに重大な変化を起こすこのプロセスは、極めて労力と時間を費やすものであり、任意のアプリケーション内に埋め込まれたチェックのシーケンスの数、および各シーケンスに含まれるコードセグメントの数に応じて、何百時間、またはさらには何千時間が必要となり得る。
【0012】
好ましくは、ルートコードセグメントは、プログラムの属性を定義するプログラム部を含む。コードセグメントのシーケンスは、ルートコードセグメントが任意の属性を指定するもしくは定義するコードまたはメモリを含むか、またはこれと関連するように定められることが好都合であるが、シーケンスの属性を定義するセグメントは、サブコードセグメントを含むいずれのコードセグメントであってもよいことは理解されたい。
【0013】
好ましい実施形態によると、耐タンパ方法は、プログラムコード部に埋め込まれたチェックの分布または「トポロジー」を確立することを含む。定義されたトポロジーは、実行時に各完全性チェック部が指定されたターゲットコードセグメント上でチェック手順を実施するという意味で、コードセグメントが、分割されたソースコードまたはコンパイルされたコードの範囲内にて互いに実質的に「連結」される方法を表す。好ましくは、トポロジーは、そのプログラム部のコードセグメントがコードセグメントの複数のシーケンスを定義する候補プログラム部に対して確立され、ここで、1若しくは2つ以上のコードセグメントが、2つ以上のコードシーケンスの一部を形成する。トポロジーの確立は、1若しくは2つ以上のサブコードセグメントが、従って実行時に2つ以上のターゲットコードセグメント上でチェック手順を実施するようにそのサブコードセグメントが操作可能であるように定義された複数のターゲットコードセグメントを持つ完全性チェック部を含むように行うことができる。特に好ましい実施形態によると、トポロジーは、いわゆる「逆ツリー構造(inverted tree structure)」を含む任意のプログラム部に対して確立することができる。そのような実施形態によると、サブコードセグメントは、この構造の異なる「レベル」を形成すると見なすことができ、ルートコードセグメントがツリーの「最上部(top)」を定義し、ここで、任意のレベルのサブコードセグメントはすべて、「その上にある」(ルートコードセグメントに向かって)レベルに含まれる各サブコードセグメント上にてチェック手順を実施するよう操作可能である。
【0014】
本発明の実施形態による耐タンパ方法の実施は、通常、各サブコードセグメントのその、もしくは各々の参照結果が演算処理される、参照結果演算処理プロセス(reference result computation process)を含む。このプロセスは、好ましくは、演算処理のシーケンスを実施して、コードセグメントの定義されたシーケンスの各々に対する参照結果を取得することを含む。
【0015】
本発明の実施形態による任意のコードシーケンスに対して実施することができる参照結果演算処理プロセスについて簡単に説明する。チェック方向とは逆の方向へルートコードセグメントに連続して隣接する第一のサブコードセグメントに対する参照結果は、サブコードセグメントの完全性チェック部によって定義されるインプリメンテーションチェック手順(implementation checking procedure)を、その定義されたターゲットコードセグメント、すなわちルートコードセグメント上で実施することによって取得される。これは、保護すべきプログラムの属性を指定するルートコードセグメントのコードまたはメモリ上で巡回冗長チェックを実施して、第一の値、または第一の「参照結果」を取得することを含んでよい。実行時には、完全性チェック部は、第一の「実行時結果」を取得するために、ルートコードセグメントのメモリのあらかじめ定義された領域上で実行時チェック手順を実施するように操作可能であり、さらに、この実行時結果をそれと関連する参照結果と比較するようにも操作可能である。ルートコードセグメントの完全性は、この比較によって確認され、確認には、実行時結果が参照結果と等しいか、またはある所定の関係によって関連性を有することを必要としてよい。
【0016】
同様に、チェック方向とは逆の方向へ第一のサブコードセグメントに連続して隣接する第二のサブコードセグメントに対する参照結果は、インプリメンテーションチェック手順を、その定義されたターゲットコードセグメント、すなわち第一のサブコードセグメント上で実施することによって取得される。インプリメンテーションチェック手順は、例えば、第一の参照結果を指定する第一のコードセグメントのメモリまたはコード上で実施される。このようにして、第二の参照結果(第一の参照結果に依存する)が取得される。実行時には、第二のサブコード部の完全性チェック部は、第一の参照結果に対するものとしての第一の実行時結果の値を指定するメモリまたはコード上で実行時チェック手順を実施するように操作可能であり、さらに、得られた第二の実行時結果を第二のサブコードセグメントと関連する第二の参照結果と比較するようにも操作可能である。
【0017】
この参照結果演算処理プロセスは、シーケンスに含まれる各サブコードセグメントに対するその(もしくは各々の)参照結果が定義されるまで、この方法で継続される。
【0018】
本発明の第二の局面によると、複数のコードセグメントを含むプログラム部の完全性をチェックするための完全性チェック方法が提供され、該プログラム部は、ルートコードセグメントおよび複数のサブコードセグメントを含むコードセグメントの少なくとも1つのシーケンスを持ち、この完全性チェック方法は、任意のコードセグメントに対して:
i)ターゲットコードセグメントの完全性をチェックして実行時結果を取得する実行時チェック手順を実施する工程であって、該任意のサブコードセグメントに対する該ターゲットコードセグメントが、該ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と;
ii)該実行時結果を参照結果と比較する工程と、
を含む。
【0019】
本発明の第一の局面の実施形態によって得られたアプリケーションまたはプログラム部が、コンピュータの実行環境または実行システム内で実行される場合、プログラムは、実行時に、第二の局面の実施形態による完全性チェック方法を実施するように操作可能である。任意のサブコードセグメントに対して定義された実行時チェック手順は、そのサブコードセグメントがプログラム部の一部分として実行される場合に起動されることは理解されたい。
【0020】
本発明の好ましい実施形態は、有利に、プログラム部を改ざんから保護する強固で効果的な手段を提供する。例えばプログラムの適正利用を定義する属性を改変する目的で、本発明の実施形態によって提供される保護を破るかまたは弱めるためには、本発明の好ましい実施形態による耐タンパ方法によって保護されたプログラムの場合、エンドユーザーは、その定義された属性と関連するコードシーケンスに含まれる一つ一つのコードセグメントすべてのプロパティを識別して変更する必要があろう。従って、すべてのチェックを除去することによってのみ、アプリケーションの自由な改変が可能となる。これは不可能な作業ではないが、完了させるのに何百時間、またはさらには何千時間が必要となり得る極めて労力と時間を費やすものである。本発明の実施形態は、ハッカーがアプリケーションに検出されない改変を施すことを阻止する効果的な保護メカニズムを提供するという点で有利である。
【0021】
特に、本発明の好ましい実施形態は、提供者によって指定されたプログラムの1若しくは2つ以上の属性を、プログラムおよびそれ自体の完全性を確認する単純で相互に連結する多数のチェックという手段により、不正な改ざんから保護することを可能とする。このチェックは、各々が別のものをチェックし、最終的には巨大なチェックのウェブを提供するという意味で、「相互に連結」している。これは、互いに自己強化(self‐buttressing)する分散した完全性チェックメカニズムとなる。エンドユーザーによって施されたいかなる不正な改変も、有利に、このシステムによって検出され、好ましくは、これらのチェックを迂回しようとする試みが阻止される。
【0022】
チェック手順に適するであろうチェックアルゴリズムまたは機能は、数多くの種類が存在する。好ましくは、一つの該サブコードセグメントの完全性チェック部は、ターゲットコードセグメント上でのチェックサム手順の実施を含むチェック手順を定義する。これは、例えば巡回冗長チェックであってよい。
【0023】
特定の好ましい実施形態によると、候補アプリケーション、またはプログラムコード部は、各セグメントがプログラムコード部の機能を含むようにコードセグメントに分割される。これは、アプリケーションの極めて重要なコンポーネントが確実に完全性チェック手順に掛けられるという点で有利である。このセグメントは、好ましくは、定義されたセグメントの一部分を形成しないプログラム部のコードが存在しないことを確実にするために、機能に隣接するコードを含むように定義される。
【0024】
本発明の好ましい実施形態は、任意のプログラム部またはアプリケーション内に、例えばサイズが数メガバイトであるアプリケーション内で一千個から一万個までの間といった、非常に数多くのチェックを挿入することを含むことが想定される。プログラムコード部は、1若しくは2つ以上のセグメントが2つ以上のコードシーケンスの一部分を形成するように、複数のコードシーケンスを含んでよい。
【0025】
本発明の第三の局面によると、改ざんからプログラムコード部を保護するための耐タンパシステムが提供され、この耐タンパシステムは、そこにプログラムコード部の複数のプログラムコードセグメントが記憶されたコンピュータ読み取り可能記憶媒体を含み、該プログラムコードセグメントは、コードセグメントのシーケンスを定義し、ここで、コードセグメントの該シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含み;
ここで、各サブコードセグメントは、ターゲットコードセグメントの完全性をチェックするための完全性チェック部を含み、任意のサブコードセグメントに対する該ターゲットコードセグメントは、該ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントであり;
ならびに、ここで、任意のサブコードセグメントの完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、そして該実行時結果を、該任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である。
【0026】
本発明の第一の局面の実施形態によると、必要なチェックコードまたは完全性チェック機能、すなわち、各サブコードセグメントに対する完全性チェック部および参照部(ここに参照結果が含まれる)を、ソースコードレベルにて、すなわち、直接ソースコードへ挿入することが可能である。別の選択肢として、チェックコードを、アプリケーションのコンパイルを行った後に続いてアプリケーションに挿入することが可能である。従って、第一の局面の一つの実施形態の耐タンパ方法によると、プログラム部は、ソースコードを含む。別の選択肢として、本発明の第一の局面の別の実施形態の耐タンパ方法によると、プログラム部は、コンパイルされたコードを含む。
【0027】
基本アプリケーション(underlying application)またはプログラム部へ、ソースコードまたはオブジェクトコードのいずれかとしてチェック部を挿入することは、多くの方法で達成することができる。例えば、チェックをコード内へ手作業で挿入することが可能であり、そこでは、プログラム開発者が、定義されたプログラムコードセグメントへチェックコードを挿入する。しかし、これは、非常に労力を必要とする。別の選択肢として、この目的で作成された1若しくは2つ以上のマクロの使用を含む前処理技術によって、完全性チェック部および参照結果をサブコードセグメントへ挿入することが可能である。
【0028】
さらに別の選択肢として、メタプログラミング技術が、チェックのネットワークをソースコードレベルで適用するのに有用であり得る。そのような技術は、チェック部のアプリケーションへの挿入の自動化が可能となることから、特に有利であり得る。特に、抽象構文ツリー(AST)等のデータ構造を利用するメタプログラミング技術では、改変を行いやすい形の任意のプログラムコード部またはアプリケーションの解析が可能となる。従って、完全性チェック部および参照結果は、好都合に、アプリケーションの分割されたセグメント全体を通してインストールすることが可能である。この手法は、ソースコードレベルで適用される挿入されたチェックがアプリケーションコードでコンパイルされるために、これらが自然に隠されるか難読化されるという点でも有利である。従って、ソースコードレベルのメタプログラミング手法を用いることは、完全性チェックコードに基本アプリケーションコードを点在させる得られたソースコード上で実行される最適化コンパイラにより、挿入されたチェックを隠すことが可能となるという点で有益である。
【0029】
上記の実施形態または局面のいずれにおいても、種々の機能は、ハードウェアにて、または1若しくは2個以上のプロセッサ上で実行されるソフトウェアモジュールとして実現することができる。一つの局面または実施形態の機能は、その他の局面または実施形態のいずれにも適用することができる。
【0030】
本発明は、本明細書で述べる技術を実現するためのコンピュータプログラムまたはコンピュータプログラム製品、ならびに本明細書で述べる技術を実現するためのプログラムをその上に記憶させたコンピュータ読み取り可能記憶媒体も提供する。本発明を具体化するコンピュータプログラムは、コンピュータ読み取り可能媒体上に記憶されていてよく、または、例えば、インターネットウェブサイトから提供されるダウンロード可能データシグナル等のシグナルの形であってもよく、または、その他のいずれの形であってもよい。
【図面の簡単な説明】
【0031】
本発明をより深く理解するために、およびそれを実施することができる方法を示すために、例として、添付の図面を参照する。
【0032】
【図1】図1は、本発明の実施形態による耐タンパシステムを示す図である。
【0033】
【図2】図2は、図1に示す耐タンパシステムのコードシーケンスを示す図である。
【0034】
【図3】図3は、本発明の実施形態による参照結果演算処理プロセスP、および実行時に実施される完全性チェックプロセスを示す図である。
【0035】
【図4】図4は、本発明を具体化し、逆ツリー構造を有する耐タンパシステムの概略図を示す。
【0036】
【図5】図5は、本発明を具体化し、メタプログラミングを利用する耐タンパ方法に従って含まれる工程を示す図である。
【発明を実施するための形態】
【0037】
図1は、3個のルートコードセグメントA、B、およびC、ならびにコードセグメントの8個のシーケンスを形成する複数のサブコードセグメントSを含む複数のコードセグメントに分割されたプログラムコード部を示す。この実施形態では、プログラムコード部はコンパイルされており、従って、サブコードセグメントの位置は、コンパイルされたアプリケーション全体を通してのその分布を表す。
【0038】
この実施形態では、ルートコードセグメントは、開発者によって指定されたプログラムの適正利用の属性を定義する手段を含むコードのセグメントを表す。3つの属性を含んでよく、例えば:プログラムの利用に科された制限、または、プログラムのユーザーがアプリケーションの完全バージョンを購入したか、もしくはアプリケーションを利用するライセンスを有しているかのチェック等、プログラムによって実施されることになるチェック、である。
【0039】
セグメントの網掛けの違いは、アプリケーションコード内のチェックコードの存在を隠すために用いられた方法を表す。任意のサブコードセグメントからの各矢印は、チェック方向へその任意のサブコードセグメントに連続して隣接するターゲットコードセグメントに向かっている。例えば、サブコードセグメントSのターゲットコードセグメントは、サブコードセグメントSである。さらに、サブコードセグメントSのターゲットコードセグメントは、ルートコードセグメントAである。矢印の太さは、元のコードセグメントの完全性チェック部によって用いられるチェックプロセスの種類を表している。従って、この実施形態では、2種類のチェック手順が用いられる。これらは、例えば、値を得るためにターゲットコードセグメントの定義された領域のチェックサムを取得するように操作可能である巡回冗長チェック、またはその他のある種のチェックサム、またはその他のチェック方法であってよい。
【0040】
図2は、ルートコードセグメントBに関連する図1の実施形態のシーケンスの一つを示す。サブコードセグメントBからBの各々に対する参照結果の演算処理のために、参照結果演算処理プロセスが実施される。これは、以下で述べるようにして実現することができる。
【0041】
具体的には、本実施形態によると、サブコードセグメントBに対する参照結果を、そのターゲットコードセグメント、すなわちルートコードセグメントB上にてインプリメンテーションチェック手順を実施することで取得する。これは、ルートコードセグメントBと関連し、プログラムの属性を指定するメモリの所定部上で巡回冗長チェック(例えば)を実施して、第一の値または第一の「参照結果」を取得することを含む。実行時は、完全性チェック部が、第一の「実行時結果」を取得するために、ルートコードセグメントBのメモリの定義された部分上で実行時チェック手順を実施するように操作可能であり、さらにこの実行時結果をそれと関連する参照結果と比較するようにも操作可能である。ルートコードセグメントの完全性は、この比較によって確認され、確認には、実行時結果が参照結果と等しいか、またはある所定の関係によって関連性を有することを必要してよい。
【0042】
同様に、第二のサブコードセグメントBに対する参照結果は、インプリメンテーションチェック手順を、そのターゲットコードセグメント、すなわちサブコードセグメントB上で実施することによって取得される。インプリメンテーションチェック手順は、第一の参照結果を含むサブコードセグメントBと関連するメモリのあらかじめ定義された領域上で実施される。このようにして、Bに対する第一の参照結果に依存するBに対する参照結果が得られ、続いて記憶される。実行時には、サブコードセグメントBの完全性チェック部は、第一の実行時結果(第一の参照結果に対するものとして)を記憶するBと関連するメモリの一部分上で実行時チェック手順を実施するように操作可能であり、さらに、得られた第二の実行時結果をサブコードセグメントBと関連する第二の参照結果と比較するようにも操作可能である。
【0043】
この参照結果演算処理プロセスは、サブコードセグメントBからBの各々に対するその(もしくは各々の)参照結果が得られ、記憶されるまで、この方法で継続される。
【0044】
図3の左側は、ルートコードセグメントCならびにサブコードセグメントCおよびCを含むコードシーケンスに対する本発明の実施形態による参照結果演算処理プロセスPを示す。参照結果演算処理プロセスPは、サブコードセグメントCの参照結果Rを定義するための第一の参照結果演算処理プロセスP、およびこれに続くサブコードセグメントCの参照結果Rを得るための第二の参照結果演算処理プロセスPを順に実施することを含む。プロセスPは、インプリメンテーションチェックプロセスを実施することを含み、そこでは、チェックサム手順がルートコードセグメントCのメモリ部M上で実施される。メモリ部Mは、例えばプログラム開発者によって定義された属性Aを指定する。チェックサム手順は、第一の参照値Rとして用いられる値を得る。値Rは、メモリ部McaR1に記憶/書き込みされる。第二の参照結果演算処理プロセスPは、サブコードセグメントCに対して実施され、ここで、チェックサムを含むインプリメンテーションチェックプロセスがサブコードセグメントCのメモリ部McaR1上で実施され、第二の参照値Rとして用いられる値が得られる。Rの値はメモリ部McbR2に記憶される。
【0045】
図3の右側は、実行時にサブコードセグメントCおよびCによって実施される完全性チェック方法を示す。従って、サブコードセグメントCの完全性チェック部は、サブコードセグメントの実行の開始時、または開始の直後に起動される完全性チェック方法を実施するように操作可能である。Cによって実施されることになる完全性チェック方法に従って、実行時チェックプロセスが実施され、そこでは、ルートコードセグメントCのメモリ部M上でチェックサム手順が実施され、実行時結果rが取得される。この結果は、メモリ部Mc1R1に記憶された参照結果Rと比較される。この比較の結果に従って、完全性チェック手順は、通過または失敗となる。さらに、実行時結果rは、メモリ部Mcar1に書き込まれる。メモリ部Mcar1上で実施されるチェックサム手順では、rがRと等しい場合、メモリ部Mc1R1上で実施される同一のチェックサム手順と同じ結果が得られる。
【0046】
サブコードセグメントCの完全性チェック部は、完全性チェック手順を実施するように操作可能であり、これは、サブコードセグメントCのメモリ部Mcar1をチェックして、実行時結果rを取得することを含む。従って、rの値は、サブコードセグメントCの完全性チェック部によって取得されたrの値に依存する。
【0047】
さらに、rとRとの比較が「通過」するのは、rとRとの比較も通過の場合だけである。
【0048】
本発明の実施形態の利点は、ハッカーが属性Aを、例えばA’となるように改変しようとした場合にどうなるかを考えることで理解することができる。この場合、実行時にCによって実施される完全性チェック手順が失敗することを防ぐために、ハッカーは、参照値Rの値も改変して、実行時結果rとRとの比較が都合良く進むようにする必要がある。さらに、メモリ部Mcar1に記憶された情報の有効性がサグコードセグメントCによってチェックされるため、次に実行時にCによって実施される完全性チェック手順が失敗とならないことを確実にするために、ハッカーは、参照値Rの値を改変して、実行時結果rとRとの比較が都合良く進むようにする必要がある。実質的に、ルートコードセグメント(例えば)内で指定された属性を改変するためには、ハッカーは、そのルートコードセグメントと連結したすべてのサブコードセグメントの追跡および改変を行う必要がある。
【0049】
図4は、複数のコードセグメントに分割された候補プログラム部の概略図を示し、ここで、チェック手順のトポロジーは、逆ツリー構造の形で定義される。従って、ルートコード部Dは、2つの一次レベルサブコードセグメント(primary level sub‐code segments)Da1およびDa2によって実行時にチェックされる。さらに、Da1およびDa2は、4つの二次レベルサブコードセグメント(secondary level sub‐code segments)Db2からDb4の各々によって実行時にチェックされる。従って、この例では、Da1がコードセグメントの4つのシーケンスの一部分を形成し、Db2がコードセグメントの4つのシーケンスの一部分を形成して、コードセグメントのシーケンスを合計で8つ定義することができる。
【0050】
図5は、ターゲットアプリケーションを改ざんから保護するための本発明を具体化する耐タンパ方法に含まれる工程を示す。図5に示すように、アプリケーションのソースコードは、構文解析されて、抽象構文ツリー(AST)としてのその表現(representation)が作り出される。小サイズのメタプログラムを次に用いて、チェックコードを無理なく挿入可能であるターゲット機能一式をコンパイルする。ここで用いられる基準としては:挿入されたチェックを十分に隠すホストコードの能力;例えば、ターゲット機能内のコードが時間制約型内部ループ(time‐critical inner loop)の一部分であるかどうか、を例とする性能に関する適切性;アプリケーションによってその機能が呼び出される回数、が挙げられる。
【0051】
ターゲット機能は、基本ターゲットアプリケーションが分割されるコードセグメントの基礎を形成する。完全性チェックネットワークのトポロジーが決定される。
【0052】
小サイズのメタプログラムを用いて、ターゲット機能へチェックコードが挿入される。挿入されたコードは、実行時には、チェックされるべき機能に対する参照を含んでいるべきである。この段階では、ダミー値がチェックすべきメモリの領域に挿入され、そのチェックが作り出すべき値である。
【0053】
コード(挿入されたチェックを含む)が、例えば、標準的なC++コンパイラを用いて、実行可能(EXE)ファイルへコンパイルされる。コンパイルのリンキングフェーズ(linking phase)では、いわゆるMAPファイルが作成され、これには、最終的にEXE中のどこに各アプリケーション機能に対するコードが存在するようになったかについての情報が含まれる。これから、実行時メモリ中のどこにこれらの機能が存在するかを推測することが可能である。
【0054】
チェックを挿入されたターゲットコードセグメントの各々に対して、数多くの工程が実施される:
‐これらのコードセグメントに対するコンパイルされたコードが、MAPファイルからのデータを用いて検出される;
‐このチェックがターゲットとすべきコードセグメントが確立される(上記で決定されたトポロジーから);
‐そのコードセグメントに対するコードが、MAPファイルを用いて検出される;
‐その機能に対するコードのチェックサム(またはその他の完全性チェック手順)が演算処理される;
‐このチェックがトポロジーによって要求されたものを確かにターゲットとするように、上記で挿入されたダミー値にパッチを施す。さらに、実行時チェックが見つけ出そうとするはずである値として演算処理されたチェックサムを挿入する。この値が実行時に見つけられない場合、問題のコードセグメントは改変されており:ハッキングが行われたということである。
【0055】
このプロセスにより、保護されたEXE、すなわち、保護されプログラム部、または本発明を具体化する耐タンパシステムが得られる。
【0056】
チェックに正しい順序でパッチを施すことが重要であり、すなわち、ルートコードセグメントを有するコードシーケンスの「最上部」から開始し、下へ向かって作業を行う。最上部のパッチを施された機能は、それより下部のチェックのために、それ自体がチェックサムを受けるべきである。
【0057】
いくつかの実施形態および例によって本発明を図示および説明してきたが、本発明の原理から逸脱することなく、種々の方法での本発明の変更、具体化、加工、または応用が可能であることは明らかであるはずである。本発明は、携帯記憶媒体上に記憶されたソフトウェアプログラムおよびデータ構造への組み込みが可能であり、デジタル通信もしくはその他の伝送媒体によって伝送可能であり、またはコンピュータメモリ内に記憶可能である。そのようなプログラムおよびデータ構造をコンピュータ上で実行することで、本発明を具体化する方法を実施し、および本明細書で述べる能力を有する機械として、もしくは装置の一部分として動作させることが可能である。

【特許請求の範囲】
【請求項1】
プログラムコード部を改ざんから保護するための耐タンパ方法であり、前記耐タンパ方法が:
前記プログラムコード部を複数のコードセグメントに分割する工程と;
前記コードセグメントからコードセグメントのシーケンスを定義する工程であって、ここで、コードセグメントの該シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含む、工程と;
各サブコードセグメントに、ターゲットコードセグメントの完全性をチェックするための完全性チェック部を提供する工程であって、任意のサブコードセグメントの前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と;
を含み、
ここで、任意のサブコードセグメントの完全性チェック部は、前記対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、前記実行時結果を前記任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である、耐タンパ方法。
【請求項2】
1つの前記サブコードセグメントの前記完全性チェック部が、前記ターゲットコードセグメント上でチェックサム手順を実施することを含むチェック手順を定義する、請求項1に記載の耐タンパ方法。
【請求項3】
前記チェックサム手順が、巡回冗長チェックを含む、請求項2に記載の耐タンパ方法。
【請求項4】
参照結果演算処理プロセスを、各サブコードセグメントに対して1つの前記参照結果を取得するために実施する工程であって、前記参照結果演算処理プロセスは、任意のサブコードセグメントに対して、インプリメンテーションチェック手順を前記対応するターゲットコードセグメント上で実施することを含む工程、をさらに含む、請求項1から3のいずれか1項に記載の耐タンパ方法。
【請求項5】
前記参照結果演算処理プロセスが:
第一のサブコードセグメントに対して1つの前記参照結果を取得するための第一のインプリメンテーションチェック手順であって、第一のサブコードセグメントが、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントであり、ここで、前記第一のインプリメンテーションチェック手順が、保護すべき前記プログラムの属性を指定する前記ルートコードセグメントの部分上で実施される、第一のインプリメンテーションチェック手順を含み:
サブコードセグメントの前記シーケンスの各サブコードセグメントに対する連続するインプリメンテーションチェック手順であって、各サブコードセグメントに対する前記インプリメンテーションチェック手順が、前のインプリメンテーションチェック手順の間に取得された参照結果を指定する対応するターゲットコードセグメントの部分上で実施される、連続するインプリメンテーションチェック手順をさらに含む、
連続するプロセスである、請求項4に記載の耐タンパ方法。
【請求項6】
前記プログラムコード部が、各セグメントが前記プログラムコード部の機能を含むようにコードセグメントへ分割される、請求項1から5のいずれか1項に記載の耐タンパ方法。
【請求項7】
前記ルートコードセグメントが、前記プログラムの指定された属性を定義する属性指定部を含む、請求項1から6のいずれか1項に記載の耐タンパ方法。
【請求項8】
複数のコードシーケンスを、1もしくは2つ以上のセグメントが2つ以上のコードシーケンスの一部分を形成するように定義することを含む、請求項1から7のいずれか1項に記載の耐タンパ方法。
【請求項9】
複数のコードセグメント内の前記シーケンスに含まれる前記コードセグメントの配列を表すためのトポロジーを定義する工程を含む、請求項1から8のいずれか1項に記載の耐タンパ方法。
【請求項10】
前記プログラムコード部が、ソースコードを含む、請求項1から9のいずれか1項に記載の耐タンパ方法。
【請求項11】
前記プログラムコード部が、コンパイルされたコードを含む、請求項1から10のいずれか1項に記載の耐タンパ方法。
【請求項12】
改ざんからプログラムコード部を保護するための耐タンパシステムであって、前記耐タンパシステムは、プログラムコード部の複数のプログラムコードセグメントがその上に記憶されたコンピュータ読み取り可能記憶媒体を含み、前記プログラムコードセグメントは、コードセグメントのシーケンスを定義し、ここで、コードセグメントの前記シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含み;
ここで、各サブコードセグメントは、ターゲットコードセグメントの完全性をチェックするための完全性チェック部を含み、任意のサブコードセグメントに対する前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントであり;
ならびに、ここで、任意のサブコードセグメントの前記完全性チェック部は、対応するターゲットコードセグメント上でチェック手順を実施して実行時結果を取得し、そして前記実行時結果を、前記任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である、耐タンパシステム。
【請求項13】
各サブコードセグメントが、前記対応するターゲットコードセグメント上でインプリメンテーションチェック手順を実施して、そのサブコードセグメントに対して1つの前記参照結果を取得するように操作可能であるインプリメンテーションチェック部をさらに含む、請求項12に記載の耐タンパシステム。
【請求項14】
前記チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接する第一のサブコードセグメントである前記サブコードセグメントの前記インプリメンテーションチェック部が、保護すべき前記プログラムの属性を指定する前記ルートコードセグメントの部分上で第一のインプリメンテーションチェック手順を実施するように操作可能であり、ならびに:
各連続するサブコードセグメントの前記インプリメンテーションチェック部が、前のインプリメンテーションチェック部によって取得された参照結果を指定する前記対応するターゲットコードセグメントの部分上で連続するインプリメンテーションチェック手順を実施するように操作可能である、請求項13に記載の耐タンパシステム。
【請求項15】
プログラムコード部を改ざんから保護するための耐タンパ方法であり、前記耐タンパ方法が:
前記プログラムコード部を複数のコードセグメントに分割する工程と;
前記コードセグメントからコードセグメントのシーケンスを定義する工程であって、ここで、コードセグメントの前記シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含む、工程と;
参照結果演算処理プロセスを、各サブコードセグメントに対して参照結果を取得するために実施する工程であって、ここで、前記参照結果演算処理プロセスは、任意のサブコードセグメントに対して、インプリメンテーションチェック手順をターゲットコードセグメント上で実施することを含み、任意のサブコードセグメントの前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と、
を含む、耐タンパ方法。
【請求項16】
前記参照結果演算処理プロセスが:
第一のサブコードセグメントに対して1つの前記参照結果を取得するための第一のインプリメンテーションチェック手順であって、第一のサブコードセグメントが、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントであり、ここで、前記第一のインプリメンテーションチェック手順が、保護すべき前記プログラムの属性を指定する前記ルートコードセグメントの部分上で実施される、第一のインプリメンテーションチェック手順を含み:
サブコードセグメントの前記シーケンスの各サブコードセグメントに対する連続するインプリメンテーションチェック手順であって、各サブコードセグメントに対する前記インプリメンテーションチェック手順が、前のインプリメンテーションチェック手順の間に取得された参照結果を指定する前記対応するターゲットコードセグメントの部分上で実施される、連続するインプリメンテーションチェック手順をさらに含む、
連続するプロセスである、請求項15に記載の耐タンパ方法。
【請求項17】
複数のコードセグメントを含むプログラム部の完全性をチェックするための完全性チェック方法であって、前記プログラム部は、ルートコードセグメントおよび複数のサブコードセグメントを含むコードセグメントの少なくとも1つのシーケンスを有し、前記完全性チェック方法は、任意のコードセグメントに対して:
i)ターゲットコードセグメントの完全性をチェックして実行時結果を取得する実行時チェック手順を実施する工程であって、前記任意のサブコードセグメントに対する前記ターゲットコードセグメントが、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントである、工程と;
ii)前記実行時結果を参照結果と比較する工程と、
を含む、完全性チェック方法。
【請求項18】
前記完全性チェック方法が:
第一のサブコードセグメントに対して1つの前記実行時結果を取得するための第一の実行時チェック手順であって、第一のサブコードセグメントは、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントであり、ここで、前記第一の実行時チェック手順が、保護すべき前記プログラムの属性を指定する前記ルートコードセグメントの部分上で実施される、第一の実行時チェック手順を含み:
サブコードセグメントの前記シーケンスの各サブコードセグメントに対する連続する実行時チェック手順であって、各サブコードセグメントに対する前記実行時チェック手順が、前の実行時チェック手順の間に取得された実行時結果を指定する前記対応するターゲットコードセグメントの部分上で実施される、連続する実行時チェック手順をさらに含む、
連続するプロセスである、請求項17に記載の完全性チェック方法。
【請求項19】
プログラム部の完全性をチェックするための完全性チェックシステムであって、前記耐タンパシステムは、前記プログラム部の複数のプログラムコードセグメントがその上に記憶されたコンピュータ読み取り可能記憶媒体を含み、前記プログラムコードセグメントは、コードセグメントのシーケンスを定義し、ここで、コードセグメントの前記シーケンスは、ルートコードセグメントおよび複数のサブコードセグメントを含み、前記システムはさらに;
ターゲットコードセグメントの完全性をチェックして実行時結果を取得するよう操作可能であり、任意のサブコードセグメントに対する前記ターゲットコードセグメントは、前記ルートコードセグメントに向かうチェック方向へ連続して隣接するコードセグメントであり;ならびに、前記実行時結果を、前記任意のサブコードセグメントに含まれる参照結果と比較するように操作可能である、実行時チェック部、を含む完全性チェックシステム。
【請求項20】
第一のサブコードセグメントの実行時チェック部であって、第一のサブコードセグメントが、チェック方向とは逆の方向へ前記ルートコードセグメントに連続して隣接するサブコードセグメントである、前記第一のサブコードセグメントの実行時チェック部が、保護すべき前記プログラムの属性を指定する前記ルートコードセグメントの部分上で第一実行時チェック手順が実施されるように操作可能であり、ならびに:
各連続するサブコードセグメントの前記実行時チェック部が、前の実行時チェック部によって取得された実行時結果を指定する前記対応するターゲットコードセグメントの部分上で連続する実行時チェック手順が実施されるように操作可能である、
請求項19に記載の完全性チェックシステム。
【請求項21】
コンピュータにロードされた場合に、請求項17から20のいずれか1項に記載の完全性チェック方法を前記コンピュータに実施させる、コンピュータプログラム。
【請求項22】
キャリア媒体によって保持される、請求項21に記載のコンピュータプログラム。
【請求項23】
前記キャリア媒体が、記録媒体である、請求項22に記載のコンピュータプログラム。
【請求項24】
前記キャリア媒体が、伝送媒体である、請求項22に記載のコンピュータプログラム。
【請求項25】
添付の図面を参照して実質的に上記で説明した、方法/システム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate


【公表番号】特表2010−541086(P2010−541086A)
【公表日】平成22年12月24日(2010.12.24)
【国際特許分類】
【出願番号】特願2010−527520(P2010−527520)
【出願日】平成20年10月1日(2008.10.1)
【国際出願番号】PCT/GB2008/003318
【国際公開番号】WO2009/044129
【国際公開日】平成21年4月9日(2009.4.9)
【出願人】(507345538)アイティーアイ スコットランド リミテッド (34)
【Fターム(参考)】