(57)【特許請求の範囲】
【請求項１】
少なくとも１つの定数値を備えたソフトウェアコード（ＳＣ）をセキュアにし、セキュアなソフトウェアコード（ＳＳＣ）を生成する方法であって、
−  保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサ（２１）によって決定するステップ（Ｓ１）と、
−  プロセッサによって、値のインデクス付けされた配列をソフトウェアコードに挿入し、配列の１つの値（Ｘ）から、保護されるべき定数値が決定され得るようにするステップ（Ｓ２）と、
−  保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサによって、置換変数によって置換するステップ（Ｓ３）と、
−  命令の第１のシーケンスを、プロセッサによってソフトウェアコードに挿入するステップ（Ｓ４）であって、命令の第１のシーケンスは、ランタイムにおいて実行されたとき、
○  保護されるべき定数値が決定され得る値（Ｘ）の、配列におけるインデクス（ｉ）を計算し（Ｅ１）、
〇  前記配列における前記計算されたインデクス（ｉ）に位置する値（Ｘ）を、前記配列から抽出し（Ｅ２）、
〇  前記抽出された値（Ｘ）から、保護されるべき定数値を決定し（Ｅ３）、
〇  前記置換変数の値を、決定された定数値に等しく設定する（Ｅ４）、ステップと
を備えた、方法。
【請求項２】
命令の第１のシーケンスが、ランタイムにおいて実行されたとき、第１の中間値（ｖ）を返す、命令の第２のシーケンスと、ランタイムにおいて実行されたとき、前記インデクス（ｉ）を計算するために、第１の変換関数（ｆ）を前記第１の中間値（ｖ）に適用する、命令の第３のシーケンスとを備えた、請求項１に記載の方法。
【請求項３】
第１の変換関数（ｆ）が、所定の変換関数の第１のセットにおいてランダムに選択される、請求項２に記載の方法。
【請求項４】
保護されるべき定数値が決定され得る、配列における前記値（Ｘ）が、保護されるべき定数値に等しい、請求項１に記載の方法。
【請求項５】
保護されるべき定数値が、メモリアドレスであり、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値が、有効なメモリアドレスである、請求項１に記載の方法。
【請求項６】
命令の第１のシーケンスが、
−  ランタイムにおいて実行されたとき、第２の変換関数（ｇ）を、前記第１の中間値（ｖ）に適用することにより、第２の中間値（ｍ）を決定する命令の第４のシーケンスと、
−  ランタイムにおいて実行されたとき、抽出された値（Ｘ）および第２の中間値（ｍ）に基づいて、保護されるべき定数値を決定する命令の第５のシーケンスとを含む、請求項２に記載の方法。
【請求項７】
第２の変換関数（ｇ）が、所定の変換関数の第２のセットにおいてランダムに選択される、請求項６に記載の方法。
【請求項８】
保護されるべき定数値が、メモリアドレスであり、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値が、無効なメモリアドレスである、請求項１に記載の方法。
【請求項９】
保護されるべき定数値が、第３の変換関数を、抽出された値および第２の中間値に適用することによって決定される、請求項６に記載の方法。
【請求項１０】
第３の変換関数（ｈ）が、所定の変換関数の第３のセットにおいてランダムに選択される、請求項６に記載の方法。
【請求項１１】
プロセッサ（３１）による実行のためのセキュアなソフトウェアコードの命令でエンコードされた非一時的な機械可読記憶媒体であって、
・  前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・  保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換され、
・  非一時的な機械可読記憶媒体は、
−  値のインデクス付けされた配列であって、保護されるべき前記定数値が、配列の１つの値（Ｘ）から決定され得る、配列と、
−  命令の第１のシーケンスと
でエンコードもされ、命令の第１のシーケンスは、ランタイムにおいて実行されたとき、
○  保護されるべき前記定数値が決定され得る値（Ｘ）の、配列におけるインデクス（ｉ）を計算し（Ｅ１）、
○  前記配列における前記計算されたインデクス（ｉ）に位置する値（Ｘ）を、前記配列から抽出し（Ｅ２）、
○  前記抽出された値（Ｘ）から、保護されるべき前記定数値を決定し（Ｅ３）、
○  前記置換変数の値を、前記決定された定数値に等しく設定する（Ｅ４）、
非一時的な機械可読記憶媒体。
【請求項１２】
プロセッサ（３１）による実行のためのセキュアなソフトウェアコードの命令を実行する方法であって、
・  前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・  保護されるべき前記定数値が、セキュアなコードにおいて、置換変数によって置換され、
・  前記セキュアなソフトウェアコードは、値のインデクス付けされた配列を備え、保護されるべき前記定数値が配列の１つの値（Ｘ）から決定され得るようにされ、
前記方法は、
・  保護されるべき前記定数値が決定され得る値（Ｘ）の、配列におけるインデクス（ｉ）を計算するステップ（Ｅ１）と、
・  前記配列における前記計算されたインデクス（ｉ）に位置する値（Ｘ）を、前記配列から抽出するステップ（Ｅ２）と、
・  前記抽出された値（Ｘ）から、保護されるべき前記定数値を決定するステップ（Ｅ３）と、
・  前記置換変数の値を、前記決定された定数値に等しく設定するステップ（Ｅ４）と
を備えた、
方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア保護の分野に関し、より詳細には、改ざん防止技術の分野に関する。これは、ソフトウェアにおいて、定数値を安全に使用することを特に可能にする難読化方法を開示する。
【背景技術】
【０００２】
現在、ソフトウェアアプリケーションを作動させることにより、多くのサービスがユーザに提供される。このようなアプリケーションは、デスクトップコンピュータ、ラップトップ、店頭（ｐｏｉｎｔ  ｏｆ  ｓａｌｅ）端末、スマートフォンなど、モバイルまたはモバイル以外の様々なデバイスで作動する。このようなアプリケーションは、ローカルで作動することも、ＬＡＮやインターネットなどのネットワークを介して実装されることもできる。スマートカードや銀行のクレジットカードなどのいくつかのデバイスは、１つまたはいくつかのアプリケーションの作動専用になっている場合もある。このようなアプリケーションは通常、セキュアにされていない環境で作動させられ、そこでは、攻撃者は、アプリケーションを作動させているシステムの動作のいくつかを制御するか、または完全に制御することさえできる。この結果、これらのアプリケーションのほとんどは、アプリケーションによって取り扱われるデータが、このような攻撃者によって読み取られる、または変更されることを防ぐために、いくつかのセキュリティメカニズムを実装する必要がある。
【０００３】
攻撃者は、システムによって実行される、コンパイル済みのコードをリバースエンジニアリングすることによって、ソフトウェアの動作を理解しようとする場合がある。攻撃者は、その後、悪意のある動作を実施するために、ソフトウェアによって取り扱われるセキュアな情報にアクセスしたり、および／または、ソフトウェアを変更する可能性がある。たとえば、攻撃者は、悪意のある金融取引を実施するために、銀行業務ソフトウェアを変更したり、ライセンスを購入せずに無料で、ライセンスで保護されたソフトウェアを作動させるために、それを変更したりできる。このようなリバースエンジニアリングは通常、コードアナライザやデバッガなどのツールを使用して実施され、これらのツールは、コード内の命令の実行の順序を示す制御フローグラフなど、コードの動作に関する情報をコンパイル済みのコードから抽出する。
【０００４】
ソフトウェアコードのあらゆる変更を阻止するために、改ざん防止技術が開発された。改ざん防止技術は、たとえば、ソフトウェアコードの特定の領域でチェックサム値を計算し、次いで、取得した値を知られている参照値と比較することによって、コードのある部分において完全性チェックを実施することにしばしば依存する。値が一致しない場合、コードは改ざんされており、ソフトウェアの通常の実行を拒否するか、ふりをするかのいずれかにより、ソフトウェアの実行を阻止する必要がある。それにも関わらず、このような保護も、攻撃者によってリバースエンジニアリングされ、破壊される可能性がある。デバッガまたはコードアナライザにとって、変数の定数値への初期化と、改ざん防止プロセスによって実施される比較におけるこのような定数値の使用とを突き止めることは特に簡単である。この種の情報は、コードにおいて実装されている保護の種類を識別するために攻撃者によって使用される可能性があり、それで、これにより保護を破ることができる。たとえば、攻撃者は、完全性チェックが実施されるソフトウェアの領域の開始と終了を識別し、コードが変更されていないときに完全性チェックルーチンによってこの領域で計算されるチェックサム値を推定し、次いで、チェックサム値が計算されるソフトウェアの領域内であっても、ソフトウェアコードの他の変更に関係なく、常に有効なチェックサム値を提供するために、完全性チェックルーチンにパッチを当てることができる。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
その結果、コンパイル済みのコードを解析する攻撃者に、ソフトウェア操作に関する情報を提供することなく、ソフトウェアにおいて、定数値を取り扱うことを可能にする方法に対するニーズがある。
【課題を解決するための手段】
【０００６】
この目的のために、第１の態様によれば、本発明は、少なくとも１つの定数値を備えたソフトウェアコードをセキュアにする方法に関し、前記方法は、セキュアなソフトウェアコードを生成し：
−  保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサによって決定するステップと、
−  プロセッサによって、値のインデクス付けされた配列をソフトウェアコードに挿入し、配列の１つの値から、保護されるべき定数値が決定され得るようにするステップと、
−  保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサによって、置換変数によって置換するステップと、
−  命令の第１のシーケンスを、プロセッサによってソフトウェアコードに挿入するステップであって、命令の第１のシーケンスは、ランタイムにおいて実行されたとき：
・  保護されるべき定数値が決定され得る値の配列におけるインデクスを計算し、
・  前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出し、
・  前記抽出された値から、保護されるべき定数値を決定し、
・  前記置換変数の値を、決定された定数値に等しく設定する、ステップと
を備えている。
【０００７】
定数値は、ソフトウェアコードにおいて、もはやそれとして出現しないため、定数値を攻撃者から隠すことができる一方、ランタイムにおいて、攻撃者によって容易に理解および再現されない手法で定数値を取得することを可能にする。結果として、セキュアなソフトウェアコードは、少なくともコードの静的解析に抵抗する可能性がより高くなる。
【０００８】
実施形態では、命令の第１のシーケンスは、ランタイムにおいて実行されたとき、第１の中間値を返す、命令の第２のシーケンスと、ランタイムにおいて実行されたとき、前記インデクスを計算するために、第１の変換関数を前記第１の中間値に適用する、命令の第３のシーケンスとを備えている。
【０００９】
保護されるべき定数値が決定され得る、値の配列におけるインデクスの２ステップの決定は、攻撃者が自分で前記インデクスを決定することを難しくし、したがって、この方法のセキュリティを強化する。
【００１０】
実施形態では、第１の変換関数は、所定の変換関数の第１のセットにおいてランダムに選択される。
【００１１】
変換関数をランダムに選択することが、異なる変数を保護するために異なる変換関数を使用することを可能にする。またこれは、保護されるべき定数値が決定され得る、値の配列におけるインデクスを検索するために、攻撃者が、使用する変換関数を予測することも不可能にする。
【００１２】
実施形態では、保護されるべき定数値が決定され得る、配列における前記値は、保護されるべき定数値に等しい。
【００１３】
これは、第１の変換関数によって返されたインデクスにおける配列における値を読み取ることにより、定数値のすばやく簡単な決定を可能とする。
【００１４】
保護されるべき定数値は、メモリアドレスであり得、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値は、有効なメモリアドレスであり得る。
【００１５】
こうすることで、攻撃者は、配列におけるアドレスの有効性に基づいて配列における定数値を認識できない。
【００１６】
実施形態では、命令の第１のシーケンスは：
−  ランタイムにおいて実行されたとき、第２の変換関数を前記第１の中間値に適用することによって、第２の中間値を決定する命令の第４のシーケンスと、
−  ランタイムにおいて実行されたとき、抽出された値および第２の中間値に基づいて、保護されるべき定数値を決定する命令の第５のシーケンスとを含んでいる。
【００１７】
このような実施形態は、配列における値からの定数値の間接的な決定を実施することを可能にする。こうすることで、定数値は、セキュアなソフトウェアコードのどこにも出現しなくなり、配列にさえも出現しなくなる。このような定数値の２ステップの決定が、攻撃者がプロセスを理解し、定数値を自分で検索することを、より困難にする。
【００１８】
実施形態では、第２の変換関数は、所定の変換関数の第２のセットにおいてランダムに選択される。
【００１９】
このような第２の変換関数のランダムな選択は、上記の第１の変換関数のランダムな選択と同じ利点を有する。これは、定数値が検索され得る、値のインデクスを決定することを可能にするプロセスを多様化し、したがって、リバースエンジニアリングをより困難にする。
【００２０】
実施形態では、保護されるべき定数値は、メモリアドレスであり、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値は、無効なメモリアドレスである。
【００２１】
配列における無効なメモリアドレスのみを使用するので、攻撃者は、どのアドレスであれば定数値の取得を可能にするのかを推測できない。
【００２２】
保護されるべき定数値は、第３の変換関数を、抽出された値および第２の中間値に適用することによって決定され得る。実施形態では、第３の変換関数は、所定の変換関数の第３のセットにおいてランダムに選択される。
【００２３】
これは、攻撃者が、使用されるべき関数を知らずに、定数値を決定することを不可能にする。
【００２４】
第２の態様によれば、本発明は、プロセッサによる実行のためのセキュアなソフトウェアコードの命令でエンコードされた非一時的な機械可読記憶媒体に関し：
・  前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・  保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換され、
・  非一時的な機械可読記憶媒体は：
−  値のインデクス付けされた配列であって、保護されるべき前記定数値が配列の１つの値から決定され得る、配列と、
−  命令の第１のシーケンスと
でエンコードもされ、命令の第１のシーケンスは、ランタイムにおいて実行されたとき：
〇  保護されるべき前記定数値が決定され得る値の配列におけるインデクスを計算し、
〇  前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出し、
〇  前記抽出された値から、保護されるべき前記定数値を決定し、
〇  前記置換変数の値を、前記決定された定数値に等しく設定する命令の第１のシーケンスでエンコードもされる。
【００２５】
第３の態様によれば、本発明は、プロセッサによる実行のためのセキュアなソフトウェアコードの命令を実行する方法に関し：
・  前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・  保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換され、
・  前記セキュアなソフトウェアコードは、値のインデクス付けされた配列も備え、保護されるべき前記定数値が配列の１つの値から決定され得るようにされ、
前記方法は：
・  保護されるべき前記定数値が決定され得る値の配列におけるインデクスを計算するステップと、
・  前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出するステップと、
・  前記抽出された値から、保護されるべき前記定数値を決定するステップと、
・  前記置換変数の値を、前記決定された定数値に等しく設定するステップとを備えている。
【００２６】
第２の態様によるこのような非一時的機械可読記憶媒体、および第３の態様による方法は、第１の態様による方法のものと同じ利点を示す。
【００２７】
前述の目的および関連する目的を達成するために、1つ以上の実施形態は、以下で十分に説明され、特に特許請求の範囲で指摘される特徴を備えている。
【００２８】
以下の説明および添付の図面は、特定の例示的な態様を詳細に説明し、実施形態の原理が採用され得る様々な方法のほんのわずかを示している。他の利点および新規の特徴は、図面と併せて考慮されるとき、後続する詳細な説明から明らかになり、開示される実施形態は、このようなすべての態様およびそれらの均等物を含むことが意図される。
【図面の簡単な説明】
【００２９】
【図１】ソフトウェアをコンパイルするプロセスを示す図である。
【図２】本発明の実施形態によるセキュアにするデバイスを概略的に示す図である。
【図３】本発明の実施形態による実行デバイスを概略的に示す図である。
【図４】本発明の実施形態によるソフトウェアコードをセキュアにする方法を概略的に示す図である。
【図５】本発明の実施形態によるインデクス付けされた配列を示す図である。
【図６】本発明の実施形態によるセキュアなソフトウェアコードの命令を実行する方法を概略的に示す図である。
【発明を実施するための形態】
【００３０】
以下に詳述する説明では、本発明が実践され得る特定の実施形態を例示として示す添付図面に対する参照がなされる。これらの実施形態は、当業者が本発明を実践できるように十分詳細に説明されている。本発明の様々な実施形態は、異なるが、必ずしも相互に排他的ではないことを理解されたい。たとえば、１つの実施形態に関連して本明細書で説明される特定の特徴、構造、または特性は、本発明の精神および範囲から逸脱することなく、他の実施形態内で実装され得る。それに加えて、開示された各実施形態内の個々の要素の位置または配置は、本発明の精神および範囲から逸脱することなく変更され得ることを理解されたい。したがって、以下に詳述する説明は限定的な意味で解釈されるべきではなく、本発明の範囲は添付の特許請求の範囲によってのみ定義され、請求項が権利を与えられる均等物の全範囲とともに、適切に解釈される。
【００３１】
本発明は、このソフトウェアコードにおいて保護されるべき少なくとも１つの定数値を難読化することにより、ソフトウェアコードＳＣをセキュアにすることを目的とする。これは、コンパイル済みのセキュアなソフトウェアコードＳＳＣを作り出し、攻撃者が、コードアナライザまたはデバッガを用いて、コンパイル済みのセキュアなソフトウェアコードを解析することによって、これらの定数値についての知識を得ることを困難にする。
【００３２】
コンパイルは、ＣやＦｏｒｔｒａｎなどの高級プログラミング言語で記述されたソースコード１１を、図１に示すように、コードが実行されることになっているシステムのハードウェア実装を考慮に入れたマシンコード１５などの低級言語で記述されたオブジェクトコードに変換する。コンパイルは、シンタックス解析１２、制御フローグラフ生成１３、およびアセンブリコード生成１４などの中間ステップを実施することがよくある。コンパイル済みのコードの実行可能ファイルをビルドするために、通常、コンパイルは、オブジェクトコードを含む多数のファイルを単一の実行可能ファイルにともにリンクするリンクステップによって後続される。
【００３３】
以下に説明する実施形態のほとんどのステップは、ソースコード、アセンブリコード、およびマシンコードのいずれにも適用され得る。以下の段落では、本発明による難読化方法の、以下ソフトウェアコードと呼ばれるコンパイル済みのコードへの適用について説明するが、これは、本発明の範囲の限定として解釈されないものとする。本発明の1つ以上のステップをソースコードに適用することにより当業者によって導出され得る様々な構成が、本発明の範囲に含まれる。
【００３４】
本発明の第１の態様は、少なくとも１つの定数値を備えたソフトウェアコードＳＣをセキュアにするための難読化方法である。このようなセキュアにする方法は、少なくとも１つの定数値を備えたコンピュータコード命令を備えたコンパイル済みのソフトウェアコードＳＣを取り扱い、セキュアなソフトウェアコードＳＳＣを作り出すセキュアにするデバイス２０によって実施される。その後、取得されたセキュアなソフトウェアコードＳＳＣは、実行デバイス３０によって、セキュアに実行され得る。
【００３５】
このようなセキュアにするデバイス２０は、プロセッサを含む任意の電子デバイスであり得る。たとえば、これは、開発環境がインストールされたパーソナルコンピュータＰＣであり得る。図２は、第１のプロセッサ２１、第１のＲＡＭメモリ２２、イーサネットまたはＷｉｆｉネットワークアダプタのような第１の通信ユニット２３、第１のディスプレイ２４、ハードドライブのような第１の大容量記憶手段２５、および第１のユーザ入力手段２６を備えた、このようなセキュアにするデバイスの例示的な実施形態を説明する。セキュアにされるべきソフトウェアコードＳＣは、セキュアにするデバイスの第１の大容量記憶手段２５に記憶され得る。セキュアにするデバイス２０が、第１の態様による方法をソフトウェアコードＳＣに適用した後に得られるセキュアなソフトウェアコードＳＳＣは、第１の大容量記憶装置２５に記憶されることもできる。
【００３６】
図３は、実行デバイス３０の例示的な実施形態を説明する。たとえば、実行デバイス３０は、パーソナルコンピュータＰＣ、スマートフォンやタブレットのようなモバイルデバイス、または、銀行や店頭における公共端末であり得る。これは、スマートカードまたはクレジットカードに含まれる単純なチップでもよい。これは、第２のプロセッサ３１、第２のＲＡＭメモリ３２、イーサネットまたはＷｉｆｉネットワークアダプタのような第２の通信ユニット３３、第２のディスプレイ３４、ハードドライブのような第２の大容量記憶手段３５、および第２のユーザ入力手段３６を備え得る。実行デバイス３０の第２のプロセッサ３１によって実行されるべきセキュアなソフトウェアコードＳＳＣは、実行デバイスの第２の大容量記憶手段３５に記憶されてもよい。電子デバイス３０は、実行デバイスのものと類似または異なる任意のタイプのものであり得る。両デバイスは、ｘ８６、ＡＲＭ、ＰｏｗｅｒＰＣのような同じハードウェアアーキテクチャを共有することも、または異なるアーキテクチャを有することもある。
【００３７】
セキュアにする方法の主なステップ
以下の段落では、図４に示すように、ソフトウェアコードＳＣをセキュアにし、セキュアなソフトウェアコードＳＳＣを作り出す、本発明の第１の態様による方法のステップを説明する。これらのステップは、セキュアにするデバイス２０の第１のプロセッサ２１によって実施され、ステップ番号が後続する文字「Ｓ」ですべてラベル付けされている。
【００３８】
必要なとき、第１の態様による方法が完了した後、セキュアなソフトウェアコードＳＳＣを実行したときに実行デバイス３０によって実施されるステップが参照される。このような実行ステップには、ステップ番号が後続する文字「Ｅ」でラベル付けされている。
【００３９】
セキュアにする方法の主なステップ：第１のセキュアにするステップ
第１のセキュアにするステップＳ１では、保護されるべき定数値が、ソフトウェアコードにおいて決定される。保護されるべきこのような定数値は、人間のオペレータによって第１のプロセッサ２１へ指定され得る。あるいは、これは、第１のプロセッサ２１自体によってランダムに決定され得るか、または第１のプロセッサ２１によって実行される解析プログラムによって決定され得る。第１の大容量記憶手段２５から読み取られたソフトウェアコードをパーシングすることにより、第１のプロセッサ２１は、たとえば、変数が、このような定数値に初期化されたとき（変数＝ｃｏｎｓｔａｎｔ＿ｖａｌｕｅ）、または、定数値が、比較（ｉｆ  変数＞ｃｏｎｓｔａｎｔ＿ｖａｌｕｅ  ｔｈｅｎ  ．．．）のような演算のパラメータとして使用されているとき、1つ以上の定数値を突き止めることができる。このような定数値はまた、セキュアなコードＳＣの命令が、実行デバイス３０によって実行されたとき、実行デバイス３０の第２のＲＡＭメモリ内の位置を指定するメモリアドレスであり得る。このようなアドレスは、たとえば、完全性チェックが実施されるべきメモリのセクションの開始または終了を指定し得る。ソフトウェアコードを、攻撃者によるリバースエンジニアリングおよび改ざんから保護するために、このような定数値は、可能な限り攻撃者から隠されるべきであり、第１の態様にしたがう方法によって作り出されたセキュアなソフトウェアコードＳＳＣにおいて「プレーンテキストで」留まるべきではない。
【００４０】
以下のステップでは、目的は、ソフトウェアコードにおいて、定数値を、置換変数（ｒｅｐｌａｃｅｍｅｎｔ  ｖａｒｉａｂｌｅ）と呼ばれる変数で置換し、実行デバイス３０の第２のプロセッサ３１によって実行されたとき、以下ターゲット値Ｘと呼ばれる別の値に基づいて、この置換変数の値を、保護された定数値に等しく設定する命令を、コードに挿入することである。コードの静的解析により定数値の検索を試みる攻撃者に対して、問題をより困難にするために、ターゲット値Ｘは多数の値を含む配列に格納され、実行デバイス３０の第２のプロセッサ３１により実行されたとき定数値が決定され得る、ターゲット値の配列におけるインデクスを計算する命令が、変更されたコードに挿入される。
【００４１】
セキュアにする方法の主なステップ：第２のセキュアにするステップ
より正確には、第２のセキュアにするステップＳ２では、セキュアにされたデバイス２０の第１のプロセッサ２１が、図５に説明された値のインデクス付けされた配列を、ソフトウェアコードに挿入し得、保護されるべき定数値が、以下ターゲット値Ｘと呼ばれる配列の１つの値から決定されるようになる。以下の方法のステップでは、このような配列は、配列におけるターゲット値Ｘを読み取ることにより、定数値の間接的な決定を可能にする。
【００４２】
セキュアにする方法の主なステップ：第３のセキュアにするステップ
第３のセキュアにするステップＳ３では、第１のプロセッサ２１は、ソフトウェアコードにおいて、保護されるべき定数値を、置換変数によって置換する。実行デバイス３０の第２のプロセッサ３１が、セキュアなソフトウェアコードＳＳＣを実行するときに、配列において読み取られたターゲット値に基づいて、定数値に等しく設定するのは、この置換変数の値である。
【００４３】
この第３のセキュアにするステップＳ３の間、第１のプロセッサは、定数値の１つ、いくつか、またはすべての出現さえも、同じ置換変数によって置換し得る。攻撃者に対して効率的であるために、定数値のすべての出現が変数で置換される方が良いが、すべての出現が、同じ唯一の変数で置換されることは必須ではない。たとえば、半分の出現が、第１の置換変数によって、他の半分が、第２の変数によって置換され得る。特定の実施形態では、第１の態様による方法のすべてのステップが、定数値の出現ごとに別々に適用され得る。セキュアなソフトウェアコードは、それで、定数値の出現ごとに、専用の配列、ターゲット値、および置換変数を含んでいる。
【００４４】
セキュアにする方法のメインステップ：第４のセキュアにするステップ
第４のセキュアにするステップＳ４では、第１のプロセッサ２１が、命令の第１のシーケンスをソフトウェアコードに挿入する。この命令の第１のシーケンスは、この命令の第１のシーケンスを備えたセキュアなソフトウェアコードＳＳＣが、実行デバイス３０の第２のプロセッサ３１によって実行されたとき、実行ステップＥ１からＥ４で説明されるアクションが実施されるようになっており、これら実行ステップは、以下および図６で説明される。この命令の第１のシーケンスは、セキュアなソフトウェアコードを実行するとき、実行デバイスが、配列におけるターゲット値Ｘに基づいて定数値を検索することを可能にすることを目的とする。
【００４５】
ＳＳＣランタイムにおいて実行デバイスによって実行されたとき、命令の第１のシーケンスは：
−  保護されるべき定数値が決定され得る値Ｘの配列におけるインデクスｉを計算し、
−  前記配列における前記計算されたインデクスｉに位置する値Ｘを、前記配列から抽出し、
−  前記抽出された値Ｘから、保護されるべき定数値を決定し、
−  前記置換変数の値を、決定された定数値に等しく設定する。
【００４６】
セキュアにする方法の例示的な実施形態
以下の段落では、セキュアにするデバイス２０によって実施される本発明の第１の態様によるセキュアにする方法の例示的かつ非限定的な実施形態について説明する。
【００４７】
上記で説明したように、第１のセキュアにするステップＳ１では、保護されるべき定数値が、ソフトウェアコードＳＣにおいて決定される。
【００４８】
その後、第２のセキュアにするステップＳ２では、値のインデクス付けされた配列が挿入され、保護されるべき定数値が、ターゲット値Ｘと呼ばれる、配列の１つの値から決定され得るようにされる。
【００４９】
第１のプロセッサ２１は、ランダムに選択されたインデクスｉにおいて、ターゲット値Ｘを、配列に含め得る。
【００５０】
第１の実施形態では、ターゲット値Ｘは、保護されるべき対応する定数値に単に等しい。この実施形態では、保護されるべき定数値がメモリアドレスであれば、配列における値、好ましくはこれらのすべては、セキュアなソフトウェアコードが第２のプロセッサ３１によって実行されるとき有効なメモリアドレスから、第１のプロセッサ２１によって選択され得る。こうすることで、攻撃者は、配列における値を解析し、有効なメモリアドレスではない値を破棄することによって、定数値に対応する、配列における値を突き止めることができない。より一般的には、どんな定数値のタイプであろうと、配列における値は定数値と同じタイプであり得、定数値は、これらと調和するように選択され得る。
【００５１】
その後、第３のセキュアにするステップＳ３では、保護されるべき定数値が、ソフトウェアコードにおいて置換変数によって置換される。
【００５２】
そしてその後、第４のセキュアにするステップＳ４では、命令の第１のシーケンスが、ソフトウェアコードに挿入される。この命令の第１のシーケンスは、ランタイムにおいて実行されたとき、ターゲット値Ｘの配列におけるインデクスｉを計算する。これを行うために、命令の第１のシーケンスは：
・  ランタイムにおいて実行されたとき、第１の中間値ｖを返す、命令の第２のシーケンスと、
・  ランタイムにおいて実行されたとき、第１の変換関数ｆを前記第１の中間値ｖに適用し、ｉ＝ｆ（ｖ）と記され得る前記インデクスｉを計算する、命令の第３のシーケンスとを備え得る。
【００５３】
命令の第２のシーケンスによる第１の中間値ｖの計算は、意図的に必要以上に、より複雑化され得る。これは、攻撃者が、リバースエンジニアリングすることと、このような計算を理解することとをより困難にすることを可能にする。このような計算は、オペイク（ｏｐａｑｕｅ）計算と呼ばれる。命令の第２のシーケンスは、ソフトウェアコードにおいて、第１の中間値を計算するだけではない別の目的を有するシーケンスであり得る。たとえば、これは、別の改ざん防止保護のために必要とされる完全性チェックであり得る。または、ループ（ｆｏｒ、ｗｈｉｌｅなど…）の組合せや、値がソフトウェアコードの別の部分で割り当てられている変数に対する動作など、攻撃者によって容易に理解できない手法で、第１の中間値を計算する以外の目的を持たない様々な命令からなる大きなシーケンスであり得る。
【００５４】
命令の第３のシーケンスにおいて適用される第１の変換関数ｆは、配列のインデクス値の範囲における値を出力し、第１の中間値ｖに適用されたときに配列におけるターゲット値Ｘのインデクスを出力する任意の関数であり得る。たとえば、これは、インデクス値を出力するために、第１の中間値のマスクされたハッシュ、または第１の中間値のほんの少数の所定のビットを選択するマスクであり得る。
【００５５】
第１の変換関数ｆは、関係ｉ＝ｆ（ｖ）を検証する所定の変換関数の第１のセットから、セキュアにするデバイス２０の第１のプロセッサ２１によってランダムに選択され得る。
【００５６】
本発明の第１の態様による方法が、定数値のいくつかの出現に別々に適用されるとき、および、第１の変換関数が、所定の変換関数の第１のセットから毎回ランダムに選択されるとき、各命令の第３のシーケンスは、異なる変換関数を適用し得る。
【００５７】
その後、この命令の第１のシーケンスは、ランタイムにおいて実行されたとき、前記配列における、前記計算されたインデクスｉに位置する値Ｘを、前記配列から抽出し、その後、前記抽出された値Ｘから、保護されるべき定数値を決定し、最後に、前記置換変数の値を、決定された定数値に等しく設定する。
【００５８】
第１の実施形態では、ターゲット値は、単純に、保護されるべき対応する定数値に等しい。この実施形態では、セキュアなソフトウェアコードＳＳＣを実行したとき、第１の変換関数によって出力されたインデクスｉにおいて、配列における定数値を単に読み取ることによって、定数値が取得される。この実施形態では、保護されるべき定数値の発見を試みる攻撃者は、配列においてそれを読み取ることができるが、配列におけるどの値が定数値であるかを発見する簡単な手法を有していない。
【００５９】
第２の実施形態では、命令の第１のシーケンスは、ランタイムにおいて実行されたとき、第２の変換関数ｇを、前記第１の中間値ｖに適用することにより、第２の中間値ｍを決定する命令の第４のシーケンスを含んでいる。これは、ｍ＝ｇ（ｖ）と記され得る。
【００６０】
この第２の実施形態では、命令の第１のシーケンスは、ランタイムにおいて実行されたとき、抽出されたターゲット値Ｘおよび第２の中間値ｍに基づいて、保護されるべき定数値を決定する命令の第５のシーケンスも含んでいる。このような実施形態は、定数値は、配列内でさえも、セキュアなソフトウェアコードにもはや格納されないため、攻撃者が、定数値を検索することをさらに困難にする。定数値を検索するために、攻撃者は、配列におけるすべての値からターゲット値Ｘを決定し、第２の中間値ｍを取得せねばならず、最後に、ターゲット値および第２の中間値に基づいて、定数値がどのように決定されるかを発見する必要がある。
【００６１】
例として、この第２の実施形態では、保護されるべき定数値は、セキュアなソフトウェアコードＳＳＣを実行したとき、配列からターゲット値Ｘを抽出し、前記第２の中間値ｍを決定した後、第３の変換関数ｈを、抽出されたターゲット値Ｘおよび第２の中間値ｍに適用することによって決定され得る。これは、ｃｏｎｓｔａｎｔ＿ｖａｌｕｅ＝ｈ（Ｘ，ｍ）と記され得る。
【００６２】
第１の変換関数が選択され得る手法は、所定の関数の第１のセットからの第１の変換関数のランダムな選択を含めて上記で説明された。同様に、第２の変換関数は、所定の変換関数の第２のセットにおいてランダムに選択され得、第３の変換関数は、所定の変換関数の第３のセットにおいてランダムに選択され得、前記セットは、ハッシュ関数およびマスク関数を含んでいる。これは、本発明の方法によって保護される各定数値または定数値の出現に対して異なる第２および第３の変換関数を使用することを可能にし、攻撃者が、セキュアなソフトウェアコードをリバースエンジニアリングすることをより困難にする。
【００６３】
この第２の実施形態において、保護されるべき定数値がメモリアドレスの場合、定数値が決定され得るターゲット値Ｘは、セキュアなソフトウェアコードＳＳＣが第２のプロセッサによって実行されるとき、実行デバイス３０の第２のＲＡＭメモリ３２内の任意のオブジェクトの有効なメモリアドレスとはならない可能性が高い。配列におけるすべての値からターゲット値を隠蔽し続けるために、セキュアなソフトウェアコードが第１のプロセッサによって実行されるとき、配列における他の値が、無効なメモリアドレスとして選択され得る。こうすることで、メモリアドレスと見なされる配列における値の有効性に関する攻撃者による解析は、配列におけるどの値がターゲット値Ｘであるかを明らかにしないであろう。
【００６４】
セキュアなソフトウェアコード実行
上記で説明されたステップが、セキュアなソフトウェアコードを作り出すセキュアにするデバイスによって実施された後、このようなセキュアなソフトウェアコードは、実行デバイス３０の第２のプロセッサ３１によって、セキュアに実行され得る。セキュアなソフトウェアコードを実行したとき、実行デバイスは、命令の第１のシーケンス：
−  第１の実行ステップＥ１の間、第２のプロセッサ３１は、保護されるべき定数値が決定され得るターゲット値Ｘの配列におけるインデクスｉを計算する。
−  第２の実行ステップＥ２の間、第２のプロセッサ３１は、前記配列における前記計算されたインデクスｉに位置する、ターゲット値Ｘである値を前記配列から抽出する。
−  第３の実行ステップＥ３の間、第２のプロセッサ３１は、前記抽出された値から、保護されるべき定数値を決定する。
−  第４の実行ステップＥ４の間、第２のプロセッサ３１は、前記置換変数の値を、決定された定数値に等しく設定する、
を実行する。
【００６５】
実施形態では、第１の実行ステップＥ１は：
・  第１の中間値ｖを返す第１の計算ステップＥ１１と、
・  ｉ＝ｆ（ｖ）と記され得る前記インデクスｉを計算するために、第１の変換関数ｆを前記第１の中間値ｖに適用する第２の計算ステップＥ１２とを備え得る。
【００６６】
上記で説明された第２の実施形態において、命令の第１のシーケンスは、ｍ＝ｇ（ｖ）と記され得る第２の変換関数ｇを前記第１の中間値ｖに適用することによって、第２の中間値ｍを決定することを含んでいる。その後、実行デバイス３０の第２プロセッサ３１が、配列からターゲット値Ｘを抽出し、前記第２の中間値ｍを決定した後、保護されるべき定数値は、抽出されたターゲット値Ｘおよび第２の中間値ｍに基づいて、第２のプロセッサ３１によって決定される。
【００６７】
保護されるべき定数値は、セキュアなソフトウェアコードＳＳＣを実行したとき、配列からターゲット値Ｘを抽出し、前記第２の中間値ｍを決定した後、関数ｈを、抽出されたターゲット値Ｘおよび第２の中間値ｍに適用することによって決定され得る。
【００６８】
他の態様
第２の態様では、本発明は、セキュアにするデバイス２０の第１のプロセッサ２１が、上記で説明された第１の態様による方法の少なくともセキュリティ保護ステップＳ１からＳ４を実施した後に得られるセキュアなソフトウェアコードの命令でエンコードされた非一時的機械可読記憶媒体にも関する。前記セキュアなソフトウェアコードは、そのとき、第１の態様による前記方法が適用され、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンである。前記記憶媒体上にエンコードされた命令において、保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換される。
【００６９】
非一時的な機械可読記憶媒体は、値のインデクス付けされた配列でエンコードもされ、保護されるべき前記定数値は、配列の１つの値と、ランタイムにおいて実行されたとき、上記で説明された実行ステップＥ１からＥ４：
−  保護されるべき定数値が決定され得る値の配列におけるインデクスを計算し、
−  前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出し、
−  前記抽出された値から、保護されるべき前記定数値を決定し、
−  前記置換変数の値を、前記決定された定数値に等しく設定する、
を実施する、命令の第１のシーケンスから決定されるようになる。
【００７０】
第３の態様では、本発明はまた、実行デバイス３０の第２のプロセッサ３１によって実行されるような、セキュアなソフトウェアコードの命令を実行する方法に関する。前記セキュアなソフトウェアコードは、それで、上記で説明された第１の態様による方法が適用され、保護されるべき定数値を備えた、セキュアでないソフトウェアコードの変更されたバージョンである。保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換されており、前記セキュアなソフトウェアコードは、値のインデクスされた配列も備え、保護されるべき前記定数値が、配列の１つの値から決定され得るようになる。セキュアなソフトウェアコードの命令を実行する方法は、上記で説明された実行ステップＥ１からＥ４：
−  第１の実行ステップＥ１の間、第２のプロセッサ３１は、保護されるべき定数値が決定され得るターゲット値Ｘの配列におけるインデクスｉを計算し、
−  第２の実行ステップＥ２の間、第２のプロセッサ３１は、前記配列における前記計算されたインデクスｉに位置する値であるターゲット値Ｘを前記配列から抽出し、
−  第３の実行ステップＥ３の間、第２のプロセッサ３１は、前記抽出された値から、保護されるべき定数値を決定し、
−  第４の実行ステップＥ４の間、第２のプロセッサ３１は、前記置換変数の値を、決定された定数値に等しく設定すること
を備えている。
【図１】
0006906057.tif 000002
【図２】
0006906057.tif 000003
【図３】
0006906057.tif 000004
【図４】
0006906057.tif 000005
【図５】
0006906057.tif 000006
【図６】
0006906057.tif 000007