JPWO2006115219A1 - プログラム難読化装置及び難読化方法 - Google Patents
プログラム難読化装置及び難読化方法 Download PDFInfo
- Publication number
- JPWO2006115219A1 JPWO2006115219A1 JP2007514688A JP2007514688A JPWO2006115219A1 JP WO2006115219 A1 JPWO2006115219 A1 JP WO2006115219A1 JP 2007514688 A JP2007514688 A JP 2007514688A JP 2007514688 A JP2007514688 A JP 2007514688A JP WO2006115219 A1 JPWO2006115219 A1 JP WO2006115219A1
- Authority
- JP
- Japan
- Prior art keywords
- program
- block
- instruction
- camouflaged
- processing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims description 157
- 238000012545 processing Methods 0.000 claims abstract description 268
- 230000037431 insertion Effects 0.000 claims description 608
- 238000003780 insertion Methods 0.000 claims description 481
- 230000014509 gene expression Effects 0.000 claims description 80
- 238000003860 storage Methods 0.000 claims description 32
- 238000004364 calculation method Methods 0.000 claims description 30
- 238000012986 modification Methods 0.000 description 57
- 230000004048 modification Effects 0.000 description 57
- 238000004458 analytical method Methods 0.000 description 46
- 230000006870 function Effects 0.000 description 46
- 238000004590 computer program Methods 0.000 description 26
- 238000004422 calculation algorithm Methods 0.000 description 24
- 230000000694 effects Effects 0.000 description 8
- 238000005516 engineering process Methods 0.000 description 8
- 230000010354 integration Effects 0.000 description 8
- 238000004519 manufacturing process Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 6
- 239000000284 extract Substances 0.000 description 6
- 238000004891 communication Methods 0.000 description 4
- 239000000470 constituent Substances 0.000 description 4
- 230000011218 segmentation Effects 0.000 description 4
- 239000004065 semiconductor Substances 0.000 description 4
- 238000006467 substitution reaction Methods 0.000 description 4
- 230000007423 decrease Effects 0.000 description 2
- 238000012966 insertion method Methods 0.000 description 2
- 238000005304 joining Methods 0.000 description 2
- 230000009191 jumping Effects 0.000 description 2
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
Abstract
Description
非特許文献1において、例えば、プログラムの出力結果に影響を与えない複製生成型偽装コードの挿入を行い、難読化プログラムを生成する方法が開示されている。
難読化前のオリジナルのプログラムは、命令群1、命令群2、及び命令群3から構成されており、3つの命令群を順に実行するものとする。
この難読化方法では、オリジナルプログラムに、オリジナルプログラムの実行とは無関係なダミー変数を追加し、ダミー変数の値を書き換えるようなプログラム命令群を実行コード中にいくつか挿入する。また、ダミー変数の値によって分岐先が決定する擬似分岐命令が、命令群1と命令群2との間に追加される。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定しておく。さらに、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を偽装ブロックとする。
また、擬似分岐命令の挿入による難読化プログラムの生成方法について説明する。
この方法では、オリジナルプログラムにダミー変数を追加する。次に、ダミー変数の値によって分岐先が決定する擬似分岐命令を命令群1と命令群2との間に追加する。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定する。このとき、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を命令群3とする。
非特許文献1では、以上に述べたような難読化を行うことで、プログラムからアルゴリズムを推定することが困難になること、特定モジュールの位置の推定が困難になることが開示されている。例えば、暗号アルゴリズムのプログラムから暗号鍵を不正な解析から保護したい場合には、暗号アルゴリズムのモジュール位置の推定を困難にすることができる。
そのため、例えば暗号アルゴリズムの場合では、平文と暗号文の組を入手可能な不正解析者であれば、プログラム中に存在する定数データを暗号鍵と仮定して平文を暗号化して得た暗号文が実際の暗号文と一致するかを調べていけば、いずれ本当の暗号鍵を見つけることができる。
鴨志田、松本、井上、″耐タンパーソフトウェアの構成手法に関する考察″、ISEC97−59 Johannes Koebler,Uwe Schoening,Jacobo Toran,″The Grapph Isomorphism Problem″,Birkhaauser,1993 戸田誠之助、「グラフ同型性判定問題」、日本大学文理学部厳書(2001年)
しかしながら、不正解析者が、分割秘密を用いて難読化されたプログラムから複数の分割秘密を見つけ出すことが考えられる。例えば、第二のプログラム命令群で用いられる変数に着目し、その変数を用いた式を難読化後のプログラムから収集する方法が考えられる。例えば、前述の被秘匿情報「d0=1234」を4つの処理「d0=230」、「d0=d0+1000」、「d0=d0+4」に置き換えた場合、不正解析者は、d0と言う変数を用いた処理をプログラム中から収集することで、第二のプログラム命令群を構成する分割秘密を見つけ出し、見つけ出した複数の分割秘密から被秘匿情報「d0=1234」を取得することができる。
この構成によると、プログラム難読化装置は、1の偽装ブロックに、前記1の偽装ブロックから、オリジナルプログラムに含まれる正当プログラム命令、及び他の偽装ブロックの何れに分岐する分岐命令を挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、グラフにおける閉路の数が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから閉路数を取得し、取得した閉路数が、前記所定数以上であるか否かを判定するとしてもよい。
ここで、前記所定の条件を満たすとは、グラフが平面グラフでないことであり、前記判定部は、前記第1生成部にて生成されたグラフが平面グラフであるか否かを判定し、平面グラフでないと判定する場合に、前記所定の条件を満たすとするとしてもよい。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、第1の所定数以上のノード数からなる閉路の数が、ユ指定された前記強度に応じたグラフの難易度にて定まる第2の所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから、第1の所定数以上のノード数からなる閉路の数を取得し、取得した閉路数が、前記第2所定数以上であるか否かを判定するとしてもよい。
ここで、前記偽装ブロック挿入手段は、前記オリジナルブロックに対して、前記演算式が前記演算順位で実行された場合に真偽値が一定値となる比較式を含み、前記比較式により真偽値が前記一定値となる場合の分岐先を次に実行する次オリジナルブロックとする条件分岐命令を、前記オリジナルブロックに挿入し、前記偽装ブロックが、前記オリジナルブロックの直後に挿入された場合には、前記条件分岐命令を前記制御命令とするとしてもよい。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、前記処理命令挿入手段は、前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、前記偽装ブロック挿入手段は、前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、生成したグラフの強度が、所定の条件を満たすか否かを判定する判定部と、所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する、又は1のオリジナルブロックに、1の偽装ブロックを分岐先とし、常に前記分岐先には分岐しない条件分岐命令を前記オリジナルブロックに挿入する第2生成部と、前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部を行うように制御する制御部とを備えるとしてもよい。
この構成によると、プログラム難読化装置にて生成された前記複数の演算式は、正しい演算順序で実行した場合にのみ前記被秘匿情報を算出するので、不正解析者は、正しい演算順序を得ない限り、被秘匿情報を取得することができない。つまり、プログラム難読化装置は、オリジナルプログラムの解析を困難にすることができる。
ここで、前記分割部は、さらに、前記偽装ブロックを、1以上のプログラム命令からなる複数の偽装分割ブロックに分割し、前記被入替ブロック生成部は、さらに、前記偽装分割ブロックのそれぞれから、偽装分割ブロックに、他の偽装分割ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
ここで、前記被入替ブロック生成部は、さらに、前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数の分割ブロックに予め分割され、前記複数の分割ブロックが実行順序で並べられており、前記処理命令挿入手段は、最初に実行される分割ブロックから前記秘匿処理命令群を有する分割ブロックまでの間に、前記複数の処理命令のそれぞれを挿入し、前記偽装ブロック挿入手段は、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とするとしてもよい。
100 記憶部
101 入力部
102 ブロック分割部
103 等価プログラム命令生成部
104 等価プログラム生成部
105 偽装ブロック挿入後プログラム生成部
106 擬似分岐命令挿入後プログラム生成部
107 被入替ブロック群生成部
108 配置順序入替部
201 難読化対象プログラム
202 変数宣言部
203 処理部
以下、本発明に係る第1の実施の形態としてのプログラム難読化装置10について、図面を参照して説明する。
1.1 プログラム難読化装置10の構成
プログラム難読化装置10は、図1に示すように、記憶部100、入力部101、ブロック分割部102、等価プログラム命令生成部103、等価プログラム生成部104、偽装ブロック挿入後プログラム生成部105、擬似分岐命令挿入後プログラム生成部106、被入替ブロック群生成部107、配置順序入替部108から構成される。
1.1.1 入力部101
入力部101は、被秘匿情報を保持する難読化対象プログラムと、難読化対象プログラムにおける被秘匿情報を含むプログラム命令の位置を示す位置情報とを受け付ける。
入力部101は、難読対象プログラムの分割を指示する分割命令をブロック分割部102へ出力する。
ここで、難読化対象プログラムは、例えば、被秘匿情報である暗号鍵を使って暗号文の復号化を行うプログラムである。位置情報は、受け付けた難読化対象プログラムにおける秘密情報を保持するプログラム命令の行番号である。
入力部101が受け付ける難読化対象プログラムの一例を図2に示す。
図2において難読化対象プログラム201は関数funcから構成されている。関数funcは、変数宣言部202と、処理部203から構成されている。処理群Aは、実際には反復命令(for文、while文、do−while文)、選択命令(if文、switch文)、無条件分岐命令(goto文、break文、continue文、return文)以外のプログラム命令からなるプログラム命令群であり、N個のプログラム命令である命令a_1、命令a_2、・・・、命令a_Nから構成されるが図では簡略化している。命令a_1、命令a_2、・・・、命令a_Nは、例えば変数に定数を足すプログラム命令である「x+=10;」などのプログラム命令である。処理群B、処理群D、処理群F、処理群G、処理群Hも同様である。処理群Hの最後のプログラム命令は、「return;」であるとする。なお、C言語の用語については、公知であるので、詳細な説明は省略する。
処理部203には、被秘匿情報を保持するプログラム命令204が含まれる。プログラム命令204は、この難読化対象プログラム201の被秘匿情報「512」を含むプログラム命令「a=b+512;」である。
入力部101は、難読化対象プログラム201の分割を指示する分割命令をブロック分割部102へ出力する。
1.1.2 記憶部100
記憶部100は、入力部101にて受け付けた難読化対象プログラムと、位置情報とを記憶している。
1.1.3 ブロック分割部102
ブロック分割部102は、入力部101から分割命令を受け取ると、記憶部100に記憶されている難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、入力部101から、難読化対象プログラムを受け取ると、受け取った難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。ここで、基本ブロックとは、開始位置が、処理部の先頭(難読化対象プログラムの入口のプログラム命令、つまり、難読化対象プログラムの一番最初に実行されるプログラム命令)、処理が合流するプログラム命令、または、分岐となるプログラム命令の次のプログラム命令であり、終了位置が、次に処理が合流するプログラム命令の一つ前のプログラム命令、処理部の最後(プログラムの出口の命令、つまり、難読化対象プログラムの一番最後に実行されるプログラム命令)、または、分岐となるプログラム命令であるブロックである。
これにより、ブロック分割部102は、難読化対象プログラムを分割して複数の基本ブロックを生成することができる。また、難読化対象プログラムを構成する全てのプログラム命令は、ブロック分割部102により、いずれかの一つの基本ブロックに含まれるようになる。
ブロック分割部102は、生成した各基本ブロックを、以下のように分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、基本ブロックに含まれるプログラム命令数m、予め与えられた所定数Nとを用いて、基本ブロックを([(m−1)/N]+1)個の分割後ブロックに分割する。分割する際には、各ブロックのプログラム命令数が出来るだけ均等になるようにする。ここで、演算[a/b]は、除算a/bを施し、算出結果から小数点以下を切り捨てた整数を取得する演算式である。例えば、[5/2]=2となる。
図3は、図2に示す難読化対象プログラムを、基本ブロックに分割した結果を示す。
図3における基本ブロック301a〜301cは、図2の関数funcの処理部203を分割して生成した基本ブロックである。
基本ブロック301aは、関数funcの入口のプログラム命令(関数の中で一番最初に実行されるプログラム命令)を含む処理群Aからはじまり、それ以降、最初に出現する条件分岐命令(for文、while文、do−while文、if文、switch文)であるプログラム命令「if(条件1)goto labelF;」までのプログラム命令を含む。ここで、この条件分岐命令を基本ブロック301aの最後にしたのは、基本ブロックはブロックの最後以外では分岐しないためである。
次に、図4は、図3に示す各基本ブロックを、分割後ブロックに分割した結果を示す。
処理群A、処理群B、処理群Cを含む基本ブロック301aは、含まれるプログラム命令数の合計が3N個である。なぜなら、ここでは、処理群A、処理群Bに含まれるプログラム命令の個数をそれぞれN個と、処理群Cに含まれるプログラム命令をN−1個としており、基本ブロック301aには、プログラム命令「if(条件1)goto labelF;」が含まれているからである。
以下、同様に2N個のプログラム命令を含む基本ブロック301bを分割し生成した分割後ブロックが、分割後ブロック401d〜401eである。さらに、同様に3N個のプログラム命令を含む基本ブロック301cを分割し生成した分割後ブロックが、分割後ブロック401f〜401hである。
1.1.4 等価プログラム命令生成部103
等価プログラム命令生成部103は、被秘匿情報を含むプログラム命令と同等の機能を有する命令群を生成する。以降の説明では、この命令群を構成する各命令を等価プログラム命令と呼ぶ。
等価プログラム命令生成部103は、等価プログラム命令に使用する変数名(秘密情報用変数名)の決定、グラフ作成、等価プログラム命令の挿入対象ブロックの決定、及び等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令の生成を行う。
等価プログラム命令生成部103は、等価プログラム命令に使用する変数の名前を決定する。
まず、等価プログラム命令生成部103は、難読化対象プログラムを解析し、このプログラム中で使用されている全ての変数名を調べる。次に、使用されているいずれの変数名とも重複しない変数名を生成し、生成した変数名を秘密情報用変数名として決定する。
等価プログラム命令生成部103は、難読化対象プログラムの構造を示すグラフを作成する。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、第一のノードが第二のノードへの分岐命令(goto文、break文、continue文、return文による無条件分岐命令、またはfor文、while文、do−while文、if文、switch文による条件分岐命令)を含む場合、または、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応するプログラム上のプログラム命令の一つ後のプログラム命令が第二のノードに含まれている場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。なお、グラフに関する用語については公知であるため、ここでの説明は省略する。グラフ生成に関するより詳細については、コンパイラの分野では公知であるため、ここでの説明は省略する。
さらに、ここでは、位置情報にて示される被秘匿情報を含むプログラム命令が含まれるノードを秘密保有ノードと呼ぶ。また、プログラムの入り口となるプログラム命令(プログラムの一番最初に実行されるプログラム命令)を含むノードを開始ノード、プログラムの出口となるプログラム命令(プログラムの一番最後に実行されるプログラム命令)を含むノードを終了ノードと呼ぶこととする。
等価プログラム命令生成部103は、生成したグラフに基づき、等価プログラム命令を挿入する分割後ブロックを決定する。
等価プログラム命令生成部103は、まず、秘密保有ノードに対応するブロックを第1の等価プログラム命令挿入対象ブロックとする。次に、第1の等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に第nの等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第(n+1)の等価プログラム命令挿入対象ブロックとする。第nの等価プログラム命令挿入対象ブロックの先行ブロックが複数ある場合には、等価プログラム命令生成部103は処理を中止し、等価プログラム命令数をnとする。このステップのいずれの操作においても、等価プログラム命令挿入対象ブロックに選ばれなかった分割後ブロックを、以降、等価プログラム非挿入ブロックと呼ぶ。
等価プログラム命令生成部103は、等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令を生成する。等価プログラム命令生成部103は、等価プログラム命令数nと同数の等価プログラム命令を生成する。ここでは、等価プログラム命令数をNとし、以下、第1の等価プログラム命令から第Nまでの等価プログラム命令の生成手順を述べる。
等価プログラム命令生成部103は、整数RA_0をランダムに選択し、選択した整数RA_0を秘密情報用変数に設定する第1の等価プログラム命令「(秘密情報用変数)=RA_0;」を生成する。
(B)第t(t=2、3、・・・N−1)の等価プログラム命令の生成
等価プログラム命令生成部103は、0以外の整数であるRA_t、RB_tをランダムに選択し、選択した0以外の整数RA_t、RB_tと、第tの演算子とを用いて、第t(t=2、3、・・・N−1)の等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)(第tの演算子)RA_t+RB_t;」を生成する。ここで、第tの演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。
等価プログラム命令生成部103は、0以外の整数であるRA_Nをランダムに選択し、選択した0以外の整数RA_Nと、第一の値と、演算子「*」とを用いて、第Nの等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)*RA_N+(第一の値)」を生成する。
等価プログラム命令生成部103は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を取得する。
等価プログラム命令生成部103は、第1〜第(N−1)の等価プログラム命令を順番に並べたプログラム命令群
「(秘密情報用変数)=RA_0;
(秘密情報用変数)=(秘密情報用変数)(第2の演算子)RA_2+RB_2;
(秘密情報用変数)=(秘密情報用変数)(第3の演算子)RA_3+RB_3;
・・・
(秘密情報用変数)=(秘密情報用変数)(第(N−1)の演算子)RA_(N−1)+RB_(N−1);
」
を実行した際に得られる秘密情報用変数の値を、第二の値として算出する。
式1:(第一の値)=(被秘匿情報の値)−{(第二の値)*RA_N}
で得られる値を第一の値とする。
このような方法によって、第1から第Nまでの等価プログラム命令を生成した場合、
「(秘密情報用変数)=RA_0;
(秘密情報用変数)=(秘密情報用変数)(第2の演算子)RA_2+RB_2;
(秘密情報用変数)=(秘密情報用変数)(第3の演算子)RA_3+RB_3;
・・・
(秘密情報用変数)=(秘密情報用変数)(第(N−1)の演算子)RA_(N−1)+RB_(N−1);
(秘密情報用変数)=(秘密情報用変数)*RA_N+(第一の値);」
からなるプログラム命令群を順に処理した場合、処理の最後で秘密情報用変数は被秘匿情報の値になる。
なお、ここでは等価プログラム命令として、掛け算と足し算とを組み合わせた演算とを示したが、これに限定されない。等価プログラム命令数nと同数の等価プログラム命令を用いて、被秘匿情報の値が取得される演算であれば、どのような演算を用いても構わない。
等価プログラム命令生成部103は、まず、図2に示す難読化対象プログラム201を用いて、難読化対象プログラム201の関数funcで使用されている引数の変数名、およびの変数宣言部202で宣言されている変数名を調べ、これらと重複しない変数名を秘密情報用変数名とする。ここでは、秘密情報用変数名を「dkey」とする。
分割後ブロック401aの最後のプログラム命令は無条件分岐命令ではない。また、分割後ブロック401aの次のプログラム命令は分割後ブロック401bのプログラム命令である。よって、等価プログラム命令生成部103は、ノード501aとノード501bにエッジ502aを設ける。
分割後ブロック401cには分割後ブロック401fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1)goto labelF;」がある。よって、等価プログラム命令生成部103は、ノード501cとノード501fにエッジ502hを設ける。
なお、このグラフにおいて、ノード501aは開始ノードであり、ノード501hは終了ノードであり、ノード501eは秘密保有ノードである。
等価プログラム命令生成部103は、秘密保有ノードであるノード501eに対応する分割後ブロック401eを第1の等価プログラム命令挿入対象ブロックとする。ノード501eには先行ブロックはノード501dのみであるので、等価プログラム命令生成部103は、ノード501dに対応する分割後ブロック401dを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に、等価プログラム命令生成部103は、ノード501cに対応する分割後ブロック401cを第3の等価プログラム命令挿入対象ブロック、ノード501bに対応する分割後ブロック401bを第4の等価プログラム命令挿入対象ブロック、ノード501aに対応する分割後ブロック401aを第5の等価プログラム命令挿入対象ブロックとする。第5の等価プログラム命令挿入対象ブロックには先行ブロックがないので、等価プログラム命令生成部103は、等価プログラム命令数を「5」とする。
等価プログラム命令生成部103は、整数「18」を選択し、第1の等価プログラム命令「dkey=18;」を生成する。
ここでは、等価プログラム命令生成部103は、第2の演算子から第4の演算子をそれぞれ順に、「/」、「*」、「/」とし、ランダムな値RA_2〜RA_4をそれぞれ値「2」、値「4」、値「5」とし、ランダムな値RB_2〜RB_4をそれぞれ値「54」、値「−32」、値「+8」とし、第2〜第4の等価プログラム命令をそれぞれ以下のように生成する。
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」
次に、等価プログラム命令生成部103は、第5の等価プログラム命令を生成する。
ここでは、等価プログラム命令生成部103は、ランダムな値RA_Nを値「9」とする。さらに、等価プログラム命令生成部103は、以下のプログラム命令群の実行し、第二の値を算出する。
dkey=dkey/2+54;
dkey=dkey*4−32;
dkey=dkey/5+8;」
このプログラム命令群を順に実行すると、「dkey」の値は、順に、値「18」、値「63」、値「220」、値「52」となり、等価プログラム命令生成部103は、値「52」を第二の値とする。
式1:(第一の値)=(被秘匿情報の値)―{(第二の値)*RA_N}
に、被秘匿情報の値「512」と、第二の値「52」、RA_Nの値「9」を代入することにより、第一の値「44」を算出する。
等価プログラム命令生成部103は、第5の等価プログラム命令「dkey=dkey*9+44;」を生成する。
「dkey=18;」、
「dkey=dkey/2+54;」、
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」、
「dkey=dkey*9+44;」
となる。これらのプログラム命令を順に行った場合のdkeyの値は被秘匿情報の値「512」になることを確認することが出来る。
等価プログラム生成部104は、被秘匿情報を秘密情報用変数に置き換え、等価プログラム命令生成部103にて生成したそれぞれの等価プログラム命令を、等価プログラム命令挿入対象ブロックに挿入し、等価プログラム挿入後ブロックを生成する。
等価プログラム生成部104は、生成した等価プログラム挿入後ブロックと、等価プログラム命令を挿入しなかった分割後ブロックとからなる等価プログラムを生成する。等価プログラムは、被秘匿情報を含む命令が等価プログラム命令群に置き換えられているが、置き換えを行う前のプログラムと同等の機能を有するプログラムである。
等価プログラム生成部104は、秘密情報用変数の追加と、被秘匿情報の置き換えと、等価プログラム命令の挿入とを行う。
(1)秘密情報用変数の追加
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数を、難読化対象プログラムの変数宣言部に追加し、新たな変数宣言部を生成する。
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える。ここでは、等価プログラム生成部104は、秘密保有ノードに含まれる被秘匿情報の値を秘密情報用変数に置き換える。
等価プログラム生成部104は、等価プログラム命令生成部103にて生成した等価プログラム命令それぞれを、等価プログラム命令生成部103にて決定したいずれかの等価プログラム命令挿入対象ブロックに挿入する。以下、詳細な動作について説明する。
等価プログラム生成部104は、第t(t=1、2、・・・、N)の等価プログラム命令を第(N―t+1)の等価プログラム命令挿入対象ブロックに挿入し、第(N―t+1)の等価プログラム命令挿入後ブロックを生成する。
なお、以降の説明において、等価プログラム命令を挿入しなかった分割後ブロックのことを、等価プログラム非挿入ブロックと呼ぶ。
また、第1〜第Nの等価プログラム挿入後ブロックを実行することにより、秘密情報用変数には被秘匿情報の値が設定されることがわかる。
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加し、図6に示すように、新たな変数宣言部601を生成する。変数宣言部601は、変数宣言部202に、秘密情報用変数「dkey」の宣言文が加わったものである。このとき、等価プログラム生成部104は、秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加する際に、変数「dkey」の変数の型を、被秘匿情報である「512」を示すことが出来る型にする(例えば、8ビット正整数型を用いると0〜255までしか表現できず512を示すことができないので、これは避ける。)。ここでは、例えば、変数「dkey」の変数の型をint型とする。
次に、等価プログラム生成部104は、第1の等価プログラム命令「dkey=18;」を第5の等価プログラム命令挿入対象ブロックであるノード501aに挿入し、第5の等価プログラム命令挿入後ブロック602aを生成する。同様に第2の等価プログラム命令「dkey=dkey/2+54;」を第4の等価プログラム命令挿入対象ブロックであるノード501bに挿入し、第4の等価プログラム命令挿入後ブロック602bを生成する。以下、同様に、第3の等価プログラム命令挿入後ブロック602c、第2の等価プログラム命令挿入後ブロック602d、第1の等価プログラム命令挿入後ブロック602eを生成する。
図6にて、等価プログラム命令挿入後ブロック602a〜602eと、等価プログラム命令非挿入ブロック603f〜603hとを用いたグラフを示す。
1.1.6 偽装ブロック挿入後プログラム生成部105
偽装ブロック挿入後プログラム生成部105は、正常系での実行結果を得るためには必要なく、また実行されることもないプログラム命令群である偽装ブロックを生成する。偽装ブロックは、より詳細には、プログラム実行中にデバッガ等を用いてプログラムカウンターや変数の値を強制的に変更することを行わない限り、実行されることのないプログラム命令群である。
偽装ブロック挿入後プログラム生成部105は、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成とを行う。
偽装ブロック挿入後プログラム生成部105は、生成する偽装ブロック数を予め記憶している。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得する。偽装ブロック数の値は、例えば、「1000」等である。なお、説明の簡略化のために偽装ブロック数を値「4」とする。
偽装ブロック挿入後プログラム生成部105は、取得した偽装ブロック数にて示される個数の偽装ブロック本体を生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1以上の分割後ブロックをランダムに選択する。
(3)偽装等価プログラム命令挿入後偽装ブロックの生成
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令それぞれを、対応する偽装ブロック本体のそれぞれに挿入し、偽装等価プログラム命令挿入後偽装ブロックを生成する。偽装等価プログラム命令は、等価プログラム生成部104にて用いた第t(t=2、3、・・・N)の等価プログラム命令と同じ変数、演算子を用いたプログラム命令である。
偽装ブロック挿入後プログラム生成部105は、0以外の整数RA及びRBをランダムに選択し、選択したRA及びRBを用いて、偽装等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)(演算子)(RA)+(RB);」を生成する。ここで、演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令を、対応する偽装ブロック本体の先頭に挿入する。
偽装ブロック挿入後プログラム生成部105は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶している。本実施の形態では、所定数は、例えば、「13」である。
偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックのそれぞれに、無条件分岐命令及び条件分岐命令のうち少なくとも1の分岐命令を挿入し、偽装分岐命令付き偽装ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
次に、偽装ブロック挿入後プログラム生成部105は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加する。なお、以降では、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令が追加されたブロックをTMPブロックと呼ぶ。
算出結果が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。中止した時点での、TMPブロック群を構成するTMPブロックを、以降、偽装ブロックと呼ぶ。
偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択する。次に、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成する。ここで、挿入する条件分岐命令の分岐条件は秘密情報用変数とランダムに決定した値とを比較する条件式とし、条件分岐命令の分岐先は、生成したグラフを構成するいずれかのノードに対応するブロックの先頭とする。条件分岐命令を挿入する位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
(5)具体例
偽装ブロック挿入後プログラム生成部105は、予め記憶している偽装ブロック数「4」を取得する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1の分割後ブロック401cを選択し、選択した分割後ブロック401cから分岐命令である「if(条件1)goto labelF;」を取り除いたプログラム命令群Cを用いて、偽装ブロック本体701iを生成する。
次に、偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体701i〜701lのそれぞれに対する偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令のそれぞれを偽装ブロック本体701i〜701lに挿入して、図9に示すような偽装等価プログラム命令挿入後偽装ブロック801i〜801lを生成する。
偽装等価プログラム命令挿入後偽装ブロック801j〜801lについても同様の生成方法であるため、ここでの説明は省略する。
ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hは、等価プログラム命令非挿入ブロック603f〜603hの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後等価プログラム命令非挿入ブロックである。なお、等価プログラム命令非挿入ブロック603fの先頭には始めからラベル「labelF:」があったので、ラベルの挿入は行っていない。
次に、偽装ブロック挿入後プログラム生成部105は、生成したラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lからTMPブロック1101i〜1101lを生成する。図11において、生成したTMPブロック1101i〜1101lの一例を示す。
次に、偽装ブロック挿入後プログラム生成部105は、以下のようにして図12にて示すグラフG200を生成する。ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eのそれぞれを、ノード1201a〜1201eとし、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hのそれぞれを、ノード1201f〜1201hとし、TMPブロック1101j〜1101lのそれぞれを、ノード1201i〜1201lとして説明する。
ラベル挿入後等価プログラム命令挿入後ブロック1001cにはラベル挿入後等価プログラム命令非挿入ブロック1002fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1)goto labelF;」がある。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201cとノード1201fにエッジ1202hを設ける。
偽装ブロック挿入後プログラム生成部105は、上記の動作を行うことにより、グラフG200を生成することができる。
次に、偽装ブロック挿入後プログラム生成部105は、図12にて示すグラフG200を用いて、「(エッジ数)−(ノード数)」の値が、所定数「13」以上であるか否かを判定する。
偽装ブロック挿入後プログラム生成部105は、TMPブロック1101i〜1101lからTMPブロック1101jをランダムに選択し、選択したTMPブロック1101jに条件分岐命令を挿入して、図13にて示す新たなTMPブロック1301jを生成する。
ここで、新たなTMPブロック群を用いたグラフG210を図14に示す。グラフG200との違いは、ノード1201jがノード1205jとなり、ノード1205jとノード1201bとにエッジ1202jを設け、ノード1205jとノード1201dとにエッジ1302jを設ける。なお、TMPブロック1301jとノード1205jとが対応している。
擬似分岐命令挿入後プログラム生成部106は、偽装ブロック挿入後プログラム生成部105にて生成したラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。ここで、ラベル挿入後等価プログラム命令挿入後ブロックに挿入される擬似分岐命令は、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系のプログラム実行時には必ず真偽が一定の値となる分岐条件分岐命令である。
擬似分岐命令挿入後プログラム生成部106は、第Nのラベル挿入後等価プログラム命令挿入後ブロックから第1のラベル挿入後等価プログラム命令挿入後ブロックに対して、等価命令挿入後ブロック秘密情報用の変数値の決定と、擬似分岐命令の挿入とを行うことにより、擬似分岐命令挿入後プログラムを生成する。
擬似分岐命令挿入後プログラム生成部106は、第1の等価プログラム命令から第(N−t+1)の等価プログラムまでの等価プログラムを取得する。
次に、擬似分岐命令挿入後プログラム生成部106は、定数m及び比較演算子をランダムに選択し、条件式「dkey(比較演算子)m」を生成する。
擬似分岐命令挿入後プログラム生成部106は、生成した条件式を用いて、擬似分岐命令「if(dkey(比較演算子)m)then 第1の分岐先 else 第2の分岐先」を生成する。擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令を、第tのラベル挿入後等価プログラム命令挿入後ブロックの追加して擬似分岐命令挿入後ブロックを生成する。なお、条件分岐命令を追加する位置はブロックの最後とする。
擬似分岐命令挿入後プログラム生成部106は、変数「dkey」に、算出した等価命令挿入後ブロック秘密情報用の変数値を代入し、条件式の真偽を判定する。
条件式が真であると判定する場合には、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先を次ブロックとし、第2の分岐先をラベル挿入後等価プログラム命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロックのそれぞれからランダムに選択した1のブロックとする。
なお、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先と第2の分岐先が、重複しないように、各ブロックを選択する。
ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eから図15に示す擬似分岐命令挿入後ブロック1401a〜1401eが生成される具体例について説明する。
擬似分岐命令挿入後プログラム生成部106は、まず、第N(ここでは、N=5)ラベル挿入後等価プログラム命令挿入後ブロック1001aから擬似分岐命令挿入後ブロック1401aを以下のようにして生成する。
擬似分岐命令挿入後プログラム生成部106は、定数m(ここでは、「46」)及び比較演算子(ここでは、「<」)をランダムに選択し、条件式「dkey < 46」を生成する。
この場合、条件式は真となり、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先として次ブロック(ここでは、ラベル名が「labelB」であるブロック)を選択し、第2の分岐先としてラベル名が「labelC」を選択し、擬似分岐命令であるプログラム命令「if(dkey<46)goto labelB;else goto labelC;」を生成する。
擬似分岐命令挿入後ブロック1401b〜1401eについても同様の生成方法であるため、ここでの説明は省略する。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム非挿入ブロックのそれぞれと、偽装ブロックのそれぞれと、偽装分岐命令挿入後ブロックのそれぞれからなるブロック群から、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系の実行時に、goto文を用いずに他のブロックに移動する経路を有するブロックを1以上抽出する。
また、被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロックを抽出し、抽出したブロックの最後の命令がプログラム命令「return;」、「exit();」以外のプログラム命令であった場合には、ブロックの最後にプログラム命令「return;」を追加する。
なお、以降の説明において、被入替ブロック群に含まれるブロックを被入替ブロックと呼ぶ。
以下に具体例を示す。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hと、偽装ブロックのそれぞれと、擬似分岐命令挿入後ブロック1401a〜1401eとから、goto文を用いずに他のブロックに移動する経路を有するブロック(ここでは、ラベル挿入後等価プログラム命令非挿入ブロック1002f、及び1002g)を抽出する。
抽出したラベル挿入後等価プログラム命令非挿入ブロック1002gに対しても同様に、被入替ブロック群生成部107は、無条件分岐命令であるプログラム命令「goto labelH;」を挿入し、被入替ブロック1501gを生成する。
偽装ブロックについても同様に偽装ブロックそのものを被入替ブロックとし、被入替ブロック群生成部107は、被入替ブロック1501j〜1501lを生成する。
配置順序入替部108は、被入替ブロック群生成部107で生成した被入替ブロック群に含まれる各被入替ブロックのうち、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替える。
配置順序入替部108は、等価プログラム生成部104にて生成した新たな変数宣言部と、配置順序を入れ替えた被入替ブロック群とからなる難読化プログラムを生成する。
以下に具体例を示す。
配置順序入替部108は、図16にて示す被入替ブロック1501b〜1501lの入れ替えを行う。ここでは、配置順序入替部108は、順に、被入替ブロック1501a、被入替ブロック1501g、被入替ブロック1501d、被入替ブロック1501c、被入替ブロック1501e、被入替ブロック1501l、被入替ブロック1501f、被入替ブロック1501b、被入替ブロック1501h、被入替ブロック1501k、被入替ブロック1501i、被入替ブロック1501jとなるように、入れ替えを行う。
1.2 プログラム難読化装置10の動作
ここでは、プログラム難読化装置10の動作について説明する。
ここでは、プログラム難読化装置10が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて説明する。
プログラム難読化装置10の入力部101は、難読化対象プログラム、及び位置情報を受け付ける(ステップS5)。
ブロック分割部102は、記憶部100から難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。その後、ブロック分割部102は、分割した基本ブロックのそれぞれを、詳細に分割して、1以上の分割後ブロックを生成する(ステップS10)。
プログラム難読化装置10は、偽装ブロック挿入後プログラムの生成処理を施して、偽装ブロック挿入後プログラムを生成する(ステップS20)。
プログラム難読化装置10の擬似分岐命令挿入後プログラム生成部106は、ラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック挿入後プログラム生成部105にて生成した偽装ブロックのそれぞれとからなる擬似分岐命令挿入後プログラムを生成する(ステップS25)。
1.2.2 等価プログラム生成処理の動作
ここでは、図18に示す等価プログラム生成処理(ステップS15)の動作について、図19に示す流れ図を用いて説明する。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、グラフを生成する。
等価プログラム命令生成部103は、取得した1以上の等価プログラム命令挿入対象ブロックそれぞれに対応する等価プログラム命令を生成する(ステップS110)。
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える(ステップS120)。
ここでは、図18に示す偽装ブロック挿入後プログラムの生成処理(ステップS20)の動作について、図20に示す流れ図を用いて説明する。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得することにより、偽装ブロック数を決定する(ステップS200)。
偽装ブロック挿入後プログラム生成部105は、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS215)。
偽装ブロック挿入後プログラム生成部105は、値「(エッジ数)−(ノード数)」が所定数以上であるか否かを判定する(ステップS230)。
所定数以上でないと判定する場合には(ステップS230における「NO」)、偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択し、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成して、新たなTMPブロック群を更新(生成)し(ステップS235)、ステップS225へ戻る。
このような構成によると、難読化されたプログラムから、秘密情報を見つけ出すことを困難にすることができる。
まず、等価プログラム命令生成部103、等価プログラム生成部104によって、秘密情報を含む命令を等価プログラム命令に置き換えプログラム上の様々な位置に配置している。このような構成により、不正解析者はプログラム中に含まれる定数値を全て収集したとしても、秘密情報を見つけることができなくなる。また、等価プログラム命令を分割後ブロックをまたがって、難読化後のプログラムの様々な位置に配置したことにより、不正解析者が等価プログラム命令を見つけ出すことを困難にすることが出来る。
例えば、DES、AES等の暗号プログラムは広くアルゴリズムが公開されており、不正解析者が難読化対象プログラムのアルゴリズムを知ることは容易である。そのような難読化対象プログラムにおいても、被秘匿情報である暗号鍵を不正解析から保護したいという要求がある。
この2つのグラフを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフに相当するグラフを見つけ出すことで、難読化後のプログラムから偽装ブロックを取り除いた部分を見つけ出すという不正解析が考えられる。
さらに、配置順序入替部108により、難読化後のプログラムのグラフの構造を複雑にすることで上記の不正解析を困難にすることができる。
上記第1の実施の形態では、プログラム難読化装置10は、TMPブロック群を用いてグラフを生成したが、これに限定されない。
プログラム難読化装置は、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを備える代わりに、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを1つの構成要素とする擬似分岐命令挿入後プログラム生成部106aを備えるとし、擬似分岐命令挿入後プログラムを用いてグラフを生成してもよい。
擬似分岐命令挿入後プログラム生成部106aは、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成と、TMPブロック群の生成と、擬似分岐命令挿入後プログラムの生成とを行う。
(1)TMPブロック群の生成
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
次に、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加して、TMPブロックを生成する。
次に、擬似分岐命令挿入後プログラム生成部106aは、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックから擬似分岐命令挿入後ブロックを生成する。生成方法は、上記第1の実施の形態にて示す擬似分岐命令挿入後プログラム生成部106が行う生成方法と同様であるため、説明は省略する。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する。ここで、閉路とは、始点となるノードから終点となるノードに至る経路のうち、始点と終点が同じノードである経路である。ここで、所定数とは、ユーザが所望する難読化の強度に応じて定まる数であり、例えば、「13」である。
選択されたブロックが、TMPブロックである場合には、上記に示す偽装ブロック挿入後プログラム生成部105による新たなTMPブロックの生成と同様であるため、説明は省略する。また、条件分岐命令の挿入位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
所定数以上であると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、生成したグラフが、平面グラフ(交差を含まないグラフ)であるか否かを判定する。
平面グラフであると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれ、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれ、TMPブロックのそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、条件分岐命令を挿入して生成した新たなブロックと、挿入を行わず変更を加えていない各ブロックとを用いて、再度、グラフ生成を行い、上記に示す動作を行う。
また、擬似分岐命令挿入後プログラム生成部106aは、閉路数を取得する代わりに、生成したグラフのエッジ数、ノード数を数え、式「(エッジ数)−(ノード数)+1」で算出した値を閉路数の近似値として用いてもよい。
ここでは、変形例1におけるプログラム難読化装置が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて変更点のみ説明する。
変形例1におけるプログラム難読化装置は、図18に示すステップS5〜15を実行後、ステップS20における偽装ブロック挿入後プログラムの生成処理を行う代わりに、擬似分岐命令挿入後プログラムの生成処理を行う。
1.4.3擬似分岐命令挿入後プログラムの生成処理
ここでは、擬似分岐命令挿入後プログラムの生成処理の動作について、図21に示す流れ図を用いて説明する。
擬似分岐命令挿入後プログラム生成部106aは、分割後ブロックの中から1以上の分割後ブロックをランダムに選択し、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する(ステップS305)。擬似分岐命令挿入後プログラム生成部106aは、このステップを取得した偽装ブロック数分だけ行う。
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成、及び生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS315)。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する(ステップS340)。
平面グラフでないと判定する場合には(ステップS345における「NO」)、擬似分岐命令挿入後プログラム生成部106aは、動作を終了する。
グラフ理論の分野では、2つのグラフG1、G2において、G1がG2に含まれるか否かを判定する問題が難しいことが部分グラフ同型判定問題として知られている。このことは非特許文献2に述べられている。
このことから、G2にG1が含まれることが分っていても、G2のどこにG1が含まれるかを判定することが難しいことが言える。また、部分グラフ同型判定問題が難しい条件として、プログラムが木構造ではないこと、プログラムが平面グラフでないことが知られる。
変形例1のプログラム難読化装置は、部分グラフ同型判定問題が困難となる難読化後のプログラムのグラフを構築することができる。
また、変形例1のプログラム難読化装置は、全ての閉路数を取得する代わりに、予め難読化前のプログラムに含まれる閉路を調べ、さらに、それぞれの閉路を構成するノード数を調べ、調べたノード数と同数のノードからなる閉路数のみを数える構成としても構わない。このような構成によれば、変形例1のプログラム難読化装置はグラフの閉路数の傾向を大まかに知ることができ、また閉路数を計算する処理時間を短くすることができる。
1.4.5 その他の変形例
擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムの生成において、閉路数の判定や、平面グラフの判定の双方を用いたが、これに限定されない。
1.5 変形例2
変形例1において、図21に示すステップS330及びステップS350の動作を以下のように変更してもよい。
擬似分岐命令挿入後プログラム生成部106aは、挿入する分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
1.5.2 ステップS350の変更
擬似分岐命令挿入後プログラム生成部106aは、挿入する条件分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの終了ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501hと、図12におけるノード1201hの対応を見つけることを行えば、難読化後のプログラムのグラフから、難読化前のプログラムを見つける解析が容易になる。
1.6 変形例3
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの開始ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501aと、図12におけるノード1201aの対応を見つけることを行えば、そこから解析が進む。変形例3は、プログラムの開始ノードの抽出を困難にするための変形例であり、変形例3のプログラム難読化装置は、上記第1の実施の形態にて示す配置順序入替部108を、以下に示す配置順序入替部108aに変更する。
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これらと重複しない変数名を、難読化対象プログラムに開始ノードを指定するための新たな引数である開始ノード指定用変数として、変数宣言部601に追加し、新たな変数宣言部601aを生成する。
次に、配置順序入替部108aは、開始ノードに対応するブロックへの先頭に分岐命令を実行する際のノード指定用変数の値を、難読化対象プログラムを呼び出す側のプログラムにおける難読化対象プログラムを呼び出すプログラム命令の引数に追加する。
1.6.2 具体例
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これと重複しない変数名を開始ノード指定用変数とする。ここでは、開始ノード指定用変数を「start」とする。
追加するswitch文にあたるプログラム命令を
「
swtich(start){
case 1:
goto labelC;
case 2:
goto labelA;
case 3:
goto labelL;
default:
}
」
とする。
また、難読化対象を呼び出すプログラム命令が「func(a,b);」であるならば、これを「func(a,b,2);」に置き換える。ここで、値「2」は、switch文に用いられる開始ノード指定用変数「start」に格納される数値である。なお、難読化対象プログラムを呼び出す側のプログラムを別途難読化して、開始ノード指定用変数がとる値「2」を隠蔽するなどを行ってもよい。
このような難読化を適用することにより、開始ノード指定用変数startに格納される正しい値が分からなくては開始ノードがどれであるのかが分からなくなる。すなわち、難読化対象プログラムを局所的に解析したのでは、開始ノードがわからなくなり難読化前のプログラムのグラフと難読化後のプログラムのグラフにおいて開始ノードの対応を取ることを困難にすることが出来る。
上記第1の実施の形態において、難読化後プログラムにおいて秘密情報用変数が右辺にのみ存在するプログラム命令は、被秘匿情報位置のプログラム命令のみである(図17では、被入替ブロック1501e)。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムのグラフにおいて被秘匿情報位置となるノード(図5では、ノード501e)と難読化後のプログラムにおける秘密情報用変数が右辺にのみ存在するブロックとの対応を取って、不正解析を行うことが考えられる。
また、変形例4のプログラム難読化装置は、等価プログラム命令挿入後ブロックにおいて、右辺に定数がある命令における定数を、算出した等価命令挿入後ブロック秘密情報用の変数値を用いて算出するプログラム命令に置き換えてもよい。これにより、右辺に秘密情報用変数を含むプログラム命令の数が増えるので、変形例4のプログラム難読化装置は、上記の不正解析を困難にすることができる。
難読化前のプログラムに特徴的な演算、特徴的な数値を用いた演算(例えば、暗号プログラムのアルゴリズムにおけるループの回数など)が含まれる場合がある。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムにおいて、特徴的な演算または数値を見つけ難読化前のグラフと難読化後のグラフにおいて対応が取れるノードを見つける手がかりにすることが考えられる。
また、特徴的な数値も、秘密情報として扱い本手法で述べた難読化方法や他の難読化方法により隠蔽しても構わない。
1.9 その他の変形例
1.9.1 C言語以外
上記第1の実施の形態では、秘密情報を保持するプログラムがC言語の場合を示したが、これに限定されない。Java(登録商標)バイトコード、Java(登録商標)言語、アセンブリ言語、機械語などで記述されたプログラムであってもよい。
その他の生成する命令については、Java(登録商標)バイトコードにおける記述方法にのっとり、同等の命令を生成する。
また、Java(登録商標)言語に適用する際には、Java(登録商標)言語にプログラム命令「goto」に対応する命令がない。よって、各ブロックをメソッドとして生成し、プログラムの出口となるプログラム命令を含むメソッドには例外をスローされるプログラム命令を追加し、プログラムの入口となる命令を含むメソッドにはスローした例外をキャッチするプログラム命令を追加する。メソッド、例外の記述仕方は公知であるため説明は省略する。
Java(登録商標)言語において、無条件分岐命令を見つける処理では、プログラム命令「break」、「continue」,「return」、「throw」を見つける。
アセンブリ言語の場合、用いるアセンブラ言語によって命令セットは異なるが、例えばGASによるアセンブル言語の場合、C言語のプログラム命令「goto」文を生成する処理では、プログラム命令「jmp」を使用する。
条件分岐命令を見つける処理では、「jmp」以外のジャンプ命令を見つける。なお、GASのアセンブリ言語については、公知であるため説明は省略する。
機械語については、用いる機械語によって命令セットは異なるが、それぞれの記述方法にのっとり記述する。
上記第1の実施の形態では、ブロック分割の際に基本ブロックに分割した後、さらに分割後ブロックを生成したが、基本ブロックへの分割を行わず、行数のみに基づく分割により分割後ブロックの生成を行っても良い。
このような構成を取る場合には、プログラム難読化装置は、等価プログラム命令を挿入する際に、等価プログラム命令挿入対象ブロックに含まれる一番最初の分岐命令よりも前に、さらに、一番最後の合流位置よりも後に等価プログラム命令を挿入する。
なお、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
(1)上記第1の実施の形態において、プログラム難読化装置10が受け付ける位置情報は、難読化対象プログラムにおける秘密情報を保持するプログラム命令の行番号であるとしたが、これに限定されない。
または、位置情報は、ラベルを用いて指定してもよい。すなわち、予め定められた所定の名前のラベルがあるプログラム上の行の次の行を被秘匿情報として扱う構成としてもよい。
(2)上記第1の実施の形態において、プログラム難読化装置10は、偽装ブロック数を予め記憶するとしたが、これに限定されない。
(生成する偽装ブロック数)=(所定数)−e
ここで、複雑度は、プログラムに含まれるプログラム命令数や、ループ数や、プログラムに使用される変数の数、またはそれらの組み合わせ等でプログラムの複雑さを指標化した値であり、バグが発生しやすいプログラムを見つけ出す際などに使用される。
ここで、所定数の決定について説明する。所定数と、難読化の強度との関係は、図22に示すように、強度が増加すると、所定数は単調に増加する(図22に示す関数G300)。グラフG300は、y=aX+bにて示される。これにより、ユーザが所望する強度が決定すると、一意的に所定数が決定することになる。プログラム難読化装置は、決定した所定数から難読化対象プログラムの複雑度eを減算することにより得られた結果を、偽装ブロック数とする。
(3)上記第1の実施の形態において、プログラム難読化装置10は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶しているとしたが、これに限定されない。
または、プログラム難読化装置10は、プログラムを難読化する度に、難読化の強度に応じた所定数を、入力部101にて受け付け、受け付けた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、他のプログラムから難読化の強度に応じた所定数を受け付け、受け付けた所定数を用いて難読化を行ってもよい。
プログラム難読化装置10は、生成した複数の偽装ブロック本体のうち1以上の偽装ブロック本体に、偽装等価プログラム命令を挿入して、偽装等価プログラム命令挿入後偽装ブロックを生成してもよい。
または、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行される1以上のブロックからなる部分プログラムから、ブロック分割部を用いて1以上の分割後ブロックを生成し、生成した1以上の分割後ブロックと、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行されない1以上のブロック(偽装ブロックに相当する)とから被入替ブロック群を生成してもよい。
グラフの難易度を示す指標として、第1の所定数以上のノードからなる閉路の数としてもよい。このとき、プログラム難読化装置10は、例えば、第1の所定数として「3」、閉路数の最小値を示す第2の所定数として「4」を予め記憶している。
偽装ブロック挿入後プログラム生成部105は、取得した閉路数が、第2の所定数以上であるか否かを判定する。
閉路数が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。
(7)上記第1の実施の形態において、被秘匿情報は、定数としたがこれに限定されない。被秘匿情報は、1以上のプログラム命令からなる命令群であってもよい。
(8)上記第1の実施の形態において、秘密情報用変数を用いたが、これに限定されない。秘密情報用変数を用いなくてもよい。
または、プログラム難読化装置は、複数の分割後ブロックと、1以上のTMPブロックとを用いて、被入替ブロック群を生成してもよい。また、分割後ブロックのそれぞれに、ラベル名を付与してもよい。
配置順序入替部108は、開始ノードとなる被入替ブロックを含めた全ての被入替ブロックの配置順序を、ランダムに入れ替えてもよい。このとき、配置順序入替部108は、入替結果により、プログラムに含まれる処理部の先頭位置に、偽装ブロックである被入替ブロックが存在する場合には、その被入替ブロックの先頭に、常に処理群Aを含む被入替ブロック(開始ノードとなるブロック)に分岐する無条件分岐命令又は条件分岐命令を挿入する。
(11)上記第1の実施の形態において、プログラム難読化装置10は、等価プログラム命令の挿入対象ブロックに対して、1の等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、挿入対象ブロックに対して、2以上の等価プログラム命令を挿入してもよい。
(14)上記第1の実施の形態において、プログラム難読化装置10は、被秘匿情報の値を秘密情報用変数に置き換え、その後、等価プログラム命令挿入対象ブロックのそれぞれに対応する等価プログラム命令を挿入したが、これに限定されない。
(15)上記第1の実施の形態において、正常系での実行に全ての命令が必要なプログラムを難読化している。そのため、難読化後のプログラムが正常系で適切に動作することを保証するために、各分割後ブロック(以下、単に、「ブロック」という。)の最後に、次に実行すべきブロックの先頭への分岐命令を挿入する必要がある。
例えば、入力として与えられるプログラムに、正常系では必要のないダミーの命令が既に含まれている場合、プログラムの分割の仕方によっては、ブロックの先頭にダミーの命令が含まれたり、最後にダミーの命令が含まれたりする可能性がある。このような事態は、他の難読化手法により難読化された後のプログラムを、本発明による手法で、さらに難読化を行う場合などが考えられる。
また、正常系で必要な命令が終わる箇所に分岐命令を挿入することで、ブロックの最後にあるダミーの命令の実行を省略してもよい。
(17)本発明における命令群とは、1以上の命令からなるものとする。つまり、本発明における命令群は、1の命令からなる場合も含まれる。
また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
(20)上記の各装置を構成する構成要素の一部又は全部は、各装置に脱着可能なICカード又は単体のモジュールから構成されているとしてもよい。前記ICカード又は前記モジュールは、マイクロプロセッサ、ROM、RAM、などから構成されるコンピュータシステムである。前記ICカード又は前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムに従って動作することにより、前記ICカード又は前記モジュールは、その機能を達成する。このICカード又はこのモジュールは、耐タンパ性を有するとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD―ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
(22)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
1.11 まとめ
(1)本発明は、プログラムを難読化するプログラム難読化装置であって、第一の入力プログラムにおける被秘匿情報を使用するプログラム命令または被秘匿命令を含む少なくとも一つ以上のプログラム命令からなる第一のプログラム命令群と同等の機能を有する、第二のプログラム命令群を生成する等価プログラム命令群生成手段と、前記第一の入力プログラムから前記第一のプログラム命令群を取り除き、前記第二のプログラム命令群を挿入して第一の出力プログラムを生成する等価プログラム生成手段と、正常系の実行結果を得るための任意の実行時には、実行されない1以上のプログラム命令からなる偽装ブロックを生成し、第二の入力プログラムに前記偽装ブロックを挿入し第二の出力プログラムを生成する偽装ブロック挿入後プログラム生成手段とを有し、少なくとも一つの前記偽装ブロックのプログラム命令の少なくとも一つは、前記第二のプログラム命令群を構成するプログラム命令が使用する変数を用いることを特徴とする。
(3)ここで、上記(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを、1以上のプログラム命令から構成される分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、閉路が予め与えられた第一の所定数以上となるように前記偽装ブロックを生成するとしてもよい。
(5)ここで、上記(2)に示すプログラム難読化装置は、さらに、前記第二の入力プログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、予め与えられた第一の所定数以上のノード数からなる閉路の数が予め与えられた第二の所定数以上となるように偽装ブロックを生成するとしてもよい。
(7)ここで、上記(5)に示すプログラム難読化装置は、さらに、前記与えられた第二の所定数を入力する入力手段を有するとしてもよい。
(8)ここで、上記(2)に示すプログラム難読化装置において、前記偽装ブロック挿入後ブロック生成手段は、さらに、前記第二のプログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第一のグラフを生成し、前記ノードブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第二のグラフを生成し、前記第二のグラフから前記第一のグラフを見つけ出す部分グラフ同型判定問題の難易度が予め与えられた第一の所定数以上になるように偽装ブロックを生成するとしてもよい。
(10)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを任意の位置で第一のブロックと第二のブロックに分割し、正常系の実行結果を得るための任意の実行時には、真偽値が一定の第一の値となる分岐条件によって分岐先を決定する条件分岐命令を前記第一のブロックの最後に追加して第三のブロックを生成し、前記第三のブロックと前記第二のブロックからなる第三の出力プログラムを生成する擬似分岐命令挿入後プログラム生成手段を有し、前記条件分岐命令は、前記分岐条件が前記第一の値を取る場合の分岐先が前記第二のブロックの先頭であるとしてもよい。
非特許文献1において、例えば、プログラムの出力結果に影響を与えない複製生成型偽装コードの挿入を行い、難読化プログラムを生成する方法が開示されている。
難読化前のオリジナルのプログラムは、命令群1、命令群2、及び命令群3から構成されており、3つの命令群を順に実行するものとする。
この難読化方法では、オリジナルプログラムに、オリジナルプログラムの実行とは無関係なダミー変数を追加し、ダミー変数の値を書き換えるようなプログラム命令群を実行コード中にいくつか挿入する。また、ダミー変数の値によって分岐先が決定する擬似分岐命令が、命令群1と命令群2との間に追加される。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定しておく。さらに、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を偽装ブロックとする。
また、擬似分岐命令の挿入による難読化プログラムの生成方法について説明する。
この方法では、オリジナルプログラムにダミー変数を追加する。次に、ダミー変数の値によって分岐先が決定する擬似分岐命令を命令群1と命令群2との間に追加する。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定する。このとき、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を命令群3とする。
非特許文献1では、以上に述べたような難読化を行うことで、プログラムからアルゴリズムを推定することが困難になること、特定モジュールの位置の推定が困難になることが開示されている。例えば、暗号アルゴリズムのプログラムから暗号鍵を不正な解析から保護したい場合には、暗号アルゴリズムのモジュール位置の推定を困難にすることができる。
そのため、例えば暗号アルゴリズムの場合では、平文と暗号文の組を入手可能な不正解析者であれば、プログラム中に存在する定数データを暗号鍵と仮定して平文を暗号化して得た暗号文が実際の暗号文と一致するかを調べていけば、いずれ本当の暗号鍵を見つけることができる。
鴨志田、松本、井上、"耐タンパーソフトウェアの構成手法に関する考察"、ISEC97−59 Johannes Koebler,Uwe Schoening,Jacobo Toran,"The Grapph Isomorphism Problem", Birkhaauser,1993 戸田誠之助、「グラフ同型性判定問題」、日本大学文理学部厳書(2001年)
しかしながら、不正解析者が、分割秘密を用いて難読化されたプログラムから複数の分割秘密を見つけ出すことが考えられる。例えば、第二のプログラム命令群で用いられる変数に着目し、その変数を用いた式を難読化後のプログラムから収集する方法が考えられる。例えば、前述の被秘匿情報「d0=1234」を4つの処理「d0=230」、「d0=d0+1000」、「d0=d0+4」に置き換えた場合、不正解析者は、d0と言う変数を用いた処理をプログラム中から収集することで、第二のプログラム命令群を構成する分割秘密を見つけ出し、見つけ出した複数の分割秘密から被秘匿情報「d0=1234」を取得することができる。
この構成によると、プログラム難読化装置は、1の偽装ブロックに、前記1の偽装ブロックから、オリジナルプログラムに含まれる正当プログラム命令、及び他の偽装ブロックの何れに分岐する分岐命令を挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、グラフにおける閉路の数が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから閉路数を取得し、取得した閉路数が、前記所定数以上であるか否かを判定するとしてもよい。
ここで、前記所定の条件を満たすとは、グラフが平面グラフでないことであり、前記判定部は、前記第1生成部にて生成されたグラフが平面グラフであるか否かを判定し、平面グラフでないと判定する場合に、前記所定の条件を満たすとするとしてもよい。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、第1の所定数以上のノード数からなる閉路の数が、ユ指定された前記強度に応じたグラフの難易度にて定まる第2の所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから、第1の所定数以上のノード数からなる閉路の数を取得し、取得した閉路数が、前記第2所定数以上であるか否かを判定するとしてもよい。
ここで、前記偽装ブロック挿入手段は、前記オリジナルブロックに対して、前記演算式が前記演算順位で実行された場合に真偽値が一定値となる比較式を含み、前記比較式により真偽値が前記一定値となる場合の分岐先を次に実行する次オリジナルブロックとする条件分岐命令を、前記オリジナルブロックに挿入し、前記偽装ブロックが、前記オリジナルブロックの直後に挿入された場合には、前記条件分岐命令を前記制御命令とするとしてもよい。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、前記処理命令挿入手段は、前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、前記偽装ブロック挿入手段は、前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、生成したグラフの強度が、所定の条件を満たすか否かを判定する判定部と、所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する、又は1のオリジナルブロックに、1の偽装ブロックを分岐先とし、常に前記分岐先には分岐しない条件分岐命令を前記オリジナルブロックに挿入する第2生成部と、前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部を行うように制御する制御部とを備えるとしてもよい。
この構成によると、プログラム難読化装置にて生成された前記複数の演算式は、正しい演算順序で実行した場合にのみ前記被秘匿情報を算出するので、不正解析者は、正しい演算順序を得ない限り、被秘匿情報を取得することができない。つまり、プログラム難読化装置は、オリジナルプログラムの解析を困難にすることができる。
ここで、前記分割部は、さらに、前記偽装ブロックを、1以上のプログラム命令からなる複数の偽装分割ブロックに分割し、前記被入替ブロック生成部は、さらに、前記偽装分割ブロックのそれぞれから、偽装分割ブロックに、他の偽装分割ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
ここで、前記被入替ブロック生成部は、さらに、前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数の分割ブロックに予め分割され、前記複数の分割ブロックが実行順序で並べられており、前記処理命令挿入手段は、最初に実行される分割ブロックから前記秘匿処理命令群を有する分割ブロックまでの間に、前記複数の処理命令のそれぞれを挿入し、前記偽装ブロック挿入手段は、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とするとしてもよい。
以下、本発明に係る第1の実施の形態としてのプログラム難読化装置10について、図面を参照して説明する。
1.1 プログラム難読化装置10の構成
プログラム難読化装置10は、図1に示すように、記憶部100、入力部101、ブロック分割部102、等価プログラム命令生成部103、等価プログラム生成部104、偽装ブロック挿入後プログラム生成部105、擬似分岐命令挿入後プログラム生成部106、被入替ブロック群生成部107、配置順序入替部108から構成される。
1.1.1 入力部101
入力部101は、被秘匿情報を保持する難読化対象プログラムと、難読化対象プログラムにおける被秘匿情報を含むプログラム命令の位置を示す位置情報とを受け付ける。
入力部101は、難読対象プログラムの分割を指示する分割命令をブロック分割部102へ出力する。
ここで、難読化対象プログラムは、例えば、被秘匿情報である暗号鍵を使って暗号文の復号化を行うプログラムである。位置情報は、受け付けた難読化対象プログラムにおける秘密情報を保持するプログラム命令の行番号である。
入力部101が受け付ける難読化対象プログラムの一例を図2に示す。
図2において難読化対象プログラム201は関数funcから構成されている。関数funcは、変数宣言部202と、処理部203から構成されている。処理群Aは、実際には反復命令(for文、while文、do−while文)、選択命令(if文、switch文)、無条件分岐命令(goto文、break文、continue文、return文)以外のプログラム命令からなるプログラム命令群であり、N個のプログラム命令である命令a_1、命令a_2、・・・、命令a_Nから構成されるが図では簡略化している。命令a_1、命令a_2、・・・、命令a_Nは、例えば変数に定数を足すプログラム命令である「x+=10;」などのプログラム命令である。処理群B、処理群D、処理群F、処理群G、処理群Hも同様である。処理群Hの最後のプログラム命令は、「return;」であるとする。なお、C言語の用語については、公知であるので、詳細な説明は省略する。
処理部203には、被秘匿情報を保持するプログラム命令204が含まれる。プログラム命令204は、この難読化対象プログラム201の被秘匿情報「512」を含むプログラム命令「a=b+512;」である。
入力部101は、難読化対象プログラム201の分割を指示する分割命令をブロック分割部102へ出力する。
1.1.2 記憶部100
記憶部100は、入力部101にて受け付けた難読化対象プログラムと、位置情報とを記憶している。
1.1.3 ブロック分割部102
ブロック分割部102は、入力部101から分割命令を受け取ると、記憶部100に記憶されている難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、入力部101から、難読化対象プログラムを受け取ると、受け取った難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。ここで、基本ブロックとは、開始位置が、処理部の先頭(難読化対象プログラムの入口のプログラム命令、つまり、難読化対象プログラムの一番最初に実行されるプログラム命令)、処理が合流するプログラム命令、または、分岐となるプログラム命令の次のプログラム命令であり、終了位置が、次に処理が合流するプログラム命令の一つ前のプログラム命令、処理部の最後(プログラムの出口の命令、つまり、難読化対象プログラムの一番最後に実行されるプログラム命令)、または、分岐となるプログラム命令であるブロックである。
これにより、ブロック分割部102は、難読化対象プログラムを分割して複数の基本ブロックを生成することができる。また、難読化対象プログラムを構成する全てのプログラム命令は、ブロック分割部102により、いずれかの一つの基本ブロックに含まれるようになる。
ブロック分割部102は、生成した各基本ブロックを、以下のように分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、基本ブロックに含まれるプログラム命令数m、予め与えられた所定数Nとを用いて、基本ブロックを([(m−1)/N]+1)個の分割後ブロックに分割する。分割する際には、各ブロックのプログラム命令数が出来るだけ均等になるようにする。ここで、演算[a/b]は、除算a/bを施し、算出結果から小数点以下を切り捨てた整数を取得する演算式である。例えば、[5/2]=2となる。
図3は、図2に示す難読化対象プログラムを、基本ブロックに分割した結果を示す。
図3における基本ブロック301a〜301cは、図2の関数funcの処理部203を分割して生成した基本ブロックである。
基本ブロック301aは、関数funcの入口のプログラム命令(関数の中で一番最初に実行されるプログラム命令)を含む処理群Aからはじまり、それ以降、最初に出現する条件分岐命令(for文、while文、do−while文、if文、switch文)であるプログラム命令「if(条件1)goto labelF;」までのプログラム命令を含む。ここで、この条件分岐命令を基本ブロック301aの最後にしたのは、基本ブロックはブロックの最後以外では分岐しないためである。
次に、図4は、図3に示す各基本ブロックを、分割後ブロックに分割した結果を示す。
処理群A、処理群B、処理群Cを含む基本ブロック301aは、含まれるプログラム命令数の合計が3N個である。なぜなら、ここでは、処理群A、処理群Bに含まれるプログラム命令の個数をそれぞれN個と、処理群Cに含まれるプログラム命令をN−1個としており、基本ブロック301aには、プログラム命令「if(条件1)goto labelF;」が含まれているからである。
以下、同様に2N個のプログラム命令を含む基本ブロック301bを分割し生成した分割後ブロックが、分割後ブロック401d〜401eである。さらに、同様に3N個のプログラム命令を含む基本ブロック301cを分割し生成した分割後ブロックが、分割後ブロック401f〜401hである。
1.1.4 等価プログラム命令生成部103
等価プログラム命令生成部103は、被秘匿情報を含むプログラム命令と同等の機能を有する命令群を生成する。以降の説明では、この命令群を構成する各命令を等価プログラム命令と呼ぶ。
等価プログラム命令生成部103は、等価プログラム命令に使用する変数名(秘密情報用変数名)の決定、グラフ作成、等価プログラム命令の挿入対象ブロックの決定、及び等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令の生成を行う。
等価プログラム命令生成部103は、等価プログラム命令に使用する変数の名前を決定する。
まず、等価プログラム命令生成部103は、難読化対象プログラムを解析し、このプログラム中で使用されている全ての変数名を調べる。次に、使用されているいずれの変数名とも重複しない変数名を生成し、生成した変数名を秘密情報用変数名として決定する。
等価プログラム命令生成部103は、難読化対象プログラムの構造を示すグラフを作成する。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、第一のノードが第二のノードへの分岐命令(goto文、break文、continue文、return文による無条件分岐命令、またはfor文、while文、do−while文、if文、switch文による条件分岐命令)を含む場合、または、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応するプログラム上のプログラム命令の一つ後のプログラム命令が第二のノードに含まれている場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。なお、グラフに関する用語については公知であるため、ここでの説明は省略する。グラフ生成に関するより詳細については、コンパイラの分野では公知であるため、ここでの説明は省略する。
さらに、ここでは、位置情報にて示される被秘匿情報を含むプログラム命令が含まれるノードを秘密保有ノードと呼ぶ。また、プログラムの入り口となるプログラム命令(プログラムの一番最初に実行されるプログラム命令)を含むノードを開始ノード、プログラムの出口となるプログラム命令(プログラムの一番最後に実行されるプログラム命令)を含むノードを終了ノードと呼ぶこととする。
等価プログラム命令生成部103は、生成したグラフに基づき、等価プログラム命令を挿入する分割後ブロックを決定する。
等価プログラム命令生成部103は、まず、秘密保有ノードに対応するブロックを第1の等価プログラム命令挿入対象ブロックとする。次に、第1の等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に第nの等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第(n+1)の等価プログラム命令挿入対象ブロックとする。第nの等価プログラム命令挿入対象ブロックの先行ブロックが複数ある場合には、等価プログラム命令生成部103は処理を中止し、等価プログラム命令数をnとする。このステップのいずれの操作においても、等価プログラム命令挿入対象ブロックに選ばれなかった分割後ブロックを、以降、等価プログラム非挿入ブロックと呼ぶ。
等価プログラム命令生成部103は、等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令を生成する。等価プログラム命令生成部103は、等価プログラム命令数nと同数の等価プログラム命令を生成する。ここでは、等価プログラム命令数をNとし、以下、第1の等価プログラム命令から第Nまでの等価プログラム命令の生成手順を述べる。
等価プログラム命令生成部103は、整数RA_0をランダムに選択し、選択した整数RA_0を秘密情報用変数に設定する第1の等価プログラム命令「(秘密情報用変数)=RA_0;」を生成する。
(B)第t(t=2、3、・・・N−1)の等価プログラム命令の生成
等価プログラム命令生成部103は、0以外の整数であるRA_t、RB_tをランダムに選択し、選択した0以外の整数RA_t、RB_tと、第tの演算子とを用いて、第t(t=2、3、・・・N−1)の等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)(第tの演算子)RA_t+RB_t;」を生成する。ここで、第tの演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。
等価プログラム命令生成部103は、0以外の整数であるRA_Nをランダムに選択し、選択した0以外の整数RA_Nと、第一の値と、演算子「*」とを用いて、第Nの等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)*RA_N+(第一の値)」を生成する。
等価プログラム命令生成部103は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を取得する。
等価プログラム命令生成部103は、第1〜第(N−1)の等価プログラム命令を順番に並べたプログラム命令群
「(秘密情報用変数)=RA_0;
(秘密情報用変数)=(秘密情報用変数)(第2の演算子)RA_2+RB_2;
(秘密情報用変数)=(秘密情報用変数)(第3の演算子)RA_3+RB_3;
・・・
(秘密情報用変数)=(秘密情報用変数)(第(N−1)の演算子)RA_(N−1)+RB_(N−1);
」
を実行した際に得られる秘密情報用変数の値を、第二の値として算出する。
式1:(第一の値)=(被秘匿情報の値)― { (第二の値)*RA_N }
で得られる値を第一の値とする。
このような方法によって、第1から第Nまでの等価プログラム命令を生成した場合、
「(秘密情報用変数)=RA_0;
(秘密情報用変数)=(秘密情報用変数)(第2の演算子)RA_2+RB_2;
(秘密情報用変数)=(秘密情報用変数)(第3の演算子)RA_3+RB_3;
・・・
(秘密情報用変数)=(秘密情報用変数)(第(N−1)の演算子)RA_(N−1)+RB_(N−1);
(秘密情報用変数)=(秘密情報用変数)*RA_N+(第一の値);」
からなるプログラム命令群を順に処理した場合、処理の最後で秘密情報用変数は被秘匿情報の値になる。
なお、ここでは等価プログラム命令として、掛け算と足し算とを組み合わせた演算とを示したが、これに限定されない。等価プログラム命令数nと同数の等価プログラム命令を用いて、被秘匿情報の値が取得される演算であれば、どのような演算を用いても構わない。
等価プログラム命令生成部103は、まず、図2に示す難読化対象プログラム201を用いて、難読化対象プログラム201の関数funcで使用されている引数の変数名、およびの変数宣言部202で宣言されている変数名を調べ、これらと重複しない変数名を秘密情報用変数名とする。ここでは、秘密情報用変数名を「dkey」とする。
分割後ブロック401aの最後のプログラム命令は無条件分岐命令ではない。また、分割後ブロック401aの次のプログラム命令は分割後ブロック401bのプログラム命令である。よって、等価プログラム命令生成部103は、ノード501aとノード501bにエッジ502aを設ける。
分割後ブロック401cには分割後ブロック401fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1) goto labelF;」がある。よって、等価プログラム命令生成部103は、ノード501cとノード501fにエッジ502hを設ける。
なお、このグラフにおいて、ノード501aは開始ノードであり、ノード501hは終了ノードであり、ノード501eは秘密保有ノードである。
等価プログラム命令生成部103は、秘密保有ノードであるノード501eに対応する分割後ブロック401eを第1の等価プログラム命令挿入対象ブロックとする。ノード501eには先行ブロックはノード501dのみであるので、等価プログラム命令生成部103は、ノード501dに対応する分割後ブロック401dを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に、等価プログラム命令生成部103は、ノード501cに対応する分割後ブロック401cを第3の等価プログラム命令挿入対象ブロック、ノード501bに対応する分割後ブロック401bを第4の等価プログラム命令挿入対象ブロック、ノード501aに対応する分割後ブロック401aを第5の等価プログラム命令挿入対象ブロックとする。第5の等価プログラム命令挿入対象ブロックには先行ブロックがないので、等価プログラム命令生成部103は、等価プログラム命令数を「5」とする。
等価プログラム命令生成部103は、整数「18」を選択し、第1の等価プログラム命令「dkey=18;」を生成する。
ここでは、等価プログラム命令生成部103は、第2の演算子から第4の演算子をそれぞれ順に、「/」、「*」、「/」とし、ランダムな値RA_2〜RA_4をそれぞれ値「2」、値「4」、値「5」とし、ランダムな値RB_2〜RB_4をそれぞれ値「54」、値「−32」、値「+8」とし、第2〜第4の等価プログラム命令をそれぞれ以下のように生成する。
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」
次に、等価プログラム命令生成部103は、第5の等価プログラム命令を生成する。
ここでは、等価プログラム命令生成部103は、ランダムな値RA_Nを値「9」とする。さらに、等価プログラム命令生成部103は、以下のプログラム命令群の実行し、第二の値を算出する。
dkey=dkey/2+54;
dkey=dkey*4−32;
dkey=dkey/5+8;」
このプログラム命令群を順に実行すると、「dkey」の値は、順に、値「18」、値「63」、値「220」、値「52」となり、等価プログラム命令生成部103は、値「52」を第二の値とする。
式1:(第一の値)=(被秘匿情報の値)― { (第二の値)*RA_N }
に、被秘匿情報の値「512」と、第二の値「52」、RA_Nの値「9」を代入することにより、第一の値「44」を算出する。
等価プログラム命令生成部103は、第5の等価プログラム命令「dkey=dkey*9+44;」を生成する。
「dkey=18;」、
「dkey=dkey/2+54;」、
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」、
「dkey=dkey*9+44;」
となる。これらのプログラム命令を順に行った場合のdkeyの値は被秘匿情報の値「512」になることを確認することが出来る。
等価プログラム生成部104は、被秘匿情報を秘密情報用変数に置き換え、等価プログラム命令生成部103にて生成したそれぞれの等価プログラム命令を、等価プログラム命令挿入対象ブロックに挿入し、等価プログラム挿入後ブロックを生成する。
等価プログラム生成部104は、生成した等価プログラム挿入後ブロックと、等価プログラム命令を挿入しなかった分割後ブロックとからなる等価プログラムを生成する。等価プログラムは、被秘匿情報を含む命令が等価プログラム命令群に置き換えられているが、置き換えを行う前のプログラムと同等の機能を有するプログラムである。
等価プログラム生成部104は、秘密情報用変数の追加と、被秘匿情報の置き換えと、等価プログラム命令の挿入とを行う。
(1)秘密情報用変数の追加
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数を、難読化対象プログラムの変数宣言部に追加し、新たな変数宣言部を生成する。
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える。ここでは、等価プログラム生成部104は、秘密保有ノードに含まれる被秘匿情報の値を秘密情報用変数に置き換える。
等価プログラム生成部104は、等価プログラム命令生成部103にて生成した等価プログラム命令それぞれを、等価プログラム命令生成部103にて決定したいずれかの等価プログラム命令挿入対象ブロックに挿入する。以下、詳細な動作について説明する。
等価プログラム生成部104は、第t(t=1、2、・・・、N)の等価プログラム命令を第(N―t+1)の等価プログラム命令挿入対象ブロックに挿入し、第(N―t+1)の等価プログラム命令挿入後ブロックを生成する。
なお、以降の説明において、等価プログラム命令を挿入しなかった分割後ブロックのことを、等価プログラム非挿入ブロックと呼ぶ。
また、第1〜第Nの等価プログラム挿入後ブロックを実行することにより、秘密情報用変数には被秘匿情報の値が設定されることがわかる。
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加し、図6に示すように、新たな変数宣言部601を生成する。変数宣言部601は、変数宣言部202に、秘密情報用変数「dkey」の宣言文が加わったものである。このとき、等価プログラム生成部104は、秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加する際に、変数「dkey」の変数の型を、被秘匿情報である「512」を示すことが出来る型にする(例えば、8ビット正整数型を用いると0〜255までしか表現できず512を示すことができないので、これは避ける。)。ここでは、例えば、変数「dkey」の変数の型をint型とする。
次に、等価プログラム生成部104は、第1の等価プログラム命令「dkey=18;」を第5の等価プログラム命令挿入対象ブロックであるノード501aに挿入し、第5の等価プログラム命令挿入後ブロック602aを生成する。同様に第2の等価プログラム命令「dkey=dkey/2+54;」を第4の等価プログラム命令挿入対象ブロックであるノード501bに挿入し、第4の等価プログラム命令挿入後ブロック602bを生成する。以下、同様に、第3の等価プログラム命令挿入後ブロック602c、第2の等価プログラム命令挿入後ブロック602d、第1の等価プログラム命令挿入後ブロック602eを生成する。
図6にて、等価プログラム命令挿入後ブロック602a〜602eと、等価プログラム命令非挿入ブロック603f〜603hとを用いたグラフを示す。
1.1.6 偽装ブロック挿入後プログラム生成部105
偽装ブロック挿入後プログラム生成部105は、正常系での実行結果を得るためには必要なく、また実行されることもないプログラム命令群である偽装ブロックを生成する。偽装ブロックは、より詳細には、プログラム実行中にデバッガ等を用いてプログラムカウンターや変数の値を強制的に変更することを行わない限り、実行されることのないプログラム命令群である。
偽装ブロック挿入後プログラム生成部105は、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成とを行う。
偽装ブロック挿入後プログラム生成部105は、生成する偽装ブロック数を予め記憶している。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得する。偽装ブロック数の値は、例えば、「1000」等である。なお、説明の簡略化のために偽装ブロック数を値「4」とする。
偽装ブロック挿入後プログラム生成部105は、取得した偽装ブロック数にて示される個数の偽装ブロック本体を生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1以上の分割後ブロックをランダムに選択する。
(3)偽装等価プログラム命令挿入後偽装ブロックの生成
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令それぞれを、対応する偽装ブロック本体のそれぞれに挿入し、偽装等価プログラム命令挿入後偽装ブロックを生成する。偽装等価プログラム命令は、等価プログラム生成部104にて用いた第t(t=2、3、・・・N)の等価プログラム命令と同じ変数、演算子を用いたプログラム命令である。
偽装ブロック挿入後プログラム生成部105は、0以外の整数RA及びRBをランダムに選択し、選択したRA及びRBを用いて、偽装等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)(演算子)(RA)+(RB);」を生成する。ここで、演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令を、対応する偽装ブロック本体の先頭に挿入する。
偽装ブロック挿入後プログラム生成部105は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶している。本実施の形態では、所定数は、例えば、「13」である。
偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックのそれぞれに、無条件分岐命令及び条件分岐命令のうち少なくとも1の分岐命令を挿入し、偽装分岐命令付き偽装ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
次に、偽装ブロック挿入後プログラム生成部105は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加する。なお、以降では、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令が追加されたブロックをTMPブロックと呼ぶ。
算出結果が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。中止した時点での、TMPブロック群を構成するTMPブロックを、以降、偽装ブロックと呼ぶ。
偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択する。次に、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成する。ここで、挿入する条件分岐命令の分岐条件は秘密情報用変数とランダムに決定した値とを比較する条件式とし、条件分岐命令の分岐先は、生成したグラフを構成するいずれかのノードに対応するブロックの先頭とする。条件分岐命令を挿入する位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
(5)具体例
偽装ブロック挿入後プログラム生成部105は、予め記憶している偽装ブロック数「4」を取得する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1の分割後ブロック401cを選択し、選択した分割後ブロック401cから分岐命令である「if(条件1)goto labelF;」を取り除いたプログラム命令群Cを用いて、偽装ブロック本体701iを生成する。
次に、偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体701i〜701lのそれぞれに対する偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令のそれぞれを偽装ブロック本体701i〜701lに挿入して、図9に示すような偽装等価プログラム命令挿入後偽装ブロック801i〜801lを生成する。
偽装等価プログラム命令挿入後偽装ブロック801j〜801lについても同様の生成方法であるため、ここでの説明は省略する。
ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hは、等価プログラム命令非挿入ブロック603f〜603hの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後等価プログラム命令非挿入ブロックである。なお、等価プログラム命令非挿入ブロック603fの先頭には始めからラベル「labelF:」があったので、ラベルの挿入は行っていない。
次に、偽装ブロック挿入後プログラム生成部105は、生成したラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lからTMPブロック1101i〜1101lを生成する。図11において、生成したTMPブロック1101i〜1101lの一例を示す。
次に、偽装ブロック挿入後プログラム生成部105は、以下のようにして図12にて示すグラフG200を生成する。ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eのそれぞれを、ノード1201a〜1201eとし、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hのそれぞれを、ノード1201f〜1201hとし、TMPブロック1101j〜1101lのそれぞれを、ノード1201i〜1201lとして説明する。
ラベル挿入後等価プログラム命令挿入後ブロック1001cにはラベル挿入後等価プログラム命令非挿入ブロック1002fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1) goto labelF;」がある。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201cとノード1201fにエッジ1202hを設ける。
偽装ブロック挿入後プログラム生成部105は、上記の動作を行うことにより、グラフG200を生成することができる。
次に、偽装ブロック挿入後プログラム生成部105は、図12にて示すグラフG200を用いて、「(エッジ数)−(ノード数)」の値が、所定数「13」以上であるか否かを判定する。
偽装ブロック挿入後プログラム生成部105は、TMPブロック1101i〜1101lからTMPブロック1101jをランダムに選択し、選択したTMPブロック1101jに条件分岐命令を挿入して、図13にて示す新たなTMPブロック1301jを生成する。
ここで、新たなTMPブロック群を用いたグラフG210を図14に示す。グラフG200との違いは、ノード1201jがノード1205jとなり、ノード1205jとノード1201bとにエッジ1202jを設け、ノード1205jとノード1201dとにエッジ1302jを設ける。なお、TMPブロック1301jとノード1205jとが対応している。
擬似分岐命令挿入後プログラム生成部106は、偽装ブロック挿入後プログラム生成部105にて生成したラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。ここで、ラベル挿入後等価プログラム命令挿入後ブロックに挿入される擬似分岐命令は、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系のプログラム実行時には必ず真偽が一定の値となる分岐条件分岐命令である。
擬似分岐命令挿入後プログラム生成部106は、第Nのラベル挿入後等価プログラム命令挿入後ブロックから第1のラベル挿入後等価プログラム命令挿入後ブロックに対して、等価命令挿入後ブロック秘密情報用の変数値の決定と、擬似分岐命令の挿入とを行うことにより、擬似分岐命令挿入後プログラムを生成する。
擬似分岐命令挿入後プログラム生成部106は、第1の等価プログラム命令から第(N−t+1)の等価プログラムまでの等価プログラムを取得する。
次に、擬似分岐命令挿入後プログラム生成部106は、定数m及び比較演算子をランダムに選択し、条件式「dkey (比較演算子) m」を生成する。
擬似分岐命令挿入後プログラム生成部106は、生成した条件式を用いて、擬似分岐命令「if (dkey (比較演算子) m) then 第1の分岐先 else 第2の分岐先」を生成する。擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令を、第tのラベル挿入後等価プログラム命令挿入後ブロックの追加して擬似分岐命令挿入後ブロックを生成する。なお、条件分岐命令を追加する位置はブロックの最後とする。
擬似分岐命令挿入後プログラム生成部106は、変数「dkey」に、算出した等価命令挿入後ブロック秘密情報用の変数値を代入し、条件式の真偽を判定する。
条件式が真であると判定する場合には、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先を次ブロックとし、第2の分岐先をラベル挿入後等価プログラム命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロックのそれぞれからランダムに選択した1のブロックとする。
なお、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先と第2の分岐先が、重複しないように、各ブロックを選択する。
ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eから図15に示す擬似分岐命令挿入後ブロック1401a〜1401eが生成される具体例について説明する。
擬似分岐命令挿入後プログラム生成部106は、まず、第N(ここでは、N=5)ラベル挿入後等価プログラム命令挿入後ブロック1001aから擬似分岐命令挿入後ブロック1401aを以下のようにして生成する。
擬似分岐命令挿入後プログラム生成部106は、定数m(ここでは、「46」)及び比較演算子(ここでは、「<」)をランダムに選択し、条件式「dkey < 46」を生成する。
この場合、条件式は真となり、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先として次ブロック(ここでは、ラベル名が「labelB」であるブロック)を選択し、第2の分岐先としてラベル名が「labelC」を選択し、擬似分岐命令であるプログラム命令「if(dkey<46)goto labelB;else goto labelC;」を生成する。
擬似分岐命令挿入後ブロック1401b〜1401eについても同様の生成方法であるため、ここでの説明は省略する。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム非挿入ブロックのそれぞれと、偽装ブロックのそれぞれと、偽装分岐命令挿入後ブロックのそれぞれからなるブロック群から、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系の実行時に、goto文を用いずに他のブロックに移動する経路を有するブロックを1以上抽出する。
また、被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロックを抽出し、抽出したブロックの最後の命令がプログラム命令「return;」、「exit();」以外のプログラム命令であった場合には、ブロックの最後にプログラム命令「return;」を追加する。
なお、以降の説明において、被入替ブロック群に含まれるブロックを被入替ブロックと呼ぶ。
以下に具体例を示す。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hと、偽装ブロックのそれぞれと、擬似分岐命令挿入後ブロック1401a〜1401eとから、goto文を用いずに他のブロックに移動する経路を有するブロック(ここでは、ラベル挿入後等価プログラム命令非挿入ブロック1002f、及び1002g)を抽出する。
抽出したラベル挿入後等価プログラム命令非挿入ブロック1002gに対しても同様に、被入替ブロック群生成部107は、無条件分岐命令であるプログラム命令「goto labelH;」を挿入し、被入替ブロック1501gを生成する。
偽装ブロックについても同様に偽装ブロックそのものを被入替ブロックとし、被入替ブロック群生成部107は、被入替ブロック1501j〜1501lを生成する。
配置順序入替部108は、被入替ブロック群生成部107で生成した被入替ブロック群に含まれる各被入替ブロックのうち、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替える。
配置順序入替部108は、等価プログラム生成部104にて生成した新たな変数宣言部と、配置順序を入れ替えた被入替ブロック群とからなる難読化プログラムを生成する。
以下に具体例を示す。
配置順序入替部108は、図16にて示す被入替ブロック1501b〜1501lの入れ替えを行う。ここでは、配置順序入替部108は、順に、被入替ブロック1501a、被入替ブロック1501g、被入替ブロック1501d、被入替ブロック1501c、被入替ブロック1501e、被入替ブロック1501l、被入替ブロック1501f、被入替ブロック1501b、被入替ブロック1501h、被入替ブロック1501k、被入替ブロック1501i、被入替ブロック1501jとなるように、入れ替えを行う。
1.2 プログラム難読化装置10の動作
ここでは、プログラム難読化装置10の動作について説明する。
ここでは、プログラム難読化装置10が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて説明する。
プログラム難読化装置10の入力部101は、難読化対象プログラム、及び位置情報を受け付ける(ステップS5)。
ブロック分割部102は、記憶部100から難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。その後、ブロック分割部102は、分割した基本ブロックのそれぞれを、詳細に分割して、1以上の分割後ブロックを生成する(ステップS10)。
プログラム難読化装置10は、偽装ブロック挿入後プログラムの生成処理を施して、偽装ブロック挿入後プログラムを生成する(ステップS20)。
プログラム難読化装置10の擬似分岐命令挿入後プログラム生成部106は、ラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック挿入後プログラム生成部105にて生成した偽装ブロックのそれぞれとからなる擬似分岐命令挿入後プログラムを生成する(ステップS25)。
1.2.2 等価プログラム生成処理の動作
ここでは、図18に示す等価プログラム生成処理(ステップS15)の動作について、図19に示す流れ図を用いて説明する。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、グラフを生成する。
等価プログラム命令生成部103は、取得した1以上の等価プログラム命令挿入対象ブロックそれぞれに対応する等価プログラム命令を生成する(ステップS110)。
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える(ステップS120)。
ここでは、図18に示す偽装ブロック挿入後プログラムの生成処理(ステップS20)の動作について、図20に示す流れ図を用いて説明する。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得することにより、偽装ブロック数を決定する(ステップS200)。
偽装ブロック挿入後プログラム生成部105は、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS215)。
偽装ブロック挿入後プログラム生成部105は、値「(エッジ数)−(ノード数)」が所定数以上であるか否かを判定する(ステップS230)。
所定数以上でないと判定する場合には(ステップS230における「NO」)、偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択し、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成して、新たなTMPブロック群を更新(生成)し(ステップS235)、ステップS225へ戻る。
このような構成によると、難読化されたプログラムから、秘密情報を見つけ出すことを困難にすることができる。
まず、等価プログラム命令生成部103、等価プログラム生成部104によって、秘密情報を含む命令を等価プログラム命令に置き換えプログラム上の様々な位置に配置している。このような構成により、不正解析者はプログラム中に含まれる定数値を全て収集したとしても、秘密情報を見つけることができなくなる。また、等価プログラム命令を分割後ブロックをまたがって、難読化後のプログラムの様々な位置に配置したことにより、不正解析者が等価プログラム命令を見つけ出すことを困難にすることが出来る。
例えば、DES、AES等の暗号プログラムは広くアルゴリズムが公開されており、不正解析者が難読化対象プログラムのアルゴリズムを知ることは容易である。そのような難読化対象プログラムにおいても、被秘匿情報である暗号鍵を不正解析から保護したいという要求がある。
この2つのグラフを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフに相当するグラフを見つけ出すことで、難読化後のプログラムから偽装ブロックを取り除いた部分を見つけ出すという不正解析が考えられる。
さらに、配置順序入替部108により、難読化後のプログラムのグラフの構造を複雑にすることで上記の不正解析を困難にすることができる。
上記第1の実施の形態では、プログラム難読化装置10は、TMPブロック群を用いてグラフを生成したが、これに限定されない。
プログラム難読化装置は、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを備える代わりに、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを1つの構成要素とする擬似分岐命令挿入後プログラム生成部106aを備えるとし、擬似分岐命令挿入後プログラムを用いてグラフを生成してもよい。
擬似分岐命令挿入後プログラム生成部106aは、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成と、TMPブロック群の生成と、擬似分岐命令挿入後プログラムの生成とを行う。
(1)TMPブロック群の生成
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
次に、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加して、TMPブロックを生成する。
次に、擬似分岐命令挿入後プログラム生成部106aは、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックから擬似分岐命令挿入後ブロックを生成する。生成方法は、上記第1の実施の形態にて示す擬似分岐命令挿入後プログラム生成部106が行う生成方法と同様であるため、説明は省略する。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する。ここで、閉路とは、始点となるノードから終点となるノードに至る経路のうち、始点と終点が同じノードである経路である。ここで、所定数とは、ユーザが所望する難読化の強度に応じて定まる数であり、例えば、「13」である。
選択されたブロックが、TMPブロックである場合には、上記に示す偽装ブロック挿入後プログラム生成部105による新たなTMPブロックの生成と同様であるため、説明は省略する。また、条件分岐命令の挿入位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
所定数以上であると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、生成したグラフが、平面グラフ(交差を含まないグラフ)であるか否かを判定する。
平面グラフであると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれ、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれ、TMPブロックのそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、条件分岐命令を挿入して生成した新たなブロックと、挿入を行わず変更を加えていない各ブロックとを用いて、再度、グラフ生成を行い、上記に示す動作を行う。
また、擬似分岐命令挿入後プログラム生成部106aは、閉路数を取得する代わりに、生成したグラフのエッジ数、ノード数を数え、式「(エッジ数)―(ノード数)+1」で算出した値を閉路数の近似値として用いてもよい。
ここでは、変形例1におけるプログラム難読化装置が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて変更点のみ説明する。
変形例1におけるプログラム難読化装置は、図18に示すステップS5〜15を実行後、ステップS20における偽装ブロック挿入後プログラムの生成処理を行う代わりに、擬似分岐命令挿入後プログラムの生成処理を行う。
1.4.3 擬似分岐命令挿入後プログラムの生成処理
ここでは、擬似分岐命令挿入後プログラムの生成処理の動作について、図21に示す流れ図を用いて説明する。
擬似分岐命令挿入後プログラム生成部106aは、分割後ブロックの中から1以上の分割後ブロックをランダムに選択し、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する(ステップS305)。擬似分岐命令挿入後プログラム生成部106aは、このステップを取得した偽装ブロック数分だけ行う。
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成、及び生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS315)。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する(ステップS340)。
平面グラフでないと判定する場合には(ステップS345における「NO」)、擬似分岐命令挿入後プログラム生成部106aは、動作を終了する。
グラフ理論の分野では、2つのグラフG1、G2において、G1がG2に含まれるか否かを判定する問題が難しいことが部分グラフ同型判定問題として知られている。このことは非特許文献2に述べられている。
このことから、G2にG1が含まれることが分っていても、G2のどこにG1が含まれるかを判定することが難しいことが言える。また、部分グラフ同型判定問題が難しい条件として、プログラムが木構造ではないこと、プログラムが平面グラフでないことが知られる。
変形例1のプログラム難読化装置は、部分グラフ同型判定問題が困難となる難読化後のプログラムのグラフを構築することができる。
また、変形例1のプログラム難読化装置は、全ての閉路数を取得する代わりに、予め難読化前のプログラムに含まれる閉路を調べ、さらに、それぞれの閉路を構成するノード数を調べ、調べたノード数と同数のノードからなる閉路数のみを数える構成としても構わない。このような構成によれば、変形例1のプログラム難読化装置はグラフの閉路数の傾向を大まかに知ることができ、また閉路数を計算する処理時間を短くすることができる。
1.4.5 その他の変形例
擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムの生成において、閉路数の判定や、平面グラフの判定の双方を用いたが、これに限定されない。
1.5 変形例2
変形例1において、図21に示すステップS330及びステップS350の動作を以下のように変更してもよい。
擬似分岐命令挿入後プログラム生成部106aは、挿入する分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
1.5.2 ステップS350の変更
擬似分岐命令挿入後プログラム生成部106aは、挿入する条件分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの終了ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501hと、図12におけるノード1201hの対応を見つけることを行えば、難読化後のプログラムのグラフから、難読化前のプログラムを見つける解析が容易になる。
1.6 変形例3
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの開始ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501aと、図12におけるノード1201aの対応を見つけることを行えば、そこから解析が進む。変形例3は、プログラムの開始ノードの抽出を困難にするための変形例であり、変形例3のプログラム難読化装置は、上記第1の実施の形態にて示す配置順序入替部108を、以下に示す配置順序入替部108aに変更する。
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これらと重複しない変数名を、難読化対象プログラムに開始ノードを指定するための新たな引数である開始ノード指定用変数として、変数宣言部601に追加し、新たな変数宣言部601aを生成する。
次に、配置順序入替部108aは、開始ノードに対応するブロックへの先頭に分岐命令を実行する際のノード指定用変数の値を、難読化対象プログラムを呼び出す側のプログラムにおける難読化対象プログラムを呼び出すプログラム命令の引数に追加する。
1.6.2 具体例
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これと重複しない変数名を開始ノード指定用変数とする。ここでは、開始ノード指定用変数を「start」とする。
追加するswitch文にあたるプログラム命令を
「
swtich(start){
case 1:
goto labelC;
case 2:
goto labelA;
case 3:
goto labelL;
default:
}
」
とする。
また、難読化対象を呼び出すプログラム命令が「func(a,b);」であるならば、これを「func(a,b,2);」に置き換える。ここで、値「2」は、switch文に用いられる開始ノード指定用変数「start」に格納される数値である。なお、難読化対象プログラムを呼び出す側のプログラムを別途難読化して、開始ノード指定用変数がとる値「2」を隠蔽するなどを行ってもよい。
このような難読化を適用することにより、開始ノード指定用変数startに格納される正しい値が分からなくては開始ノードがどれであるのかが分からなくなる。すなわち、難読化対象プログラムを局所的に解析したのでは、開始ノードがわからなくなり難読化前のプログラムのグラフと難読化後のプログラムのグラフにおいて開始ノードの対応を取ることを困難にすることが出来る。
上記第1の実施の形態において、難読化後プログラムにおいて秘密情報用変数が右辺にのみ存在するプログラム命令は、被秘匿情報位置のプログラム命令のみである(図17では、被入替ブロック1501e)。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムのグラフにおいて被秘匿情報位置となるノード(図5では、ノード501e)と難読化後のプログラムにおける秘密情報用変数が右辺にのみ存在するブロックとの対応を取って、不正解析を行うことが考えられる。
また、変形例4のプログラム難読化装置は、等価プログラム命令挿入後ブロックにおいて、右辺に定数がある命令における定数を、算出した等価命令挿入後ブロック秘密情報用の変数値を用いて算出するプログラム命令に置き換えてもよい。これにより、右辺に秘密情報用変数を含むプログラム命令の数が増えるので、変形例4のプログラム難読化装置は、上記の不正解析を困難にすることができる。
難読化前のプログラムに特徴的な演算、特徴的な数値を用いた演算(例えば、暗号プログラムのアルゴリズムにおけるループの回数など)が含まれる場合がある。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムにおいて、特徴的な演算または数値を見つけ難読化前のグラフと難読化後のグラフにおいて対応が取れるノードを見つける手がかりにすることが考えられる。
また、特徴的な数値も、秘密情報として扱い本手法で述べた難読化方法や他の難読化方法により隠蔽しても構わない。
1.9 その他の変形例
1.9.1 C言語以外
上記第1の実施の形態では、秘密情報を保持するプログラムがC言語の場合を示したが、これに限定されない。Java(登録商標)バイトコード、Java(登録商標)言語、アセンブリ言語、機械語などで記述されたプログラムであってもよい。
その他の生成する命令については、Java(登録商標)バイトコードにおける記述方法にのっとり、同等の命令を生成する。
また、Java(登録商標)言語に適用する際には、Java(登録商標)言語にプログラム命令「goto」に対応する命令がない。よって、各ブロックをメソッドとして生成し、プログラムの出口となるプログラム命令を含むメソッドには例外をスローされるプログラム命令を追加し、プログラムの入口となる命令を含むメソッドにはスローした例外をキャッチするプログラム命令を追加する。メソッド、例外の記述仕方は公知であるため説明は省略する。
Java(登録商標)言語において、無条件分岐命令を見つける処理では、プログラム命令「break」、「continue」,「return」、「throw」を見つける。
アセンブリ言語の場合、用いるアセンブラ言語によって命令セットは異なるが、例えばGASによるアセンブル言語の場合、C言語のプログラム命令「goto」文を生成する処理では、プログラム命令「jmp」を使用する。
条件分岐命令を見つける処理では、「jmp」以外のジャンプ命令を見つける。なお、GASのアセンブリ言語については、公知であるため説明は省略する。
機械語については、用いる機械語によって命令セットは異なるが、それぞれの記述方法にのっとり記述する。
上記第1の実施の形態では、ブロック分割の際に基本ブロックに分割した後、さらに分割後ブロックを生成したが、基本ブロックへの分割を行わず、行数のみに基づく分割により分割後ブロックの生成を行っても良い。
このような構成を取る場合には、プログラム難読化装置は、等価プログラム命令を挿入する際に、等価プログラム命令挿入対象ブロックに含まれる一番最初の分岐命令よりも前に、さらに、一番最後の合流位置よりも後に等価プログラム命令を挿入する。
なお、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
(1)上記第1の実施の形態において、プログラム難読化装置10が受け付ける位置情報は、難読化対象プログラムにおける秘密情報を保持するプログラム命令の行番号であるとしたが、これに限定されない。
または、位置情報は、ラベルを用いて指定してもよい。すなわち、予め定められた所定の名前のラベルがあるプログラム上の行の次の行を被秘匿情報として扱う構成としてもよい。
(2)上記第1の実施の形態において、プログラム難読化装置10は、偽装ブロック数を予め記憶するとしたが、これに限定されない。
(生成する偽装ブロック数)=(所定数)−e
ここで、複雑度は、プログラムに含まれるプログラム命令数や、ループ数や、プログラムに使用される変数の数、またはそれらの組み合わせ等でプログラムの複雑さを指標化した値であり、バグが発生しやすいプログラムを見つけ出す際などに使用される。
ここで、所定数の決定について説明する。所定数と、難読化の強度との関係は、図22に示すように、強度が増加すると、所定数は単調に増加する(図22に示す関数G300)。グラフG300は、y=aX+bにて示される。これにより、ユーザが所望する強度が決定すると、一意的に所定数が決定することになる。プログラム難読化装置は、決定した所定数から難読化対象プログラムの複雑度eを減算することにより得られた結果を、偽装ブロック数とする。
(3)上記第1の実施の形態において、プログラム難読化装置10は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶しているとしたが、これに限定されない。
または、プログラム難読化装置10は、プログラムを難読化する度に、難読化の強度に応じた所定数を、入力部101にて受け付け、受け付けた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、他のプログラムから難読化の強度に応じた所定数を受け付け、受け付けた所定数を用いて難読化を行ってもよい。
プログラム難読化装置10は、生成した複数の偽装ブロック本体のうち1以上の偽装ブロック本体に、偽装等価プログラム命令を挿入して、偽装等価プログラム命令挿入後偽装ブロックを生成してもよい。
または、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行される1以上のブロックからなる部分プログラムから、ブロック分割部を用いて1以上の分割後ブロックを生成し、生成した1以上の分割後ブロックと、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行されない1以上のブロック(偽装ブロックに相当する)とから被入替ブロック群を生成してもよい。
グラフの難易度を示す指標として、第1の所定数以上のノードからなる閉路の数としてもよい。このとき、プログラム難読化装置10は、例えば、第1の所定数として「3」、閉路数の最小値を示す第2の所定数として「4」を予め記憶している。
偽装ブロック挿入後プログラム生成部105は、取得した閉路数が、第2の所定数以上であるか否かを判定する。
閉路数が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。
(7)上記第1の実施の形態において、被秘匿情報は、定数としたがこれに限定されない。被秘匿情報は、1以上のプログラム命令からなる命令群であってもよい。
(8)上記第1の実施の形態において、秘密情報用変数を用いたが、これに限定されない。秘密情報用変数を用いなくてもよい。
または、プログラム難読化装置は、複数の分割後ブロックと、1以上のTMPブロックとを用いて、被入替ブロック群を生成してもよい。また、分割後ブロックのそれぞれに、ラベル名を付与してもよい。
配置順序入替部108は、開始ノードとなる被入替ブロックを含めた全ての被入替ブロックの配置順序を、ランダムに入れ替えてもよい。このとき、配置順序入替部108は、入替結果により、プログラムに含まれる処理部の先頭位置に、偽装ブロックである被入替ブロックが存在する場合には、その被入替ブロックの先頭に、常に処理群Aを含む被入替ブロック(開始ノードとなるブロック)に分岐する無条件分岐命令又は条件分岐命令を挿入する。
(11)上記第1の実施の形態において、プログラム難読化装置10は、等価プログラム命令の挿入対象ブロックに対して、1の等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、挿入対象ブロックに対して、2以上の等価プログラム命令を挿入してもよい。
(14)上記第1の実施の形態において、プログラム難読化装置10は、被秘匿情報の値を秘密情報用変数に置き換え、その後、等価プログラム命令挿入対象ブロックのそれぞれに対応する等価プログラム命令を挿入したが、これに限定されない。
(15)上記第1の実施の形態において、正常系での実行に全ての命令が必要なプログラムを難読化している。そのため、難読化後のプログラムが正常系で適切に動作することを保証するために、各分割後ブロック(以下、単に、「ブロック」という。)の最後に、次に実行すべきブロックの先頭への分岐命令を挿入する必要がある。
例えば、入力として与えられるプログラムに、正常系では必要のないダミーの命令が既に含まれている場合、プログラムの分割の仕方によっては、ブロックの先頭にダミーの命令が含まれたり、最後にダミーの命令が含まれたりする可能性がある。このような事態は、他の難読化手法により難読化された後のプログラムを、本発明による手法で、さらに難読化を行う場合などが考えられる。
また、正常系で必要な命令が終わる箇所に分岐命令を挿入することで、ブロックの最後にあるダミーの命令の実行を省略してもよい。
(17)本発明における命令群とは、1以上の命令からなるものとする。つまり、本発明における命令群は、1の命令からなる場合も含まれる。
また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
(20)上記の各装置を構成する構成要素の一部又は全部は、各装置に脱着可能なICカード又は単体のモジュールから構成されているとしてもよい。前記ICカード又は前記モジュールは、マイクロプロセッサ、ROM、RAM、などから構成されるコンピュータシステムである。前記ICカード又は前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムに従って動作することにより、前記ICカード又は前記モジュールは、その機能を達成する。このICカード又はこのモジュールは、耐タンパ性を有するとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD―ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
(22)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
1.11 まとめ
(1)本発明は、プログラムを難読化するプログラム難読化装置であって、 第一の入力プログラムにおける被秘匿情報を使用するプログラム命令または被秘匿命令を含む少なくとも一つ以上のプログラム命令からなる第一のプログラム命令群と同等の機能を有する、第二のプログラム命令群を生成する等価プログラム命令群生成手段と、前記第一の入力プログラムから前記第一のプログラム命令群を取り除き、前記第二のプログラム命令群を挿入して第一の出力プログラムを生成する等価プログラム生成手段と、 正常系の実行結果を得るための任意の実行時には、実行されない1以上のプログラム命令からなる偽装ブロックを生成し、第二の入力プログラムに前記偽装ブロックを挿入し第二の出力プログラムを生成する偽装ブロック挿入後プログラム生成手段とを有し、 少なくとも一つの前記偽装ブロックのプログラム命令の少なくとも一つは、前記第二のプログラム命令群を構成するプログラム命令が使用する変数を用いることを特徴とする。
(3)ここで、上記(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを、1以上のプログラム命令から構成される分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、閉路が予め与えられた第一の所定数以上となるように前記偽装ブロックを生成するとしてもよい。
(5)ここで、上記(2)に示すプログラム難読化装置は、さらに、前記第二の入力プログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、 前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、予め与えられた第一の所定数以上のノード数からなる閉路の数が予め与えられた第二の所定数以上となるように偽装ブロックを生成するとしてもよい。
(7)ここで、上記(5)に示すプログラム難読化装置は、さらに、前記与えられた第二の所定数を入力する入力手段を有するとしてもよい。
(8)ここで、上記(2)に示すプログラム難読化装置において、前記偽装ブロック挿入後プログラム生成手段は、さらに、前記第二のプログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第一のグラフを生成し、前記ノードブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第二のグラフを生成し、前記第二のグラフから前記第一のグラフを見つけ出す部分グラフ同型判定問題の難易度が予め与えられた第一の所定数以上になるように偽装ブロックを生成するとしてもよい。
(10)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを任意の位置で第一のブロックと第二のブロックに分割し、正常系の実行結果を得るための任意の実行時には、真偽値が一定の第一の値となる分岐条件によって分岐先を決定する条件分岐命令を前記第一のブロックの最後に追加して第三のブロックを生成し、 前記第三のブロックと前記第二のブロックからなる第三の出力プログラムを生成する擬似分岐命令挿入後プログラム生成手段を有し、前記条件分岐命令は、前記分岐条件が前記第一の値を取る場合の分岐先が前記第二のブロックの先頭であるとしてもよい。
100 記憶部
101 入力部
102 ブロック分割部
103 等価プログラム命令生成部
104 等価プログラム生成部
105 偽装ブロック挿入後プログラム生成部
106 擬似分岐命令挿入後プログラム生成部
107 被入替ブロック群生成部
108 配置順序入替部
201 難読化対象プログラム
202 変数宣言部
203 処理部
Claims (20)
- 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置であって、
前記オリジナルプログラムを記憶している記憶手段と、
複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成手段と、
前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入手段と、
前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成手段と、
前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入手段と
を備えることを特徴とするプログラム難読化装置。 - 前記秘匿処理命令群は、演算対象として前記被秘匿情報を含む秘匿演算式であり、
前記処理命令は、秘密変数に対して演算結果を代入する演算式であり、
前記偽装処理命令は、前記秘密変数を演算対象とする偽装演算式であり、
前記処理命令生成手段は、定められた処理順序に従った演算が行われると最後の演算により、前記秘匿演算式による演算と同一の値が得られる複数の演算式を生成し、
前記処理命令挿入手段は、
前記オリジナルプログラムが含む被秘匿情報を前記秘密変数へ置換する置換部と、
前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の演算式のそれぞれを、前記演算順序で実行されるように挿入する挿入部と
を備えることを特徴とする請求項1に記載のプログラム難読化装置。 - 前記偽装ブロック挿入手段は、
前記偽装ブロック生成手段にて生成される少なくとも1の偽装ブロックに、前記正当プログラム命令、前記処理命令及び他の偽装ブロックの何れかを分岐先とする分岐命令を挿入する
ことを特徴とする請求項1に記載のプログラム難読化装置。 - 前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、
前記処理命令挿入手段は、
前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、
前記偽装ブロック挿入手段は、
前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、
生成したグラフの難易度が、所定の条件を満たすか否かを判定する判定部と、
所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する第2生成部と、
前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部による処理を行うように制御する制御部と
を備えることを特徴とする請求項3に記載のプログラム難読化装置。 - 前記プログラム難読化装置は、さらに、
難読化の強度の指定を受け付ける受付手段を備え、
前記所定の条件を満たすとは、ノード間を結ぶエッジの数と、ノード数とから算出される値(エッジ数)−(ノード数)が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、
前記判定部は、前記第1生成部にて生成されたグラフから、エッジ数とノード数とを取得し、値(エッジ数)−(ノード数)が、前記所定数以上であるか否かを判定する
ことを特徴とする請求項4に記載のプログラム難読化装置。 - 前記プログラム難読化装置は、さらに、
難読化の強度の指定を受け付ける受付手段を備え、
前記所定の条件を満たすとは、グラフにおける閉路の数が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、
前記判定部は、前記第1生成部にて生成されたグラフから閉路数を取得し、取得した閉路数が、前記所定数以上であるか否かを判定する
ことを特徴とする請求項4に記載のプログラム難読化装置。 - 前記所定の条件を満たすとは、グラフが平面グラフでないことであり、
前記判定部は、前記第1生成部にて生成されたグラフが平面グラフであるか否かを判定し、平面グラフでないと判定する場合に、前記所定の条件を満たすとする
ことを特徴とする請求項4に記載のプログラム難読化装置。 - 前記プログラム難読化装置は、さらに、
難読化の強度の指定を受け付ける受付手段を備え、
前記所定の条件を満たすとは、第1の所定数以上のノード数からなる閉路の数が、ユ指定された前記強度に応じたグラフの難易度にて定まる第2の所定数以上であることであり、
前記判定部は、前記第1生成部にて生成されたグラフから、第1の所定数以上のノード数からなる閉路の数を取得し、取得した閉路数が、前記第2所定数以上であるか否かを判定する
ことを特徴とする請求項4に記載のプログラム難読化装置。 - 前記偽装ブロック挿入手段は、
前記オリジナルブロックに対して、前記演算式が前記演算順位で実行された場合に真偽値が一定値となる比較式を含み、前記比較式により真偽値が前記一定値となる場合の分岐先を次に実行する次オリジナルブロックとする条件分岐命令を、前記オリジナルブロックに挿入し、
前記偽装ブロックが、前記オリジナルブロックの直後に挿入された場合には、前記条件分岐命令を前記制御命令とする
ことを特徴とする請求項4に記載のプログラム難読化装置。 - 前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、
前記処理命令挿入手段は、
前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、
前記偽装ブロック挿入手段は、
前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、
生成したグラフの強度が、所定の条件を満たすか否かを判定する判定部と、
所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する、又は1のオリジナルブロックに、1の偽装ブロックを分岐先とし、常に前記分岐先には分岐しない条件分岐命令を前記オリジナルブロックに挿入する第2生成部と、
前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部を行うように制御する制御部と
を備えることを特徴とする請求項3に記載のプログラム難読化装置。 - 処理命令生成手段は、
前記処理順序で実行した場合のみに、前記秘匿処理命令群による処理と同一の結果が得られるように、前記複数の処理命令を生成する
ことを特徴とする請求項1に記載のプログラム難読化装置。 - 前記偽装ブロック挿入手段は、
前記オリジナルプログラムを、1以上の正当プログラム命令からなる複数の分割ブロックに分割する分割部と、
前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、
前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、
前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、
前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とする
ことを特徴とする請求項1に記載のプログラム難読化装置。 - 前記分割部は、さらに、
前記偽装ブロックを、1以上のプログラム命令からなる複数の偽装分割ブロックに分割し、
前記被入替ブロック生成部は、さらに、
前記偽装分割ブロックのそれぞれから、偽装分割ブロックに、他の偽装分割ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、
前記挿入部は、
前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入する
ことを特徴とする請求項12に記載のプログラム難読化装置。 - 前記被入替ブロック生成部は、さらに、
前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、
前記挿入部は、
前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入する
ことを特徴とする請求項12に記載のプログラム難読化装置。 - 前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数の分割ブロックに予め分割され、前記複数の分割ブロックが実行順序で並べられており、
前記処理命令挿入手段は、最初に実行される分割ブロックから前記秘匿処理命令群を有する分割ブロックまでの間に、前記複数の処理命令のそれぞれを挿入し、
前記偽装ブロック挿入手段は、
前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、
前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、
前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、
前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とする
ことを特徴とする請求項1に記載のプログラム難読化装置。 - 前記被入替ブロック生成部は、さらに、
前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、
前記挿入部は、
前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入する
ことを特徴とする請求項15に記載のプログラム難読化装置。 - 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置で用いられる難読化方法であって、
前記プログラム難読化装置は、
前記オリジナルプログラムを記憶している記憶手段を備え、
前記難読化方法は、
複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成ステップと、
前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入ステップと、
前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成ステップと、
前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入ステップと
を含むことを特徴とする難読化方法。 - 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置で用いられる難読化プログラムであって、
前記プログラム難読化装置は、
前記オリジナルプログラムを記憶している記憶手段を備え、
前記難読化方法は、
複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成ステップと、
前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入ステップと、
前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成ステップと、
前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入ステップと
を含むことを特徴とする難読化プログラム。 - 前記難読化プログラムは、コンピュータ読み取り可能な記録媒体に記録されていることを特徴とする請求項15に記載の難読化プログラム。
- 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置の集積回路であって、
前記オリジナルプログラムを記憶している記憶手段と、
複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成手段と、
前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入手段と、
前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成手段と、
前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入手段と
を備えることを特徴とする集積回路。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007514688A JP4806402B2 (ja) | 2005-04-21 | 2006-04-21 | プログラム難読化装置及び難読化方法 |
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2005124114 | 2005-04-21 | ||
JP2005124114 | 2005-04-21 | ||
PCT/JP2006/308456 WO2006115219A1 (ja) | 2005-04-21 | 2006-04-21 | プログラム難読化装置及び難読化方法 |
JP2007514688A JP4806402B2 (ja) | 2005-04-21 | 2006-04-21 | プログラム難読化装置及び難読化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2006115219A1 true JPWO2006115219A1 (ja) | 2008-12-18 |
JP4806402B2 JP4806402B2 (ja) | 2011-11-02 |
Family
ID=37214834
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007514688A Active JP4806402B2 (ja) | 2005-04-21 | 2006-04-21 | プログラム難読化装置及び難読化方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8312297B2 (ja) |
JP (1) | JP4806402B2 (ja) |
CN (1) | CN101203859B (ja) |
WO (1) | WO2006115219A1 (ja) |
Families Citing this family (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8312297B2 (en) * | 2005-04-21 | 2012-11-13 | Panasonic Corporation | Program illegiblizing device and method |
US8584109B2 (en) * | 2006-10-27 | 2013-11-12 | Microsoft Corporation | Virtualization for diversified tamper resistance |
JP5055993B2 (ja) * | 2006-12-11 | 2012-10-24 | ソニー株式会社 | 暗号処理装置、および暗号処理方法、並びにコンピュータ・プログラム |
JP4989418B2 (ja) * | 2007-10-26 | 2012-08-01 | 三菱電機株式会社 | プログラム変換装置及びプログラム及びプログラム変換方法 |
JP5300294B2 (ja) * | 2008-03-25 | 2013-09-25 | パナソニック株式会社 | 処理装置、難読化装置、プログラムおよび集積回路 |
US8800048B2 (en) * | 2008-05-20 | 2014-08-05 | Microsoft Corporation | Software protection through interdependent parameter cloud constrained software execution |
FR2942558B1 (fr) * | 2009-02-24 | 2014-05-30 | Eads Europ Aeronautic Defence | Procede d'obscurcissement d'un programme d'ordinateur. |
KR20110001618A (ko) * | 2009-06-30 | 2011-01-06 | 애니포인트 미디어 그룹 | 장치-특화 및 애플리케이션-특화된 컴퓨팅 장치, 재생 장치 및 컴퓨팅 장치를 이용한 재생 장치의 제어 방법 |
CN102713839B (zh) * | 2009-10-08 | 2015-11-25 | 爱迪德技术有限公司 | 用于动态函数调用系统中的积极自我修改的系统和方法 |
EP2506174B1 (en) * | 2011-03-30 | 2019-01-09 | Irdeto B.V. | Enabling a software application to be executed on a hardware device |
US8904279B1 (en) * | 2011-12-07 | 2014-12-02 | Amazon Technologies, Inc. | Inhibiting automated extraction of data from network pages |
CN102582268A (zh) * | 2012-01-10 | 2012-07-18 | 珠海天威技术开发有限公司 | 微控制器及其算法保护方法、存储芯片、耗材容器、成像设备 |
WO2014123552A1 (en) * | 2013-02-08 | 2014-08-14 | Mellmo Inc. | Executing database queries using multiple processors |
US9721120B2 (en) * | 2013-05-14 | 2017-08-01 | Apple Inc. | Preventing unauthorized calls to a protected function |
FR3011354A1 (fr) * | 2013-10-01 | 2015-04-03 | Commissariat Energie Atomique | Procede d'execution par un microprocesseur d'un code binaire polymorphique d'une fonction predeterminee |
US10521496B1 (en) | 2014-01-03 | 2019-12-31 | Amazon Technologies, Inc. | Randomize markup to disturb scrapers |
EP2913772A1 (de) * | 2014-02-28 | 2015-09-02 | Wibu-Systems AG | Verfahren und Computersystem zum Schutz eines Computerprogramms gegen Beeinflussung |
US9600672B1 (en) * | 2014-12-04 | 2017-03-21 | Amazon Technologies, Inc. | Dynamic function switching |
CN104504336B (zh) * | 2014-12-30 | 2018-01-19 | 大连楼兰科技股份有限公司 | 防止嵌入式系统被恶意在线调试的方法和装置 |
US20160328539A1 (en) * | 2015-05-05 | 2016-11-10 | Nxp B.V. | Obscuring Software Code With Split Variables |
US10068070B2 (en) * | 2015-05-05 | 2018-09-04 | Nxp B.V. | White-box elliptic curve point multiplication |
EP3217307B1 (en) * | 2016-02-22 | 2018-11-07 | Eshard | Method of testing the resistance of a circuit to a side channel analysis of second order or more |
US11126718B2 (en) * | 2017-07-12 | 2021-09-21 | Acronis International Gmbh | Method for decrypting data encrypted by ransomware |
FR3096851B1 (fr) * | 2019-05-27 | 2021-05-21 | Idemia Identity & Security France | Procedes de mise en œuvre et d’obfuscation d’un algorithme cryptographique a cle secrete donnee |
CN112199667A (zh) * | 2020-09-30 | 2021-01-08 | 常熟理工学院 | 软件保护方法、装置、设备及存储介质 |
EP4080386A1 (en) * | 2021-04-19 | 2022-10-26 | Thales DIS France SA | Method to protect program in integrated circuit |
FR3122747B1 (fr) * | 2021-05-07 | 2023-03-31 | Commissariat Energie Atomique | Procede d’execution d’une fonction, securise par desynchronisation temporelle |
CN117171766B (zh) * | 2023-07-31 | 2024-04-05 | 上海交通大学 | 基于深度神经网络模型的数据保护方法、系统及介质 |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
IL98248A0 (en) * | 1991-05-23 | 1992-06-21 | Ibm Israel | Instruction scheduler for a computer |
US5410657A (en) * | 1992-10-09 | 1995-04-25 | International Business Machines Corporation | Method and system for high speed floating point exception enabled operation in a multiscalar processor system |
US5799179A (en) * | 1995-01-24 | 1998-08-25 | International Business Machines Corporation | Handling of exceptions in speculative instructions |
JP4739465B2 (ja) | 1997-06-09 | 2011-08-03 | インタートラスト テクノロジーズ コーポレイション | ソフトウェアセキュリティを増強するための混乱化技術 |
CN1215867A (zh) * | 1998-11-17 | 1999-05-05 | 桂继东 | 计算机软件防盗版加密方法 |
US7263722B1 (en) * | 1999-05-12 | 2007-08-28 | Fraunhofer Crcg, Inc. | Obfuscation of executable code |
CN1265494A (zh) * | 2000-04-24 | 2000-09-06 | 后健慈 | 加解密内存及其存取控制方法 |
US6839179B2 (en) * | 2002-05-10 | 2005-01-04 | Applera Corporation | Imaging system and method for reduction of interstitial images |
US7383443B2 (en) * | 2002-06-27 | 2008-06-03 | Microsoft Corporation | System and method for obfuscating code using instruction replacement scheme |
JP3900485B2 (ja) * | 2002-07-29 | 2007-04-04 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 最適化装置、コンパイラプログラム、最適化方法、及び記録媒体 |
JP4619288B2 (ja) * | 2002-12-12 | 2011-01-26 | エイアールエム リミテッド | データ処理システムにおける処理動作マスキング |
GB2405958A (en) * | 2003-08-20 | 2005-03-16 | Macrovision Europ Ltd | Code obfuscation and controlling a processor by emulation |
EP1758395A1 (en) * | 2004-06-28 | 2007-02-28 | Matsushita Electric Industrial Co., Ltd. | Program creation device, program test device, program execution device, information processing system |
JP4235243B2 (ja) * | 2005-04-21 | 2009-03-11 | パナソニック株式会社 | プログラム変換装置及び秘密保持プログラム |
US8312297B2 (en) * | 2005-04-21 | 2012-11-13 | Panasonic Corporation | Program illegiblizing device and method |
US7620987B2 (en) * | 2005-08-12 | 2009-11-17 | Microsoft Corporation | Obfuscating computer code to prevent an attack |
JP5118036B2 (ja) * | 2006-07-18 | 2013-01-16 | パナソニック株式会社 | 命令生成装置、命令生成方法、プログラムおよび集積回路 |
US8112636B1 (en) * | 2007-11-06 | 2012-02-07 | Lockheed Martin Corporation | Protection of code or data from exposure by use of code injection service |
-
2006
- 2006-04-21 US US11/918,904 patent/US8312297B2/en active Active
- 2006-04-21 CN CN2006800224218A patent/CN101203859B/zh active Active
- 2006-04-21 WO PCT/JP2006/308456 patent/WO2006115219A1/ja active Application Filing
- 2006-04-21 JP JP2007514688A patent/JP4806402B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
CN101203859B (zh) | 2013-08-14 |
US8312297B2 (en) | 2012-11-13 |
JP4806402B2 (ja) | 2011-11-02 |
CN101203859A (zh) | 2008-06-18 |
US20090083521A1 (en) | 2009-03-26 |
WO2006115219A1 (ja) | 2006-11-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4806402B2 (ja) | プログラム難読化装置及び難読化方法 | |
Bos et al. | Differential computation analysis: Hiding your white-box designs is not enough | |
US8225077B2 (en) | Obfuscation device for generating a set of obfuscated instructions, processing device, method, program, and integrated circuit thereof | |
JP5643894B2 (ja) | サイドチャネル攻撃および反復起動攻撃に耐える動的可変タイミング演算パスのシステムおよび方法 | |
JP4970279B2 (ja) | セキュア処理装置、セキュア処理方法、難読化秘密情報埋め込み方法、プログラム、記憶媒体および集積回路 | |
JP5118036B2 (ja) | 命令生成装置、命令生成方法、プログラムおよび集積回路 | |
JP5616528B2 (ja) | ソフトウェアの完全性を保証するためのプロセッサにより実施される方法 | |
CN104919750B (zh) | 计算关于函数‑输入值的数据函数的计算设备和方法 | |
CN102047220A (zh) | 生成软件应用程序的白盒实现的系统和方法 | |
CN102341806A (zh) | 软件保护 | |
Balachandran et al. | Potent and stealthy control flow obfuscation by stack based self-modifying code | |
US11119741B2 (en) | Compiling device and method | |
JP2021515314A (ja) | コンパイルデバイス及び方法 | |
CN103858128B (zh) | 提供用于抗攻击的遍及应用的相依性网络的系统和方法 | |
US20090217008A1 (en) | Program conversion device, and secret keeping program | |
Hettwer et al. | Side-channel analysis of the xilinx zynq ultrascale+ encryption engine | |
Tsai et al. | A graph approach to quantitative analysis of control-flow obfuscating transformations | |
Ceccato et al. | Codebender: Remote software protection using orthogonal replacement | |
Balachandran et al. | Software protection with obfuscation and encryption | |
KR102352066B1 (ko) | 암호화 알고리즘에 사용될 때 비밀 데이터를 보호하는 방법 | |
US11210135B2 (en) | Lightweight dispatcher for program control flow flattening | |
KR100958784B1 (ko) | 응용 프로그램 다형화 방법 및 그 장치 | |
Anckaert et al. | Covert communication through executables | |
CN117633734A (zh) | 代码编译的方法、装置及电子设备 | |
CN117828618A (zh) | 许可链智能合约漏洞的检测方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20090216 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20110719 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20110812 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 4806402 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140819 Year of fee payment: 3 |