(57)【要約】【課題】コンピューターコードのリバースエンジニアリング又はハッキングの、妨害、防止又は検出すること。【解決手段】プログラムを実行しているコンピューター中において条件付ジャンプを行う方法の実施形態において、本質的条件分岐がなされる条件となる入力が提供される。難読化させる、予測不能なデータが提供される。前記予測不能なデータを条件とする難読化された分岐を引き起こすコードが実行される。難読化された条件分岐によって決定されるコンピュータプログラム中のポイントにおいて、その入力に依存する本質的な条件分岐がなされる。【選択図】図２
2010225154.tif 000002
【特許請求の範囲】
【請求項１】
コンピューター実行プログラムにおいて条件付ジャンプを行う方法であって、以下のことを含む方法：
本質的条件分岐がなされるべきである入力条件をコンピューター中に提供すること；
難読化させる、予測不能なデータをコンピューター中に提供すること；
コンピュータープログラム中で、予測不能なデータを条件とする難読化された条件分岐を引き起こすコードを実行すること；  及び
コンピュータープログラム中の難読化された条件分岐によって決定されるポイントで、上記入力上で本質的条件分岐を行うこと。
【請求項２】
請求項１に記載の方法で、さらに難読化された条件分岐の繰り返し、及びコンピュータープログラム中の難読化された条件分岐によって決定されるポイントで、本質的条件分岐を行うことを含む方法。
【請求項３】
請求項２に記載の方法で、予測不能なデータが行列中の行を選択し、難読化された条件分岐が、選択された行中の入力によって決定される方法。
【請求項４】
請求項１に記載の方法で、さらに前記本質的条件分岐から、前記本質的条件分岐がなされるポイントに依存するプログラム中のポイントに進める工程を含み、その後前記本質的条件分岐がなされるポイントから独立したポイントに進める工程を含む方法。
【請求項５】
請求項４に記載の方法で、本質的条件分岐がなされるポイントに依存するポイントから、本質的条件分岐が作成されるポイントから独立したポイントへ進めることが、独立したポイントに到達するまで繰り返すことを含む方法。
【請求項６】
請求項１に記載の方法で、さらに本質的条件分岐の後、予測不能な回数分、さらなる難読化されたコードを繰り返すことを含む方法。
【請求項７】
請求項１に記載の方法で、さらに前記難読化された条件分岐と前記本質的条件分岐の間において、他のコンピュータープログラムコードを実行することを含む方法。
【請求項８】
請求項７に記載の方法で、さらに前記他のコンピュータープログラムコードの実行を監視し、難読化された条件分岐の異なる選択に続いて、他のプログラムコードの実行間における矛盾を検出しようとすることを含む方法。
【請求項９】
請求項１に記載の方法で、入力を提供することが、同じプログラムの他の部分からの入力を提供することを含む方法。
【請求項１０】
請求項１に記載の方法で、予測不能なデータを提供することが、予測不能なデータのソースをプログラム内から呼び出すことを含む方法。
【請求項１１】
コンピューター読取可能保存媒体で、使用において以下のようなことをコンピューターに引き起こすように設定されたインストラクションを含む媒体：
・本質的条件分岐がなされるべき入力条件を提供すること；
・難読化させる、予測不能なデータを提供すること；
・予測不能なデータを条件とする難読化された分岐を引き起こすこと；及び
・難読化された条件分岐によって決定されるインストラクション中のポイントで、前記入力上で本質的条件分岐を行うこと。
【請求項１２】
請求項１１に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
難読化された条件分岐を繰り返すこと、及び
難読化された条件分岐によって決定されるインストラクション中のポイントで本質的条件分岐を行うこと
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１３】
請求項１１に記載のコンピューター読取可能保存媒体で、さらに
予測不能なデータが行列中の行を選択すること、及び
難読化された条件分岐が選択された行の入力によって決定されること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１４】
請求項１１に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
本質的条件分岐から、本質的条件分岐がなされたポイントに依存するインストラクション中のポイントへ進行すること、及びその後
本質的条件分岐がなされたポイントから独立したポイントに進行すること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１５】
請求項１４に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
本質的条件分岐がなされたポイントに依存するポイントから、
本質的条件分岐がなされたポイントから独立したポイントへ
独立したポイントに到達するまで繰り返すことによって進行すること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１６】
請求項１１に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
本質的条件分岐の後で、予測不能な回数分さらなる難読化されたコードを繰り返すこと
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１７】
請求項１１に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
前記難読化された条件分岐と前記本質的条件分岐の間で、他のコンピュータープログラムコードを実行すること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１８】
請求項１７に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
前記他のコンピュータープログラムコードの実行を監視すること、及び
難読化された条件分岐の異なる選択に続いて、他のプログラムコードの実行間における矛盾を検出しようとすること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項１９】
請求項１１に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
同じプログラムの他の部分からの前記入力を提供すること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【請求項２０】
請求項１１に記載のコンピューター読取可能保存媒体で、さらにコンピューターが
予測不能なデータのソースをプログラム内から呼び出すことによって前記予測不能なデータを提供すること
を、使用において引き起こすように設定されたインストラクションを含む媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示はコンピューターコードのリバースエンジニアリング又はハッキングの、妨害、防止又は検出に関する。
【背景技術】
【０００２】
コンピュータープログラムの作者又は所有者の許可なしで、コンピュータプログラムの機能を分析又は改変しようと試みることは人々にとって知られていないわけではない。コンピュータプログラムの改変は、分析のため、又はプログラムが作者の意図しない現実世界の結果を生み出すことを引き起こす目的で、ツールとして使用される可能性がある。
【０００３】
リバースエンジニアリングを防止するために様々な措置が提案されてきており、その中には、分析する人間が作者の原文にアクセスすることなしに、コードがどのように機能しているかを理解することがより困難になるように、機能がない、不必要な、又は非論理的に配置されたコードを含むことを、一般的に有する難読化が含まれる。
【０００４】
リバースエンジニアリングにおけるあらゆる試みにおいて重要となりうる多くのコンピューターコードの一の部分は、「条件分岐」又は「条件付ジャンプ」であり、このポイントにおいて、幾つかの様々な要素や他のイベントに依存して、コードの実行が異なるコースを取りうる。条件分岐は、その条件の両結果ににおいてプログラムの異なる部分にジャンプする可能性がある。より一般的には、条件分岐は、特定の条件が満たされた場合にジャンプするコマンドによって形成される。そして、その条件が満たされない場合に条件付ジャンプコマンドに続くコマンドにおいて継続する暗黙のコマンドがある。一般に、本願明細書において、一つの分岐にジャンプがあるか両方の分岐にジャンプがあるか、及びジャンプがある分岐の選択で一つだけジャンプがあるかどうかは重要ではなく、用語「条件付ジャンプ」と「条件分岐」は前記３つのケースにおいて区別されることなく使用される。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
リバースエンジニアは、典型的にはプログラムのコンパイルされたバイナリコード中の条件付ジャンプステートメントを容易に認識することができる。条件付ステートメントは容易に見つけられ、現在一般に入手可能なデバッガーを用いて分析される。そして、リバースエンジニアは、プログラムが常に同一の継続するコースを追うように条件分岐を不能にすることができる。従ってそのオペレーションの理解をより簡単にする。悪意あるハッカーは条件分岐を改変する可能性があり、その結果実行の継続的なコースは、様々な要素や他のイベントを正確に満たさなくなる。そのことは、例えば、セキュリティや整合性テストを機能しなくさせたり、正常な入力から異常な出力を生み出すことを引き起こす可能性がある。従来の難読化は、リバースエンジニアにとって、バイナリコード中の条件付ジャンプコマンドを特定することを防止するものではなかった。
【課題を解決するための手段】
【０００６】
本出願は、プログラムを実行するコンピューターにおいて条件付ジャンプを行う方法及びそのためのコンピュータプログラムを開示し、その方法及びプログラムは、コンピューター中に、どの本質的条件分岐（ａ  ｓｕｂｓｔａｎｔｉｖｅ  ｃｏｎｄｉｔｉｏｎａｌ  ｂｒａｎｃｈ）がなされるべきかを条件とする入力を提供することを含む。そこにはそのコンピューター中に難読化させる、予測不能なデータが提供される。そして、コンピュータープログラム中に、予測不能なデータを条件とする難読化された分岐を引き起こすコードが実行される。難読化された条件分岐によって決定されるコンピュータープログラム中の一のポイントにおいて、前述の入力を条件とする本質的条件分岐がなされる。通常、「本質的条件分岐」とは、プログラムの実際の目的に関係したあらゆる条件分岐である。
上記及び他の態様、特徴、並びに利点は、以下のより特定的なそれらの記述から、より明らかになるであろう。そしてそれは以下の図と併用して示される。
【図面の簡単な説明】
【０００７】
【図１】図１はコンピュータネットワークの概略図である。
【図２】図２は条件分岐を難読化するための処理のフローチャートである。
【図３Ａ】図３Ａは図２の処理を実行するためのコンピューターソースコードの例である。
【図３Ｂ】図３Ｂは図２の処理を実行するためのコンピューターソースコードの例である。
【図３Ｃ】図３Ｃは図２の処理を実行するためのコンピューターソースコードの例である。
【図３Ｄ】図３Ｄは図２の処理を実行するためのコンピューターソースコードの例である。
【発明を実施するための形態】
【０００８】
ある実施形態においては、難読化された条件分岐は繰り返されても良く、その結果プログラムは分岐したツリー構造で作用する。本質的条件分岐はコンピュータープログラム中の一のポイント、ツリーの枝でなされ、それは本質的条件分岐の幾つかの実行可能な幾つかのインスタンスの中から、継続的な難読化された条件分岐の蓄積効果によって選択される。
【０００９】
ある実施形態において、予測不能なデータは、行列中の行を選択して、難読化された条件分岐は選択された行の入力によって決定される。
【００１０】
ある実施形態において、本質的条件分岐は、なされた本質的条件分岐のインスタンスに依存するプログラム中のポイントにプログラムが進行することを引き起こすことができ、そして、プログラムは、要すればさらなる難読化を通して、なされた本質的条件分岐のインスタンスから独立したポイントに進行することができる。ある実施例においては、本質的条件分岐の異なるインスタンスが、プログラムを異なる目的地のシーケンスに送ることができ、そして、そのプログラムは、そのシーケンスを通して繰り返すことができ、独立したポイントで終了する。別の実施例では、本質的条件分岐の後で、さらに予測不能な選択があってもよく、例えば、プログラムは、さらなる難読化されたコードを予測不能な回数分繰り返してもよい。
【００１１】
ある実施形態において、他のコンピュータープログラムコードは難読化された条件分岐と本質的条件分岐の間、又は本質的条件分岐の後の難読化されたコード間に含まれてもよい。２以上の継続的な難読化された条件分岐がある所で、他のプログラムコードは、最初の難読化された条件分岐の後のいかなるポイントにあってもよい。他のプログラムコードは、動作不能な難読化であってもよい。実行されると、それはポイントのない難読化であってもよく、又は本質的条件分岐の主題に密接に関連しないプログラムの一部からの不調和なコードであってもよく、又は難読化された条件分岐中の２重化された関連コードであってもよい。特に、後者のケースでは他のコードはハッカーが改変しようと望むであろうコードであってもよい。そして、もしハッカーが難読化された構造を完全に理解できなければ、ハッカーは、他のコードの一つだけ又は複数のコピーを改変する可能性がある。そして、改変されたコードが時として実行され、改変されていないコードが時として実行されるため、さらなるハッキングは防止されることができる。
【００１２】
ある実施形態において、難読化された条件分岐の異なる選択に続く他のプログラムコードの実行間の矛盾を検出する試みにおいて、そのような他のコンピュータープログラムコードの実行は、監視されてもよい。例えば、もしハッカーが、全ての難読化の構造を理解せずに、他のプログラムコードを改変する試みた場合、ハッカーは難読化されたツリーを通して一つのパス上の他のプログラムコードを改変するが、他のパスは改変しない可能性がある。結果、ツリーを通した継続的な繰り返しが、明確に異なる結果を引き起こす。
【００１３】
ある実施形態において、例えば、計算の結果、入力が、同じプログラムの別の部分から提供されてもよい。あるいは、入力は、プログラムの外部から送られたり、取り出されてもよい。
【００１４】
ある実施形態において、予測不能なデータは、予測不能なデータのソースをプログラム内から呼び出すことによって提供されてもよい。ソースは例えば、乱数や擬似乱数発生器であってもよい。あるいは、予測不能なデータは、同じ又は別のコンピュータープログラムの関連しない部分からのデータ又は結果であってもよい。オブジェクトは難読化されるであろうから、不調和なリンクは有益であろう。
【実施例】
【００１５】
添付した図を参照すると、そして最初に図１を参照すると、一般的に参照番号１０によって示さるコンピューターシステムの一の実施形態は、プロセッサー１２を含み、バス１４によって、ＲＡＭ１６、ＲＯＭ１８、固定ディスク２０、及びリムーバブルディスク２２といったコンピュータ読取可能保存媒体に接続される。バス１４は、キーボードのようなＩ／Ｏデバイス２４、マウスのようなポインティングデバイズ２６、及びインターネット接続２８にも接続される。２８を通した周辺機器１６は単なる例に過ぎない。当業者に知られているように、ストレージ及びＩ／Ｏの他の形態も提供されることができ、そしてまだまだ将来的には他の形態も開発されると思われる。プロセッサー１２は、様々な形態のソフトウェアを実行し、ソフトウェアはオペレーティングシステム及び他のセキュアなソフトウェア３０（ＲＯＭ１８やディスク２０に保存されることができる）、並びにアプリケーションソフトウェア３２（リムーバブルディスク２０上やインターネット２８を介して送られることができ、固定ディスク２０上に保存されることができる）を含む。ＲＡＭ１６は、アクティブ使用のプログラムやデータを一時保存するために共通で使用される。
【００１６】
図２を参照すると、本願発明に従ったコンピュータープログラム４０のある実施形態が、コンピューターシステム１０と一緒に用いられることができる。コンピュータープログラム４０は使用されないときには、ＲＯＭ１８又は固定ディスク２０上に保存されることができ、アクティブ使用の時にはＲＡＭ１６に保存されることができる。コンピュータープログラム４０はハッキングやリバースエンジニアリングから保護することを望むいかなるコンピュータープログラムであってもよい。そのようなプログラムの無数の例が当業者によって知られており、簡潔さの観点から、本開示と関係のないそのようなプログラムの部分は、詳細には記述していない。
【００１７】
図２のブロック５０において、コンピュータープログラム４０がロードされて、プログラムの実行が開始する。ブロック５２において、プログラムが難読化されるべき条件分岐に到達するまで、様々なコマンドが実行される。ブロック５３において、予測不能な選択がなされ、プログラムはブロック５４かブロック５６のいずれかに進む。予測不能な選択は乱数、擬似乱数、又は難読化される条件分岐に密接に関連しない幾つかのデータ若しくは結果に基づいたものであってよい。
【００１８】
ブロック５４及び５６は任意である。ブロック５４又は５６において、もし存在するならば、何もすることができないか、プログラム４０の別の部分における目的に寄与することができるか、又はブロック５４若しくはブロック５６が実行されたことを検出する（この場合にはコードは２つのブロックにおいて同じでも異なってもよい）ために寄与することができるコードをプログラムは実行する。ブロック５４又はブロック５６は２以上の機能のコードを含んでもよい。あるいは、又はさらには、ブロック５４及び／又はブロック５６は、実際には全く実行されず、単にコンパイルされたプログラム４０がより読みづらくさせるコードを表してもよい。ブロック５４及び５６は同じでも異なってもよい。たとえブロック５４及び５６が共通の有用な目的に寄与したとしても、それらが二重化されたことがより明白になりにくくするために、異なるコードを用いることができる。
【００１９】
そして、プログラムはブロック５８及びブロック６０に進む。ブロック５８及びブロック６０において、予測不能な選択がなされ、プログラムは任意のブロック６２、６４、６６、又は６８に進む。ブロック６２、６４、６６、又は６８において、もし存在するならば、何もすることができないか、プログラム４０の別の部分における目的に寄与することができるか、又は問題のブロックが実行されたことを検出する（この場合にはコードは４つのブロックにおいて同じでも異なってもよい）ために寄与することができるコードをプログラムは実行する。ブロック６２、６４、６６及び６８は２以上の関数のコードを含んでもよい。あるいは、又さらには、ブロック６２、６４、６６及び／又は６８は、実際には全く実行されず、単にコンパイルされたプログラム４０がより読みづらくさせるコードを表してもよい。難読化がより明白になりにくくするために、ブロック５４、５６、６２、６４、６６、及び６８のコードは、たとえこれらのブロックの２つが実行された最終的な結果が同じであったとしても、異なってもよい。
【００２０】
そして、プログラムはブロック７０、７２、７４、及び７６のうち１つに進み、ここでさらなる予測不能な選択がなされ、そこからプログラムは、任意のブロック７８、８０、８２、８４、８６、８８、９０及び９２のうち選択された一つに進む。ブロック５４、５６、６２、６４、６６、及び６８に関する上記の記述は、ブロック７８、８０、８２、８４、８６、８８、９０及び９２にもあてはまり、簡便のため繰り返して説明はしない。
【００２１】
予測不能な選択の継続レベルの数は、図示した３つよりも多くても少なくてもよい。非常に短いパスは狡猾な又は幸運なハッカーから攻撃の受けやすさを露呈し得るため、一般に等しい数はよりセキュアな可能性はあるが、異なる分岐においては、レベルの数は異なっても良い。しかし、８つの枝につながる、３つのレベルは多くの目的に有用であると考えられる。
【００２２】
このこと及び他の予測不能な選択の根拠は、その状況や、必要とされる難読化の程度、予測不能性の入手可能なソース、及びプログラム４０を書いた個々のプログラマーに依存する可能性がある。通常は、二つの結果がおおよそ等しい可能性が好ましい。擬似乱数に基づいた選択は通常十分にセキュアなものであり、容易に実装できる。しかし、より予測が不能なものを時々利用することは、有利であろう。予測不能な選択の複数の繰り返しが、立て続けになされるところでは、例えば行列から行を選択して、そのパスを決定する継続的な選択を特定するためにその行の項を用いることによって、全体のパスを選択するために単一の擬似乱数又は他の予測不可能なデータが用いられてもよい。図３に示される実施例では、行列は８行あり、各行は３つの２進数の異なる順列を含んでいる。
【００２３】
任意のブロック７８、８０、８２、８４、８６、８８、９０、及び９２からは、プログラム４０はブロック９４、９６、９８、１００、１０２、１０４、１０６、及び１０８に進みここで本質的な入力が得られ、その入力に依存して本質的条件分岐が実行される。８つの本質的条件分岐ブロック９４、９６、９８、１００、１０２、１０４、１０６、及び１０８は、たとえその実態において同一の条件をテストするとしても、その形式において異なってよい。簡潔な例では、異なるブロックでは、ｉｆ（ｘ＞ｙ）、ｉｆ（ｘーｙ＞０）、ｉｆ（ｘ＋ｋ＞ｙ＋ｋ）などをテストできる。当業者は、条件分岐に通常基づく比較や他の条件の為に所望の数のテストや難読化の所望のレベルをどのように作成するかを理解するであろう。
【００２４】
本質的条件分岐の結果に依存して、プログラム４０は、一方の本質的結果のためのブロック１１０、１１２、１１４、１１６、１１８、１２０、１２２、又は１２４のうちの一つに進むか、あるいは他方の本質的結果のためのブロック、１２６、１２８、１３０、１３２、１３４、１３６、１３８、又は１４０のうちの一つに進む。各結果グループ１１０、１１２、１１４、１１６、１１８、１２０、１２２、及び１２４、又は１２６、１２８、１３０、１３２、１３４、１３６、１３８、及び１４０におけるブロックの数が、本質的条件分岐ブロック９４、９６、９８、１００、１０２、１０４、１０６、及び１０８の数と等しい場合は、各本質的条件分岐ブロックは各結果グループ中の特定のブロックへコントロールを通すことができる。あるいは、本質的条件分岐の結果が、結果グループを選択することができ、各結果グループ中の特定のブロックが予測不能な形で選択されることができる。この場合、結果グループ中のブロックの数は、本質的条件分岐ブロックの数と異なっても良い。
【００２５】
選択された結果ブロック１１０、１１２、１１４、１１６、１１８、１２０、１２２、１２４、又は１２６、１２８、１３０、１３２、１３４、１３６、１３８、１４０から、プログラム４０は、コントロールが「真の」結果ブロック１４２又は１４４に到達するまで、隣接するブロックへ繰り返し進む。この処理は、ゼロまでカウントダウンするブロックの初期選択を決定する番号くらいのシンプルなものであってよいし、より複雑な処理であってもよい。コントロールは各結果グループ内のブロックに沿って一方向に、或いは示したような論理リングを形成するブロックと共に予測不能に選択された方向に通過することができる。真の結果ブロック１４２又は１４４は、選択された結果ブロックの１つであってもよく、又は分離されたブロックであってもよい。真のブロック１４２又は１４４から、プログラム４０はブロック１５０又は１５２にそれぞれ進み、そこで他のコードが本質的条件分岐の結果に依存して実行される。
【００２６】
ある実施形態において、ブロック５４、５６等に似たさらなる任意のブロックが、本質的条件分岐ブロック９４等と結果ブロック１１０等又は１２６等との間に含まれることができる。そのようなさらなる任意のブロックは、二つの分岐において同じであっても異なってもよい。さらなる任意のブロックは結果グループ内に含まれてもよい。しかし、そのような任意のブロックは予測可能な状態で実行されたりスキップされるであろう。或いはそのような任意のブロックの繰り返しの数は予想可能な状態で、多様性をもつことができ、プログラム４０がどの結果ブロックの結果グループかに依存し、そのような予測可能性は、脆弱性を引き起こす可能性がある。従ってプログラマーは、そのような任意のブロックのための適切な材料の選択にあたっては、自身のスキルや判断を用いるべきである。
【００２７】
もしリバースエンジニアが、図２に示したプログラムブロックを経由するパスを解析しようと試みたならば、１つの代わりに１５個の条件分岐コマンドの存在と、それらのプログラムブロックを経由する少なくとも１６の固有の選択パスの存在によって、分析を混乱させ、妨げることができる。例えば、デバッギングツールは通常条件分岐の位置を特定することができる。しかし、デバッガーは難読化されたものを本質的条件分岐から区別できないであろうし、なぜこんなにもたくさんの分岐があるのかを説明することもできないであろう。もし、ハッカーが、例えば、結果が本質的入力から独立したものであることを確かなものとするため、本質的条件分岐コマンドを改変しようと試みたならば、ハッカーは本質的条件分岐の８つ全てのインスタンスを見つけて変更しなくてはならず、あるいは、確かな結果を得るために難読化された条件分岐ツリーを理解して不能化させなくてはならない。同様に、任意のコードブロックのいずれかが、実際の機能に寄与して、ハッカーがそのブロックを改変することを望んだ場合は、ハッカーは一貫した結果を得るためにそのコードブロックの全てのインスタンスを見つけて改変するか、すべての前記難読化された条件分岐を不能化しなくてはならない。
【００２８】
さらなるセーフガードとして、幾つか又は全ての任意の機能ブロック５４等の実行を監視してもよい。例えば、その難読化された条件分岐に続く又は反対側に位置する任意の機能ブロックペアの実行される相対的な率を監視することによって、難読化された条件分岐の何れかを改ざんしようとすることが検出される。例えば、ツリーを経由する連続パス上のツリー中におけるそのレベルのブロックを実行した結果を観察し、連続パス上の連続パスが同じ又は異なる結果を生み出すかを検出することにより、任意の機能ブロックの１つを改ざんしたり又は、パスを通したりすることが検出される。
【００２９】
ここで図３Ａ、３Ｂ、３Ｃ及び３Ｄを参照（総括的に図３として参照）すると、図２の処理を実行するコンピュータープログラムの実施形態のためのソースコードの例が示されている。参照しやすいように、コードの行に付番をした。
【００３０】
７〜１５行目においては、８行３列の行列が定義されており、各々２進数を有している。列番号は難読化分岐のレベルの番号に等しくなるように選択される（図２の５３等、５８等、７０等参照）。この例では、行番号は各可能な異なる行が一度だけ発生するように選択され、理解しやすいように行は体系的な順序でリストされる。他の配置も可能である。例えば、行がバイナリーオブジェクトコード中でより簡単に行列を認識されることの無いようシャッフルされることもできる。２３及び２４行目では、行列中の行番号を表す擬似乱数ｉが発生する。行ｉ内の連続する数は、難読化された分岐の決定の継続レベルの根拠となる予測不能なデータとして用いられるだろう。
【００３１】
２５行目では、項行列［ｉ］［０］、即ち行列行ｉの最初の桁、が読まれ、そして２６及び６７行目（図２のステップ５３に対応）では、行列［ｉ］［０］が１なのか０なのかによって、プログラムは異なるコードの部分に分岐する。簡潔にするため、２８及び６９行目で「左」及び「右」の同定する見出しを除いて、２つの選択的部分である２７〜６６行目と６８〜１０７行目が、同一であるように示されている。しかし、たとえ両者がその実態において同じ計算処理を行っているとしても、代わりに二つの部分は異なって見えるように記載されることができる。そのような違いは、ハッカーやリバースエンジニアにとって、第一に二重化された分岐があることを認識することがより困難となり、第二に全ての分岐を特定することがより困難となるであろう。そして、明瞭簡潔にするため、図２のブロック５４、５６、６２等、７８等といった任意のコードは図３には含まれていない。
【００３２】
２９、３０及び４８行目（図２における第二レベルの難読化された条件分岐５８に対応）において、プログラムは行配列［ｉ］［１］、即ち行列行ｉの２番目の桁、を読み込み、それに従って分岐する。７０、７１及び８９行目（図２におけるもう一方の第二レベルの難読化された条件分岐６０に対応）も同一であり、簡潔にするため、別々に記載しない。３２、３３及び４０行目（図２の第三レベルの難読化された条件分岐７０に対応）において、プログラムは、行配列［ｉ］［２］、即ち行列行ｉの３番目の桁、を読み込み、それに従って分岐する。５０、７３、及び９１行目は第３レベルの難読化された条件分岐７２、７４及び７６である３２行目に対応する。
【００３３】
最後に、３５〜３８、４２〜４５、５３〜５６、６０〜６３、７６〜７９、８３〜８６、９４〜９７、及び１０１〜１０４行目においては、プログラムは８つの異なるポイントに到達し、それは図２の本質的条件分岐９４、９６、９８、１００、１０２、１０４、１０６、及び１０８に対応する。この例では、分岐が条件付きである入力は、単に値ａとｂの違いであり、２１行目であらかじめ定義される。実際の実施形態では、入力は、プログラムの別の部分で計算された値、プログラム外部から受け取ったデータ、或いはその両方に依存するであろう。
【００３４】
どの本質的条件分岐から選ばれたとしても、プログラムはａ＞ｂならばｃｉｒ１（１０９行目）に進むし、ａ＜ｂならばｃｉｒ２（１３３行目）に進む。ｃｉｒ１及びｃｉｒ２それぞれにおいて、新しい乱数値ｉは１〜８の値で、ｓｗｉｔｃｈステートメントで引数として使用され、８つの値は図２の１２４を経由するブロック１１０か、又は１４０を経由するブロック１２６に対応する。そしてプログラムはループして、ｉ＝０になるまでｉを繰り返し減らし（図２のブロック１４２又は１４４に対応）、ＡがＢより大きいかどうかをｐｒｉｎｔｆステートメントで出力する（図２のブロック１５０又は１５２に対応）。簡潔にするため、ｃｉｒ１及びｃｉｒ２は同じものとして示す。実際の実施形態では、両者は完全に異なってもよいし、たとえ両者が類似の機能を持っていたとしても、異なって表現されてよい。上述したように、他のコードはｃｉｒ１及びｃｉｒ２の前又は内部に挿入されてもよい。
【００３５】
特定の実施形態を記述してきたが、当分野において通常の知識を有する読者は、本願発明の範囲を離れることなく、異なる実施形態の特徴をどのように結合したり、置き換えたりできるかを理解するであろう。
【００３６】
例えば、図２は、特定の難読化された構造を、本質的条件分岐の前後に示している。これらの難読化された構造のいずれかは、難読化されない、又は難読化の異なる形態と共に、本質的条件分岐の反対側で使用されることもできるであろう。
【００３７】
開示したシステムを実践する現在考えられているベストモードの前記記載は、意味を限定するものとして理解するのではなく、単に開示したシステムの動作の一般的な原理を記述する目的でなされたものである。保護される全範囲は、特許請求の範囲を参照することにより決定されるべきである。
【図１】
2010225154.tif 000003
【図２】
2010225154.tif 000004
【図３Ａ】
2010225154.tif 000005
【図３Ｂ】
2010225154.tif 000006
【図３Ｃ】
2010225154.tif 000007
【図３Ｄ】
2010225154.tif 000008