JP4971200B2 - プログラム難読化装置 - Google Patents
プログラム難読化装置 Download PDFInfo
- Publication number
- JP4971200B2 JP4971200B2 JP2007557847A JP2007557847A JP4971200B2 JP 4971200 B2 JP4971200 B2 JP 4971200B2 JP 2007557847 A JP2007557847 A JP 2007557847A JP 2007557847 A JP2007557847 A JP 2007557847A JP 4971200 B2 JP4971200 B2 JP 4971200B2
- Authority
- JP
- Japan
- Prior art keywords
- block
- program
- attribute
- exit
- obfuscation
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 claims description 91
- 238000012545 processing Methods 0.000 claims description 80
- 230000008569 process Effects 0.000 claims description 46
- 230000007704 transition Effects 0.000 claims description 41
- 238000004590 computer program Methods 0.000 claims description 13
- 230000008859 change Effects 0.000 claims description 8
- 238000013507 mapping Methods 0.000 description 330
- 238000006243 chemical reaction Methods 0.000 description 106
- 230000006870 function Effects 0.000 description 69
- 230000014509 gene expression Effects 0.000 description 35
- 238000010586 diagram Methods 0.000 description 25
- 238000004458 analytical method Methods 0.000 description 17
- 238000004364 calculation method Methods 0.000 description 15
- 230000000694 effects Effects 0.000 description 7
- 238000006467 substitution reaction Methods 0.000 description 7
- 238000004519 manufacturing process Methods 0.000 description 5
- 238000007796 conventional method Methods 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 239000000470 constituent Substances 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000007480 spreading Effects 0.000 description 2
- 238000003892 spreading Methods 0.000 description 2
- 239000013589 supplement Substances 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 239000012141 concentrate Substances 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000009792 diffusion process Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000002265 prevention Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
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
Description
例えば、コピー防止用に、映像コンテンツ等を暗号化する技術がある。しかし、暗号化のプログラムは、秘密情報である暗号鍵を用いて処理を行っており、処理が解析されて暗号鍵が不正解析者に奪われると、暗号化されたコンテンツが復号され、コンテンツが自由に利用できることとなってしまう。
このような要望に対し、例えば、非特許文献1には、プログラムに含まれる秘密情報を、複数のプログラム命令を実行することによって算出されるように変換し、さらに、そのプログラム命令をプログラム中の様々な場所に拡散することで解析を困難にする手法が述べられている。
鴨志田、松本、井上、「耐タンパーソフトウェアの構成手法に関する考察」、ISEC97−59
すなわち、分岐やループを多く含む制御構造が複雑なプログラムでは、秘密情報を使用する箇所に至るルートが複数あることとなるが、実行時にどのルートを通ったとしても秘密情報の算出結果が同一でなければならないという制限があるからである。
この場合、不正解析者はこのような箇所、例えば、分岐のないプログラムの入口などを重点的に解析することにより、比較的容易に秘密情報を得ることができてしまうことになる。
従って、遷移先ブロックでは、予定した処理の内容に基づいて、自ブロックの処理を行うことが可能となる。
従って、秘密ブロックに実行が遷移する前のブロック内に、特定変数を使用したいかなるプログラム命令を追加したとしても、係るブロックの出口において特定変数が出口属性に応じた値となるならば、秘密ブロックでは、特定変数を用いて秘密情報を求めることが可能となる。
また、前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックが複数ある場合には、全ての当該ブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
また、前記生成手段は、更に、前記秘密ブロックの前に実行され得るブロックに、当該ブロックの入口の属性に応じた特定変数の値から、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
言い換えれば、全てのブロック内に、特定変数を使用したいかなるプログラム命令を追加したとしても、ブロックの出口において特定変数が出口属性に応じた値となるならば、各ブロックでは、入口属性に応じて変換を相殺する処理を加えることができ、難読化前の処理結果を保証することが可能となる。
つまり、従来技術では困難であった複雑な制御構造に対する処理の複雑化が可能となる。
本発明では、少なくともデバッガ等でプログラムの実行手順を強制的に変えるなどを行わないような実行時(以下、「正常系での実行時」という。)には、ブロックに遷移してくる前に加えられた変換を相殺する機能を、そのブロック内に追加することができる。実行制御が遷移するブロック間では属性を共有するため、入口属性に応じた変換が加えられていることが確実だからである。
ループを例に挙げると、ループを何周回ることとなっても難読化により付加された処理の影響はループの内部で相殺されるため、ループ箇所から出力される結果は難読化前と同一となる。すなわち、難読化前後でプログラムの出力結果は変化しない。
また、前記プログラム難読化装置は、更に、前記対象プログラムに含まれない変数を追加する変数追加手段を備え、前記特定変数は、前記変数追加手段で追加された変数であることとしてもよい。
また、ブロックの入口または出口の属性に対応付けられている特定変数の値は複数あり、前記生成手段は、特定変数が、ブロックの入口の属性に応じた特定変数のいずれかの値から当該ブロックの出口の属性に応じたいずれかの値になるようにする1又は複数の命令を付加することとしてもよい。
また、前記特定変数は、複数あり、前記生成手段は、一のブロックに、当該ブロックの出口の属性に応じて、特定変数のうちの1特定変数の値と他の特定変数の値とを入れ替える命令を付加し、前記一のブロックの出口から実行制御が遷移する他のブロックに、当該ブロックの入口の属性に応じて、前記特定変数の値と前記他の特定変数の値とを入れ替える命令を付加して、難読化プログラムを生成することとしてもよい。
また、前記属性には、それぞれ所定の演算が対応付けられており、前記生成手段は、一のブロックに、特定変数の値に当該ブロックの出口の属性に対応する所定の演算を施した結果値を、当該特定変数の値とするような命令を付加し、前記一のブロックの出口から実行制御が遷移する他のブロックに、当該特定変数の値に当該ブロックの入口の属性に対応した所定の演算の逆演算を施した結果値を、当該特定変数の値とするような命令を付加して、難読化プログラムを生成することとしてもよい。
また、前記プログラム難読化装置は、更に、ブロックを暗号化する暗号化手段を備え、前記属性には、それぞれ暗号鍵が対応付けられており、前記生成手段は、ブロックの出口の属性に対応付けられている暗号鍵で、当該ブロックの出口から実行制御が遷移する他のブロックを復号する処理を行う1又は複数の命令を付加し、前記1又は複数の命令を付加したブロックを、前記暗号化手段に当該ブロックの入口の属性に対応付けられている暗号鍵で暗号化させて、難読化プログラムを生成することとしてもよい。
また、本発明のプログラム難読化装置は、複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、前記ブロックは、順序付けられた複数の命令で構成される命令群であり、ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を、全ての入口からの実行制御が通る部分に付加し、難読化プログラムを生成する生成手段とを備えることとしてもよい。
また、本発明のプログラム難読化装置は、複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、ブロックにおける実行制御の入口と出口それぞれに対して属性を決定する属性決定手段と、1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段とを備え、前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられ、複数のブロックから実行制御が遷移してくるブロックの入口の属性には、遷移元の全てのブロックの出口の属性に対応付けられている値が対応付けられており、前記生成手段は、1又は複数のブロックに、特定変数が、ブロックの入口の属性に応じた特定変数の値のうちの何れの値からも当該ブロックの出口の属性に応じた値になるようにする処理を行う1又は複数の命令を付加し、難読化プログラムを生成することとしてもよい。
<概要>
本発明に係るプログラム難読化装置は、分岐やループを多く含む制御構造が複雑なプログラムであっても、秘密情報を使用する箇所に至る全てのルート上に、処理を複雑にする為のプログラム命令を配置したプログラムを生成することができるものである。
<従来のプログラム難読化>
図28は難読化前のオリジナルプログラム9100を示す図であり、プログラム命令群9110から成る。秘密情報は、プログラム命令9101の「123」であるとする。
図31では、図30で追加したプログラム命令をプログラム中の様々な位置に拡散したプログラムを示している。
よって、本プログラム例では「c」の値が最終的に「123」となることを保証するために、プログラム命令はブロック9311に移動することとなる。
以下、本発明の実施形態のプログラム難読化装置について説明する。
本実施形態は、秘密情報を、複数のプログラム命令を実行することによって算出されるように変換する難読化の一例であり、難読化前のプログラム(以下、「対象プログラム」という。)に新たな変数を追加し、秘密情報をかかる変数から算出する式に置き換えて、そこに至る式を広範囲に配置して難読化したプログラム(以下、「難読化プログラム」という。)を生成するものである。
図1は、本発明にかかるプログラム難読化装置のコンピューティングシステムの例である。
コンピューティングシステム10は、汎用コンピュータ20、プログラム等を表示するためのディスプレイ11、キーボード等からユーザの指示を受け付けて処理を行う入力装置12、及び、プログラム等を記憶する外部メモリ13で構成される。コンピュータ20は、入出力を管理するI/O部21、演算を行うCPU(CentralProcessing Unit)22及びメモリ23を含み、通常のコンピュータの機能を有する。
図2は、プログラム難読化装置1000の構成例を示すブロック図であり、プログラム難読化装置1000は、変数追加部1100、プログラム分割部1200、写像情報生成部1300、ブロック変換部1400、および、秘密ブロック変換部1500から構成される。また、装置外部から対象プログラム2000を読み込む入力部(図示しない。)と、難読化プログラム3000を出力する出力部(図示しない。)を備える。
図3は、難読化の対象プログラム2000の例を示す図であり、図4は、対象プログラムを難読化した後の難読化プログラム3000の例を示す図である。
まず、変数追加部1100は、対象プログラム2000に、対象プログラム2000で使用されていない新たな変数(以下、「追加変数」と言う。)を追加する機能を有する。
次に、プログラム分割部1200は、対象プログラムを1以上のプログラム命令からなる複数のブロックに分割する機能を有する。
コントロールフロー生成部1310は、対象プログラムのコントロールフローを生成する機能を有し、属性情報割当表生成部1320は、コントロールフローを参照して、ブロックの入口と出口とに属性を割り当てて、属性情報割当表を生成する機能を有する。
尚、属性情報割当表および写像対応表については、図9、図12を用いて後で説明する。
ブロック変換部1400は、写像情報生成部1300で生成した写像に基づいて、各ブロックに追加変数の値を変換するプログラム命令を追加等する機能を有する。
<動作>
図5は、プログラム難読化装置1000の難読化処理を表すフローチャートである。本図を用いて、対象プログラム2000から難読化プログラム3000を生成する処理を説明する。その際、各機能部の詳細な機能も併せて説明する。尚、点線の矩形は、点線矩形内の処理を行う各機能部を示している。
難読化プログラム3000は、対象プログラム2000に複数のプログラム命令が追加され、プログラム命令3001では、秘密情報「123」が式「3*pm_0+4*pm_1−40」に変換されている(図4参照)。
まず、対象プログラム2000を入力部が、内部の作業メモリに読み込む(ステップS110)。
<変数追加部1100の処理>
次に、変数追加部1100が、読み込まれた対象プログラム2000に変数を追加する(ステップS120)。
本実施形態では、「pm_0」と「pm_1」の2つの変数を追加するものとする。
変数追加部1100は、追加変数「pm_0」「pm_1」の初期値をランダムに決定し、ここでは、それぞれ「0」「1」と決定し、追加変数「pm_0」「pm_1」の変数宣言を対象プログラム2000に追加する。
なお、追加する変数の数、追加する変数の名前、変数の型は固定のものであっても、ユーザによって入力装置12から入力されるものであっても、ランダムに決定したものであっても構わない。また、追加変数は配列とする構成であってもよい。
<プログラム分割部1200の処理>
変数追加部1100は、追加変数を追加した対象プログラム2100を、プログラム分割部1200に渡し、プログラム分割部1200は、対象プログラム2100のうちのプログラム命令群2010を分割して、複数の基本ブロックを生成する(ステップS130)。
ここで、基本ブロックとは、1以上のプログラム命令からなるプログラム命令群であって、プログラム命令群の先頭以外では合流せず、プログラム命令群の最後以外では分岐しないプログラム命令群である。
開始プログラム命令から終了プログラム命令までのプログラム命令からなるプログラム命令群を基本ブロックとする。
<写像情報生成部1300の処理>
プログラム分割部1200は、生成したブロックを、写像情報生成部1300に渡し、写像情報生成部1300は、各ブロックの入口と出口に設定する写像情報を生成する。これらの処理は、写像情報生成部1300を構成するコントロールフロー生成部1310、属性情報割当表生成部1320および写像対応表生成部1330によって行われる。
これら入口の写像情報(以下、「入口写像情報」という。)と出口の写像情報(以下、「出口写像情報」という。)は、ブロック変換部1400や秘密ブロック変換部1500で、ブロックを変換する際に使用される情報である。
写像情報は、pm_X(X=0、1)が取りうる値を要素とする集合を集合PM_Xとし、pm_0_before∈PM_0、pm_1_before∈PM_1を満たす(pm_0_before、pm_1_before)を、pm_0_after∈PM_0、pm_1_after∈PM_1を満たす(pm_0_after、pm_1_after)に対応させる写像であって、写像による像(pm_0_after、pm_1_after)が1点(例えば、(0、1))となる写像を示す。
ブロック分割部1200は、対象プログラム2100を分割して生成した基本ブロックを、写像情報生成部1300を介してコントロールフロー生成部1310に渡し、コントロールフロー生成部1310は、コントロールフローを生成する(ステップS140)。
図8は、対象プログラム2100のコントロールフローを示す図である。
コントロールフロー生成部1310は、対象プログラム2100の基本ブロック(図7参照)から、図8に示すコントロールフローを以下の方法で生成する。
次に、第一のブロックから第二のブロックに分岐がある場合、第一のブロックが対応するノードから第二のブロックが対応するノードへエッジを設ける。
例えば、ブロックB1では、プログラム命令「if(pm_a>pm_b)goto label C;」における条件式「pm_a>pm_b」が偽の場合は(図7参照)、ブロックB2に分岐し、真の場合は、「label C:」に対応するブロックB3に分岐する。
以下、同様にエッジ3〜エッジ6を設ける。
なお、本明細書では、分岐先が複数存在するものに限らず、ブロック間の移動が起こることを全て「分岐」と呼ぶものとする。
<属性情報割当表生成部1320の処理>
コントロールフローを生成したコントロールフロー生成部1310は、生成したコントロールフローを属性情報割当表生成部1320に渡し、属性情報割当表生成部1320は、渡されたコントロールフローを基に属性情報割当表1800を生成する(ステップS150)。
例えば、図8に示すコントロールフローにおいて、ブロックB1に対応するノード1からブロックB2に対応するノード2にエッジ1に示される分岐があるので、ブロックB1の出口属性と、ブロックB2の入口属性には同じ属性を設定する。
また、繋がっているエッジのまとまりごとに1つの属性を割当てる。
例えば、ノード3の出口で繋がっているエッジ4とエッジ5、および、ノード3の入口でエッジ4と繋がっているエッジ2、ノード1の出口でエッジ2と繋がっているエッジ1とは、同じ属性を割当てる。
図9は、属性情報割当表生成部1320が生成する属性情報割当表1800の生成過程と、構成及び内容の例を示す図である。
ブロック1810は、ブロックB1〜ブロックB5のそれぞれの入口と出口を示し、エッジ1820は、ブロックの入口と出口がそれぞれ接続しているエッジの番号を示す。例えば、「1」はエッジ1を表す。また、属性1830は、ブロックの入口と出口それぞれに設定された属性を示す。
図10は、属性情報割当表生成処理を表すフローチャートである。
まず、属性情報割当表生成部1320は、コントロールフロー生成部1310が生成したブロック数の2倍の欄を持つテーブルを作成する(ステップS310)。
ここでは、コントロールフロー生成部1310が生成したブロック数が5であることより、10個の欄からなるテーブルを作成する(図9参照)。
初期値を設定した属性情報割当表生成部1320は、S340からS360を繰り返し実行する回数をカウントするためのカウンタnに1を設定する(ステップS330)。
nの値がエッジの総数、本例では「6」より大きいかを判定し、大きい場合(ステップS360:YES)は全エッジに対する処理が終了しているため処理を終了し、小さい場合(ステップS360:NO)は次のエッジについて処理を続ける(ステップS340)。
同様に、「n==6」まで行い、ブロック4の出口属性の値「8」を、ブロックB5の入口属性の値「4」で置換え(属性1804参照)、10個の欄の値を「1、2、2、4、2、2、2、4、4、10」(属性1831参照)に更新する。
<写像対応表生成部1330の処理>
属性情報割当表1800を生成した属性情報割当表生成部1320は、生成した属性情報割当表を写像対応表生成部1330に渡し、写像対応表生成部1330は、渡された属性情報割当表の各属性に写像情報対応させる写像対応表1900を生成する(ステップS160)。
また、属性情報割当表1800と写像対応表1900は、図示しないメモリ上に生成されるものとする。
図12は、写像対応表1900の構成および内容の例を示す図である。
属性1950は、写像情報割当表1800の最終的な属性1831における属性の一覧である。また、写像対応表1900は、ID1910と写像情報1920とで構成される。ID1910は、写像情報1920の識別子であり、属性1950と対応しているものとする(図12:点線矢印参照)。
以下、写像対応表生成部1330が写像情報1920を生成する手順を具体例を交えて説明する。
本実施形態では、始点となるブロックB1の入力属性は「1」であり(図11参照)、追加変数「pm_0」、「pm_1」の初期値はそれぞれ「0」、「1」である。
従って、属性1950「1」に対応するID1910「F1」の写像情報1920(以下、「写像情報F1」等というものとする。)として、「pm_0」、「pm_1」の初期値を「pm_0_after」、「pm_1_after」とする写像情報を生成する。
続いて、始点の入力属性以外の属性、「2」と「4」と「10」に対する写像を、ランダムに生成する。
本実施形態では、属性「2」「4」「10」に対応する写像情報として、pm_X∈PM_X(X=0、1)を満たすランダムな値pm_Xをpm_X_afterの値とするような写像情報を生成する。
写像対応表1900を生成した写像対応表生成部1330は、生成した写像対応表をブロック変換部1400に渡し、ブロック変換部1400は、渡された写像対応表に基づいて各ブロックにプログラム命令を追加し、変換後ブロックを生成する(ステップS170)。
図13は、ブロックB1〜ブロックB5を、ブロック変換部1400が変換して生成した変換後ブロックを示す図である。プログラム命令群1401〜プログラム命令群1405は、それぞれのブロックに追加されたプログラム命令を表す。
ここで、追加する機能は、追加変数の値が入口写像情報に示される値であった場合に、追加変数の値を出口写像情報に示される値に変換する機能である。具体的には、このような機能を実行するプログラム命令を追加する。
<追加する機能>
まず、ブロックB1に追加する機能を説明する。
ブロックB1に追加する機能は、写像情報F1を写像情報F2に変換するような機能であり(図11参照)、この機能を実現するプログラム命令群を「G_1_2」というものとする。
従って、ブロックB1に追加する機能は、(pm_0、pm_1)の値が入口写像情報F1における(pm_0_after、pm_1_after)の値(0、1)である場合に、(pm_0、pm_1)の値を出口写像情報F2の(pm_0_after、pm_1_after)が示す(pm_0、pm_1)の値(30、6)と等しくなるよう、(pm_0、pm_1)の値を変換する機能である。
なお、このような命令をどのように生成するかについては後述する。
すなわち、プログラム命令群1402〜プログラム命令群1405も同様に、各ブロックの入口写像情報における(pm_0_after、pm_1_after)の値を代入すると、各ブロックの出口写像情報における(pm_0_after、pm_1_after)となるような処理を行うためのプログラム命令群である(図13参照)。
以下、上述したプログラム命令群G_1_2等をどのようにして生成するのかについての詳細を述べる。
入口写像情報としてF_INを、出口写像情報としてF_OUTを持つブロックに対する命令群G_IN_OUTを生成する場合の説明を行う。
まず、ランダムに生成した定数をR1、R2、R3とし、式1、式2を、式1「pm_0_after−pm_0_before*R1−pm_1_before*R2」、式2「pm_1_after−pm_1_before*R3」
とする。
以下、具体的な一例として、R1、R2、R3をそれぞれ「5」「20」「13」としてブロックB1に追加する追加プログラム命令群G_1_2を生成する処理を説明する。
上述したR1、R2、R3の値を代入すると、式1、式2は、「pm_0_after−pm_0_before*5−pm_1_before*20」「pm_1_after−pm_1_before*13」となる。
よって、プログラム命令群G_1_2は「pm0=pm0*5+pm1*20+10:pm_1=pm_1*13−7;」となる。このようにして生成した追加プログラム命令群G_1_2をブロックB1の先頭に追加し、変換後ブロックとする(図13:プログラム命令群1401参照)。
変換後ブロックを生成したブロック変換部1400は、生成した変換後ブロックを秘密ブロック変換部1500に渡し、秘密ブロック変換部1500は、渡された変換後ブロックから秘密情報を含む秘密ブロックを特定し(ステップS190)、秘密情報を追加変数を用いて算出する式に置き換えて、難読化プログラムを生成する(ステップS200)。
秘密情報を検出する方法としては、予め、秘密情報を特定のコードで囲んでおいたり、難読化開始前にユーザが指定する等して、秘密ブロック変換部1500が認識できるようにしておく。また、秘密ブロックの中に秘密情報は複数あってもよく、また、対象プログラム中に秘密ブロックが複数あってもよい。
このようにして生成した変換後の秘密ブロックを含む難読化後プログラム3000を、図14に示す。
以下、秘密情報を追加変数を用いて算出するプログラム命令の求め方を説明する。
式3「pm_0_after−pm_0_before*R4−pm_1_before*R5」。
次に、「pm_0_after」に秘密情報の値を、(pm_0_before、pm_1_before)に秘密ブロックの出口写像情報F_OUTの(pm_0_after、pm_1_after)の値を代入して式3の値を計算し、計算した値をV3とする。
秘密情報「123」を含むブロックはブロックB5であり、ブロックB5の出口写像情報F10の(pm_0_after、pm_1_after)は(13、31)である。
R4、R5をそれぞれ「3」、「4」とし、これらを式3に代入し、「123−13*3−31*4」よりV3の値「−40」を求める。
ここで、最終的に得られる上式は、ブロックB5における入力写像情報(pm_0_before、pm_1_before)の値にランダムな数R3、R4をかけて加算した演算結果と秘密情報「123」との差分V3を算出し、加算する式となっている。
難読化後プログラム3000は、秘密ブロック変換部1500により生成された秘密情報変換後のブロックB5と、ブロック変換部1400により生成された変換後ブロックB1〜ブロックB4とを備えるプログラムである。
<実施形態1の効果>
実施形態1では、秘密情報を、複数のプログラム命令を実行することによって算出されるように変換する難読化の一例を示した。この難読化方法は以下の3点を特徴とする。
(ロ)各ブロックに、追加変数がそのブロックの入口写像情報F_INで示す値であった場合に、そのブロックの出口写像情報F_OUTに示す値に変換する機能が追加される(ブロック変換部1400の処理参照)。
よって、秘密情報を含むブロックB5の入口写像情報に基づき算出される秘密情報の値は、正常系の実行時に難読化後プログラムがどのような実行ルートで実行されたとしても、正しい値「123」となる。
<実施形態2>
<概要>
実施形態1が、新たな変数を追加し、この追加変数の値を算出するプログラム命令を全てのブロックに追加し、更に、秘密情報をかかる追加変数から算出する式に置き換えて難読化プログラムを生成するものであったのに対し、本実施形態では、対象プログラムに既に存在する変数を利用し、その変数の役割をプログラムの途中で置換えて難読化プログラムを生成するものである。
差異は、写像情報が異なる点である。本実施形態の写像対応表4900を図15に示す。
写像対応表4900は、ID1910と写像情報4920とで構成され、ID1910は実施形態1と同様に、写像情報4920の識別子である。また、変数の置換え関係4930は、写像対応表4900を構成しないが、説明の便宜上、変数の置換え関係を矢印を用いて表したものである。
<構成>
図16は、実施形態2にかかるプログラム難読化装置4000の構成例を示すブロック図である。
1点目は、変数追加部1100が無い点であり、2点目は、写像情報生成部4400の写像対応表生成部4330が生成する写像の内容が異なる点である。3点目は、写像の内容が異なることによるブロック変換部4400で追加するプログラム命令群の生成方法が異なる点である。また、4点目は、追加変数が追加されていないため、秘密ブロック変換部4500での秘密情報の算出方法が異なる点である。
以下、写像情報生成部4400の写像対応表生成部4330、ブロック変換部4400、秘密ブロック変換部4500の処理について説明する。他の動作は、実施形態1と同様である(図5等参照)。
<写像情報生成部4400の写像対応表生成部4330の処理>
写像情報生成部4400は、プログラム分割部1200で生成した各ブロックの入口と出口に設定する写像情報を生成する。
写像情報は、pm_X(X=a、b、c)が取りうる値を要素とする集合を集合PM_X(X=a、b、c)とし、pm_a_before∈PM_A、pm_b_before∈PM_B、pm_c_before∈PM_Cを満たす(pm_a_before、pm_b_before、pm_c_before)をpm_a_after∈PM_A、pm_b_after∈PM_B、pm_c_after∈PM_Cを満たす(pm_a_after、pm_b_after、 pm_c_after)に対応させる写像であって、変数の役割を置換える写像を示す。
写像対応表生成部4330は、実施形態1と同様、属性情報割当表1800の属性に対応する写像情報を示す写像対応表4900を生成する。
なお、本実施形態において、属性情報割当表は実施形態1の属性情報割当表1800と同じである(図9参照)。
各写像情報の作成は、例えば以下のようにして行う。
pm_a_before、pm_b_before、pm_c_beforeからランダムに選んだ1つをpm_a_afterに対応させ、残りの二つからランダムに選んだ1つをpm_b_afterに対応させ、さらに残りの1つをpm_c_afterに対応させる。
本実施形態では、図11のコントロールフローの始点となるブロックB1の入口写像情報の属性「1」に対応する写像情報F1を「pm_a_after= pm_a_before; pm_b_after= pm_b_before; pm_c_after= pm_c_before;」とする。
<ブロック変換部4400の処理>
ブロック変換部4400は、もともとのブロックが保持する機能に、機能追加を行ったブロックを変換後ブロックとして生成する手段である。追加する機能は、入口写像情報に示される変数の置換えが行われている場合に、出口写像情報を示す変数の置換えを行う機能である。また、この置換えは、もとからあるプログラム命令で使用されている変数を用いて行う。
<追加する機能>
ブロックに追加する機能を、具体例を用いて説明する。
図17は、図7のブロックB2をブロック変換部4400によって変換して生成した変換後ブロックB2を示す図である。
変換後ブロックB2は、変換前ブロックB2に、変数の役割を置換えるプログラム命令群G_2_4「tmp=pm_a:pm_a=pm_c;pm_c=pm_b;pm_b=tmp;」(図17:プログラム命令群4401参照)を追加し、さらに、変換前ブロックB2に含まれる変数を出口写像情報F4に基づいて置き換えて(プログラム命令群4402参照)生成したブロックである。
以下、プログラム命令群4402で示されるプログラム命令群G_2_4が、上記の特徴を持つプログラム命令群であることを説明する。
図18は、ブロックB2の入口と出口での変換を示した図である。なお、F2_INVは、F2の逆写像をあらわすものとする(変換4420)。
入口写像情報F2は、変数(pm_a、pm_b、pm_c)の役割を(pm_a、pm_c、pm_b)に置換える置換え(変換4410)であって、出口写像情報F4は変数(pm_a、pm_b、pm_c)の役割を(pm_b、pm_a、pm_c)に置換える置換え(変換4430)である(図15:写像対応表4900参照)。
この時、入口写像情報F2による置換えと、プログラム命令群G_2_4による置換えの両方を行った際の置換えを図19の下段に示す。
なお、プログラム命令群G_2_4の生成方法については、後述する。
さらに、ブロックB2では、ブロックに含まれる変数を出口写像情報F4に基づき書き換える必要がある。
具体的には、ブロックB2における「pm_b=pm_b*8;」におけるpm_bを出口写像情報F_4に基づいてpm_aに置換えて「pm_a=pm_a*8;」とする(図17:プログラム命令4402)。
以下、上述したプログラム命令群G_2_4等をどのようにして生成するのかについて詳細を述べる。
変換を行うブロックの入力写像情報をF_IN、出口写像情報をF_OUTとし、入力写像情報F_INによる置換えの逆変換をF_IN_INVとする。
この時、F2_INVは、F_2のpm_X_afterとpm_X_beforeとを置換えた写像であり、(pm_a_before、pm_b_before、pm_c_before)を(pm_a_after、pm_c_after、pm_b_after)に対応させる写像となる(図18:変換4420参照)。
例えば、対象ブロックがブロックB2である場合、F_OUTはF4であり、(pm_a_before、pm_b_before、pm_c_before)を(pm_b_after、pm_a_after、pm_c_after)に対応させる写像となる(図18:変換4430参照)。
次に、上記の置換えを行う追加プログラム命令群G_2_4「tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=tmp;」を生成し、ブロックB2に追加する。
具体的には、ブロックB2に対応する出口写像情報F4が「pm_a_after=pm_b_before;」を含むことから、変数pm_bはpm_aに置換えられたことが分かるので、ブロックB2のpm_bをpm_aに置き換える。すなわち、式「pm_b=pm_b*8;」を「pm_a=pm_a*8;」に置換える。
このような変換を行うことにより、各ブロックは常に、一つ前のブロックの出口写像情報に対応する変換を打ち消した後、自身の出口写像情報に対応する変換を行う。
これにより、正常系の実行時には、各ブロックでどのように分岐やループが発生したとしても、各ブロックにおける変数の置換えの状態は、図15に示される写像情報4920が示すものと等しくなる。
<秘密ブロック変換部4500の処理>
実施形態1では、秘密情報は追加変数を用いた式で求めたが、本実施形態では追加変数は追加されない。従って、本実施形態では、秘密情報の変更しないものとするが、変換した変数を用いたり、他の変数を用いて難読化することとしてももちろんよい。
実施形態2では、変数の役割をプログラムの途中で置換える難読化の一例を示した。この難読化方法は以下の4点を特徴とする。
(イ)コントロールフローの始点となるノード2に対応するブロックB2の入口写像情報F_INには、もともとのプログラムと同じ変数を割り当てている(写像対応表生成部4330の処理参照)。
(ハ)ノード5のような複数の分岐元(ノード2、ノード4)を持つノードに対応する全ての分岐元のブロックの出口写像情報は、分岐先のノード(ノード5)に対応するブロックの入口写像情報と等しい(属性情報割当表1800参照)。
以上、4点の特徴により、正常系の実行時に難読化後プログラムがどのような実行ルートで実行されても、各ブロックに実行制御が遷移した際、変数は、そのブロックの入口写像情報に示す置換えが成された変数となる。
このような難読化により、プログラムの様々な位置で変数の役割が置換わり、プログラムの解析を困難にすることができる。また、ブロック毎に、変数の役割が替わることにより、あるブロックでの変数が、他のブロックでどの変数になっているかが解り難くなるので、解析を困難にすることができる。
<実施形態3>
<概要>
実施形態2が、対象プログラムに既に存在する変数を利用し、その変数の役割をプログラムの途中で置換えて難読化プログラムを生成するものであったのに対し、本実施形態では、変数の値に所定の演算を施した値を、その変数に保持させることで難読化プログラムを生成するものである。例えば、変数pm_aに14を足した値を、変数pm_aに保持させるなどである。
差異は、写像情報が異なる点である。本実施形態の写像対応表5900を図20に示す。
写像対応表5900は、ID1910と写像情報5920とで構成され、ID1910は実施形態2と同様に、写像情報5920の識別子である。
<構成>
図21は、実施形態3にかかるプログラム難読化装置5000の構成例を示すブロック図である。
1点目は、写像情報生成部5400の写像対応表生成部5330が生成する写像の内容が異なる点である。2点目は、写像の内容が異なることによるブロック変換部5400で追加するプログラム命令群の生成方法が異なる点である。
以下、写像情報生成部5400の写像対応表生成部5330、ブロック変換部5400の各処理について説明する。他の動作は、実施形態1および実施形態2と同様である(図5、図16等参照)。
<写像情報生成部5400の写像対応表生成部5330の処理>
まず、本実施形態で設定する写像情報について説明する。
<写像情報生成部5300の写像対応表生成部5330の処理>
写像対応表生成部5330は、実施形態2と同様、属性情報割当表1800の属性に対応する写像情報を示す写像対応表5900を生成する。
写像対応表生成部5330は、属性情報割当表1800を構成する属性の種類数、すなわち、4種類の写像情報を生成する。
各写像情報の作成は例えば以下のようにして行う。
具体的には、図11のコントロールフローの始点となるブロックの入口写像情報の属性「1」に対応する写像情報F1を「pm_a_after= pm_a_before; pm_b_after= pm_b_before; pm_c_after= pm_c_before;」とする。
<ブロック変換部5400の処理>
ブロック変換部5400は、変換前ブロックが保持する機能に、機能追加を行ったブロックを変換後ブロックとして生成する。ここで、追加する機能は、入口写像情報に示される変数の置換えが行われている場合に、出口写像情報を示す変数の置換えを行う機能である。
<追加する機能>
以下、ブロックに追加する機能を、具体例を用いて説明する。
図22は、ブロックB2を、ブロック変換手段5400によって変換して生成した変換後ブロックB2を示す図である。
具体的には、変換前ブロックB2の先頭に、プログラム命令群G_2_INV(図22:プログラム命令群5401参照)を追加し、その後にプログラム命令群G_4(図22:プログラム命令群5402参照)を追加する。
さらに、ブロックに含まれる変数をブロックの出口写像情報に基づいて変換する(図22:プログラム命令5403参照)。
以下、プログラム命令群G_2_INV、プログラム命令群G_4の生成、および、ブロックに含まれる変数の置換えの詳細を説明する。
プログラム命令群G_2_INVは、ブロックB2の入口写像情報F2の逆写像を行う追加プログラム命令群である。
プログラム命令群G_2_INVの生成の仕方を説明する。
まず、写像情報F2より、(pm_a_before、pm_b_before、pm_c_before)を(pm_a_after、pm_b_after、pm_c_after)を用いて求める式を生成する。
この式の、pm_X_afterをpm_Xに置換え、pm_X_beforeをpm_Xに置換えた「pm_a=pm_a−14; pm_b=pm_b−12; pm_c=pm_c+6;」をプログラム命令群G_2_INVとする。
プログラム命令群G_4は、ブロックB2の出口写像情報F4の写像を行う追加プログラム命令群である。
プログラム命令群G_4の生成を説明する。
写像情報F4「pm_a_after=pm_a_before+7; pm_b_after=pm_b_before+5; pm_c_after=pm_c_before+21;」の、pm_X_afterをpm_Xに置換え、pm_X_beforeをpm_Xに置換える。
<変数の置換え>
ブロックB2に含まれる変数の置換えを説明する。
変数の置換えは、代入式の左辺に変数(代入によって値が決まる変数)がある場合と、右辺に変数(代入の値を決める)がある場合とで異なった変換方法によって行う。なお、右辺と左辺の両方に変数がある場合には、右辺に変数がある場合の変換と、左辺に変数がある場合の変換の両方を施す。
以下、「pm_b=pm_b*8;」を置換え対象プログラム命令とし、左辺の変数の置換えと右辺の変数の置換えとを説明する。
<左辺の変数がある場合の置換え>
プログラム命令の左辺に変数が含まれている場合には、その変数に対する置き換えを行う。このような変換を行うのは、各プログラム命令の演算結果に出口写像情報を反映させる必要があるからである。
ここで、pm_X_beforeを含む式が見つからなかった場合、そのプログラム命令に対しては変換の必要がないため、何も変換を行わない。
本具体例では、式「pm_b=pm_b*8;」の左辺の変数が「pm_b」であり、ブロックB2の出口写像情報がF4であることから、pm_b_beforeを含む式「pm_b_after=pm_b_before+5;」が見つかることとなる。
その後、「pm_b_after」を変数「pm_b」に変換することにより、「pm_b=(pm_b*8)+5;」という式が得られる。
なお、上述の例において、左辺の変数がpm_X(X=a,b,c)であって、写像情報にpm_X_beforeを含む式が複数ある場合には、対象プログラム命令を、それら複数の式からなるプログラム命令に置換え、次に、それぞれの式のpm_X_beforeを置換え対象プログラム命令の右辺の内容に置換える。
<右辺の変数がある場合の置き換え>
プログラム命令の右辺に変数が含まれている場合には、その変数に対する置き換えを行う。
このような変換を行うのは、プログラム命令の右辺に含まれている変数は入口写像による変換が行われた状態の変数であるので、もともとの式で演算を行っても適切な計算結果が得られないためである。すなわち、プログラム命令の右辺に含まれている変数から入力写像の影響を消すことにより、適切な結果が得られるような式に修正する。
まず、ブロックB2の出口写像情報F4の逆写像F4_INVを上述した方法で生成する。
ここでは、F4_INVは、「pm_a_before=pm_a_after−7; pm_b_before=pm_b_after−5; pm_c_before=pm_c_after−21」となる。
次に、F4_INV中から、pm_X_beforeを含む式を見つける。ここで、F4_INV中から、pm_X_beforeを含む式が見つからなかった場合は、変数pm_Xに対応する入口写像情報がない、すなわち、変数pm_Xは特に変換されていない状態であるので、置き換えた式中のpm_X_beforeを変数pm_Xに戻して処理を終了する。
続いて、見つかった式に基づき、pm_X_beforeをpm_X_afterを使った式に置換える。すなわち、「pm_b=(pm_b_before*8)+5;」を「pm_b=((pm_b_after−5)*8)+5;」に置き換える。
なお、右辺にpm_b_beforeを含むプログラム命令が複数ある場合には、それぞれのpm_b_beforeを(pm_b_after−5)に置換える。
なお、定数同士の演算は予め行うことができるので、最終的には定数をまとめた式「pm_b=pm_b*8−35;」とすることができる。
<実施形態3の効果>
実施の形態3では、変数の役割をプログラムの途中で置換える難読化の一例を示した。この難読化方法は以下の3点を特徴とする。
(イ)コントロールフローの始点となるブロックB2の入口写像情報F_INには、もともとのプログラムと同じ変数を割り当てている(写像対応表生成部5330の処理参照)。
(ロ)各ブロックに、変数の置換えが入口写像情報F_INで示す置換えであった場合に、出口写像情報F_OUTに示す変数の置換えを行う機能が追加されている(ブロック変換部5400の処理参照)。
(ハ)ブロックB5のような複数の分岐元(ブロックB2、ブロックB4)を持つブロックの全ての分岐元の出口写像情報は、分岐先のブロック(ブロックB5)の入口写像情報と等しい(属性情報割当表1800参照)。
このような難読化により、プログラムの様々な位置で変数の役割が置換わり、プログラムの解析を困難にすることができる。また、ブロック毎に、変数の役割が替わることにより、あるブロックでの変数が、他のブロックでどのような役割の変数であるかの解析が困難になる。
<実施形態4>
<概要>
実施形態1〜3が、対象プログラムにプログラム命令を追加したり、変数の役割を入れ替えて、すなわち変数の値を変えたりすることで難読化プログラムを生成し、ソフトウェアの機密性を確保していたのに対し、本実施形態では、ブロックを暗号化することにより機密性を確保するものである。
さらに、実行時に次に実行するブロックを復号化することから、ブロック単位でのみ平文が内部メモリに展開されることとなる。すなわち、メモリ上の平文が少ないため、プログラム全体を解析することをより困難とすることができる。
差異は、写像情報が異なる点である。本実施形態の写像対応表6900を図23に示す。
写像対応表6900は、ID1910と写像情報6920とで構成され、ID1910は実施形態3と同様に、写像情報6920の識別子である。
<構成>
図24は、実施形態4にかかるプログラム難読化装置6000の構成例を示すブロック図である。
1点目は、写像情報生成部6400の写像対応表生成部6330が生成する写像の内容が異なる点である。2点目は、写像の内容が異なることによるブロック変換部6400で追加するプログラム命令群の生成方法が異なる点である。加えて、ブロック変換部6400では暗号化も行い難読化プログラム3200を生成する。
以下、写像情報生成部6400の写像対応表生成部6330、ブロック変換部6400の各処理について説明する。他の動作は、対象プログラムをブロックに分割し、各ブロックに入口属性と出口属性を設定することは、実施形態3と同様である(図16等参照)。
<写像情報生成部6400の写像対応表生成部6330の処理>
本実施形態の写像対応表6900を図23に示す。
写像情報6920は、暗号鍵の値を示すものである。例えば、属性情報F1は、「Key=3」である。
本実施形態では、各属性に対応する暗号鍵の値は、予め決めてあるものとする。なお、写像対応表生成時にランダムに作成することとしてもよい。
以下、本実施形態のブロック変換部の処理について、図25と図26を用いて説明する。
図25は、変換後ブロックを示す図であり、図26は、ブロック変換部の処理を示すフローチャートである。本実施形態では、この変換後ブロックを暗号化して、難読化プログラムを生成する。
まず、対象プログラムに復号化関数「decrypt」のプログラムを追加する(ステップS610、図25:復号化プログラム6409参照)。
この復号化関数は、暗号化するブロックの識別子である「ブロックID」と、暗号鍵「key」とを引数とし、「ブロックID」で特定されるブロックを「key」で暗号化する機能を有する。なお、ここではブロックの識別子を指定しているが、ブロックの開始アドレスと終了アドレスとを指定することとしてもよく、ブロックが特定できればよい。
最初のブロックでは、出口写像情報の値を「key」に設定する(ブロックB1:プログラム命令群6401の1行目参照)。例えば、最初のブロックであるブロックB1の出口写像情報は「2」であるので、写像情報F4「key=4;」(図23参照)の「4」を設定する。
例えば、ブロック2では、入口写像情報が「2」、出口写像情報が「4」であり、keyはそれぞれ「4」、「5」である(図23参照)。従って、「4」から「5」を求める式、「key=key+1;」を追加する(ブロックB2:プログラム命令群6402の1行目参照)。
例えば、ブロックB2には、「decrypt(B5、key);go to labelE;」を追加する(ブロックB2:プログラム命令群6402の2行目参照)。ここで「B5」は、ブロックB5のブロックIDとする。
例えば、ブロックB2は、プログラム命令群6402を追加した後、入口写像情報「2」、即ち「Key=4」で暗号化する。
すべてのブロックに、ステップS620〜ステップS640の処理を行う(ステップS650)。
<補足>
以上、本発明に係るプログラム難読化装置について実施形態に基づいて説明したが、このプログラム難読化装置を部分的に変形することもでき、本発明は上述の実施形態に限られないことは勿論である。即ち、
(1)実施形態では、第一のブロックと第二のブロックから第三のブロックに分岐がある場合には、第一のブロックの出口写像情報と、第二のブロックの出口写像情報と、第三のブロックの入口写像情報は同じ写像情報としたが、第一のブロックの出口写像情報と、第二のブロックの出口写像情報は別の写像であってもよい。
この時ブロックB5の入口写像情報は、pm_0_before∈PM_0、pm_1_before∈PM_1を満たす(pm_0_before、pm_1_before)を、(12、7)または(4、13)のいずれかに対応させる写像を示すこととなる。
(2)実施形態1における追加変数は、プログラムの引数としてもよい。
引数とした場合は、関数funcの呼び出し元も変更する必要がある。
なお、呼び出し元を含むプログラムにおける追加変数の初期値を難読化するために、呼び出し元をさらに本難読化手法を用いて難読化しても構わない。
このような構成により、不正解析者が関数funcを局所的に解析しても、追加変数の初期値を知ることが困難になる。
(3)実施形態2および実施形態3において、コントロールフローの始点となるブロックの入口写像情報F_INには、もともとのプログラムと同じ変数を割り当てているが、異なる変数としてよい。
例えば、呼び出し元が「func(a、b、c);」である場合には、写像情報F1に基づき、呼び出し元を「func(b、a、c);」に変更する。
なお、呼び出し元を含むプログラムを難読化するために、呼び出し元のプログラムをさらに本難読化手法を用いて難読化しても構わない。
(4)実施形態において、写像情報を、pm_X(X=a、b、c)をpm_X(X=a、b、c)に対応させる写像を示したが、サイズの異なる他の変数pm_Y(Y=d、e、f)に対応させる写像であっても構わない。
よって、追加するプログラム命令群を構成するプログラム命令のバリエーションを増やすことができ、ブロックに含まれるプログラム命令群のうち、どのプログラム命令が追加プログラム命令であり、どのプログラム命令がブロックに元々含まれていたプログラム命令であるかを判断することを困難にすることができる。
この場合、例えば、写像情報F2を「pm_d_after=(long)pm_a_before*3−4;」とし、追加プログラム命令群G_2_INVを「pm_a=(pm_d+4)/3;」としてもよい。
例えば、実施形態3において、変数宣言「f(int pm_a、int pm_b、int pm_c)」を「f(long pm_a、long pm_b、long pm_c)」として、写像情報F2を「pm_a_after=pm_a_before*3−4;」とし、追加するプログラム命令群G_2_INVを「pm_a=(pm_a+4)/3;」としてもよい。
(5)実施形態において、写像情報を、pm_X(X=a、b、c)をpm_X(X=a、b、c)に対応させる写像を示したが、他の変数pm_Y(Y=d、e、f)に対応させる写像であっても、他の変数を含むpm_Y(Y=a、b、c、d、e、f)に対応させる写像であっても構わない。
このような構成により、追加するプログラム命令群を構成するプログラム命令のバリエーションを増やすことができ、ブロックに含まれるプログラム命令群のうち、どのプログラム命令が追加プログラム命令であり、どのプログラム命令がブロックに元々含まれていたプログラム命令であるかを判断することを困難にすることができる。
(6)実施形態3において、写像情報は「pm_a_after=pm_a_before+14;pm_b_after=pm_b_before+12;pm_c_after=pm_c_before−6;」で示されるように、一つの変数(例えば、pm_a_before)の値を用いて1つの変数(例えばpm_a_after)を算出する写像を示したが、複数の変数を用いて複数の変数を算出する写像であっても構わない。
(7)実施形態において、写像情報はランダムに生成する場合を示したが、ブロックに含まれるプログラム命令に基づいて写像情報を生成する構成であっても構わない。
例えば、実施形態1において、ブロックB5は秘密情報「123」を含む。
この時、ブロック変換部1400で、「pm_b=pm_b*123+pm_c;」を「pm_b=pm_b*pm_0+pm_c;」とすれば、適切な処理結果が得られるようなプログラムに難読化することができる。
(8)実施形態1において、追加変数が2つの場合を示したが、追加変数はいくつであっても構わない。
(9)実施形態2および実施形態3において、変数の置換え等を行う変数が3つの場合を示したが、置換えを行う変数はいくつであっても構わない。
また、どの変数を置換えるか等をユーザや外部の装置、呼び出し元プログラム等が指定する構成であっても構わない。
(10)実施形態3では、写像の一例を示したが、逆写像を有する他の写像であっても構わない。
これにより、一度逆写像を生成すれば、それ以降の同一の逆写像の生成が必要なくなるので、難読化処理を高速化することができる。
これにより、同一の写像情報や逆写像情報について、複数回、同様のプログラム命令群を生成する手間が省けるので、難読化処理を高速化することができる。
(11)実施形態では、対象プログラムが、C言語で作成されているプログラムである場合を示したが、Java(登録商標)言語、Java(登録商標)バイトコード、C++言語、機械語、アセンブリ言語、コンパイラ等の中間言語、UML(UnifiedModeling Language)等のモデリング言語等の他のプログラム言語で作成されたものであっても構わない。
さらに、実施形態では、C言語の難読化対象プログラムを難読化してC言語の難読化後プログラムを生成することとしているが、難読化後プログラムを機械語として出力する構成であっても構わない。
(12)実施形態において、変数「pm_X」が取りうる値を要素とする集合PM_Xは、変数の型によって決めるものであっても、予めユーザが指定するものであっても構わない。
(13)実施形態において、プログラム命令群をブロックの先頭に追加する場合を示したが、それら以外の位置に追加する構成であっても構わない。
この場合、追加したプログラム命令群より前のプログラム命令は、ブロックB2の入口写像情報に基づき変数の置換えを行い、追加したプログラム命令群よりも後のプログラム命令は、ブロックB2の出口写像情報に基づき変数の置換えを行う。
このような構成にすることによって、追加プログラム命令群が含まれる位置がブロックによって異なるようになり、変換後ブロックを見て、どのプログラム命令が追加プログラム命令であり、どのプログラム命令が元々ブロックに存在していたプログラム命令であるかを解析しにくくすることができる。
(14)実施形態1における秘密ブロック変換部1500において、置換えを行う秘密情報は、ユーザ等が指定した秘密情報を置換える構成であっても、プログラムに含まれる全ての定数値を置換える構成であっても構わない。
このようにすることで、全ての秘密情報を置き換える場合よりも高速に難読化を行うことができる。また、難読化により増加する処理の数を抑えることができるため、難読化後のプログラムの動作も高速化することができる。
(15)実施形態1では、追加プログラム命令群G_1_2の一例を示したが、(0、1)を(30、6)に対応させる写像を実現するプログラム命令群であればどのようなものでも構わない。他の写像を実現するプログラム命令群についても同様である。
すなわち、入力写像情報が与えられた場合に出力写像情報に従った変換が行われるようなプログラム命令群が生成されるのであればどのようなものであっても構わない。
(16)実施形態1では、写像情報をpm_0_before∈PM_0、pm_1_before∈PM_1を満たす全ての(pm_0_before、pm_1_before)を1点(例えば(0、1))に対応させる写像を示したが、複数の点に対応させる写像であっても構わない。
また、追加プログラム命令群が追加変数以外の変数を含む構成であっても構わない。
例えば、写像情報F2を(pm_0_before、pm_1_before)を(0、1)または(3、4)のいずれかに対応させる写像とし、写像情報F4を(pm_0_before、pm_1_before)を(0、1)または(1、2)のいずれかに対応させる写像とし、追加プログラム命令群G_2_4を例えば、「pm_0=pm_0%3+pm_a%2;pm_1=pm_1%3+pm_a%2;」としてもよい。
例えば、写像情報F2を、(pm_0_before、pm_1_before)を(6の倍数、3で割って1余る数)に対応させる集合とし、写像情報F4を(pm_0_before、pm_1_before)を(6で割って1余る数、3で割って2余る数)に対応させる集合とし、追加プログラム命令群G_2_4を例えば、「pm_0=pm_0+1;pm_1=(pm_1−1)*2+2;」としてもよい。
この効果をより具体的に説明する。追加変数以外の変数を使わない場合、不正解析者が、ブロックの出口写像情報、入口写像情報を解析するために、関数の引数の値を変えて、関数funcを複数回実行し、実行時にメモリに現れる値(ランタイムデータ)を収集し、その差分をとり、不変なデータを抽出することで写像情報の追加変数の値の特定が可能なる。
なお、ランタイムデータを収集する不正解析については、「署名生成ソフトウェアのランタイムデータ探索による耐タンパー性評価 SCIS2005」に記載されている。
(17)実施形態1における秘密ブロック変換部1500の処理において、置換えを行う秘密情報は、例えばプログラムの分岐先のアドレスのようなプログラムの分岐先を示す数値であっても構わない。
この条件分岐命令は、難読化対象プログラムに含まれるラベル「labelE:」「labelC:」が条件分岐先であり、条件式は、もともとの無条件分岐先「label E;」に対応するcase文の値「2」としたものである。
さらに、実施形態1では、秘密情報を式に置き換えているが、プログラム命令を追加するだけでもよい。
例えば、実施形態1では、「pm_b=pm_b*123+pm_c;」を「pm_b=pm_b*(3*pm_0+4*pm_1−40)+pm_c;」に置き換えているが(図13、図14参照)、1プログラム命令を追加することとしてもよい。
このような構成により、プログラムの実行順序の解析を困難にすることができる。
(18)各部は、必ずしも独立した部である必要はなく、複数の部が提供する機能を組み合わせた部とする構成であっても構わない。
(19)実施形態1では、難読化対象プログラムに変数を追加する変数追加手段がある構成を示したが、追加変数の替わりに、難読化対象プログラムにおいて使われていない変数を使う構成であっても構わない。
(20)実施形態における、ブロック変換部の処理において、入口写像情報と出口写像情報が同じ写像情報であるブロックには、追加プログラム命令を追加しない構成であっても構わない。
また、属性情報割当表1800において、異なる属性を同一の属性に置換えてもよい。例えば、実施形態で用いた属性情報割当表1800の属性1831「4」を「2」としてもよい(図9参照)。ブロックB2出口属性、ブロックB4出口属性およびブロックB5入口属性の3つである。
(21)本発明は、実施形態1と実施形態3を組み合わせた構成であっても構わない。
このような構成を用いると、いずれの変数が追加変数であり、いずれの変数が元々プログラムに含まれる変数であるかの解析が困難になる。
(22)実施形態では、難読化対象プログラムを基本ブロックに分割する構成を示したが、その他の分割の仕方であっても構わない。
例えば、基本ブロックをさらに複数のブロックに分割してもよい。例えば、基本ブロックが「a=1;a=a*2;a−3;」である場合に、それぞれのプログラム命令をブロックとし、「a=1;」「a=a*2;」「a−3;」をそれぞれブロックする。その場合、「a=1;」のブロックから「a=2;」のブロックへは分岐があると見なして、コントロールフローを生成する。このようにすることにより、基本ブロックよりもさらに細かい単位で追加プログラム命令群を入れることができるため、より解析を困難にすることができる。
その場合、追加プログラム命令は、そのブロックにおける最後の合流点よりも後であって、最初の分岐点よりも前に追加する。もし、そのブロックにおける最後の合流点よりも後であって、最初の分岐点よりも前であるプログラム命令群が1つもない場合には、そのブロックの入口写像情報と出口写像情報とは同じ写像情報とする。
(23)実施形態においるブロック変換部1400の処理では、プログラム命令を追加することによって、ブロックに機能を追加する構成を示したが、必ずしもこのような構成でなくとも構わない。
例えば、実施形態2において、ブロックB2からプログラム命令「pm_b=pm_b*8;」を取り除き、プログラム命令群D「tmp=pm_a; pm_a=pm_c*8; pm_c=pm_b; pm_b=tmp;」を追加する構成であっても構わない。
(24)上記の実施の形態では、写像情報の基づいた変数の置き換え等を例として挙げたが、これに限られるものではない。
例えば、実施形態4のように、分岐先のブロックを暗号化し、分岐元のブロックへそのブロックを復号する処理を追加するなどしてもよい。
すなわち、本発明は、分岐元のブロックと分岐先のブロックとで相殺しあうような性質を有する難読化を施すことによって、プログラムの制御構造に関わらない難読化を行うことを可能とするものである。
(29)また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD−ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記ディジタル信号であるとしてもよい。
(31)また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
<従来技術の詳細および課題>
図27は、従来の難読化方法の例を示すプログラム例である。
難読化前のオリジナルプログラムを図27(a)に示す。このプログラムにおいて、「1234」は不正解析者に知られたくない秘密情報9001である。なお、以下では特に断らない限り、C言語で記述されたプログラムを例とした説明を行う。
図27(a)に示す難読化前のプログラムでは、このプログラムに含まれる定数を全て収集することで秘密情報9001の値を絞りこむことができる。すなわち、図27(a)に含まれる定数を収集すると、「1」、「2」、「7」、「5」、「1234」が収集できるが、そのうちの一つは秘密情報の値である。よって、不正解析者は、プログラムに含まれる定数を収集するだけで秘密情報の値を5つに絞りこむことができる。
プログラムに含まれる秘密情報を、複数のプログラム命令を実行することによって算出されるように変換したプログラムを図27(b)に示す。
このプログラムは、オリジナルプログラム(a)に新しい変数「c」を追加し、追加した変数「c」を用いて秘密情報「1234」を算出する処理を追加し、秘密情報「1234」を「c(9002)」に置換えることで生成したプログラムである。
図27(b)のプログラムでは、プログラムに含まれる定数を全て収集しても秘密情報「1234」が直接得られることはない。
よって、図27(a)のプログラムよりも安全性が高い。
続いて、秘密情報を算出する処理をプログラム中の様々な位置に拡散したプログラムを図27(c)に示す。このプログラムは、図27(b)で示した秘密情報置換え後プログラムに含まれる秘密情報を算出するプログラム命令「c=1;」、「c=c*10+2;」、「c=c*10+3;」、「c=c*10+4;」をプログラム中の様々な位置に拡散したプログラムである。
また、以上で述べた難読化方法の他にも、非特許文献1には、計算途中の値を記憶する変数のメモリをプログラム実行中に何度か変えることでプログラムの解析が困難になることが述べられている。図27(d)は、このような難読化の一例として、変数の役割をプログラムの途中で変えるプログラムを示す。
変数の役割をプログラムの途中で変えるプログラムを図27(d)に示す。このプログラムはオリジナルプログラム図27(a)に変数d、eを追加し、プログラムの途中に「d=a;b=e;」を追加して、追加した位置以降の変数「a」、「b」をそれぞれ「d」、「e」に置換えたプログラムである。
<課題>
プログラムに含まれる秘密情報を、複数のプログラム命令を実行することによって算出されるように変換し、さらに、そのプログラム命令をプログラム中の様々な場所に拡散することで解析を困難にする方法がある。しかし、制御構造が複雑なプログラムに対して拡散を行うことは困難であるため、不正解析者は特定の箇所を重点的に解析することにより比較的容易に秘密情報を得ることができてしまうという課題がある。以下、この課題を具体的に説明する。
図28は難読化前のオリジナルプログラムを示す。オリジナルプログラムは関数funcを含み、関数はプログラム命令群9110からなる関数である。また、「123」が秘密情報である(プログラム命令9101参照)。
このプログラムのコントロールフローを図29に示す。
基本ブロック生成ステップは、難読化対象プログラムから基本ブロックを生成するステップである。基本ブロックとは、1以上のプログラム命令からなるプログラム命令群であって、プログラム命令群の先頭以外では他のブロックから合流せず、プログラム命令群の最後以外では他のブロックへ分岐しないプログラム命令群である。
グラフ生成ステップでは、次の処理を行う。
基本ブロックのそれぞれをノードと見なし、第一のノードに第二のノードへの分岐命令(goto文、break文、continue文、return文による無条件分岐命令、またはfor文、while文、do−while文、if文、switch文による条件分岐命令のこと)がある場合、または、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応するプログラム上のプログラム命令の一つ後のプログラム命令が対応するプログラム命令が第二のノードであった場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。
ブロック9111からは2つの矢印が出ているが、デバッガ等でプログラムの実行手順を強制的に変えるなどを行わないような実行時、すなわち、正常系での実行時にブロック9111が実行された後に、ブロック9112かブロック9113のどちらかが実行されることを示す。ブロック9115は、秘密情報である値「123」を含む。
図30は、図27(b)と同様に、オリジナルプログラム図27(a)に新しい変数「c」を追加し、追加した変数「c」を用いて秘密情報「123」を算出する処理を追加し、秘密情報「123」を「c」に置換えることで生成したプログラムのコントロールフロー図である。
(c)秘密情報拡散後プログラムのコントロールフロー
図30に示した秘密情報を算出するプログラム命令をプログラム中の様々な位置に拡散したプログラムを図31に示す。
まず、ブロック9215に含まれるプログラム命令「c=c*10+2;」を移動する場所を決める(図30参照)。
ここで、このプログラム命令は、条件分岐の片側に移動することはできない。このような制限が設けられる理由は、例えば、ブロック9114にこのプログラム命令を移動すると、ブロック9114が実行されずにブロック9112が実行される分岐が起こった場合に、このプログラム命令「c=c*10+2;」が実行されないためである。この場合、ブロック9215におけるcの値が「123」ではなくなってしまうため、適切な演算が行えなくなる。
このように、従来手法では、分岐やループを含むプログラムでは、プログラム命令を移動可能な位置は少なく、結果として、プログラム命令は十分に拡散されずに特定の箇所に集中してしまう。よって、従来手法では、プログラム命令の拡散が困難な箇所(分岐やループ等)以外の箇所を重点的に解析することにより、秘密情報を算出するプログラム命令群を比較的容易に見つけ出すことができてしまうという課題がある。
しかし、制御構造が複雑なプログラムに対してこの手法を行う際にも、上記と同様の課題がある。以下、この課題を具体的に説明する。
難読化前のオリジナルプログラムは前記と同じく図28のプログラムであるとする。また、プログラムのコントロールフローは図29のコントロールフローとなる。このプログラムの途中で変数の役割を置換える。
例えば、ブロック9114の最後に変数の役割を入れ替えるための命令「d=a;e=b;」を追加した場合、ブロック9115に含まれるプログラム命令群「labelE: b*=a*123;return b;」において、「a」、[b]を「d」、「e」に置換え「labelE:; e*=d*123;return e;」としなければならない。
この場合、dおよびeの値がaおよびbの値と異なってしまうので、正しい演算結果が得られなくなる。よって、プログラム命令を拡散させる際と同様に、分岐の片側で入れ換えを行うことを避け、ブロック9111に変数の役割を入れ替えを行う処理を追加することとなる。そのため、変数の役割を入れ替える処理を多数追加しようとしても、このような処理がブロック9111に集中してしまうため、処理を見つけ出し易くなってしまうという課題がある。
1000 4000 5000 プログラム難読化装置
1100 変数追加部
1200 プログラム分割部
1300 写像情報生成部
1310 コントロールフロー生成部
1320 属性情報割当表生成部
1330 写像対応表生成部
1400 ブロック変換部
1500 秘密ブロック変換部
1800 属性情報割当表
1900 4900 5900 6900 写像対応表
2000 2100 対象プログラム
3000 難読化プログラム
9100 オリジナルプログラム
Claims (16)
- 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、
前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、
1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段と
を備えることを特徴とするプログラム難読化装置。 - 前記対象プログラムは、秘密情報を含み、
前記プログラム難読化装置は、更に、前記対象プログラムから、特定変数の値に基づいて前記秘密情報を求める命令を含むブロックを秘密ブロックとして特定するブロック特定手段を備え、
前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられており、
前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成する
ことを特徴とする請求項1記載のプログラム難読化装置。 - 前記生成手段は、前記秘密ブロックに実行制御が遷移するブロックが複数ある場合には、全ての当該ブロックに、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成する
ことを特徴とする請求項2記載のプログラム難読化装置。 - 前記生成手段は、更に、前記秘密ブロックの前に実行され得るブロックに、当該ブロックの入口の属性に応じた特定変数の値から、特定変数が当該ブロックの出口の属性に応じた値となるようにする1又は複数の命令を付加し、難読化プログラムを生成する
ことを特徴とする請求項2記載のプログラム難読化装置。 - 前記プログラム難読化装置は、更に、前記対象プログラムに含まれない変数を追加する変数追加手段を備え、
前記特定変数は、前記変数追加手段で追加された変数である
ことを特徴とする請求項2記載のプログラム難読化装置。 - ブロックの入口または出口の属性に対応付けられている特定変数の値は複数あり、
前記生成手段は、特定変数が、ブロックの入口の属性に応じた特定変数のいずれかの値から当該ブロックの出口の属性に応じたいずれかの値になるようにする1又は複数の命令を付加する
ことを特徴とする請求項2記載のプログラム難読化装置。 - 前記特定変数は、複数あり、
前記生成手段は、一のブロックに、当該ブロックの出口の属性に応じて、特定変数のうちの1特定変数の値と他の特定変数の値とを入れ替える命令を付加し、
前記一のブロックの出口から実行制御が遷移する他のブロックに、当該ブロックの入口の属性に応じて、前記特定変数の値と前記他の特定変数の値とを入れ替える命令を付加して、難読化プログラムを生成する
ことを特徴とする請求項2記載のプログラム難読化装置。 - 前記属性には、それぞれ所定の演算が対応付けられており、
前記生成手段は、一のブロックに、特定変数の値に当該ブロックの出口の属性に対応する所定の演算を施した結果値を、当該特定変数の値とするような命令を付加し、
前記一のブロックの出口から実行制御が遷移する他のブロックに、当該特定変数の値に当該ブロックの入口の属性に対応した所定の演算の逆演算を施した結果値を、当該特定変数の値とするような命令を付加して、難読化プログラムを生成する
ことを特徴とする請求項2記載のプログラム難読化装置。 - 前記属性には、それぞれ複数の特定変数の値の入れ替えが対応付けられており、
前記生成手段は、一のブロックに、当該ブロックの出口の属性に応じて、特定変数のうちの1特定変数の値と他の特定変数の値とを入れ替える処理を行う命令を付加し、
前記一のブロックの出口から実行制御が遷移する他のブロックに、当該ブロックの入口の属性に応じて、前記特定変数の値と前記他の特定変数の値とを入れ替える処理を行う命令を付加して、難読化プログラムを生成する
ことを特徴とする請求項1記載のプログラム難読化装置。 - 前記属性には、それぞれ特定変数と所定の演算とが対応付けられており、
前記生成手段は、一のブロックに、特定変数の値に当該ブロックの出口の属性に対応する所定の演算を施した結果値を、当該特定変数の値とするような処理を行う命令を付加し、
前記一のブロックの出口から実行制御が遷移する他のブロックに、当該特定変数の値に当該ブロックの入口の属性に対応した所定の演算の逆演算を施した結果値を、当該特定変数の値とするような処理を行う命令を付加して、難読化プログラムを生成する
ことを特徴とする請求項1記載のプログラム難読化装置。 - 前記プログラム難読化装置は、更に、ブロックを暗号化する暗号化手段を備え、
前記属性には、それぞれ暗号鍵が対応付けられており、
前記生成手段は、ブロックの出口の属性に対応付けられている暗号鍵で、当該ブロックの出口から実行制御が遷移する他のブロックを復号する処理を行う1又は複数の命令を付加し、前記1又は複数の命令を付加したブロックを、前記暗号化手段に当該ブロックの入口の属性に対応付けられている暗号鍵で暗号化させて、難読化プログラムを生成する
ことを特徴とする請求項1記載のプログラム難読化装置。 - 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、
前記ブロックは、順序付けられた複数の命令で構成される命令群であり、
ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、
1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を、全ての入口からの実行制御が通る部分に付加し、難読化プログラムを生成する生成手段と
を備えることを特徴とするプログラム難読化装置。 - 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置であって、
前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
ブロックにおける実行制御の入口と出口それぞれに対して属性を決定する属性決定手段と、
1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段とを備え、
前記属性には、それぞれ1又は複数の特定変数と1又は複数のその値とが対応付けられ、複数のブロックから実行制御が遷移してくるブロックの入口の属性には、遷移元の全てのブロックの出口の属性に対応付けられている値が対応付けられており、
前記生成手段は、1又は複数のブロックに、特定変数が、ブロックの入口の属性に応じた特定変数の値のうちの何れの値からも当該ブロックの出口の属性に応じた値になるようにする処理を行う1又は複数の命令を付加し、難読化プログラムを生成する
ことを特徴とするプログラム難読化装置。 - 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置において用いられる難読化方法であって、
前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定ステップと、
1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成ステップと
を備えることを特徴とするプログラム難読化方法。 - 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置に難読化処理を行わせるコンピュータプログラムであって、
前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
前記プログラム難読化装置におけるコンピュータに、
ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定ステップと、
1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成ステップと
を実行させることを特徴とするコンピュータプログラム。 - 複数ブロックで構成される対象プログラムに基づいて、難読化プログラムを生成するプログラム難読化装置で使用される集積回路であって、
前記ブロックは、順序付けられた複数の命令で構成され、最初の命令以外では実行制御が他のブロックから遷移せず、最後の命令以外では他のブロックに実行制御が遷移しない命令群であり、
ブロックにおける実行制御の入口と出口それぞれに対して属性を決定し、一のブロックの出口から他のブロックの入口に実行制御が遷移する関係にある当該出口と当該入口とは同一の属性となるように当該決定を行う属性決定手段と、
1又は複数のブロックに、当該ブロックの入口又は出口の属性に応じた処理を行う1又は複数の命令を付加し、難読化プログラムを生成する生成手段と
を備えることを特徴とする集積回路。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007557847A JP4971200B2 (ja) | 2006-02-06 | 2007-02-06 | プログラム難読化装置 |
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006028579 | 2006-02-06 | ||
JP2006028579 | 2006-02-06 | ||
PCT/JP2007/052026 WO2007091558A1 (ja) | 2006-02-06 | 2007-02-06 | プログラム難読化装置 |
JP2007557847A JP4971200B2 (ja) | 2006-02-06 | 2007-02-06 | プログラム難読化装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2007091558A1 JPWO2007091558A1 (ja) | 2009-07-02 |
JP4971200B2 true JP4971200B2 (ja) | 2012-07-11 |
Family
ID=38345154
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007557847A Active JP4971200B2 (ja) | 2006-02-06 | 2007-02-06 | プログラム難読化装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20090307500A1 (ja) |
JP (1) | JP4971200B2 (ja) |
CN (1) | CN101416197A (ja) |
WO (1) | WO2007091558A1 (ja) |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2007091558A1 (ja) * | 2006-02-06 | 2007-08-16 | Matsushita Electric Industrial Co., Ltd. | プログラム難読化装置 |
US8112636B1 (en) * | 2007-11-06 | 2012-02-07 | Lockheed Martin Corporation | Protection of code or data from exposure by use of code injection service |
US8856500B2 (en) | 2008-02-06 | 2014-10-07 | Nxp B.V. | Obfuscating program by scattering sequential instructions into memory regions such that jumps occur with steps of both signs in equal frequency |
EP2243098A2 (en) * | 2008-02-11 | 2010-10-27 | Nxp B.V. | Method of program obfuscation and processing device for executing obfuscated programs |
JP5300294B2 (ja) * | 2008-03-25 | 2013-09-25 | パナソニック株式会社 | 処理装置、難読化装置、プログラムおよび集積回路 |
FR2942558B1 (fr) * | 2009-02-24 | 2014-05-30 | Eads Europ Aeronautic Defence | Procede d'obscurcissement d'un programme d'ordinateur. |
CA2776913C (en) | 2009-10-08 | 2017-01-03 | Irdeto Canada Corporation | A system and method for aggressive self-modification in dynamic function call systems |
CN102582268A (zh) * | 2012-01-10 | 2012-07-18 | 珠海天威技术开发有限公司 | 微控制器及其算法保护方法、存储芯片、耗材容器、成像设备 |
EP2901348A4 (en) * | 2012-09-28 | 2016-12-14 | Hewlett Packard Entpr Dev Lp | ANWENDUNGSRANDOMISIERUNG |
JP6203028B2 (ja) * | 2013-12-13 | 2017-09-27 | Kddi株式会社 | 疑似乱数生成装置及び方法、並びにプログラム難読化装置及び方法 |
EP2913772A1 (de) * | 2014-02-28 | 2015-09-02 | Wibu-Systems AG | Verfahren und Computersystem zum Schutz eines Computerprogramms gegen Beeinflussung |
US9858440B1 (en) * | 2014-05-23 | 2018-01-02 | Shape Security, Inc. | Encoding of sensitive data |
EP2958044B1 (en) * | 2014-06-20 | 2019-09-18 | Secure-IC SAS | A computer implemented method and a system for controlling dynamically the execution of a code |
US10068070B2 (en) * | 2015-05-05 | 2018-09-04 | Nxp B.V. | White-box elliptic curve point multiplication |
US20160328539A1 (en) * | 2015-05-05 | 2016-11-10 | Nxp B.V. | Obscuring Software Code With Split Variables |
CN107667368B (zh) * | 2015-07-09 | 2020-12-22 | 赫尔实验室有限公司 | 用于混淆计算机程序的系统、方法以及存储介质 |
US10509918B1 (en) * | 2015-09-18 | 2019-12-17 | Hrl Laboratories, Llc | One-time obfuscation for polynomial-size ordered binary decision diagrams (POBDDs) |
EP3502935A1 (en) * | 2017-12-20 | 2019-06-26 | Koninklijke Philips N.V. | Compiling device and method |
US11550903B1 (en) * | 2019-04-26 | 2023-01-10 | Joseph Alan Epstein | System and method for trustworthiness, reputation, provenance, and measurement of software |
US11163675B1 (en) | 2021-04-07 | 2021-11-02 | State Farm Mutual Automobile Insurance Company | Mutation testing in parallel threads |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2007091558A1 (ja) * | 2006-02-06 | 2007-08-16 | Matsushita Electric Industrial Co., Ltd. | プログラム難読化装置 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6006328A (en) * | 1995-07-14 | 1999-12-21 | Christopher N. Drake | Computer software authentication, protection, and security system |
US6192475B1 (en) * | 1997-03-31 | 2001-02-20 | David R. Wallace | System and method for cloaking software |
EP0988591A1 (en) * | 1997-06-09 | 2000-03-29 | Intertrust, Incorporated | Obfuscation techniques for enhancing software security |
US6643775B1 (en) * | 1997-12-05 | 2003-11-04 | Jamama, Llc | Use of code obfuscation to inhibit generation of non-use-restricted versions of copy protected software applications |
US6779114B1 (en) * | 1999-08-19 | 2004-08-17 | Cloakware Corporation | Tamper resistant software-control flow encoding |
CA2305078A1 (en) * | 2000-04-12 | 2001-10-12 | Cloakware Corporation | Tamper resistant software - mass data encoding |
CA2353347A1 (en) * | 2001-07-20 | 2003-01-20 | Cloakware Corporation | Tamper-resistant control-flow with software fingerprinting |
US7210134B1 (en) * | 2001-09-06 | 2007-04-24 | Sonic Solutions | Deterring reverse-engineering of software systems by randomizing the siting of stack-based data |
US7124445B2 (en) * | 2002-06-21 | 2006-10-17 | Pace Anti-Piracy, Inc. | Protecting software from unauthorized use by converting source code modules to byte codes |
US7383443B2 (en) * | 2002-06-27 | 2008-06-03 | Microsoft Corporation | System and method for obfuscating code using instruction replacement scheme |
JP2004185064A (ja) * | 2002-11-29 | 2004-07-02 | Matsushita Electric Ind Co Ltd | プログラムの難読化装置及び難読化方法 |
US7631292B2 (en) * | 2003-11-05 | 2009-12-08 | Microsoft Corporation | Code individualism and execution protection |
US7996671B2 (en) * | 2003-11-17 | 2011-08-09 | Bluerisc Inc. | Security of program executables and microprocessors based on compiler-architecture interaction |
US7444677B2 (en) * | 2004-03-05 | 2008-10-28 | Microsoft Corporation | Intentional cascade failure |
US7620987B2 (en) * | 2005-08-12 | 2009-11-17 | Microsoft Corporation | Obfuscating computer code to prevent an attack |
-
2007
- 2007-02-06 WO PCT/JP2007/052026 patent/WO2007091558A1/ja active Application Filing
- 2007-02-06 US US12/162,706 patent/US20090307500A1/en not_active Abandoned
- 2007-02-06 CN CNA200780011709XA patent/CN101416197A/zh active Pending
- 2007-02-06 JP JP2007557847A patent/JP4971200B2/ja active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2007091558A1 (ja) * | 2006-02-06 | 2007-08-16 | Matsushita Electric Industrial Co., Ltd. | プログラム難読化装置 |
Also Published As
Publication number | Publication date |
---|---|
JPWO2007091558A1 (ja) | 2009-07-02 |
CN101416197A (zh) | 2009-04-22 |
WO2007091558A1 (ja) | 2007-08-16 |
US20090307500A1 (en) | 2009-12-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4971200B2 (ja) | プログラム難読化装置 | |
JP4976991B2 (ja) | 情報処理装置、プログラム検証方法及びプログラム | |
JP5322620B2 (ja) | 情報処理装置、プログラム開発システム、プログラム検証方法及びプログラム | |
JP4770425B2 (ja) | 保護済み実行プログラムの作成のためのプログラム、方法及び装置 | |
JP5118036B2 (ja) | 命令生成装置、命令生成方法、プログラムおよび集積回路 | |
US20080271001A1 (en) | Method of generating program, information processing device and microcomputer | |
JP2009512087A (ja) | プログラム実行可能イメージの暗号化 | |
JP2001134337A (ja) | 暗号解読コンパイラ | |
CN108595921A (zh) | 一种源代码中字符串的混淆方法和装置 | |
JP2012118956A (ja) | インデックステーブル基盤のコード暗号化及び復号化装置及びその方法 | |
CN104662553A (zh) | 程序验证装置、程序验证方法和程序验证程序 | |
CN111512307B (zh) | 编译设备和方法 | |
CN107871066B (zh) | 基于安卓系统的代码编译方法及装置 | |
JP2005216027A (ja) | 暗号化装置及びこれを備えた暗号化システム並びに復号化装置及びこれを備えた半導体システム | |
CN112639774A (zh) | 具有掩蔽功能的编译器设备 | |
JP2007304726A (ja) | プログラム難読化装置、難読化方法及び難読化プログラム | |
JP3555858B2 (ja) | プログラムの編集方法、シングルパッケージ化システム、プログラム開発システム、プログラムの身元情報付加システム及び記憶媒体 | |
US6931634B2 (en) | Encrypted compiler | |
JP2009009537A (ja) | プログラム作成方法及び情報処理装置ならびにマイコン | |
JP2009211622A (ja) | 契約定義関数検証装置、その方法及びそのプログラム | |
JP4125995B2 (ja) | データ変換システム | |
JPWO2017204139A1 (ja) | データ処理装置、データ処理方法、およびプログラム記録媒体 | |
CN105095698A (zh) | 基于最近执行的程序代码的程序代码模糊处理 | |
JP6298937B2 (ja) | データ処理装置 | |
JP2002258961A (ja) | 計算機プログラムへの副情報埋め込み方法及び装置及び計算機プログラムへの副情報埋め込みプログラム及び計算機プログラムへの副情報埋め込みプログラムを格納した記憶媒体及び計算機プログラムからの副情報読み出し方法及び装置及び計算機プログラムからの副情報読み出しプログラム及び計算機プログラムからの副情報読み出しプログラムを格納した記憶媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20091117 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20120117 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20120215 |
|
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: 20120313 |
|
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: 20120405 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20150413 Year of fee payment: 3 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |