JPWO2006115219A1 - プログラム難読化装置及び難読化方法 - Google Patents

プログラム難読化装置及び難読化方法 Download PDF

Info

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
Application number
JP2007514688A
Other languages
English (en)
Other versions
JP4806402B2 (ja
Inventor
太一 佐藤
太一 佐藤
大森 基司
基司 大森
理惠子 浅井
理惠子 浅井
布田 裕一
裕一 布田
芳賀 智之
智之 芳賀
雅浩 満保
雅浩 満保
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2007514688A priority Critical patent/JP4806402B2/ja
Publication of JPWO2006115219A1 publication Critical patent/JPWO2006115219A1/ja
Application granted granted Critical
Publication of JP4806402B2 publication Critical patent/JP4806402B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Abstract

不正解析者が容易に被秘匿情報を取得することができない難読化プログラムを生成するプログラム難読化装置を提供する。 プログラム難読化装置は、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムを記憶し、複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成し、前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入し、偽装処理命令を含む偽装ブロックを少なくとも1つ生成し、前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する。

Description

本発明は、秘密情報を保持して実行するプログラムを、秘密情報を不正に解析することを困難にするプログラムに変換する技術に関する。
従来、暗号鍵などの被秘匿情報を扱うプログラムの不正な解析/改ざんを防止するための方法としてプログラムの制御構造/処理などを元のプログラムとは異なる形式に変換して、解析困難なプログラムにするプログラム難読化の方法が考えられている(例えば非特許文献1参照)。ここで、被秘匿情報とは、第三者には知られたくない情報である。
非特許文献1において、例えば、プログラムの出力結果に影響を与えない複製生成型偽装コードの挿入を行い、難読化プログラムを生成する方法が開示されている。
ここで、擬似分岐命令と偽装ブロックの挿入による難読化プログラムの生成方法について説明する。
難読化前のオリジナルのプログラムは、命令群1、命令群2、及び命令群3から構成されており、3つの命令群を順に実行するものとする。
この難読化方法では、オリジナルプログラムに、オリジナルプログラムの実行とは無関係なダミー変数を追加し、ダミー変数の値を書き換えるようなプログラム命令群を実行コード中にいくつか挿入する。また、ダミー変数の値によって分岐先が決定する擬似分岐命令が、命令群1と命令群2との間に追加される。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定しておく。さらに、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を偽装ブロックとする。
このように難読化されたプログラムは、命令群1、擬似分岐命令、命令群2、命令群3の順に実行される。追加された偽装ブロックは、プログラム中に存在するがデバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系の実行時には実行されることはない。
また、擬似分岐命令の挿入による難読化プログラムの生成方法について説明する。
難読化前のオリジナルのプログラムは、命令群1、命令群2、及び命令群3から構成されており、3つの命令群を順に実行するものとする。
この方法では、オリジナルプログラムにダミー変数を追加する。次に、ダミー変数の値によって分岐先が決定する擬似分岐命令を命令群1と命令群2との間に追加する。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定する。このとき、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を命令群3とする。
このように難読化されたプログラムは、命令群1、擬似分岐命令、命令群2、命令群3の順に実行される。
非特許文献1では、以上に述べたような難読化を行うことで、プログラムからアルゴリズムを推定することが困難になること、特定モジュールの位置の推定が困難になることが開示されている。例えば、暗号アルゴリズムのプログラムから暗号鍵を不正な解析から保護したい場合には、暗号アルゴリズムのモジュール位置の推定を困難にすることができる。
しかし、このような方法を用いてプログラムの制御構造を複雑にした場合でも、プログラム中のどこかには暗号鍵のような被秘匿情報が存在する。よって、プログラム中に存在する定数データを全て収集すれば、その中のいずれかが被秘匿情報となる。
そのため、例えば暗号アルゴリズムの場合では、平文と暗号文の組を入手可能な不正解析者であれば、プログラム中に存在する定数データを暗号鍵と仮定して平文を暗号化して得た暗号文が実際の暗号文と一致するかを調べていけば、いずれ本当の暗号鍵を見つけることができる。
非特許文献1では、さらに、この問題に対し被秘匿情報を含むプログラム命令を、複数のプログラム命令群に置き換えることでプログラムを難読化する方法を述べている。例えば、「d0=1234」というプログラム命令において「1234」が被秘匿情報である場合、「d0=1234」というプログラム命令を、「d0=230」、「d0=d0+1000」、「d0=d0+4」のようなプログラム命令群に置き換え、これらを分散して配置することが述べられている。このような方法を用いれば、プログラム中に存在する定数データを収集しても、その中から被秘匿情報を見つけることができなくなる。また、被秘匿情報が分割され、生成された複数のプログラム命令を分割秘密と呼ぶ。
鴨志田、松本、井上、″耐タンパーソフトウェアの構成手法に関する考察″、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の偽装ブロックから、オリジナルプログラムに含まれる正当プログラム命令、及び他の偽装ブロックの何れに分岐する分岐命令を挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、前記処理命令挿入手段は、前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、前記偽装ブロック挿入手段は、前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、生成したグラフの難易度が、所定の条件を満たすか否かを判定する判定部と、所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する第2生成部と、前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部による処理を行うように制御する制御部とを備えるとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックが挿入されたオリジナルプログラムからグラフを生成するので、偽装ブロックが挿入されたオリジナルプログラムを部分グラフ同型問題として扱うことができる。部分グラフ同型問題において、与えられた2つのグラフ(部分グラフと全体グラフ)があるとき、全体グラフから部分グラフを見つけ出すことが困難であることが知られている。これにより、偽装ブロックが挿入されたオリジナルプログラムからグラフから、偽装ブロックが挿入されていないオリジナルプログラムを見つけ出すことが困難になる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、ノード間を結ぶエッジの数と、ノード数とから算出される値(エッジ数)−(ノード数)が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから、エッジ数とノード数とを取得し、値(エッジ数)−(ノード数)が、前記所定数以上であるか否かを判定するとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準として、値(エッジ数)−(ノード数)を用いて、グラフ生成をすることができる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、グラフにおける閉路の数が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから閉路数を取得し、取得した閉路数が、前記所定数以上であるか否かを判定するとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準として、閉路数を用いて、グラフ生成をすることができる。
ここで、前記所定の条件を満たすとは、グラフが平面グラフでないことであり、前記判定部は、前記第1生成部にて生成されたグラフが平面グラフであるか否かを判定し、平面グラフでないと判定する場合に、前記所定の条件を満たすとするとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準を、平面グラフでないことを用いて、グラフ生成をすることができる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、第1の所定数以上のノード数からなる閉路の数が、ユ指定された前記強度に応じたグラフの難易度にて定まる第2の所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから、第1の所定数以上のノード数からなる閉路の数を取得し、取得した閉路数が、前記第2所定数以上であるか否かを判定するとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準として、閉路数を用いて、グラフ生成をすることができる。
ここで、前記偽装ブロック挿入手段は、前記オリジナルブロックに対して、前記演算式が前記演算順位で実行された場合に真偽値が一定値となる比較式を含み、前記比較式により真偽値が前記一定値となる場合の分岐先を次に実行する次オリジナルブロックとする条件分岐命令を、前記オリジナルブロックに挿入し、前記偽装ブロックが、前記オリジナルブロックの直後に挿入された場合には、前記条件分岐命令を前記制御命令とするとしてもよい。
この構成によると、プログラム難読化装置は、真偽値が一定値となる条件分岐命令をオリジナルブロックに挿入することにより、オリジナルプログラムの解析を困難にすることができる。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、前記処理命令挿入手段は、前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、前記偽装ブロック挿入手段は、前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、生成したグラフの強度が、所定の条件を満たすか否かを判定する判定部と、所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する、又は1のオリジナルブロックに、1の偽装ブロックを分岐先とし、常に前記分岐先には分岐しない条件分岐命令を前記オリジナルブロックに挿入する第2生成部と、前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部を行うように制御する制御部とを備えるとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックが挿入されたオリジナルプログラムからグラフを生成するので、偽装ブロックが挿入されたオリジナルプログラムを部分グラフ同型問題として扱うことができる。これにより、偽装ブロックが挿入されたオリジナルプログラムからグラフから、偽装ブロックが挿入されていないオリジナルプログラムを見つけ出すことが困難になる。
ここで、処理命令生成手段は、前記処理順序で実行した場合のみに、前記秘匿処理命令群による処理と同一の結果が得られるように、前記複数の処理命令を生成するとしてもよい。
この構成によると、プログラム難読化装置にて生成された前記複数の演算式は、正しい演算順序で実行した場合にのみ前記被秘匿情報を算出するので、不正解析者は、正しい演算順序を得ない限り、被秘匿情報を取得することができない。つまり、プログラム難読化装置は、オリジナルプログラムの解析を困難にすることができる。
ここで、前記偽装ブロック挿入手段は、前記オリジナルプログラムを、1以上の正当プログラム命令からなる複数の分割ブロックに分割する分割部と、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とするとしてもよい。
この構成によると、プログラム難読化装置は、オリジナルプログラムの先頭に位置する分割ブロックを除く他の分割ブロックの位置を入れ替えるので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記分割部は、さらに、前記偽装ブロックを、1以上のプログラム命令からなる複数の偽装分割ブロックに分割し、前記被入替ブロック生成部は、さらに、前記偽装分割ブロックのそれぞれから、偽装分割ブロックに、他の偽装分割ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックを構成する1以上の偽装分割ブロックのそれぞれを前記オリジナルプログラムに挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記被入替ブロック生成部は、さらに、前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックを前記オリジナルプログラムに挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数の分割ブロックに予め分割され、前記複数の分割ブロックが実行順序で並べられており、前記処理命令挿入手段は、最初に実行される分割ブロックから前記秘匿処理命令群を有する分割ブロックまでの間に、前記複数の処理命令のそれぞれを挿入し、前記偽装ブロック挿入手段は、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とするとしてもよい。
この構成によると、プログラム難読化装置は、オリジナルプログラムの先頭に位置する分割ブロックを除く他の分割ブロックの位置を入れ替えるので、オリジナルプログラムの解析を困難にすることができる。
プログラム難読化装置10の構成を示すブロック図である。 難読化対象プログラム201の構成の一例を示す図である。 難読化対象プログラム201から生成された複数の基本ブロックの構成の一例を示す図である。 基本ブロックのそれぞれから生成された複数の分割後ブロックの構成の一例を示す図である。 各分割後ブロックに基づいて生成されたグラフを示す図である。 等価プログラム命令挿入後ブロックを示す図である。 ノード数として取り得る範囲を示す図である。 偽装ブロック本体の構成の一例を示す図である。 偽装等価プログラム命令挿入後偽装ブロックの構成の一例を示す図である。 ラベル挿入後等価プログラム命令挿入後ブロック、ラベル挿入後等価プログラム命令非挿入ブロック、及びラベル挿入後等価プログラム命令挿入後偽装ブロックの構成の一例を示す図である。 TMPブロックの構成の一例を示す図である。 ラベル挿入後等価プログラム命令挿入後ブロック、ラベル挿入後等価プログラム命令非挿入ブロック、及びTMPブロックを用いて生成したグラフである。 TMPブロック1101jに条件分岐命令が挿入された新たなTMPブロック1301jの構成の一例を示す図である。 新たなTMPブロック1301jを用いて、再生成したグラフを示す図である。 擬似分岐命令挿入後ブロックの構成の一例を示す図である。 被入替ブロックの構成の一例を示す図である。 難読化対象プログラム201から生成した難読化プログラム1500の構成の一例を示す図である。 プログラム難読化装置10の動作概要を示す流れ図である。 等価プログラム生成処理の動作を示す流れ図である。 偽装ブロック挿入後プログラムの生成処理の動作を示す流れ図である。 擬似分岐命令挿入後プログラムの生成処理の動作を示す流れ図である。 所定数とグラフの強度との関係を示す図である。
符号の説明
10 プログラム難読化装置
100 記憶部
101 入力部
102 ブロック分割部
103 等価プログラム命令生成部
104 等価プログラム生成部
105 偽装ブロック挿入後プログラム生成部
106 擬似分岐命令挿入後プログラム生成部
107 被入替ブロック群生成部
108 配置順序入替部
201 難読化対象プログラム
202 変数宣言部
203 処理部
1.第1の実施の形態
以下、本発明に係る第1の実施の形態としてのプログラム難読化装置10について、図面を参照して説明する。
1.1 プログラム難読化装置10の構成
プログラム難読化装置10は、図1に示すように、記憶部100、入力部101、ブロック分割部102、等価プログラム命令生成部103、等価プログラム生成部104、偽装ブロック挿入後プログラム生成部105、擬似分岐命令挿入後プログラム生成部106、被入替ブロック群生成部107、配置順序入替部108から構成される。
以下、各構成要素について説明する。以下の説明では、まず、構成要素の動作を説明し、その後、具体的に難読化対象プログラムの一例に対して各構成要素による処理を施した例を示すことでその構成要素をより明確にしていく。
1.1.1 入力部101
入力部101は、被秘匿情報を保持する難読化対象プログラムと、難読化対象プログラムにおける被秘匿情報を含むプログラム命令の位置を示す位置情報とを受け付ける。
入力部101は、受け付けた難読化対象プログラムと位置情報とを、記憶部100へ格納する。
入力部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言語の用語については、公知であるので、詳細な説明は省略する。
処理群C、処理群Eは、含まれる命令数が(N−1)個である以外は、処理群Aと同種のプログラム命令から構成されるプログラム命令群である。
処理部203には、被秘匿情報を保持するプログラム命令204が含まれる。プログラム命令204は、この難読化対象プログラム201の被秘匿情報「512」を含むプログラム命令「a=b+512;」である。
入力部101は、難読化対象プログラム201と、位置情報(ここでは、プログラム命令204の行番号)とを受け取り、受け取った難読化対象プログラム201と、位置情報とを記憶部100へ格納する。
入力部101は、難読化対象プログラム201の分割を指示する分割命令をブロック分割部102へ出力する。
以降、具体例を用いて説明する場合には、難読化対象プログラム201を用いて説明する。
1.1.2 記憶部100
記憶部100は、入力部101にて受け付けた難読化対象プログラムと、位置情報とを記憶している。
具体的には、記憶部100は、入力部101にて受け付けた難読化対象プログラム201と、この難読化対象プログラム201の被秘匿情報「512」を含むプログラム命令「a=b+512;」の位置を示す位置情報とを記憶している。
1.1.3 ブロック分割部102
ブロック分割部102は、入力部101から分割命令を受け取ると、記憶部100に記憶されている難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、受け取った難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割し、その後、分割した基本ブロックのそれぞれを、詳細に分割して、1以上の分割後ブロックを生成する。ここで、基本ブロックは、1以上のプログラム命令からなるプログラム命令群であって、プログラム命令群の先頭以外では他のプログラム命令群とは合流せず、プログラム命令群の最後以外では他のプログラム命令群へ分岐しないプログラム命令群である。なお、コンパイラに関する用語についての詳細な説明は省略する。
(1)基本ブロックの生成
ブロック分割部102は、入力部101から、難読化対象プログラムを受け取ると、受け取った難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。ここで、基本ブロックとは、開始位置が、処理部の先頭(難読化対象プログラムの入口のプログラム命令、つまり、難読化対象プログラムの一番最初に実行されるプログラム命令)、処理が合流するプログラム命令、または、分岐となるプログラム命令の次のプログラム命令であり、終了位置が、次に処理が合流するプログラム命令の一つ前のプログラム命令、処理部の最後(プログラムの出口の命令、つまり、難読化対象プログラムの一番最後に実行されるプログラム命令)、または、分岐となるプログラム命令であるブロックである。
なお、基本ブロック生成に関するより詳細については、コンパイラの分野で公知であるためここでの説明は省略する。
これにより、ブロック分割部102は、難読化対象プログラムを分割して複数の基本ブロックを生成することができる。また、難読化対象プログラムを構成する全てのプログラム命令は、ブロック分割部102により、いずれかの一つの基本ブロックに含まれるようになる。
(2)分割後ブロックの生成
ブロック分割部102は、生成した各基本ブロックを、以下のように分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、基本ブロックに含まれるプログラム命令数m、予め与えられた所定数Nとを用いて、基本ブロックを([(m−1)/N]+1)個の分割後ブロックに分割する。分割する際には、各ブロックのプログラム命令数が出来るだけ均等になるようにする。ここで、演算[a/b]は、除算a/bを施し、算出結果から小数点以下を切り捨てた整数を取得する演算式である。例えば、[5/2]=2となる。
(3)具体例
図3は、図2に示す難読化対象プログラムを、基本ブロックに分割した結果を示す。
図3における基本ブロック301a〜301cは、図2の関数funcの処理部203を分割して生成した基本ブロックである。
基本ブロック301aは、関数funcの入口のプログラム命令(関数の中で一番最初に実行されるプログラム命令)を含む処理群Aからはじまり、それ以降、最初に出現する条件分岐命令(for文、while文、do−while文、if文、switch文)であるプログラム命令「if(条件1)goto labelF;」までのプログラム命令を含む。ここで、この条件分岐命令を基本ブロック301aの最後にしたのは、基本ブロックはブロックの最後以外では分岐しないためである。
基本ブロック301bは、基本ブロック301aの最後のプログラム命令の次のプログラム命令からはじまり、それ以降、最初に合流する位置である「labelF」の直前のプログラム命令「a=b+512;」までのプログラム命令までを含む。ここで、合流位置の直前のプログラム命令を基本ブロック301bの最後にしたのは、基本ブロックはブロックの先頭以外では合流しないためである。なお、「labelF:」で合流するとしたのは、「labelF:」の位置に処理が移動する経路が2つ以上ありうるからである。すなわち、一方は基本ブロック301aの実行後に条件分岐により処理が移動する場合であり、もう一方は、基本ブロック301bの実行後に処理が移動する場合である。
基本ブロック301cは、基本ブロック301bの最後のプログラム命令の次のプログラム命令からはじまり、それ以降、関数funcの出口となるプログラム命令(関数の中で一番最後に実行されるプログラム命令)までを含む。
次に、図4は、図3に示す各基本ブロックを、分割後ブロックに分割した結果を示す。
処理群A、処理群B、処理群Cを含む基本ブロック301aは、含まれるプログラム命令数の合計が3N個である。なぜなら、ここでは、処理群A、処理群Bに含まれるプログラム命令の個数をそれぞれN個と、処理群Cに含まれるプログラム命令をN−1個としており、基本ブロック301aには、プログラム命令「if(条件1)goto labelF;」が含まれているからである。
基本ブロック301aから生成する分割後ブロック数は、式([(m−1)/N]+1)のmに3Nを代入し3である事がわかる。基本ブロック301aを3つに分割して生成したものが分割後ブロック401a〜401cである。
以下、同様に2N個のプログラム命令を含む基本ブロック301bを分割し生成した分割後ブロックが、分割後ブロック401d〜401eである。さらに、同様に3N個のプログラム命令を含む基本ブロック301cを分割し生成した分割後ブロックが、分割後ブロック401f〜401hである。
なお、本実施例では、基本ブロックを更に分割して分割後ブロックを生成する構成を示したが、基本ブロックそのものを分割後ブロックとして扱っても構わない。
1.1.4 等価プログラム命令生成部103
等価プログラム命令生成部103は、被秘匿情報を含むプログラム命令と同等の機能を有する命令群を生成する。以降の説明では、この命令群を構成する各命令を等価プログラム命令と呼ぶ。
本実施例では、簡単のため被秘匿情報である定数を、複数のプログラム命令から算出するようなプログラム命令群を生成し、生成したプログラム命令群のそれぞれを等価プログラム命令とする場合を示す。
等価プログラム命令生成部103は、等価プログラム命令に使用する変数名(秘密情報用変数名)の決定、グラフ作成、等価プログラム命令の挿入対象ブロックの決定、及び等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令の生成を行う。
(1)秘密情報用変数名の決定
等価プログラム命令生成部103は、等価プログラム命令に使用する変数の名前を決定する。
まず、等価プログラム命令生成部103は、難読化対象プログラムを解析し、このプログラム中で使用されている全ての変数名を調べる。次に、使用されているいずれの変数名とも重複しない変数名を生成し、生成した変数名を秘密情報用変数名として決定する。
(2)グラフ作成
等価プログラム命令生成部103は、難読化対象プログラムの構造を示すグラフを作成する。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、第一のノードが第二のノードへの分岐命令(goto文、break文、continue文、return文による無条件分岐命令、またはfor文、while文、do−while文、if文、switch文による条件分岐命令)を含む場合、または、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応するプログラム上のプログラム命令の一つ後のプログラム命令が第二のノードに含まれている場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。なお、グラフに関する用語については公知であるため、ここでの説明は省略する。グラフ生成に関するより詳細については、コンパイラの分野では公知であるため、ここでの説明は省略する。
このようなグラフにおいて、第一のノードは第二のノードの先行ブロック、第二のノードは第一のノードの後続ブロックと呼ぶ。
さらに、ここでは、位置情報にて示される被秘匿情報を含むプログラム命令が含まれるノードを秘密保有ノードと呼ぶ。また、プログラムの入り口となるプログラム命令(プログラムの一番最初に実行されるプログラム命令)を含むノードを開始ノード、プログラムの出口となるプログラム命令(プログラムの一番最後に実行されるプログラム命令)を含むノードを終了ノードと呼ぶこととする。
(3)等価プログラム命令の挿入対象ブロックの決定
等価プログラム命令生成部103は、生成したグラフに基づき、等価プログラム命令を挿入する分割後ブロックを決定する。
等価プログラム命令生成部103は、まず、秘密保有ノードに対応するブロックを第1の等価プログラム命令挿入対象ブロックとする。次に、第1の等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に第nの等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第(n+1)の等価プログラム命令挿入対象ブロックとする。第nの等価プログラム命令挿入対象ブロックの先行ブロックが複数ある場合には、等価プログラム命令生成部103は処理を中止し、等価プログラム命令数をnとする。このステップのいずれの操作においても、等価プログラム命令挿入対象ブロックに選ばれなかった分割後ブロックを、以降、等価プログラム非挿入ブロックと呼ぶ。
このような方法で、等価プログラム命令挿入対象ブロックを決定した場合、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系で実行された際において、第1の等価プログラム命令挿入対象ブロックが実行される前には必ず第2の等価プログラム命令挿入対象ブロックが実行されることになる。このことは、第1の等価プログラム命令挿入対象ブロックの先行ブロックが第2の等価プログラム命令挿入対象ブロックのみであることより分る。以下同様に、第(n−1)の等価ブロックが実行される前には必ず第nの等価プログラム命令挿入対象ブロックが実行される。まとめると、第1の等価プログラム命令挿入対象ブロックが実行される際には、それ以前に必ず第n、第(n−1)、・・・、第2の等価プログラム命令挿入対象ブロックがこの順番で実行されることが分る。なお、実際に等価プログラム命令を挿入する処理は、等価プログラム生成部104にて行われ、その詳細な動作は後述する。
(4)等価プログラム命令の生成
等価プログラム命令生成部103は、等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令を生成する。等価プログラム命令生成部103は、等価プログラム命令数nと同数の等価プログラム命令を生成する。ここでは、等価プログラム命令数をNとし、以下、第1の等価プログラム命令から第Nまでの等価プログラム命令の生成手順を述べる。
(A)第1の等価プログラム命令の生成
等価プログラム命令生成部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の演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。
(C)第Nの等価プログラム命令の生成
等価プログラム命令生成部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);

を実行した際に得られる秘密情報用変数の値を、第二の値として算出する。
等価プログラム命令生成部103は、
式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+(第一の値);」
からなるプログラム命令群を順に処理した場合、処理の最後で秘密情報用変数は被秘匿情報の値になる。
この生成方法によると、例えば、第tの等価プログラム命令と、第(t+1)の等価プログラム命令とを入れ替えて、第1、2、・・・、t−1、t+1、t、t+2、・・・、Nの順に等価プログラム命令を実行した値と、第1から第Nまでの等価プログラム命令を実行した値とは異なることが分かる。
なお、ここでは等価プログラム命令として、掛け算と足し算とを組み合わせた演算とを示したが、これに限定されない。等価プログラム命令数nと同数の等価プログラム命令を用いて、被秘匿情報の値が取得される演算であれば、どのような演算を用いても構わない。
(5)具体例
等価プログラム命令生成部103は、まず、図2に示す難読化対象プログラム201を用いて、難読化対象プログラム201の関数funcで使用されている引数の変数名、およびの変数宣言部202で宣言されている変数名を調べ、これらと重複しない変数名を秘密情報用変数名とする。ここでは、秘密情報用変数名を「dkey」とする。
次に、等価プログラム命令生成部103は、図4に示す分割後ブロック401a〜401hを用いて、以下のようにしてグラフG100を生成する。ここでは、分割後ブロック401a〜401hのそれぞれを、ノード501a〜501hとして説明する。
分割後ブロック401aの最後のプログラム命令は無条件分岐命令ではない。また、分割後ブロック401aの次のプログラム命令は分割後ブロック401bのプログラム命令である。よって、等価プログラム命令生成部103は、ノード501aとノード501bにエッジ502aを設ける。
同様にして、等価プログラム命令生成部103は、エッジ502b〜エッジ502gを設ける。
分割後ブロック401cには分割後ブロック401fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1)goto labelF;」がある。よって、等価プログラム命令生成部103は、ノード501cとノード501fにエッジ502hを設ける。
等価プログラム命令生成部103は、上記の動作を行うことにより、難読化対象プログラム201の構造を示すグラフG100を生成する。生成したグラフG100を図5にて示す。
なお、このグラフにおいて、ノード501aは開始ノードであり、ノード501hは終了ノードであり、ノード501eは秘密保有ノードである。
次に、等価プログラム命令生成部103は、図5に示すグラフG100に基づいて、等価プログラム命令を挿入する分割後ブロックを、以下のようにして決定する。
等価プログラム命令生成部103は、秘密保有ノードであるノード501eに対応する分割後ブロック401eを第1の等価プログラム命令挿入対象ブロックとする。ノード501eには先行ブロックはノード501dのみであるので、等価プログラム命令生成部103は、ノード501dに対応する分割後ブロック401dを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に、等価プログラム命令生成部103は、ノード501cに対応する分割後ブロック401cを第3の等価プログラム命令挿入対象ブロック、ノード501bに対応する分割後ブロック401bを第4の等価プログラム命令挿入対象ブロック、ノード501aに対応する分割後ブロック401aを第5の等価プログラム命令挿入対象ブロックとする。第5の等価プログラム命令挿入対象ブロックには先行ブロックがないので、等価プログラム命令生成部103は、等価プログラム命令数を「5」とする。
次に、等価プログラム命令生成部103は、等価プログラム命令数「5」と同数の等価プログラム命令を生成する。ここでは、次に、等価プログラム命令生成部103は、第1〜第5の等価プログラム命令を生成する。
等価プログラム命令生成部103は、整数「18」を選択し、第1の等価プログラム命令「dkey=18;」を生成する。
等価プログラム命令生成部103は、以下、第2〜第4の等価プログラム命令をそれぞれ決定する。
ここでは、等価プログラム命令生成部103は、第2の演算子から第4の演算子をそれぞれ順に、「/」、「*」、「/」とし、ランダムな値RA_2〜RA_4をそれぞれ値「2」、値「4」、値「5」とし、ランダムな値RB_2〜RB_4をそれぞれ値「54」、値「−32」、値「+8」とし、第2〜第4の等価プログラム命令をそれぞれ以下のように生成する。
「dkey=dkey/2+54;」、
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」
次に、等価プログラム命令生成部103は、第5の等価プログラム命令を生成する。
ここでは、等価プログラム命令生成部103は、ランダムな値RA_Nを値「9」とする。さらに、等価プログラム命令生成部103は、以下のプログラム命令群の実行し、第二の値を算出する。
「dkey=18;
dkey=dkey/2+54;
dkey=dkey*4−32;
dkey=dkey/5+8;」
このプログラム命令群を順に実行すると、「dkey」の値は、順に、値「18」、値「63」、値「220」、値「52」となり、等価プログラム命令生成部103は、値「52」を第二の値とする。
等価プログラム命令生成部103は、
式1:(第一の値)=(被秘匿情報の値)―{(第二の値)*RA_N}
に、被秘匿情報の値「512」と、第二の値「52」、RA_Nの値「9」を代入することにより、第一の値「44」を算出する。
等価プログラム命令生成部103は、第5の等価プログラム命令「dkey=dkey*9+44;」を生成する。
以上、まとめると、第1から第5の等価プログラム命令は順に
「dkey=18;」、
「dkey=dkey/2+54;」、
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」、
「dkey=dkey*9+44;」
となる。これらのプログラム命令を順に行った場合のdkeyの値は被秘匿情報の値「512」になることを確認することが出来る。
1.1.5 等価プログラム生成部104
等価プログラム生成部104は、被秘匿情報を秘密情報用変数に置き換え、等価プログラム命令生成部103にて生成したそれぞれの等価プログラム命令を、等価プログラム命令挿入対象ブロックに挿入し、等価プログラム挿入後ブロックを生成する。
等価プログラム生成部104は、生成した等価プログラム挿入後ブロックと、等価プログラム命令を挿入しなかった分割後ブロックとからなる等価プログラムを生成する。等価プログラムは、被秘匿情報を含む命令が等価プログラム命令群に置き換えられているが、置き換えを行う前のプログラムと同等の機能を有するプログラムである。
なお、以降において、等価プログラム命令を挿入しなかった分割後ブロックのことを、以降の説明では等価プログラム非挿入ブロックと呼ぶ。
等価プログラム生成部104は、秘密情報用変数の追加と、被秘匿情報の置き換えと、等価プログラム命令の挿入とを行う。
(1)秘密情報用変数の追加
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数を、難読化対象プログラムの変数宣言部に追加し、新たな変数宣言部を生成する。
(2)被秘匿情報の置き換え
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える。ここでは、等価プログラム生成部104は、秘密保有ノードに含まれる被秘匿情報の値を秘密情報用変数に置き換える。
(3)等価プログラム命令の挿入
等価プログラム生成部104は、等価プログラム命令生成部103にて生成した等価プログラム命令それぞれを、等価プログラム命令生成部103にて決定したいずれかの等価プログラム命令挿入対象ブロックに挿入する。以下、詳細な動作について説明する。
等価プログラム生成部104は、第t(t=1、2、・・・、N)の等価プログラム命令を第(N―t+1)の等価プログラム命令挿入対象ブロックに挿入し、第(N―t+1)の等価プログラム命令挿入後ブロックを生成する。
つまり、等価プログラム生成部104は、第1の等価プログラム命令を第Nの等価プログラム命令挿入対象ブロックに挿入し、第Nの等価プログラム命令挿入後ブロックを生成する。以下、同様に、第t(t=2、3、・・・、N)の等価プログラム命令を第(N−t+1)の等価プログラム命令挿入対象ブロックに挿入し、第tの等価プログラム命令挿入後ブロックを生成する。
ここで、第Nの等価プログラム命令は、被秘匿情報を秘密情報用変数に置き換えたプログラム命令よりも前に挿入することとする。これは、秘密情報用変数が被秘匿情報の値になってから、被秘匿情報を秘密情報用変数に置き換えることにより生成したプログラム命令を実行することを確実にするためである。
なお、以降の説明において、等価プログラム命令を挿入しなかった分割後ブロックのことを、等価プログラム非挿入ブロックと呼ぶ。
これにより、等価プログラム生成部104は、1以上の等価プログラム挿入後ブロックと、1以上の等価プログラム非挿入ブロックからなる等価プログラムを生成することができる。
また、第1〜第Nの等価プログラム挿入後ブロックを実行することにより、秘密情報用変数には被秘匿情報の値が設定されることがわかる。
なぜなら、上述したように、第1の等価プログラム命令挿入対象ブロックは、被秘匿情報を有する分割後ブロックである。さらに、第1の等価プログラム命令挿入対象ブロックが実行される際には、それ以前に必ず第N、第(N−1)、・・・、第2の等価プログラム命令挿入対象ブロックがこの順番で実行される。一方で、(3.4)で述べたように、第1、第2、・・・、第Nの等価プログラム命令をこの順に実行すれば、秘密情報用変数の値は被秘匿情報の値となる。したがって、等価プログラム生成部104は、上述したように、第1〜第Nの等価プログラム挿入後ブロックを生成することにより、第1の等価プログラム命令挿入後ブロックが実行される際には、それ以前に必ず第N、第(N−1)、・・・、第2の等価プログラム命令挿入後ブロックが実行されることとなり、その中に含まれる第1、第2、・・・、第(N−1)の等価プログラム命令が必ずこの順番で実行されることとなる。よって第1の等価プログラム命令挿入後ブロックにある第Nの等価プログラム命令が実行された際には、秘密情報用の変数は被秘匿情報の値となる。
したがって、等価プログラム生成部104にて生成された等価プログラムが、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系で実行された場合、第1の等価プログラム命令を含む第Nの等価プログラム挿入後ブロックが実行された際には、秘密情報用変数の値は第1の等価プログラム命令が実行された際に秘密情報用変数が取る値になる。また、第2の等価プログラム命令を含む第(N−1)の等価プログラム挿入後ブロックが実行された際には、第1〜第2の等価プログラム命令を順に行った場合の秘密情報用変数の値は、第1の等価プログラム命令と第2の等価プログラム命令を順に行った際に秘密情報用変数が取る値となる。以下、同様に、第t(t=3、4、・・・N)の等価プログラム命令を含む第(N−t+1)の等価プログラム命令挿入後ブロックが実行された際には、秘密情報用変数が、第1〜第tまでの等価プログラム命令を順に実行された際に秘密情報用変数が取る値となる。
(4)具体例
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加し、図6に示すように、新たな変数宣言部601を生成する。変数宣言部601は、変数宣言部202に、秘密情報用変数「dkey」の宣言文が加わったものである。このとき、等価プログラム生成部104は、秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加する際に、変数「dkey」の変数の型を、被秘匿情報である「512」を示すことが出来る型にする(例えば、8ビット正整数型を用いると0〜255までしか表現できず512を示すことができないので、これは避ける。)。ここでは、例えば、変数「dkey」の変数の型をint型とする。
次に、等価プログラム生成部104は、位置情報にて示されるプログラム命令(ここでは、図2にて示すプログラム命令204)における被秘匿情報の値「512」を秘密情報用変数「dkey」に置き換えて、図6に示すように、新たなプログラム命令603を生成する。
次に、等価プログラム生成部104は、第1の等価プログラム命令「dkey=18;」を第5の等価プログラム命令挿入対象ブロックであるノード501aに挿入し、第5の等価プログラム命令挿入後ブロック602aを生成する。同様に第2の等価プログラム命令「dkey=dkey/2+54;」を第4の等価プログラム命令挿入対象ブロックであるノード501bに挿入し、第4の等価プログラム命令挿入後ブロック602bを生成する。以下、同様に、第3の等価プログラム命令挿入後ブロック602c、第2の等価プログラム命令挿入後ブロック602d、第1の等価プログラム命令挿入後ブロック602eを生成する。
ここで、等価プログラム命令を挿入しなかったノード501f〜501hを、以降では、等価プログラム命令非挿入ブロック603f〜603hとする。
図6にて、等価プログラム命令挿入後ブロック602a〜602eと、等価プログラム命令非挿入ブロック603f〜603hとを用いたグラフを示す。
1.1.6 偽装ブロック挿入後プログラム生成部105
偽装ブロック挿入後プログラム生成部105は、正常系での実行結果を得るためには必要なく、また実行されることもないプログラム命令群である偽装ブロックを生成する。偽装ブロックは、より詳細には、プログラム実行中にデバッガ等を用いてプログラムカウンターや変数の値を強制的に変更することを行わない限り、実行されることのないプログラム命令群である。
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロックと、等価プログラム命令挿入後ブロックと、等価プログラム命令非挿入ブロックからなる偽装ブロック挿入後プログラムを生成する。
偽装ブロック挿入後プログラム生成部105は、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成とを行う。
(1)偽装ブロック数の取得
偽装ブロック挿入後プログラム生成部105は、生成する偽装ブロック数を予め記憶している。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得する。偽装ブロック数の値は、例えば、「1000」等である。なお、説明の簡略化のために偽装ブロック数を値「4」とする。
ここで、偽装ブロック数の決定について説明する。ノード数(ここでは、偽装ブロック数)と、難読化の強度との関係は、図7に示すように、ノード数が大きくなるにつれ、まず難読化の強度は指数関数的に増加し(図7に示す関数G110)、ある時点から、ノード数が増大するにつれ、難読化の強度が指数関数的に減少する(図7に示す関数G120)。偽装ブロック数は、例えば、図7に示すt1〜t2の区間から選ばれることが望ましい。特に、t1に対応するノード数を偽装ブロック数とすることが望ましい。
(2)偽装ブロック本体の生成
偽装ブロック挿入後プログラム生成部105は、取得した偽装ブロック数にて示される個数の偽装ブロック本体を生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1以上の分割後ブロックをランダムに選択する。
偽装ブロック挿入後プログラム生成部105は、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する。
(3)偽装等価プログラム命令挿入後偽装ブロックの生成
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令それぞれを、対応する偽装ブロック本体のそれぞれに挿入し、偽装等価プログラム命令挿入後偽装ブロックを生成する。偽装等価プログラム命令は、等価プログラム生成部104にて用いた第t(t=2、3、・・・N)の等価プログラム命令と同じ変数、演算子を用いたプログラム命令である。
偽装ブロック挿入後プログラム生成部105は、以下の動作を、生成した全ての偽装ブロック本体に対して行い、偽装等価プログラム命令挿入後偽装ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、0以外の整数RA及びRBをランダムに選択し、選択したRA及びRBを用いて、偽装等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)(演算子)(RA)+(RB);」を生成する。ここで、演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令を、対応する偽装ブロック本体の先頭に挿入する。
このように生成した偽装等価プログラム命令は、前述の等価プログラム命令と同じく秘密情報用変数を用いたプログラム命令であり、秘密情報用変数のみに着目した場合、等価プログラム命令と区別できないプログラム命令である。そのため、秘密情報用変数に着目して等価プログラム命令を収集しようとする不正解析者には、偽装等価プログラム命令と等価プログラム命令の区別がつかない。
(4)偽装分岐命令付き偽装ブロックの生成
偽装ブロック挿入後プログラム生成部105は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶している。本実施の形態では、所定数は、例えば、「13」である。
偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックのそれぞれに、無条件分岐命令及び条件分岐命令のうち少なくとも1の分岐命令を挿入し、偽装分岐命令付き偽装ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、等価プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
ここで、各ブロックに挿入するラベルのラベル名は、プログラム中で既に使用されているラベル名とは重複しないようにする。また、既に、ラベルが付与されている場合には、新たなラベルの挿入は行わない。
次に、偽装ブロック挿入後プログラム生成部105は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加する。なお、以降では、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令が追加されたブロックをTMPブロックと呼ぶ。
また、TMPブロックを生成する際に、追加する無条件分岐命令の分岐先は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックのそれぞれと、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム非挿入ブロックのそれぞれの中からランダムに選んだブロックの先頭とする。以下の説明では、この動作により生成した全てのTMPブロックからなるブロックの集合をTMPブロック群と呼ぶ。
次に、偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックのそれぞれと、ラベル挿入後等価プログラム挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれをノードと見なし、第一のノードが第二のノードへの分岐命令を含む場合に第一のノードと第二のノードの間にはエッジが存在すると見なし、また、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、最後のプログラム命令の一つ後のプログラム命令が対応するノードが第二のノードであった場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。
次に、偽装ブロック挿入後プログラム生成部105は、生成したグラフを用いて、ノード数、及びエッジ数を取得する。偽装ブロック挿入後プログラム生成部105は、式「(エッジ数)−(ノード数)」を算出し、算出した値が所定数以上であるか否かを判定する。
算出結果が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。中止した時点での、TMPブロック群を構成するTMPブロックを、以降、偽装ブロックと呼ぶ。
所定数以上でないと判定する場合には、偽装ブロック挿入後プログラム生成部105は、以下の動作を行う。
偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択する。次に、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成する。ここで、挿入する条件分岐命令の分岐条件は秘密情報用変数とランダムに決定した値とを比較する条件式とし、条件分岐命令の分岐先は、生成したグラフを構成するいずれかのノードに対応するブロックの先頭とする。条件分岐命令を挿入する位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
偽装ブロック挿入後プログラム生成部105は、条件分岐命令を挿入して生成した新たなTMPブロックと、挿入を行わず変更を加えていないTMPブロックからなるブロック群を新たなTMPブロック群とし、再度、グラフ生成を行い、上記に示す動作を行う。
(5)具体例
偽装ブロック挿入後プログラム生成部105は、予め記憶している偽装ブロック数「4」を取得する。
偽装ブロック挿入後プログラム生成部105は、図8に示すように、取得した偽装ブロック数にて示される個数の偽装ブロック本体701i〜701lを生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1の分割後ブロック401cを選択し、選択した分割後ブロック401cから分岐命令である「if(条件1)goto labelF;」を取り除いたプログラム命令群Cを用いて、偽装ブロック本体701iを生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1の分割後ブロック401hを選択し、選択した分割後ブロック401hを用いて、偽装ブロック本体701jを生成する。偽装ブロック本体701k、701lについても同様の生成方法であるため、ここでの説明は省略する。
次に、偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体701i〜701lのそれぞれに対する偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令のそれぞれを偽装ブロック本体701i〜701lに挿入して、図9に示すような偽装等価プログラム命令挿入後偽装ブロック801i〜801lを生成する。
例えば、偽装ブロック挿入後プログラム生成部105は、偽装ブロック本体701iに対する偽装等価プログラム命令「dkey=dkey*34+7;」を生成し、生成した偽装等価プログラム命令を偽装ブロック本体701iに挿入することにより、偽装等価プログラム命令挿入後偽装ブロック801iを生成する。
偽装等価プログラム命令挿入後偽装ブロック801j〜801lについても同様の生成方法であるため、ここでの説明は省略する。
次に、偽装ブロック挿入後プログラム生成部105は、等価プログラム命令挿入後ブロック602a〜602e、等価プログラム命令非挿入ブロック603f〜603h、偽装等価プログラム命令挿入後偽装ブロック801i〜801lのそれぞれの先頭に、ラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001e、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002h、及びラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lを生成する。図10において、生成した各ブロックの一例を示す。ここで、ブロックB1000は、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eと、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hとからなり、上位から順に実行する、又は、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001cの実行後、分岐命令にてラベル挿入後等価プログラム命令非挿入ブロック1002fに分岐し、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hを実行するものとする。また、ブロックB1001は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lからなるものとする。
図10において、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eは、等価プログラム命令挿入後ブロック602a〜602eの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後等価プログラム命令挿入後ブロックである。
ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hは、等価プログラム命令非挿入ブロック603f〜603hの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後等価プログラム命令非挿入ブロックである。なお、等価プログラム命令非挿入ブロック603fの先頭には始めからラベル「labelF:」があったので、ラベルの挿入は行っていない。
ラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lは、偽装等価プログラム命令挿入後偽装ブロック801i〜801lの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後偽装等価プログラム命令挿入後偽装ブロックである。
次に、偽装ブロック挿入後プログラム生成部105は、生成したラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lからTMPブロック1101i〜1101lを生成する。図11において、生成したTMPブロック1101i〜1101lの一例を示す。
例えば、偽装ブロック挿入後プログラム生成部105は、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001e、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002h、及びラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lから、ラベル挿入後等価プログラム命令挿入後ブロック1001aを選択する。偽装ブロック挿入後プログラム生成部105は、選択したラベル挿入後等価プログラム命令挿入後ブロック1001aへ無条件に分岐するように、無条件分岐命令「goto labelA;」を生成し、生成した無条件分岐命令を、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003iの最後に挿入して、TMPブロック1101iを生成する。
TMPブロック1101j〜1101lについても同様の生成方法であるため、ここでの説明は省略する。
次に、偽装ブロック挿入後プログラム生成部105は、以下のようにして図12にて示すグラフG200を生成する。ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eのそれぞれを、ノード1201a〜1201eとし、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hのそれぞれを、ノード1201f〜1201hとし、TMPブロック1101j〜1101lのそれぞれを、ノード1201i〜1201lとして説明する。
ラベル挿入後等価プログラム命令挿入後ブロック1001aの最後のプログラム命令は無条件分岐命令ではない。また、ラベル挿入後等価プログラム命令挿入後ブロック1001aの次のプログラム命令はラベル挿入後等価プログラム命令挿入後ブロック1001bのプログラム命令である。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201aとノード1201bにエッジ1202aを設ける。
同様にして、偽装ブロック挿入後プログラム生成部105は、エッジ1202b〜エッジ1202gを設ける。
ラベル挿入後等価プログラム命令挿入後ブロック1001cにはラベル挿入後等価プログラム命令非挿入ブロック1002fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1)goto labelF;」がある。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201cとノード1201fにエッジ1202hを設ける。
TMPブロック1101iの最後のプログラム命令は無条件分岐命令であるプログラム命令「goto labelA;」はラベル挿入後等価プログラム命令挿入後ブロック1001aのラベル「labelA:」に無条件分岐するプログラム命令である。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201iとノード1201aにエッジ1202iを設ける。
同様にして、偽装ブロック挿入後プログラム生成部105は、エッジ1202j〜1202kを設ける。
偽装ブロック挿入後プログラム生成部105は、上記の動作を行うことにより、グラフG200を生成することができる。
次に、偽装ブロック挿入後プログラム生成部105は、図12にて示すグラフG200を用いて、「(エッジ数)−(ノード数)」の値が、所定数「13」以上であるか否かを判定する。
ここでは、「(エッジ数)−(ノード数)」の値は0であるので、偽装ブロック挿入後プログラム生成部105は、所定数以上でないと判定し、以下の動作を行う。
偽装ブロック挿入後プログラム生成部105は、TMPブロック1101i〜1101lからTMPブロック1101jをランダムに選択し、選択したTMPブロック1101jに条件分岐命令を挿入して、図13にて示す新たなTMPブロック1301jを生成する。
偽装ブロック挿入後プログラム生成部105は、TMPブロック1301jを生成する際に、まず、選択したTMPブロック1101jに挿入する条件分岐命令を生成する。ここでは、秘密情報用変数を「dkey」とし、ランダムな値を値「273」とし、「dkey」と値「273」との比較を条件式とする。さらに、ノード1201a〜1201lまでのノードからノード1201dを、ランダムにノードを選択する。偽装ブロック挿入後プログラム生成部105は、生成する条件分岐命令の条件分岐先を、選択したノード1201dに対応するブロックであるラベル挿入後等価プログラム命令挿入後ブロック1001dの先頭にする。このようにして生成した条件分岐命令に対応するプログラム命令が、プログラム命令「if(dkey>273)goto labelD;」である。次に、偽装ブロック挿入後プログラム生成部105は、TMPブロック1101jの一番最後のプログラム命令であり、無条件分岐命令でもあるプログラム命令「goto label B;」の一つ手前に生成したプログラム命令を挿入して、TMPブロック1301jを生成する。
以上の動作が終了した後、偽装ブロック挿入後プログラム生成部105は、生成したTMPブロック1301jと、変更を行わなかったTMPブロックであるTMPブロック1101i、1101kおよび1101lからなるブロック群を新たなTMPブロック群とし、グラフの作成を行う。
ここで、新たなTMPブロック群を用いたグラフG210を図14に示す。グラフG200との違いは、ノード1201jがノード1205jとなり、ノード1205jとノード1201bとにエッジ1202jを設け、ノード1205jとノード1201dとにエッジ1302jを設ける。なお、TMPブロック1301jとノード1205jとが対応している。
1.1.7 擬似分岐命令挿入後プログラム生成部106
擬似分岐命令挿入後プログラム生成部106は、偽装ブロック挿入後プログラム生成部105にて生成したラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。ここで、ラベル挿入後等価プログラム命令挿入後ブロックに挿入される擬似分岐命令は、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系のプログラム実行時には必ず真偽が一定の値となる分岐条件分岐命令である。
擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック挿入後プログラム生成部105にて生成した偽装ブロックのそれぞれとからなる擬似分岐命令挿入後プログラムを生成する。
擬似分岐命令挿入後プログラム生成部106は、第Nのラベル挿入後等価プログラム命令挿入後ブロックから第1のラベル挿入後等価プログラム命令挿入後ブロックに対して、等価命令挿入後ブロック秘密情報用の変数値の決定と、擬似分岐命令の挿入とを行うことにより、擬似分岐命令挿入後プログラムを生成する。
以下に、擬似分岐命令挿入後プログラム生成部106が、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックから擬似分岐命令挿入後ブロックを生成する場合について説明する。
擬似分岐命令挿入後プログラム生成部106は、第1の等価プログラム命令から第(N−t+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の分岐先をラベル挿入後等価プログラム命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロックのそれぞれからランダムに選択した1のブロックとし、第2の分岐先を次ブロックとする。
なお、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先と第2の分岐先が、重複しないように、各ブロックを選択する。
以下に具体例を示す。
ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eから図15に示す擬似分岐命令挿入後ブロック1401a〜1401eが生成される具体例について説明する。
擬似分岐命令挿入後プログラム生成部106は、まず、第N(ここでは、N=5)ラベル挿入後等価プログラム命令挿入後ブロック1001aから擬似分岐命令挿入後ブロック1401aを以下のようにして生成する。
擬似分岐命令挿入後プログラム生成部106は、第1の等価プログラム命令「dkey=18;」を取得し、取得した第1の等価プログラム命令を用いて、等価命令挿入後ブロック秘密情報用の変数値「18」を算出する。
擬似分岐命令挿入後プログラム生成部106は、定数m(ここでは、「46」)及び比較演算子(ここでは、「<」)をランダムに選択し、条件式「dkey < 46」を生成する。
擬似分岐命令挿入後プログラム生成部106は、変数「dkey」に、算出した等価命令挿入後ブロック秘密情報用の変数値「18」を代入し、条件式の真偽を判定する。
この場合、条件式は真となり、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先として次ブロック(ここでは、ラベル名が「labelB」であるブロック)を選択し、第2の分岐先としてラベル名が「labelC」を選択し、擬似分岐命令であるプログラム命令「if(dkey<46)goto labelB;else goto labelC;」を生成する。
擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令を第5のラベル挿入後等価プログラム命令挿入後ブロック1001aの最後に挿入して、擬似分岐命令挿入後ブロック1401aを生成する。
擬似分岐命令挿入後ブロック1401b〜1401eについても同様の生成方法であるため、ここでの説明は省略する。
1.1.8 被入替ブロック群生成部107
被入替ブロック群生成部107は、ラベル挿入後等価プログラム非挿入ブロックのそれぞれと、偽装ブロックのそれぞれと、偽装分岐命令挿入後ブロックのそれぞれからなるブロック群から、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系の実行時に、goto文を用いずに他のブロックに移動する経路を有するブロックを1以上抽出する。
被入替ブロック群生成部107は、抽出した1以上のブロックそれぞれに対して、他のブロックへの移動する経路をgoto文を用いた分岐に置き換える。
また、被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロックを抽出し、抽出したブロックの最後の命令がプログラム命令「return;」、「exit();」以外のプログラム命令であった場合には、ブロックの最後にプログラム命令「return;」を追加する。
被入替ブロック群生成部107は、変更を加えたブロックのそれぞれと、置き換えを行わなかったブロックのそれぞれからなる被入替ブロック群を生成する。
なお、以降の説明において、被入替ブロック群に含まれるブロックを被入替ブロックと呼ぶ。
以下に具体例を示す。
被入替ブロック群生成部107が、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hと、偽装ブロックのそれぞれと、擬似分岐命令挿入後ブロック1401a〜1401eとから生成した被入替ブロック群を、図16に示す。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hと、偽装ブロックのそれぞれと、擬似分岐命令挿入後ブロック1401a〜1401eとから、goto文を用いずに他のブロックに移動する経路を有するブロック(ここでは、ラベル挿入後等価プログラム命令非挿入ブロック1002f、及び1002g)を抽出する。
被入替ブロック群生成部107は、抽出したラベル挿入後等価プログラム命令非挿入ブロック1002fに対して、他のブロック(ここでは、次ブロックである。)へ移動する経路を、無条件分岐命令であるプログラム命令「goto labelG;」を挿入し、被入替ブロック1501fを生成する。
抽出したラベル挿入後等価プログラム命令非挿入ブロック1002gに対しても同様に、被入替ブロック群生成部107は、無条件分岐命令であるプログラム命令「goto labelH;」を挿入し、被入替ブロック1501gを生成する。
被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロック(ここでは、ラベル挿入後等価プログラム命令非挿入ブロック1002h)を抽出する。このとき、ラベル挿入後等価プログラム命令非挿入ブロック1002hには処理群Hが含まれ、処理群Hは命令群Hである。その命令群Hの最後のプログラム命令は、「return;」であるため、被入替ブロック群生成部107は、ブロックの最後にプログラム命令「return;」を追加しないで、被入替ブロック1501hを生成する。つまり、ラベル挿入後等価プログラム命令非挿入ブロック1002hと被入替ブロック1501hとは同一である。
また、擬似分岐命令挿入後ブロック1401a〜1401eのそれぞれは、他のブロックへの分岐はgoto文を使っているため、被入替ブロック群生成部107は、擬似分岐命令挿入後ブロック1401a〜1401eのそれぞれに変更を加えることなく、被入替ブロック1501a〜1501eを生成する。
偽装ブロックについても同様に偽装ブロックそのものを被入替ブロックとし、被入替ブロック群生成部107は、被入替ブロック1501j〜1501lを生成する。
1.1.9 配置順序入替部108
配置順序入替部108は、被入替ブロック群生成部107で生成した被入替ブロック群に含まれる各被入替ブロックのうち、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替える。
配置順序入替部108は、等価プログラム生成部104にて生成した新たな変数宣言部と、配置順序を入れ替えた被入替ブロック群とからなる難読化プログラムを生成する。
配置順序入替部108は、生成した難読化プログラムを、当該難読化プログラムを実行する外部装置へ配布する。
以下に具体例を示す。
配置順序入替部108は、図16にて示す被入替ブロック1501b〜1501lの入れ替えを行う。ここでは、配置順序入替部108は、順に、被入替ブロック1501a、被入替ブロック1501g、被入替ブロック1501d、被入替ブロック1501c、被入替ブロック1501e、被入替ブロック1501l、被入替ブロック1501f、被入替ブロック1501b、被入替ブロック1501h、被入替ブロック1501k、被入替ブロック1501i、被入替ブロック1501jとなるように、入れ替えを行う。
配置順序入替部108は、入れ替えを行った被入替ブロック群と、等価プログラム生成部104にて生成した変数宣言部601とから、図17にて示す難読化プログラム1500を生成する。
1.2 プログラム難読化装置10の動作
ここでは、プログラム難読化装置10の動作について説明する。
1.2.1 動作概要
ここでは、プログラム難読化装置10が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて説明する。
プログラム難読化装置10の入力部101は、難読化対象プログラム、及び位置情報を受け付ける(ステップS5)。
入力部101は、受け付けた難読化対象プログラムと位置情報とを記憶部100へ格納する。
ブロック分割部102は、記憶部100から難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。その後、ブロック分割部102は、分割した基本ブロックのそれぞれを、詳細に分割して、1以上の分割後ブロックを生成する(ステップS10)。
プログラム難読化装置10は、等価プログラム生成処理を施して、等価プログラムを生成する(ステップS15)。
プログラム難読化装置10は、偽装ブロック挿入後プログラムの生成処理を施して、偽装ブロック挿入後プログラムを生成する(ステップS20)。
プログラム難読化装置10の擬似分岐命令挿入後プログラム生成部106は、ラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック挿入後プログラム生成部105にて生成した偽装ブロックのそれぞれとからなる擬似分岐命令挿入後プログラムを生成する(ステップS25)。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム非挿入ブロックのそれぞれと、偽装ブロックのそれぞれと、偽装分岐命令挿入後ブロックのそれぞれからなるブロック群から、正常系の実行時に、goto文を用いずに他のブロックに移動する経路を有するブロックを1以上抽出する。被入替ブロック群生成部107は、抽出した1以上のブロックそれぞれに対して、他のブロックへの移動する経路をgoto文を用いた分岐に置き換える。また、被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロックを抽出し、抽出したブロックの最後の命令がプログラム命令「return;」、「exit();」以外のプログラム命令であった場合には、ブロックの最後にプログラム命令「return;」を追加する。被入替ブロック群生成部107は、変更を加えたブロックのそれぞれと、置き換えを行わなかったブロックのそれぞれからなる被入替ブロック群を生成する(ステップS30)。
配置順序入替部108は、被入替ブロック群生成部107で生成した被入替ブロック群に含まれる各被入替ブロックのうち、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替える。配置順序入替部108は、等価プログラム生成部104にて生成した新たな変数宣言部と、配置順序を入れ替えた被入替ブロック群とからなる難読化プログラムを生成する(ステップS35)。
配置順序入替部108は、生成した難読化プログラムを、当該難読化プログラムを実行する外部装置へ配布する(ステップS40)。
1.2.2 等価プログラム生成処理の動作
ここでは、図18に示す等価プログラム生成処理(ステップS15)の動作について、図19に示す流れ図を用いて説明する。
等価プログラム命令生成部103は、難読化対象プログラムを解析し、このプログラム中で使用されている全ての変数名を調べる。次に、使用されているいずれの変数名とも重複しない変数名を生成し、生成した変数名を秘密情報用変数名として決定する(ステップS100)。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、グラフを生成する。
等価プログラム命令生成部103は、グラフ生成ステップで生成したグラフに基づき、等価プログラム命令を挿入する第1〜第Nの等価プログラム命令挿入対象ブロックを取得する(ステップS105)。ここで、Nは1以上の整数である。
等価プログラム命令生成部103は、取得した1以上の等価プログラム命令挿入対象ブロックそれぞれに対応する等価プログラム命令を生成する(ステップS110)。
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数を、難読化対象プログラムの変数宣言部に追加し、新たな変数宣言部を生成する(ステップS115)。
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える(ステップS120)。
等価プログラム生成部104は、第t(t=1、2、・・・、N)の等価プログラム命令を第(N―t+1)の等価プログラム命令挿入対象ブロックに挿入し、第(N―t+1)の等価プログラム命令挿入後ブロックを生成する。等価プログラム生成部104は、1以上の等価プログラム挿入後ブロックと、1以上の等価プログラム非挿入ブロックからなる等価プログラムを生成する(ステップS125)。
1.2.3 偽装ブロック挿入後プログラムの生成処理の動作
ここでは、図18に示す偽装ブロック挿入後プログラムの生成処理(ステップS20)の動作について、図20に示す流れ図を用いて説明する。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得することにより、偽装ブロック数を決定する(ステップS200)。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1以上の分割後ブロックをランダムに選択し、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する(ステップS205)。偽装ブロック挿入後プログラム生成部105は、このステップを取得した偽装ブロック数分だけ行う。
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成し、生成した偽装等価プログラム命令を対応する偽装ブロック本体に挿入し、偽装ブロック数にて示される個数分の偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS210)。
偽装ブロック挿入後プログラム生成部105は、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS215)。
偽装ブロック挿入後プログラム生成部105は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックそれぞれの最後に無条件分岐命令を追加して、偽装ブロック数にて示される個数分のTMPブロックを生成する。偽装ブロック挿入後プログラム生成部105は、生成した1以上のTMPブロックからなるTMPブロック群を生成する(ステップS220)。
偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックのそれぞれと、ラベル挿入後等価プログラム挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれをノードとして、グラフを生成する(ステップS225)。
偽装ブロック挿入後プログラム生成部105は、値「(エッジ数)−(ノード数)」が所定数以上であるか否かを判定する(ステップS230)。
算出結果が所定数以上であると判定する場合には(ステップS230における「YES」)、偽装ブロック挿入後プログラム生成部105は、処理を終了する。
所定数以上でないと判定する場合には(ステップS230における「NO」)、偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択し、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成して、新たなTMPブロック群を更新(生成)し(ステップS235)、ステップS225へ戻る。
1.3 第1の実施の形態の効果
このような構成によると、難読化されたプログラムから、秘密情報を見つけ出すことを困難にすることができる。
まず、等価プログラム命令生成部103、等価プログラム生成部104によって、秘密情報を含む命令を等価プログラム命令に置き換えプログラム上の様々な位置に配置している。このような構成により、不正解析者はプログラム中に含まれる定数値を全て収集したとしても、秘密情報を見つけることができなくなる。また、等価プログラム命令を分割後ブロックをまたがって、難読化後のプログラムの様々な位置に配置したことにより、不正解析者が等価プログラム命令を見つけ出すことを困難にすることが出来る。
さらに、偽装ブロック挿入後プログラム生成部105で、偽装ブロックに等価プログラム命令と同じ変数を用いたプログラム命令である偽装等価プログラム命令を挿入したことで、不正解析者がプログラム中の特定の変数を用いた処理を収集したとしても、その中に等価プログラム命令と、偽装等価プログラム命令が含まれることとなり、等価プログラム命令の収集を困難にすることができる。
さらに、等価プログラム命令生成部103で、複数の演算を組み合わせて等価プログラム命令を生成している。よって、不正解析者がプログラム中に含まれる等価プログラム命令の集合を見つけ出したとしても、見つけ出した集合の等価プログラム命令を正しい順序に並べ替えることが出来なければ、被秘匿情報の値を算出することができない。例えば、等価プログラム命令がプログラム命令「(秘密情報用変数名)=RA_0;」、「(秘密情報用変数名)+=RA_2;」「(秘密情報用変数名)+=RA_3;」であれば、2番目と3番目の処理の順番を逆にしても同じ被秘匿情報の値を算出することが出来てしまうが、実施例で述べた方法では、そのような事が起こらない。
さらに、不正解析者が、難読化対象プログラム(難読化前のプログラム)のアルゴリズム、および、本難読化手法自体を知っている場合、その情報を用いて不正解析を行うことが考えられる。この詳細を説明する。
例えば、DES、AES等の暗号プログラムは広くアルゴリズムが公開されており、不正解析者が難読化対象プログラムのアルゴリズムを知ることは容易である。そのような難読化対象プログラムにおいても、被秘匿情報である暗号鍵を不正解析から保護したいという要求がある。
さて、難読化対象プログラムのアルゴリズムを知る不正解析者は難読化前のプログラムのグラフを作成することができると考えることが出来る(例えば、図5のグラフ)。また、難読化後のプログラムを解析して、難読化後のプログラムのグラフを作成することができると考えることが出来る(例えば、図12のグラフ)。
この2つのグラフを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフに相当するグラフを見つけ出すことで、難読化後のプログラムから偽装ブロックを取り除いた部分を見つけ出すという不正解析が考えられる。
本実施の形態では、偽装ブロック挿入後プログラム生成部105で、偽装ブロックに偽装分岐命令の挿入を行っていることにより、難読化後のプログラムのグラフの構成を複雑になるので、上記の不正解析が困難になる。
さらに、配置順序入替部108により、難読化後のプログラムのグラフの構造を複雑にすることで上記の不正解析を困難にすることができる。
また、暗号鍵を有する暗号化プログラムにおいて、プログラム難読化装置は、前記暗号鍵を被秘匿情報として、暗号化プログラムを難読化するので、不正解析者は、暗号鍵を解析することが困難になる。これにより、著作権を保護すべきデータを暗号化して暗号化データを生成した場合、暗号鍵を不正に取得することが困難であるので、暗号化データを不正に解析することも困難になる。
1.4 変形例1
上記第1の実施の形態では、プログラム難読化装置10は、TMPブロック群を用いてグラフを生成したが、これに限定されない。
プログラム難読化装置は、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを備える代わりに、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを1つの構成要素とする擬似分岐命令挿入後プログラム生成部106aを備えるとし、擬似分岐命令挿入後プログラムを用いてグラフを生成してもよい。
1.4.1 擬似分岐命令挿入後プログラム生成部106a
擬似分岐命令挿入後プログラム生成部106aは、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成と、TMPブロック群の生成と、擬似分岐命令挿入後プログラムの生成とを行う。
なお、擬似分岐命令挿入後プログラム生成部106aが行う偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成に係る動作は、偽装ブロック挿入後プログラム生成部105にて示す偽装ブロック数の取得、偽装ブロック本体の生成、及び偽装等価プログラム命令挿入後偽装ブロックの生成に係る動作と同様であるため、ここでの説明は省略する。
以下において、TMPブロック群の生成と、擬似分岐命令挿入後プログラムの生成とについて説明する。
(1)TMPブロック群の生成
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
ここで、各ブロックに挿入するラベルのラベル名は、プログラム中で既に使用されているラベル名とは重複しないようにする。また、既に、ラベルが付与されている場合には、新たなラベルの挿入は行わない。
次に、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加して、TMPブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックのそれぞれに対して、TMPブロックを生成することにより、TMPブロック群を生成する。
次に、擬似分岐命令挿入後プログラム生成部106aは、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックから擬似分岐命令挿入後ブロックを生成する。生成方法は、上記第1の実施の形態にて示す擬似分岐命令挿入後プログラム生成部106が行う生成方法と同様であるため、説明は省略する。
次に、擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムに含まれる各ブロックをノードと見なして、グラフを生成する。グラフの生成方法は、上記第1の実施の形態にて示す偽装ブロック挿入後プログラム生成部105にて示すグラフの生成方法と同様であるため説明は省略する。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する。ここで、閉路とは、始点となるノードから終点となるノードに至る経路のうち、始点と終点が同じノードである経路である。ここで、所定数とは、ユーザが所望する難読化の強度に応じて定まる数であり、例えば、「13」である。
所定数以上でないと判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれ、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれ、TMPブロックのそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成する。
ここで、選択されたブロックが、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックである場合には、擬似分岐命令挿入後プログラム生成部106aは、第1〜第(N−t+1)の等価プログラムを順次実行して、等価命令挿入後ブロック秘密情報用の変数値を算出する。擬似分岐命令挿入後プログラム生成部106aは、定数mをランダムに選択し、秘密情報用変数dkeyに算出した値を代入し、条件式「dkey(比較演算子)m」が偽となるように、比較演算子を決定し、決定した比較演算子を用いた擬似分岐命令「if(dkey(比較演算子)m)then 分岐先」を生成する。ここで、分岐先は、TMPブロックの先頭とする。また、条件分岐命令の挿入位置は、ブロックの最後とする。
選択されたブロックが、ラベル挿入後等価プログラム命令非挿入ブロックである場合には、第1〜第Nの等価プログラムを順次実行して、等価命令挿入後ブロック秘密情報用の変数値を算出する。以降は、上記と同様の動作であるので、説明は省略する。また、条件分岐命令の挿入位置は、ブロックの最後とする。
選択されたブロックが、TMPブロックである場合には、上記に示す偽装ブロック挿入後プログラム生成部105による新たなTMPブロックの生成と同様であるため、説明は省略する。また、条件分岐命令の挿入位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
擬似分岐命令挿入後プログラム生成部106aは、条件分岐命令を挿入して生成した新たなブロックと、挿入を行わず変更を加えていない各ブロックとを用いて、再度、グラフ生成を行い、上記に示す動作を行う。
所定数以上であると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、生成したグラフが、平面グラフ(交差を含まないグラフ)であるか否かを判定する。
平面グラフでないと判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、動作を終了する。
平面グラフであると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれ、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれ、TMPブロックのそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、条件分岐命令を挿入して生成した新たなブロックと、挿入を行わず変更を加えていない各ブロックとを用いて、再度、グラフ生成を行い、上記に示す動作を行う。
なお、平面グラフに関しては、グラフ理論の分野で公知であるので、ここでの説明は省略する。
また、擬似分岐命令挿入後プログラム生成部106aは、閉路数を取得する代わりに、生成したグラフのエッジ数、ノード数を数え、式「(エッジ数)−(ノード数)+1」で算出した値を閉路数の近似値として用いてもよい。
1.4.2 動作概要
ここでは、変形例1におけるプログラム難読化装置が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて変更点のみ説明する。
変形例1におけるプログラム難読化装置は、図18に示すステップS5〜15を実行後、ステップS20における偽装ブロック挿入後プログラムの生成処理を行う代わりに、擬似分岐命令挿入後プログラムの生成処理を行う。
変形例1におけるプログラム難読化装置は、擬似分岐命令挿入後プログラムの生成処理を実行後、ステップS25を省略し、ステップS30以降を行う。
1.4.3擬似分岐命令挿入後プログラムの生成処理
ここでは、擬似分岐命令挿入後プログラムの生成処理の動作について、図21に示す流れ図を用いて説明する。
擬似分岐命令挿入後プログラム生成部106aは、記憶している偽装ブロック数を取得することにより、偽装ブロック数を決定する(ステップS300)。
擬似分岐命令挿入後プログラム生成部106aは、分割後ブロックの中から1以上の分割後ブロックをランダムに選択し、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する(ステップS305)。擬似分岐命令挿入後プログラム生成部106aは、このステップを取得した偽装ブロック数分だけ行う。
擬似分岐命令挿入後プログラム生成部106aは、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成し、生成した偽装等価プログラム命令を対応する偽装ブロック本体に挿入し、偽装ブロック数にて示される個数分の偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS310)。
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成、及び生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS315)。
擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックそれぞれの最後に無条件分岐命令を追加して、偽装ブロック数にて示される個数分のTMPブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、生成した1以上のTMPブロックからなるTMPブロック群を生成する(ステップS320)。
擬似分岐命令挿入後プログラム生成部106aは、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックに対応する等価命令挿入後ブロック秘密情報用の変数値を算出する(ステップS325)。算出方法は、上記第1の実施の形態にて示す擬似分岐命令挿入後プログラム生成部106が行う算出方法と同様であるため、説明は省略する。
擬似分岐命令挿入後プログラム生成部106aは、算出した変数値のそれぞれから、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックに挿入する擬似分岐命令を生成し、生成した擬似分岐命令を、挿入対象の第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックに挿入して擬似分岐命令挿入後ブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック(TMPブロック)のそれぞれからなる擬似分岐命令挿入後プログラムを生成する(ステップS330)。
擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムに含まれる各ブロックをノードとしてグラフを生成する(ステップS335)。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する(ステップS340)。
所定数以上であると判定する場合には(ステップS340における「YES」)、擬似分岐命令挿入後プログラム生成部106aは、生成したグラフが、平面グラフ(交差を含まないグラフ)であるか否かを判定する(ステップS345)。
平面グラフでないと判定する場合には(ステップS345における「NO」)、擬似分岐命令挿入後プログラム生成部106aは、動作を終了する。
閉路数が所定数以上でないと判定する場合(ステップS340における「NO」)、及び平面グラフであると判定する場合には(ステップS345における「YES」)、擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック(TMPブロック)のそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成し(ステップS350)、ステップS335へ戻る。
1.4.4 変形例1の効果
グラフ理論の分野では、2つのグラフG1、G2において、G1がG2に含まれるか否かを判定する問題が難しいことが部分グラフ同型判定問題として知られている。このことは非特許文献2に述べられている。
このことから、G2にG1が含まれることが分っていても、G2のどこにG1が含まれるかを判定することが難しいことが言える。また、部分グラフ同型判定問題が難しい条件として、プログラムが木構造ではないこと、プログラムが平面グラフでないことが知られる。
よって、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す部分グラフ同型判定問題が困難になる指標に基づき、難読化後のプログラムのグラフを構築すれば、先に述べた不正解析を困難にすることができる。
変形例1のプログラム難読化装置は、部分グラフ同型判定問題が困難となる難読化後のプログラムのグラフを構築することができる。
なお、変形例1のプログラム難読化装置は、全ての閉路数を取得する代わりに、予め与えられた範囲のノード数からなる閉路数を取得する構成としても構わない。
また、変形例1のプログラム難読化装置は、全ての閉路数を取得する代わりに、予め難読化前のプログラムに含まれる閉路を調べ、さらに、それぞれの閉路を構成するノード数を調べ、調べたノード数と同数のノードからなる閉路数のみを数える構成としても構わない。このような構成によれば、変形例1のプログラム難読化装置はグラフの閉路数の傾向を大まかに知ることができ、また閉路数を計算する処理時間を短くすることができる。
また、閉路数の判定や、平面グラフの判定の他に、非特許文献3(44〜50)に示されるグラフ同型判定問題の計算複雑さの指標を判定に用いても構わない。グラフ同型判定問題は、部分グラフ同型判定問題の特別な場合であると考えることが出来るので、このような指標を用いれば、部分グラフ同型判定が困難な難読化後のプログラムのグラフを生成することができる。
また、ここでは、偽装ブロックを生成し部分グラフ同型判定が困難でない場合は偽装分岐を追加していく場合について述べたが、予め部分グラフ同型判定が困難になる難読化後のグラフを作成し、そのグラフに合うように偽装分岐命令を追加しても構わない。
1.4.5 その他の変形例
擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムの生成において、閉路数の判定や、平面グラフの判定の双方を用いたが、これに限定されない。
擬似分岐命令挿入後プログラム生成部106aは、閉路数の判定、及び平面グラフの判定のうち1の判定のみを用いて、擬似分岐命令挿入後プログラムを生成してもよい。
1.5 変形例2
変形例1において、図21に示すステップS330及びステップS350の動作を以下のように変更してもよい。
1.5.1 ステップS330の変更
擬似分岐命令挿入後プログラム生成部106aは、挿入する分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
1.5.2 ステップS350の変更
擬似分岐命令挿入後プログラム生成部106aは、挿入する条件分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
1.5.2 変形例2の効果
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの終了ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501hと、図12におけるノード1201hの対応を見つけることを行えば、難読化後のプログラムのグラフから、難読化前のプログラムを見つける解析が容易になる。
変形例2によれば、終了ノードの候補が増えるため、難読化後のプログラムから終了ノードを見つけ出すことを困難にすることが出来る。
1.6 変形例3
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの開始ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501aと、図12におけるノード1201aの対応を見つけることを行えば、そこから解析が進む。変形例3は、プログラムの開始ノードの抽出を困難にするための変形例であり、変形例3のプログラム難読化装置は、上記第1の実施の形態にて示す配置順序入替部108を、以下に示す配置順序入替部108aに変更する。
1.6.1 配置順序入替部108a
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これらと重複しない変数名を、難読化対象プログラムに開始ノードを指定するための新たな引数である開始ノード指定用変数として、変数宣言部601に追加し、新たな変数宣言部601aを生成する。
次に、配置順序入替部108aは、プログラムの先頭に、条件分岐命令であるswitch文を追加する。追加するswitch文は、開始ノード指定用変数の値によって実行するcase文を選択するプログラム命令とし、各case文は、開始ノードを含むノード群に対応するブロックへの先頭への分岐命令を有するようにする。
次に、配置順序入替部108aは、開始ノードに対応するブロックへの先頭に分岐命令を実行する際のノード指定用変数の値を、難読化対象プログラムを呼び出す側のプログラムにおける難読化対象プログラムを呼び出すプログラム命令の引数に追加する。
次に、開始ノードを含め、全てのブロックの順序をランダムに並び替えて難読化プログラムを生成する。
1.6.2 具体例
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これと重複しない変数名を開始ノード指定用変数とする。ここでは、開始ノード指定用変数を「start」とする。
次に、プログラムの先頭にswitch文を追加する。
追加するswitch文にあたるプログラム命令を

swtich(start){
case 1:
goto labelC;
case 2:
goto labelA;
case 3:
goto labelL;
default:


とする。
次に、関数宣言および関数名を「func(int a,int b)」から「func(int a,int b,int start)」に置き換える。
また、難読化対象を呼び出すプログラム命令が「func(a,b);」であるならば、これを「func(a,b,2);」に置き換える。ここで、値「2」は、switch文に用いられる開始ノード指定用変数「start」に格納される数値である。なお、難読化対象プログラムを呼び出す側のプログラムを別途難読化して、開始ノード指定用変数がとる値「2」を隠蔽するなどを行ってもよい。
1.6.3 変形例3の効果
このような難読化を適用することにより、開始ノード指定用変数startに格納される正しい値が分からなくては開始ノードがどれであるのかが分からなくなる。すなわち、難読化対象プログラムを局所的に解析したのでは、開始ノードがわからなくなり難読化前のプログラムのグラフと難読化後のプログラムのグラフにおいて開始ノードの対応を取ることを困難にすることが出来る。
1.7 変形例4
上記第1の実施の形態において、難読化後プログラムにおいて秘密情報用変数が右辺にのみ存在するプログラム命令は、被秘匿情報位置のプログラム命令のみである(図17では、被入替ブロック1501e)。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムのグラフにおいて被秘匿情報位置となるノード(図5では、ノード501e)と難読化後のプログラムにおける秘密情報用変数が右辺にのみ存在するブロックとの対応を取って、不正解析を行うことが考えられる。
そこで、変形例4のプログラム難読化装置は、偽装ブロック本体生成の際に秘密情報用変数が右辺にのみ存在するプログラム命令を追加してもよい。これにより、変形例4のプログラム難読化装置は、上記の不正解析を困難にすることができる。
また、変形例4のプログラム難読化装置は、等価プログラム命令挿入後ブロックにおいて、右辺に定数がある命令における定数を、算出した等価命令挿入後ブロック秘密情報用の変数値を用いて算出するプログラム命令に置き換えてもよい。これにより、右辺に秘密情報用変数を含むプログラム命令の数が増えるので、変形例4のプログラム難読化装置は、上記の不正解析を困難にすることができる。
1.8 変形例5
難読化前のプログラムに特徴的な演算、特徴的な数値を用いた演算(例えば、暗号プログラムのアルゴリズムにおけるループの回数など)が含まれる場合がある。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムにおいて、特徴的な演算または数値を見つけ難読化前のグラフと難読化後のグラフにおいて対応が取れるノードを見つける手がかりにすることが考えられる。
そこで、特徴的な演算を別の処理に置き換えることで、上記の解析を困難にすることを行ってもよい。このような方法については、非特許文献1に述べられている。
また、特徴的な数値も、秘密情報として扱い本手法で述べた難読化方法や他の難読化方法により隠蔽しても構わない。
1.9 その他の変形例
1.9.1 C言語以外
上記第1の実施の形態では、秘密情報を保持するプログラムがC言語の場合を示したが、これに限定されない。Java(登録商標)バイトコード、Java(登録商標)言語、アセンブリ言語、機械語などで記述されたプログラムであってもよい。
Java(登録商標)バイトコードの場合、C言語のプログラム命令「goto」文を生成する処理では、プログラム命令「goto」、「goto_w」を使用する。プログラム命令「goto」、「goto_w」の使い分けについては、公知であるため、ここでの説明は省略する。
その他の生成する命令については、Java(登録商標)バイトコードにおける記述方法にのっとり、同等の命令を生成する。
また、無条件分岐命令を見つける処理では、Java(登録商標)バイトコードにおける無条件分岐を、条件分岐命令を見つける処理では、Java(登録商標)バイトコードにおける複合分岐、条件分岐をみつける。
また、Java(登録商標)言語に適用する際には、Java(登録商標)言語にプログラム命令「goto」に対応する命令がない。よって、各ブロックをメソッドとして生成し、プログラムの出口となるプログラム命令を含むメソッドには例外をスローされるプログラム命令を追加し、プログラムの入口となる命令を含むメソッドにはスローした例外をキャッチするプログラム命令を追加する。メソッド、例外の記述仕方は公知であるため説明は省略する。
その他の生成する命令については、Java(登録商標)言語における記述方法にのっとり、同等の命令を生成する。
Java(登録商標)言語において、無条件分岐命令を見つける処理では、プログラム命令「break」、「continue」,「return」、「throw」を見つける。
条件分岐命令を見つける処理では、「if−else」「switch」、「while」、「do−while」、「for」、「try、catch,finally」を見つける。なお、これらのプログラム命令については、公知であるため説明は省略する。
アセンブリ言語の場合、用いるアセンブラ言語によって命令セットは異なるが、例えばGASによるアセンブル言語の場合、C言語のプログラム命令「goto」文を生成する処理では、プログラム命令「jmp」を使用する。
また、無条件分岐命令を見つける処理では、プログラム命令「jmp」、「call」、「ret」、「hlt」を見つける。
条件分岐命令を見つける処理では、「jmp」以外のジャンプ命令を見つける。なお、GASのアセンブリ言語については、公知であるため説明は省略する。
機械語については、用いる機械語によって命令セットは異なるが、それぞれの記述方法にのっとり記述する。
なお、機械語を用いる場合、変形例3に述べたswitch文の生成の代わりに以下の処理を用いた構成としてもよい。すなわち、switch文を生成する代わりに、引数として開始ノード指定用変数を用いた相対ジャンプ命令(引数として指定された変数の値の分だけプログラムカウンタを動かす命令)を生成する。開始ノード指定用変数には、switch文のcase文で使用する値を設定する代わりに、生成した相対ジャンプ命令で開始ノードに対応するアドレスにジャンプできるような値を設定する。
1.9.2 ブロック分割
上記第1の実施の形態では、ブロック分割の際に基本ブロックに分割した後、さらに分割後ブロックを生成したが、基本ブロックへの分割を行わず、行数のみに基づく分割により分割後ブロックの生成を行っても良い。
このような構成を取る場合には、プログラム難読化装置は、等価プログラム命令を挿入する際に、等価プログラム命令挿入対象ブロックに含まれる一番最初の分岐命令よりも前に、さらに、一番最後の合流位置よりも後に等価プログラム命令を挿入する。
1.10 その他の変形例
なお、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
(1)上記第1の実施の形態において、プログラム難読化装置10が受け付ける位置情報は、難読化対象プログラムにおける秘密情報を保持するプログラム命令の行番号であるとしたが、これに限定されない。
位置情報は、定数のマクロの名前を用いて指定してもよい。すなわち、予め定められた所定の名前のマクロを有するプログラム命令を位置情報として扱う構成としてもよい。
または、位置情報は、ラベルを用いて指定してもよい。すなわち、予め定められた所定の名前のラベルがあるプログラム上の行の次の行を被秘匿情報として扱う構成としてもよい。
または、ここで述べた所定の名前のマクロ/ラベルの変わりに、予め定められた所定の接頭語、接尾語を有するマクロ/ラベルを用いて位置情報を指定する構成としても構わない。
(2)上記第1の実施の形態において、プログラム難読化装置10は、偽装ブロック数を予め記憶するとしたが、これに限定されない。
プログラム難読化装置10は、難読化対象プログラムの複雑度をeとし、下式を用いて、偽装ブロック数を取得しても構わない。
(生成する偽装ブロック数)=(所定数)−e
ここで、複雑度は、プログラムに含まれるプログラム命令数や、ループ数や、プログラムに使用される変数の数、またはそれらの組み合わせ等でプログラムの複雑さを指標化した値であり、バグが発生しやすいプログラムを見つけ出す際などに使用される。
ここで、所定数とは、ユーザが所望する難読化の強度に応じて定まる数である。
ここで、所定数の決定について説明する。所定数と、難読化の強度との関係は、図22に示すように、強度が増加すると、所定数は単調に増加する(図22に示す関数G300)。グラフG300は、y=aX+bにて示される。これにより、ユーザが所望する強度が決定すると、一意的に所定数が決定することになる。プログラム難読化装置は、決定した所定数から難読化対象プログラムの複雑度eを減算することにより得られた結果を、偽装ブロック数とする。
または、決定したノード数から分割後ブロックの個数を減算した結果を偽装ブロック数としてもよい。
(3)上記第1の実施の形態において、プログラム難読化装置10は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶しているとしたが、これに限定されない。
プログラム難読化装置10は、プログラムを難読化する度に、難読化の強度の指定を、入力部101にて受け付け、指定された強度に応じた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、難読化の強度に応じた所定数を、入力部101にて受け付け、受け付けた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、他のプログラムから難読化の強度の指定を受け付け、指定された強度に応じた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、他のプログラムから難読化の強度に応じた所定数を受け付け、受け付けた所定数を用いて難読化を行ってもよい。
(4)上記第1の実施の形態において、プログラム難読化装置10は、全ての偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を挿入して、偽装等価プログラム命令挿入後偽装ブロックを生成したが、これに限定されない。
プログラム難読化装置10は、生成した複数の偽装ブロック本体のうち1以上の偽装ブロック本体に、偽装等価プログラム命令を挿入して、偽装等価プログラム命令挿入後偽装ブロックを生成してもよい。
(5)上記第1の実施の形態において、プログラム難読化装置10は、擬似分岐命令挿入後プログラムから、ブロック分割部を用いて1以上の分割後ブロックを生成し、生成した1以上の分割後ブロックから被入替ブロック群を生成してもよい。
または、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行される1以上のブロックからなる部分プログラムから、ブロック分割部を用いて1以上の分割後ブロックを生成し、生成した1以上の分割後ブロックと、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行されない1以上のブロック(偽装ブロックに相当する)とから被入替ブロック群を生成してもよい。
(6)上記第1の実施の形態及び変形例において、グラフの難易度(強度)を示す指標の例として、「(エッジ数)−(ノード数)」、閉路数、平面グラフを用いたが、これに限定されない。
グラフの難易度を示す指標として、第1の所定数以上のノードからなる閉路の数としてもよい。このとき、プログラム難読化装置10は、例えば、第1の所定数として「3」、閉路数の最小値を示す第2の所定数として「4」を予め記憶している。
プログラム難読化装置10の偽装ブロック挿入後プログラム生成部105は、生成したグラフから3個以上のノードからなる閉路を全て取得する。
偽装ブロック挿入後プログラム生成部105は、取得した閉路数が、第2の所定数以上であるか否かを判定する。
閉路数が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。
所定数以上でないと判定する場合には、偽装ブロック挿入後プログラム生成部105は、第1の実施の形態と同様に、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択し、選択したTMPブロックから新たなTMPブロックを生成する。
(7)上記第1の実施の形態において、被秘匿情報は、定数としたがこれに限定されない。被秘匿情報は、1以上のプログラム命令からなる命令群であってもよい。
例えば、分岐命令による分岐先を被秘匿情報としてもよい。具体的には、分岐命令「goto label D;」の分岐先「label D」を被秘匿情報とする場合、「x=0;」、「x=x+3」、「if(x==2)then goto label B;」、及び「if(x==3)then goto label D;」に分解しても良い。このとき、偽装ブロックには、例えば、変数xを用いた演算式、ラベルDへ分岐する命令、及び変数xに格納された値に応じて分岐先を変更する命令等のうち少なくとも1のプログラム命令が追加される。追加されるプログラム命令の具体例は、「x=x+5;」、「if(x==5)then goto label D;」、及び「if(x==4)then goto label A;」である。ここで、プログラム命令の概念には、演算式も含まれる。また、上記に記載の「label A」及び「label B」は、例えば、難読化対象プログラムに記載されているラベル名である。
また、例えば、2つのプログラム命令「a=a*10;a=a+5;」を被秘匿情報とし、プログラム難読化装置は、これらから等価プログラム命令として、「a=a*2;」、「a=a+1;」、「a=a*5;」を3つ生成する。このとき、偽装ブロックには、変数aを用いた演算式が追加される。例えば、「a=a*5+2;」である。
(8)上記第1の実施の形態において、秘密情報用変数を用いたが、これに限定されない。秘密情報用変数を用いなくてもよい。
例えば、「b=a^3」を被秘匿情報とし、これを、「b=a;」、「b=b*a+4;」、「b=(b−4)*a;」と分解してもよい。このとき、偽装ブロックには、例えば、変数a、bの双方を用いた演算式、若しくはその一方を用いた演算式のうち少なくとも1の演算式が追加される。追加される演算式の具体例は、「b=b*a−6;」、「b=b+2;」、「a=a+1;」である。
また、例えば、「b=9;」を、「値8をファイルAに書き込む命令」、「ファイルAを読み込む命令」、「読み込んだ値を変数bに代入する命令」、「読み込んだ値が代入された変数bに1を加算する命令」に分解してもよい。または、「値8をファイルAに書き込む命令」、「ファイルAを読み込む命令」、「読み込んだ値を変数cに代入する命令」、「読み込んだ値が代入された変数cに1を加算する命令」、及び「加算結果を変数bに代入する命令」に分解してもよい。このとき、偽装ブロックには、例えば、変数bを用いた演算式、ファイルAの書き込み命令又はファイルAの読み込み命令、ファイルAを読み込み、読み込んだ値を変数bに代入する命令等のうち少なくとも1のプログラム命令が追加される。追加される演算式の具体例は、「b=b*3+1;」、「値3をファイルAにwrite;」、「b=read関数(ファイルAの読み込み);」である。ここで、プログラム命令の概念には、演算式も含まれる。
(9)上記第1の実施の形態において、プログラム難読化装置は、複数の分割後ブロックと、1以上の偽装等価プログラム命令挿入後偽装ブロックとを用いて、被入替ブロック群を生成してもよい。また、分割後ブロックのそれぞれに、ラベル名を付与してもよい。
または、プログラム難読化装置は、複数の分割後ブロックと、1以上のTMPブロックとを用いて、被入替ブロック群を生成してもよい。また、分割後ブロックのそれぞれに、ラベル名を付与してもよい。
(10)上記第1の実施の形態において、配置順序入替部108は、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替えたが、これに限定されない。
配置順序入替部108は、開始ノードとなる被入替ブロックを含めた全ての被入替ブロックの配置順序を、ランダムに入れ替えてもよい。このとき、配置順序入替部108は、入替結果により、プログラムに含まれる処理部の先頭位置に、偽装ブロックである被入替ブロックが存在する場合には、その被入替ブロックの先頭に、常に処理群Aを含む被入替ブロック(開始ノードとなるブロック)に分岐する無条件分岐命令又は条件分岐命令を挿入する。
これにより、プログラムの開始位置に偽装ブロックが存在する場合でも、難読化プログラムは、常に正しいブロックから実行される。
(11)上記第1の実施の形態において、プログラム難読化装置10は、等価プログラム命令の挿入対象ブロックに対して、1の等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、挿入対象ブロックに対して、2以上の等価プログラム命令を挿入してもよい。
(12)上記第1の実施の形態において、プログラム難読化装置10は、開始ノードであるブロックから、秘密保有ノードであるブロックまでに存在する各ブロックに、等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、開始ノードであるブロックから、秘密保有ノードであるブロックまでに存在する各ブロックのうち1以上のブロックに、等価プログラム命令を順次挿入してもよい。
(13)上記第1の実施の形態において、プログラム難読化装置10は、難読化対象プログラムを、複数の分割後ブロックに分割した後、等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、難読化対象プログラムにおいて最初に実行されるプログラム命令から、被秘匿情報を含むプログラム命令までの間に、生成した第1〜第Nの等価プログラム命令を挿入してもよい。
このとき、プログラム難読化装置10は、第1〜第Nの等価プログラム命令を挿入後、複数の分割後ブロックに分割してもよい。または、プログラム難読化装置10は、第1〜第Nの等価プログラム命令を挿入後、さらに、偽装ブロックを挿入し、挿入した偽装ブロックを常に迂回する分岐命令を挿入する。この場合、プログラム難読化装置10は、例えば、挿入された偽装ブロックの直後に、ラベルを付与し、挿入する分岐命令の分岐先は、付与したラベルを示すようにする。
ここで、偽装ブロックを迂回する分岐命令とは、偽装ブロックに含まれる全てのプログラム命令を実行しないように、偽装ブロックに含まれない他のプログラム命令へ分岐することを示す命令である。
(14)上記第1の実施の形態において、プログラム難読化装置10は、被秘匿情報の値を秘密情報用変数に置き換え、その後、等価プログラム命令挿入対象ブロックのそれぞれに対応する等価プログラム命令を挿入したが、これに限定されない。
プログラム難読化装置10は、等価プログラム命令挿入対象ブロックのそれぞれに対応する等価プログラム命令を挿入後、被秘匿情報の値を秘密情報用変数に置き換えてもよい。
(15)上記第1の実施の形態において、正常系での実行に全ての命令が必要なプログラムを難読化している。そのため、難読化後のプログラムが正常系で適切に動作することを保証するために、各分割後ブロック(以下、単に、「ブロック」という。)の最後に、次に実行すべきブロックの先頭への分岐命令を挿入する必要がある。
しかし、以下のような場合には、このような分岐命令の挿入の仕方を取る必要はない。
例えば、入力として与えられるプログラムに、正常系では必要のないダミーの命令が既に含まれている場合、プログラムの分割の仕方によっては、ブロックの先頭にダミーの命令が含まれたり、最後にダミーの命令が含まれたりする可能性がある。このような事態は、他の難読化手法により難読化された後のプログラムを、本発明による手法で、さらに難読化を行う場合などが考えられる。
このようなプログラムが入力として与えられる場合、ダミーの命令については実行を省略しても正常系での動作に影響はないため、正常系で必要な命令が始まる箇所を分岐先とした分岐命令を挿入することで、ブロックの先頭にあるダミーの命令の実行を省略してもよい。
また、正常系で必要な命令が終わる箇所に分岐命令を挿入することで、ブロックの最後にあるダミーの命令の実行を省略してもよい。
(16)また、偽装ブロックに挿入する分岐命令や、常に分岐先に分岐しない条件分岐命令の分岐先については、どこに分岐するとして正常系での実行に影響はない。したがって、これらの命令については、ブロックの先頭に分岐する分岐命令とする必要がなく、ブロックの途中に分岐するとしてもよい。
(17)本発明における命令群とは、1以上の命令からなるものとする。つまり、本発明における命令群は、1の命令からなる場合も含まれる。
(18)上記の各装置は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、各装置は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
(19)上記の各装置を構成する構成要素の一部又は全部は、1個のシステムLSI(Large Scale Integration:大規模集積回路)から構成されているとしてもよい。システムLSIは、複数の構成部を1個のチップ上に集積して製造された超多機能LSIであり、具体的には、マイクロプロセッサ、ROM、RAMなどを含んで構成されるコンピュータシステムである。前記RAMには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、システムLSIは、その機能を達成する。
ここでは、LSIとしたが、集積度の違いにより、IC、システムLSI、スーパーLSI、ウルトラLSIと呼称されることもある。
また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
さらには、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
(20)上記の各装置を構成する構成要素の一部又は全部は、各装置に脱着可能なICカード又は単体のモジュールから構成されているとしてもよい。前記ICカード又は前記モジュールは、マイクロプロセッサ、ROM、RAM、などから構成されるコンピュータシステムである。前記ICカード又は前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムに従って動作することにより、前記ICカード又は前記モジュールは、その機能を達成する。このICカード又はこのモジュールは、耐タンパ性を有するとしてもよい。
(21)本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD―ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号を、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
また、前記プログラム又は前記デジタル信号を前記記録媒体に記録して移送することにより、又は前記プログラム又は前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
(22)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
1.11 まとめ
(1)本発明は、プログラムを難読化するプログラム難読化装置であって、第一の入力プログラムにおける被秘匿情報を使用するプログラム命令または被秘匿命令を含む少なくとも一つ以上のプログラム命令からなる第一のプログラム命令群と同等の機能を有する、第二のプログラム命令群を生成する等価プログラム命令群生成手段と、前記第一の入力プログラムから前記第一のプログラム命令群を取り除き、前記第二のプログラム命令群を挿入して第一の出力プログラムを生成する等価プログラム生成手段と、正常系の実行結果を得るための任意の実行時には、実行されない1以上のプログラム命令からなる偽装ブロックを生成し、第二の入力プログラムに前記偽装ブロックを挿入し第二の出力プログラムを生成する偽装ブロック挿入後プログラム生成手段とを有し、少なくとも一つの前記偽装ブロックのプログラム命令の少なくとも一つは、前記第二のプログラム命令群を構成するプログラム命令が使用する変数を用いることを特徴とする。
(2)ここで、上記(1)に示すプログラム難読化装置において、前記偽装ブロックの少なくとも一つは、前記第二の入力プログラムのいずれかのプログラム命令への分岐命令を有するとしてもよい。
(3)ここで、上記(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを、1以上のプログラム命令から構成される分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、閉路が予め与えられた第一の所定数以上となるように前記偽装ブロックを生成するとしてもよい。
(4)ここで、上記(3)にて示すプログラム難読化装置は、さらに、前記与えられた第一の所定数を入力する入力手段を有するとしてもよい。
(5)ここで、上記(2)に示すプログラム難読化装置は、さらに、前記第二の入力プログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、予め与えられた第一の所定数以上のノード数からなる閉路の数が予め与えられた第二の所定数以上となるように偽装ブロックを生成するとしてもよい。
(6)ここで、上記(5)に示すプログラム難読化装置は、さらに、前記与えられた第一の所定数を入力する入力手段を有するとしてもよい。
(7)ここで、上記(5)に示すプログラム難読化装置は、さらに、前記与えられた第二の所定数を入力する入力手段を有するとしてもよい。
(8)ここで、上記(2)に示すプログラム難読化装置において、前記偽装ブロック挿入後ブロック生成手段は、さらに、前記第二のプログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第一のグラフを生成し、前記ノードブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第二のグラフを生成し、前記第二のグラフから前記第一のグラフを見つけ出す部分グラフ同型判定問題の難易度が予め与えられた第一の所定数以上になるように偽装ブロックを生成するとしてもよい。
(9)ここで、上記(8)に示すプログラム難読化装置は、さらに、前記与えられた第一の所定数を入力する入力手段を有するとしてもよい。
(10)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを任意の位置で第一のブロックと第二のブロックに分割し、正常系の実行結果を得るための任意の実行時には、真偽値が一定の第一の値となる分岐条件によって分岐先を決定する条件分岐命令を前記第一のブロックの最後に追加して第三のブロックを生成し、前記第三のブロックと前記第二のブロックからなる第三の出力プログラムを生成する擬似分岐命令挿入後プログラム生成手段を有し、前記条件分岐命令は、前記分岐条件が前記第一の値を取る場合の分岐先が前記第二のブロックの先頭であるとしてもよい。
(11)ここで、上記(1)に示すプログラム難読化装置において、前記等価プログラム命令群生成手段は、前記第一の出力プログラムに含まれる前記第二のプログラム命令群を構成する少なくとも一組の二つのプログラム命令を入れ替えたプログラムが、正常系のいずれかの実行時には前記第一の出力プログラムと機能が異なる前記第二のプログラム命令群を生成するとしてもよい。
(12)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第四の入力プログラムを1以上のプログラム命令から構成される細分化ブロックに分割する細分化ブロック生成手段と、各々の前記細分化ブロックから被入替ブロックを生成する被入替ブロック生成手段と、前記被入替ブロックの配置順序を変えて、第四の出力プログラムを生成する配置順序入替後プログラム生成手段配置順序入替後プログラム生成手段とを有し、前記被入替ブロック生成手段は、第一の前記細分化ブロックの最後のプログラム命令が対応する前記第四の入力プログラムのプログラム命令の、次のプログラム命令が対応する前記第二の前記細分化ブロックへの分岐命令を、前記第一の前記細分化ブロックの最後に追加して被入替ブロックとするとしてもよい。
(13)ここで、上記(12)に示すプログラム難読化装置において、前記被入替ブロック生成手段は、前記第一の前記細分化ブロックの最後のプログラム命令が無条件分岐でない場合に、前記第四の入力プログラムのプログラム命令の、次のプログラム命令が対応する前記第二の前記細分化ブロックへの分岐命令を、前記第一の前記細分化ブロックの最後に追加したものを被入替ブロックとするとしてもよい。
(14)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、前記偽装ブロックを含む第四の入力プログラムにおいて、前記偽装ブロック以外に存在するプログラム命令からなるプログラム命令群を1以上のプログラム命令から構成される細分化ブロックに分割して細分化ブロックを生成する細分化ブロック生成手段と、前記細分化ブロックまたは前記偽装ブロックである小ブロックから被入替ブロックを生成する被入替ブロック生成手段と、前記被入替ブロックの配置順序を変えて、第四の出力プログラムを生成する配置順序入替後プログラム生成手段配置順序入替後プログラム生成手段とを有し、前記被入替ブロック生成手段は、第一の前記小ブロックの最後のプログラム命令が対応する前記第四の入力プログラムのプログラム命令の、次のプログラム命令が対応する前記第二の前記小ブロックへの分岐命令を、前記第一の前記小ブロックの最後に追加したものを被入替ブロックとするとしてもよい。
(15)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第四の入力プログラムを構成する偽装ブロックの各々と、分割後ブロックの各々を細分化ブロックとし、各々の前記細分化ブロックから被入れ替えブロックを生成する被入替ブロック生成手段と、前記被入替ブロックの配置順序を変えて、第四の出力プログラムを生成する配置順序入替後プログラム生成手段とを有し、前記被入替ブロック生成手段は、第一の前記細分化ブロックの最後のプログラム命令が対応する前記第二の入力プログラムの次のプログラム命令が対応する第二の細分化ブロックへの分岐命令を、前記第一の細分化ブロックの最後に追加したものを被入替ブロックとするとしてもよい。
上記にて示したプログラム難読化装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。また、本発明のプログラム難読化装置は、著作権を有するデータを暗号化して配布するサービス産業において、経営的に、また継続的及び反復的に使用することができる。
本発明は、秘密情報を保持して実行するプログラムを、秘密情報を不正に解析することを困難にするプログラムに変換する技術に関する。
従来、暗号鍵などの被秘匿情報を扱うプログラムの不正な解析/改ざんを防止するための方法としてプログラムの制御構造/処理などを元のプログラムとは異なる形式に変換して、解析困難なプログラムにするプログラム難読化の方法が考えられている(例えば非特許文献1参照)。ここで、被秘匿情報とは、第三者には知られたくない情報である。
非特許文献1において、例えば、プログラムの出力結果に影響を与えない複製生成型偽装コードの挿入を行い、難読化プログラムを生成する方法が開示されている。
ここで、擬似分岐命令と偽装ブロックの挿入による難読化プログラムの生成方法について説明する。
難読化前のオリジナルのプログラムは、命令群1、命令群2、及び命令群3から構成されており、3つの命令群を順に実行するものとする。
この難読化方法では、オリジナルプログラムに、オリジナルプログラムの実行とは無関係なダミー変数を追加し、ダミー変数の値を書き換えるようなプログラム命令群を実行コード中にいくつか挿入する。また、ダミー変数の値によって分岐先が決定する擬似分岐命令が、命令群1と命令群2との間に追加される。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定しておく。さらに、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を偽装ブロックとする。
このように難読化されたプログラムは、命令群1、擬似分岐命令、命令群2、命令群3の順に実行される。追加された偽装ブロックは、プログラム中に存在するがデバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系の実行時には実行されることはない。
また、擬似分岐命令の挿入による難読化プログラムの生成方法について説明する。
難読化前のオリジナルのプログラムは、命令群1、命令群2、及び命令群3から構成されており、3つの命令群を順に実行するものとする。
この方法では、オリジナルプログラムにダミー変数を追加する。次に、ダミー変数の値によって分岐先が決定する擬似分岐命令を命令群1と命令群2との間に追加する。この際、擬似分岐命令は、プログラム実行時に決定するダミー変数の値によって必ず真偽が一定の値(例えば、常に「真」となる値)となる分岐条件を設定する。このとき、分岐の条件が真となる場合の分岐先を命令群2とし、分岐の条件が偽となる場合の分岐先を命令群3とする。
このように難読化されたプログラムは、命令群1、擬似分岐命令、命令群2、命令群3の順に実行される。
非特許文献1では、以上に述べたような難読化を行うことで、プログラムからアルゴリズムを推定することが困難になること、特定モジュールの位置の推定が困難になることが開示されている。例えば、暗号アルゴリズムのプログラムから暗号鍵を不正な解析から保護したい場合には、暗号アルゴリズムのモジュール位置の推定を困難にすることができる。
しかし、このような方法を用いてプログラムの制御構造を複雑にした場合でも、プログラム中のどこかには暗号鍵のような被秘匿情報が存在する。よって、プログラム中に存在する定数データを全て収集すれば、その中のいずれかが被秘匿情報となる。
そのため、例えば暗号アルゴリズムの場合では、平文と暗号文の組を入手可能な不正解析者であれば、プログラム中に存在する定数データを暗号鍵と仮定して平文を暗号化して得た暗号文が実際の暗号文と一致するかを調べていけば、いずれ本当の暗号鍵を見つけることができる。
非特許文献1では、さらに、この問題に対し被秘匿情報を含むプログラム命令を、複数のプログラム命令群に置き換えることでプログラムを難読化する方法を述べている。例えば、「d0=1234」というプログラム命令において「1234」が被秘匿情報である場合、「d0=1234」というプログラム命令を、「d0=230」、「d0=d0+1000」、「d0=d0+4」のようなプログラム命令群に置き換え、これらを分散して配置することが述べられている。このような方法を用いれば、プログラム中に存在する定数データを収集しても、その中から被秘匿情報を見つけることができなくなる。また、被秘匿情報が分割され、生成された複数のプログラム命令を分割秘密と呼ぶ。
鴨志田、松本、井上、"耐タンパーソフトウェアの構成手法に関する考察"、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の偽装ブロックから、オリジナルプログラムに含まれる正当プログラム命令、及び他の偽装ブロックの何れに分岐する分岐命令を挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、前記処理命令挿入手段は、前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、前記偽装ブロック挿入手段は、前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、生成したグラフの難易度が、所定の条件を満たすか否かを判定する判定部と、所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する第2生成部と、前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部による処理を行うように制御する制御部とを備えるとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックが挿入されたオリジナルプログラムからグラフを生成するので、偽装ブロックが挿入されたオリジナルプログラムを部分グラフ同型問題として扱うことができる。部分グラフ同型問題において、与えられた2つのグラフ(部分グラフと全体グラフ)があるとき、全体グラフから部分グラフを見つけ出すことが困難であることが知られている。これにより、偽装ブロックが挿入されたオリジナルプログラムからグラフから、偽装ブロックが挿入されていないオリジナルプログラムを見つけ出すことが困難になる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、ノード間を結ぶエッジの数と、ノード数とから算出される値(エッジ数)−(ノード数)が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから、エッジ数とノード数とを取得し、値(エッジ数)−(ノード数)が、前記所定数以上であるか否かを判定するとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準として、値(エッジ数)−(ノード数)を用いて、グラフ生成をすることができる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、グラフにおける閉路の数が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから閉路数を取得し、取得した閉路数が、前記所定数以上であるか否かを判定するとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準として、閉路数を用いて、グラフ生成をすることができる。
ここで、前記所定の条件を満たすとは、グラフが平面グラフでないことであり、前記判定部は、前記第1生成部にて生成されたグラフが平面グラフであるか否かを判定し、平面グラフでないと判定する場合に、前記所定の条件を満たすとするとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準を、平面グラフでないことを用いて、グラフ生成をすることができる。
ここで、前記プログラム難読化装置は、さらに、難読化の強度の指定を受け付ける受付手段を備え、前記所定の条件を満たすとは、第1の所定数以上のノード数からなる閉路の数が、ユ指定された前記強度に応じたグラフの難易度にて定まる第2の所定数以上であることであり、前記判定部は、前記第1生成部にて生成されたグラフから、第1の所定数以上のノード数からなる閉路の数を取得し、取得した閉路数が、前記第2所定数以上であるか否かを判定するとしてもよい。
この構成によると、プログラム難読化装置は、グラフの強度の基準として、閉路数を用いて、グラフ生成をすることができる。
ここで、前記偽装ブロック挿入手段は、前記オリジナルブロックに対して、前記演算式が前記演算順位で実行された場合に真偽値が一定値となる比較式を含み、前記比較式により真偽値が前記一定値となる場合の分岐先を次に実行する次オリジナルブロックとする条件分岐命令を、前記オリジナルブロックに挿入し、前記偽装ブロックが、前記オリジナルブロックの直後に挿入された場合には、前記条件分岐命令を前記制御命令とするとしてもよい。
この構成によると、プログラム難読化装置は、真偽値が一定値となる条件分岐命令をオリジナルブロックに挿入することにより、オリジナルプログラムの解析を困難にすることができる。
ここで、前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、前記処理命令挿入手段は、前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、前記偽装ブロック挿入手段は、前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、生成したグラフの強度が、所定の条件を満たすか否かを判定する判定部と、所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する、又は1のオリジナルブロックに、1の偽装ブロックを分岐先とし、常に前記分岐先には分岐しない条件分岐命令を前記オリジナルブロックに挿入する第2生成部と、前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部を行うように制御する制御部とを備えるとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックが挿入されたオリジナルプログラムからグラフを生成するので、偽装ブロックが挿入されたオリジナルプログラムを部分グラフ同型問題として扱うことができる。これにより、偽装ブロックが挿入されたオリジナルプログラムからグラフから、偽装ブロックが挿入されていないオリジナルプログラムを見つけ出すことが困難になる。
ここで、処理命令生成手段は、前記処理順序で実行した場合のみに、前記秘匿処理命令群による処理と同一の結果が得られるように、前記複数の処理命令を生成するとしてもよい。
この構成によると、プログラム難読化装置にて生成された前記複数の演算式は、正しい演算順序で実行した場合にのみ前記被秘匿情報を算出するので、不正解析者は、正しい演算順序を得ない限り、被秘匿情報を取得することができない。つまり、プログラム難読化装置は、オリジナルプログラムの解析を困難にすることができる。
ここで、前記偽装ブロック挿入手段は、前記オリジナルプログラムを、1以上の正当プログラム命令からなる複数の分割ブロックに分割する分割部と、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とするとしてもよい。
この構成によると、プログラム難読化装置は、オリジナルプログラムの先頭に位置する分割ブロックを除く他の分割ブロックの位置を入れ替えるので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記分割部は、さらに、前記偽装ブロックを、1以上のプログラム命令からなる複数の偽装分割ブロックに分割し、前記被入替ブロック生成部は、さらに、前記偽装分割ブロックのそれぞれから、偽装分割ブロックに、他の偽装分割ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックを構成する1以上の偽装分割ブロックのそれぞれを前記オリジナルプログラムに挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記被入替ブロック生成部は、さらに、前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、前記挿入部は、前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入するとしてもよい。
この構成によると、プログラム難読化装置は、偽装ブロックを前記オリジナルプログラムに挿入するので、オリジナルプログラムの解析を困難にすることができる。
ここで、前記オリジナルプログラムは、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は、受け付けた難読化対象プログラムと位置情報とを、記憶部100へ格納する。
入力部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言語の用語については、公知であるので、詳細な説明は省略する。
処理群C、処理群Eは、含まれる命令数が(N−1)個である以外は、処理群Aと同種のプログラム命令から構成されるプログラム命令群である。
処理部203には、被秘匿情報を保持するプログラム命令204が含まれる。プログラム命令204は、この難読化対象プログラム201の被秘匿情報「512」を含むプログラム命令「a=b+512;」である。
入力部101は、難読化対象プログラム201と、位置情報(ここでは、プログラム命令204の行番号)とを受け取り、受け取った難読化対象プログラム201と、位置情報とを記憶部100へ格納する。
入力部101は、難読化対象プログラム201の分割を指示する分割命令をブロック分割部102へ出力する。
以降、具体例を用いて説明する場合には、難読化対象プログラム201を用いて説明する。
1.1.2 記憶部100
記憶部100は、入力部101にて受け付けた難読化対象プログラムと、位置情報とを記憶している。
具体的には、記憶部100は、入力部101にて受け付けた難読化対象プログラム201と、この難読化対象プログラム201の被秘匿情報「512」を含むプログラム命令「a=b+512;」の位置を示す位置情報とを記憶している。
1.1.3 ブロック分割部102
ブロック分割部102は、入力部101から分割命令を受け取ると、記憶部100に記憶されている難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、受け取った難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割し、その後、分割した基本ブロックのそれぞれを、詳細に分割して、1以上の分割後ブロックを生成する。ここで、基本ブロックは、1以上のプログラム命令からなるプログラム命令群であって、プログラム命令群の先頭以外では他のプログラム命令群とは合流せず、プログラム命令群の最後以外では他のプログラム命令群へ分岐しないプログラム命令群である。なお、コンパイラに関する用語についての詳細な説明は省略する。
(1)基本ブロックの生成
ブロック分割部102は、入力部101から、難読化対象プログラムを受け取ると、受け取った難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。ここで、基本ブロックとは、開始位置が、処理部の先頭(難読化対象プログラムの入口のプログラム命令、つまり、難読化対象プログラムの一番最初に実行されるプログラム命令)、処理が合流するプログラム命令、または、分岐となるプログラム命令の次のプログラム命令であり、終了位置が、次に処理が合流するプログラム命令の一つ前のプログラム命令、処理部の最後(プログラムの出口の命令、つまり、難読化対象プログラムの一番最後に実行されるプログラム命令)、または、分岐となるプログラム命令であるブロックである。
なお、基本ブロック生成に関するより詳細については、コンパイラの分野で公知であるためここでの説明は省略する。
これにより、ブロック分割部102は、難読化対象プログラムを分割して複数の基本ブロックを生成することができる。また、難読化対象プログラムを構成する全てのプログラム命令は、ブロック分割部102により、いずれかの一つの基本ブロックに含まれるようになる。
(2)分割後ブロックの生成
ブロック分割部102は、生成した各基本ブロックを、以下のように分割して、1以上の分割後ブロックを生成する。
ブロック分割部102は、基本ブロックに含まれるプログラム命令数m、予め与えられた所定数Nとを用いて、基本ブロックを([(m−1)/N]+1)個の分割後ブロックに分割する。分割する際には、各ブロックのプログラム命令数が出来るだけ均等になるようにする。ここで、演算[a/b]は、除算a/bを施し、算出結果から小数点以下を切り捨てた整数を取得する演算式である。例えば、[5/2]=2となる。
(3)具体例
図3は、図2に示す難読化対象プログラムを、基本ブロックに分割した結果を示す。
図3における基本ブロック301a〜301cは、図2の関数funcの処理部203を分割して生成した基本ブロックである。
基本ブロック301aは、関数funcの入口のプログラム命令(関数の中で一番最初に実行されるプログラム命令)を含む処理群Aからはじまり、それ以降、最初に出現する条件分岐命令(for文、while文、do−while文、if文、switch文)であるプログラム命令「if(条件1)goto labelF;」までのプログラム命令を含む。ここで、この条件分岐命令を基本ブロック301aの最後にしたのは、基本ブロックはブロックの最後以外では分岐しないためである。
基本ブロック301bは、基本ブロック301aの最後のプログラム命令の次のプログラム命令からはじまり、それ以降、最初に合流する位置である「labelF」の直前のプログラム命令「a=b+512;」までのプログラム命令までを含む。ここで、合流位置の直前のプログラム命令を基本ブロック301bの最後にしたのは、基本ブロックはブロックの先頭以外では合流しないためである。なお、「labelF:」で合流するとしたのは、「labelF:」の位置に処理が移動する経路が2つ以上ありうるからである。すなわち、一方は基本ブロック301aの実行後に条件分岐により処理が移動する場合であり、もう一方は、基本ブロック301bの実行後に処理が移動する場合である。
基本ブロック301cは、基本ブロック301bの最後のプログラム命令の次のプログラム命令からはじまり、それ以降、関数funcの出口となるプログラム命令(関数の中で一番最後に実行されるプログラム命令)までを含む。
次に、図4は、図3に示す各基本ブロックを、分割後ブロックに分割した結果を示す。
処理群A、処理群B、処理群Cを含む基本ブロック301aは、含まれるプログラム命令数の合計が3N個である。なぜなら、ここでは、処理群A、処理群Bに含まれるプログラム命令の個数をそれぞれN個と、処理群Cに含まれるプログラム命令をN−1個としており、基本ブロック301aには、プログラム命令「if(条件1)goto labelF;」が含まれているからである。
基本ブロック301aから生成する分割後ブロック数は、式([(m−1)/N]+1)のmに3Nを代入し3である事がわかる。基本ブロック301aを3つに分割して生成したものが分割後ブロック401a〜401cである。
以下、同様に2N個のプログラム命令を含む基本ブロック301bを分割し生成した分割後ブロックが、分割後ブロック401d〜401eである。さらに、同様に3N個のプログラム命令を含む基本ブロック301cを分割し生成した分割後ブロックが、分割後ブロック401f〜401hである。
なお、本実施例では、基本ブロックを更に分割して分割後ブロックを生成する構成を示したが、基本ブロックそのものを分割後ブロックとして扱っても構わない。
1.1.4 等価プログラム命令生成部103
等価プログラム命令生成部103は、被秘匿情報を含むプログラム命令と同等の機能を有する命令群を生成する。以降の説明では、この命令群を構成する各命令を等価プログラム命令と呼ぶ。
本実施例では、簡単のため被秘匿情報である定数を、複数のプログラム命令から算出するようなプログラム命令群を生成し、生成したプログラム命令群のそれぞれを等価プログラム命令とする場合を示す。
等価プログラム命令生成部103は、等価プログラム命令に使用する変数名(秘密情報用変数名)の決定、グラフ作成、等価プログラム命令の挿入対象ブロックの決定、及び等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令の生成を行う。
(1)秘密情報用変数名の決定
等価プログラム命令生成部103は、等価プログラム命令に使用する変数の名前を決定する。
まず、等価プログラム命令生成部103は、難読化対象プログラムを解析し、このプログラム中で使用されている全ての変数名を調べる。次に、使用されているいずれの変数名とも重複しない変数名を生成し、生成した変数名を秘密情報用変数名として決定する。
(2)グラフ作成
等価プログラム命令生成部103は、難読化対象プログラムの構造を示すグラフを作成する。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、第一のノードが第二のノードへの分岐命令(goto文、break文、continue文、return文による無条件分岐命令、またはfor文、while文、do−while文、if文、switch文による条件分岐命令)を含む場合、または、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応するプログラム上のプログラム命令の一つ後のプログラム命令が第二のノードに含まれている場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。なお、グラフに関する用語については公知であるため、ここでの説明は省略する。グラフ生成に関するより詳細については、コンパイラの分野では公知であるため、ここでの説明は省略する。
このようなグラフにおいて、第一のノードは第二のノードの先行ブロック、第二のノードは第一のノードの後続ブロックと呼ぶ。
さらに、ここでは、位置情報にて示される被秘匿情報を含むプログラム命令が含まれるノードを秘密保有ノードと呼ぶ。また、プログラムの入り口となるプログラム命令(プログラムの一番最初に実行されるプログラム命令)を含むノードを開始ノード、プログラムの出口となるプログラム命令(プログラムの一番最後に実行されるプログラム命令)を含むノードを終了ノードと呼ぶこととする。
(3)等価プログラム命令の挿入対象ブロックの決定
等価プログラム命令生成部103は、生成したグラフに基づき、等価プログラム命令を挿入する分割後ブロックを決定する。
等価プログラム命令生成部103は、まず、秘密保有ノードに対応するブロックを第1の等価プログラム命令挿入対象ブロックとする。次に、第1の等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に第nの等価プログラム命令挿入対象ブロックの先行ブロックが一つだけであった場合、等価プログラム命令生成部103は、その先行ブロックを第(n+1)の等価プログラム命令挿入対象ブロックとする。第nの等価プログラム命令挿入対象ブロックの先行ブロックが複数ある場合には、等価プログラム命令生成部103は処理を中止し、等価プログラム命令数をnとする。このステップのいずれの操作においても、等価プログラム命令挿入対象ブロックに選ばれなかった分割後ブロックを、以降、等価プログラム非挿入ブロックと呼ぶ。
このような方法で、等価プログラム命令挿入対象ブロックを決定した場合、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系で実行された際において、第1の等価プログラム命令挿入対象ブロックが実行される前には必ず第2の等価プログラム命令挿入対象ブロックが実行されることになる。このことは、第1の等価プログラム命令挿入対象ブロックの先行ブロックが第2の等価プログラム命令挿入対象ブロックのみであることより分る。以下同様に、第(n−1)の等価ブロックが実行される前には必ず第nの等価プログラム命令挿入対象ブロックが実行される。まとめると、第1の等価プログラム命令挿入対象ブロックが実行される際には、それ以前に必ず第n、第(n−1)、・・・、第2の等価プログラム命令挿入対象ブロックがこの順番で実行されることが分る。なお、実際に等価プログラム命令を挿入する処理は、等価プログラム生成部104にて行われ、その詳細な動作は後述する。
(4)等価プログラム命令の生成
等価プログラム命令生成部103は、等価プログラム命令挿入対象ブロックに挿入する等価プログラム命令を生成する。等価プログラム命令生成部103は、等価プログラム命令数nと同数の等価プログラム命令を生成する。ここでは、等価プログラム命令数をNとし、以下、第1の等価プログラム命令から第Nまでの等価プログラム命令の生成手順を述べる。
(A)第1の等価プログラム命令の生成
等価プログラム命令生成部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の演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。
(C)第Nの等価プログラム命令の生成
等価プログラム命令生成部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);

を実行した際に得られる秘密情報用変数の値を、第二の値として算出する。
等価プログラム命令生成部103は、
式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+(第一の値);」
からなるプログラム命令群を順に処理した場合、処理の最後で秘密情報用変数は被秘匿情報の値になる。
この生成方法によると、例えば、第tの等価プログラム命令と、第(t+1)の等価プログラム命令とを入れ替えて、第1、2、・・・、t−1、t+1、t、t+2、・・・、Nの順に等価プログラム命令を実行した値と、第1から第Nまでの等価プログラム命令を実行した値とは異なることが分かる。
なお、ここでは等価プログラム命令として、掛け算と足し算とを組み合わせた演算とを示したが、これに限定されない。等価プログラム命令数nと同数の等価プログラム命令を用いて、被秘匿情報の値が取得される演算であれば、どのような演算を用いても構わない。
(5)具体例
等価プログラム命令生成部103は、まず、図2に示す難読化対象プログラム201を用いて、難読化対象プログラム201の関数funcで使用されている引数の変数名、およびの変数宣言部202で宣言されている変数名を調べ、これらと重複しない変数名を秘密情報用変数名とする。ここでは、秘密情報用変数名を「dkey」とする。
次に、等価プログラム命令生成部103は、図4に示す分割後ブロック401a〜401hを用いて、以下のようにしてグラフG100を生成する。ここでは、分割後ブロック401a〜401hのそれぞれを、ノード501a〜501hとして説明する。
分割後ブロック401aの最後のプログラム命令は無条件分岐命令ではない。また、分割後ブロック401aの次のプログラム命令は分割後ブロック401bのプログラム命令である。よって、等価プログラム命令生成部103は、ノード501aとノード501bにエッジ502aを設ける。
同様にして、等価プログラム命令生成部103は、エッジ502b〜エッジ502gを設ける。
分割後ブロック401cには分割後ブロック401fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1) goto labelF;」がある。よって、等価プログラム命令生成部103は、ノード501cとノード501fにエッジ502hを設ける。
等価プログラム命令生成部103は、上記の動作を行うことにより、難読化対象プログラム201の構造を示すグラフG100を生成する。生成したグラフG100を図5にて示す。
なお、このグラフにおいて、ノード501aは開始ノードであり、ノード501hは終了ノードであり、ノード501eは秘密保有ノードである。
次に、等価プログラム命令生成部103は、図5に示すグラフG100に基づいて、等価プログラム命令を挿入する分割後ブロックを、以下のようにして決定する。
等価プログラム命令生成部103は、秘密保有ノードであるノード501eに対応する分割後ブロック401eを第1の等価プログラム命令挿入対象ブロックとする。ノード501eには先行ブロックはノード501dのみであるので、等価プログラム命令生成部103は、ノード501dに対応する分割後ブロック401dを第2の等価プログラム命令挿入対象ブロックとする。以下、同様に、等価プログラム命令生成部103は、ノード501cに対応する分割後ブロック401cを第3の等価プログラム命令挿入対象ブロック、ノード501bに対応する分割後ブロック401bを第4の等価プログラム命令挿入対象ブロック、ノード501aに対応する分割後ブロック401aを第5の等価プログラム命令挿入対象ブロックとする。第5の等価プログラム命令挿入対象ブロックには先行ブロックがないので、等価プログラム命令生成部103は、等価プログラム命令数を「5」とする。
次に、等価プログラム命令生成部103は、等価プログラム命令数「5」と同数の等価プログラム命令を生成する。ここでは、次に、等価プログラム命令生成部103は、第1〜第5の等価プログラム命令を生成する。
等価プログラム命令生成部103は、整数「18」を選択し、第1の等価プログラム命令「dkey=18;」を生成する。
等価プログラム命令生成部103は、以下、第2〜第4の等価プログラム命令をそれぞれ決定する。
ここでは、等価プログラム命令生成部103は、第2の演算子から第4の演算子をそれぞれ順に、「/」、「*」、「/」とし、ランダムな値RA_2〜RA_4をそれぞれ値「2」、値「4」、値「5」とし、ランダムな値RB_2〜RB_4をそれぞれ値「54」、値「−32」、値「+8」とし、第2〜第4の等価プログラム命令をそれぞれ以下のように生成する。
「dkey=dkey/2+54;」、
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」
次に、等価プログラム命令生成部103は、第5の等価プログラム命令を生成する。
ここでは、等価プログラム命令生成部103は、ランダムな値RA_Nを値「9」とする。さらに、等価プログラム命令生成部103は、以下のプログラム命令群の実行し、第二の値を算出する。
「dkey=18;
dkey=dkey/2+54;
dkey=dkey*4−32;
dkey=dkey/5+8;」
このプログラム命令群を順に実行すると、「dkey」の値は、順に、値「18」、値「63」、値「220」、値「52」となり、等価プログラム命令生成部103は、値「52」を第二の値とする。
等価プログラム命令生成部103は、
式1:(第一の値)=(被秘匿情報の値)― { (第二の値)*RA_N }
に、被秘匿情報の値「512」と、第二の値「52」、RA_Nの値「9」を代入することにより、第一の値「44」を算出する。
等価プログラム命令生成部103は、第5の等価プログラム命令「dkey=dkey*9+44;」を生成する。
以上、まとめると、第1から第5の等価プログラム命令は順に
「dkey=18;」、
「dkey=dkey/2+54;」、
「dkey=dkey*4―32;」、
「dkey=dkey/5+8;」、
「dkey=dkey*9+44;」
となる。これらのプログラム命令を順に行った場合のdkeyの値は被秘匿情報の値「512」になることを確認することが出来る。
1.1.5 等価プログラム生成部104
等価プログラム生成部104は、被秘匿情報を秘密情報用変数に置き換え、等価プログラム命令生成部103にて生成したそれぞれの等価プログラム命令を、等価プログラム命令挿入対象ブロックに挿入し、等価プログラム挿入後ブロックを生成する。
等価プログラム生成部104は、生成した等価プログラム挿入後ブロックと、等価プログラム命令を挿入しなかった分割後ブロックとからなる等価プログラムを生成する。等価プログラムは、被秘匿情報を含む命令が等価プログラム命令群に置き換えられているが、置き換えを行う前のプログラムと同等の機能を有するプログラムである。
なお、以降において、等価プログラム命令を挿入しなかった分割後ブロックのことを、以降の説明では等価プログラム非挿入ブロックと呼ぶ。
等価プログラム生成部104は、秘密情報用変数の追加と、被秘匿情報の置き換えと、等価プログラム命令の挿入とを行う。
(1)秘密情報用変数の追加
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数を、難読化対象プログラムの変数宣言部に追加し、新たな変数宣言部を生成する。
(2)被秘匿情報の置き換え
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える。ここでは、等価プログラム生成部104は、秘密保有ノードに含まれる被秘匿情報の値を秘密情報用変数に置き換える。
(3)等価プログラム命令の挿入
等価プログラム生成部104は、等価プログラム命令生成部103にて生成した等価プログラム命令それぞれを、等価プログラム命令生成部103にて決定したいずれかの等価プログラム命令挿入対象ブロックに挿入する。以下、詳細な動作について説明する。
等価プログラム生成部104は、第t(t=1、2、・・・、N)の等価プログラム命令を第(N―t+1)の等価プログラム命令挿入対象ブロックに挿入し、第(N―t+1)の等価プログラム命令挿入後ブロックを生成する。
つまり、等価プログラム生成部104は、第1の等価プログラム命令を第Nの等価プログラム命令挿入対象ブロックに挿入し、第Nの等価プログラム命令挿入後ブロックを生成する。以下、同様に、第t(t=2、3、・・・、N)の等価プログラム命令を第(N−t+1)の等価プログラム命令挿入対象ブロックに挿入し、第tの等価プログラム命令挿入後ブロックを生成する。
ここで、第Nの等価プログラム命令は、被秘匿情報を秘密情報用変数に置き換えたプログラム命令よりも前に挿入することとする。これは、秘密情報用変数が被秘匿情報の値になってから、被秘匿情報を秘密情報用変数に置き換えることにより生成したプログラム命令を実行することを確実にするためである。
なお、以降の説明において、等価プログラム命令を挿入しなかった分割後ブロックのことを、等価プログラム非挿入ブロックと呼ぶ。
これにより、等価プログラム生成部104は、1以上の等価プログラム挿入後ブロックと、1以上の等価プログラム非挿入ブロックからなる等価プログラムを生成することができる。
また、第1〜第Nの等価プログラム挿入後ブロックを実行することにより、秘密情報用変数には被秘匿情報の値が設定されることがわかる。
なぜなら、上述したように、第1の等価プログラム命令挿入対象ブロックは、被秘匿情報を有する分割後ブロックである。さらに、第1の等価プログラム命令挿入対象ブロックが実行される際には、それ以前に必ず第N、第(N−1)、・・・、第2の等価プログラム命令挿入対象ブロックがこの順番で実行される。一方で、(1.1.4)で述べたように、第1、第2、・・・、第Nの等価プログラム命令をこの順に実行すれば、秘密情報用変数の値は被秘匿情報の値となる。したがって、等価プログラム生成部104は、上述したように、第1〜第Nの等価プログラム挿入後ブロックを生成することにより、第1の等価プログラム命令挿入後ブロックが実行される際には、それ以前に必ず第N、第(N−1)、・・・、第2の等価プログラム命令挿入後ブロックが実行されることとなり、その中に含まれる第1、第2、・・・、第(N−1)の等価プログラム命令が必ずこの順番で実行されることとなる。よって第1の等価プログラム命令挿入後ブロックにある第Nの等価プログラム命令が実行された際には、秘密情報用の変数は被秘匿情報の値となる。
したがって、等価プログラム生成部104にて生成された等価プログラムが、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系で実行された場合、第1の等価プログラム命令を含む第Nの等価プログラム挿入後ブロックが実行された際には、秘密情報用変数の値は第1の等価プログラム命令が実行された際に秘密情報用変数が取る値になる。また、第2の等価プログラム命令を含む第(N−1)の等価プログラム挿入後ブロックが実行された際には、第1〜第2の等価プログラム命令を順に行った場合の秘密情報用変数の値は、第1の等価プログラム命令と第2の等価プログラム命令を順に行った際に秘密情報用変数が取る値となる。以下、同様に、第t(t=3、4、・・・N)の等価プログラム命令を含む第(N−t+1)の等価プログラム命令挿入後ブロックが実行された際には、秘密情報用変数が、第1〜第tまでの等価プログラム命令を順に実行された際に秘密情報用変数が取る値となる。
(4)具体例
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加し、図6に示すように、新たな変数宣言部601を生成する。変数宣言部601は、変数宣言部202に、秘密情報用変数「dkey」の宣言文が加わったものである。このとき、等価プログラム生成部104は、秘密情報用変数「dkey」を、難読化対象プログラムの変数宣言部に追加する際に、変数「dkey」の変数の型を、被秘匿情報である「512」を示すことが出来る型にする(例えば、8ビット正整数型を用いると0〜255までしか表現できず512を示すことができないので、これは避ける。)。ここでは、例えば、変数「dkey」の変数の型をint型とする。
次に、等価プログラム生成部104は、位置情報にて示されるプログラム命令(ここでは、図2にて示すプログラム命令204)における被秘匿情報の値「512」を秘密情報用変数「dkey」に置き換えて、図6に示すように、新たなプログラム命令603を生成する。
次に、等価プログラム生成部104は、第1の等価プログラム命令「dkey=18;」を第5の等価プログラム命令挿入対象ブロックであるノード501aに挿入し、第5の等価プログラム命令挿入後ブロック602aを生成する。同様に第2の等価プログラム命令「dkey=dkey/2+54;」を第4の等価プログラム命令挿入対象ブロックであるノード501bに挿入し、第4の等価プログラム命令挿入後ブロック602bを生成する。以下、同様に、第3の等価プログラム命令挿入後ブロック602c、第2の等価プログラム命令挿入後ブロック602d、第1の等価プログラム命令挿入後ブロック602eを生成する。
ここで、等価プログラム命令を挿入しなかったノード501f〜501hを、以降では、等価プログラム命令非挿入ブロック603f〜603hとする。
図6にて、等価プログラム命令挿入後ブロック602a〜602eと、等価プログラム命令非挿入ブロック603f〜603hとを用いたグラフを示す。
1.1.6 偽装ブロック挿入後プログラム生成部105
偽装ブロック挿入後プログラム生成部105は、正常系での実行結果を得るためには必要なく、また実行されることもないプログラム命令群である偽装ブロックを生成する。偽装ブロックは、より詳細には、プログラム実行中にデバッガ等を用いてプログラムカウンターや変数の値を強制的に変更することを行わない限り、実行されることのないプログラム命令群である。
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロックと、等価プログラム命令挿入後ブロックと、等価プログラム命令非挿入ブロックからなる偽装ブロック挿入後プログラムを生成する。
偽装ブロック挿入後プログラム生成部105は、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成とを行う。
(1)偽装ブロック数の取得
偽装ブロック挿入後プログラム生成部105は、生成する偽装ブロック数を予め記憶している。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得する。偽装ブロック数の値は、例えば、「1000」等である。なお、説明の簡略化のために偽装ブロック数を値「4」とする。
ここで、偽装ブロック数の決定について説明する。ノード数(ここでは、偽装ブロック数)と、難読化の強度との関係は、図7に示すように、ノード数が大きくなるにつれ、まず難読化の強度は指数関数的に増加し(図7に示す関数G110)、ある時点から、ノード数が増大するにつれ、難読化の強度が指数関数的に減少する(図7に示す関数G120)。偽装ブロック数は、例えば、図7に示すt1〜t2の区間から選ばれることが望ましい。特に、t1に対応するノード数を偽装ブロック数とすることが望ましい。
(2)偽装ブロック本体の生成
偽装ブロック挿入後プログラム生成部105は、取得した偽装ブロック数にて示される個数の偽装ブロック本体を生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1以上の分割後ブロックをランダムに選択する。
偽装ブロック挿入後プログラム生成部105は、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する。
(3)偽装等価プログラム命令挿入後偽装ブロックの生成
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令それぞれを、対応する偽装ブロック本体のそれぞれに挿入し、偽装等価プログラム命令挿入後偽装ブロックを生成する。偽装等価プログラム命令は、等価プログラム生成部104にて用いた第t(t=2、3、・・・N)の等価プログラム命令と同じ変数、演算子を用いたプログラム命令である。
偽装ブロック挿入後プログラム生成部105は、以下の動作を、生成した全ての偽装ブロック本体に対して行い、偽装等価プログラム命令挿入後偽装ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、0以外の整数RA及びRBをランダムに選択し、選択したRA及びRBを用いて、偽装等価プログラム命令「(秘密情報用変数)=(秘密情報用変数)(演算子)(RA)+(RB);」を生成する。ここで、演算子は、掛け算を表す「*」または割り算を表す「/」のどちらかの演算子であり、どちらにするかはランダムに選択する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令を、対応する偽装ブロック本体の先頭に挿入する。
このように生成した偽装等価プログラム命令は、前述の等価プログラム命令と同じく秘密情報用変数を用いたプログラム命令であり、秘密情報用変数のみに着目した場合、等価プログラム命令と区別できないプログラム命令である。そのため、秘密情報用変数に着目して等価プログラム命令を収集しようとする不正解析者には、偽装等価プログラム命令と等価プログラム命令の区別がつかない。
(4)偽装分岐命令付き偽装ブロックの生成
偽装ブロック挿入後プログラム生成部105は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶している。本実施の形態では、所定数は、例えば、「13」である。
偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックのそれぞれに、無条件分岐命令及び条件分岐命令のうち少なくとも1の分岐命令を挿入し、偽装分岐命令付き偽装ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、等価プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。
偽装ブロック挿入後プログラム生成部105は、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
ここで、各ブロックに挿入するラベルのラベル名は、プログラム中で既に使用されているラベル名とは重複しないようにする。また、既に、ラベルが付与されている場合には、新たなラベルの挿入は行わない。
次に、偽装ブロック挿入後プログラム生成部105は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加する。なお、以降では、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令が追加されたブロックをTMPブロックと呼ぶ。
また、TMPブロックを生成する際に、追加する無条件分岐命令の分岐先は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックのそれぞれと、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム非挿入ブロックのそれぞれの中からランダムに選んだブロックの先頭とする。以下の説明では、この動作により生成した全てのTMPブロックからなるブロックの集合をTMPブロック群と呼ぶ。
次に、偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックのそれぞれと、ラベル挿入後等価プログラム挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれをノードと見なし、第一のノードが第二のノードへの分岐命令を含む場合に第一のノードと第二のノードの間にはエッジが存在すると見なし、また、第一のノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、最後のプログラム命令の一つ後のプログラム命令が対応するノードが第二のノードであった場合に、第一のノードと第二のノードの間にはエッジが存在すると見なし、ノードとエッジからなるグラフを生成する。
次に、偽装ブロック挿入後プログラム生成部105は、生成したグラフを用いて、ノード数、及びエッジ数を取得する。偽装ブロック挿入後プログラム生成部105は、式「(エッジ数)−(ノード数)」を算出し、算出した値が所定数以上であるか否かを判定する。
算出結果が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。中止した時点での、TMPブロック群を構成するTMPブロックを、以降、偽装ブロックと呼ぶ。
所定数以上でないと判定する場合には、偽装ブロック挿入後プログラム生成部105は、以下の動作を行う。
偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択する。次に、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成する。ここで、挿入する条件分岐命令の分岐条件は秘密情報用変数とランダムに決定した値とを比較する条件式とし、条件分岐命令の分岐先は、生成したグラフを構成するいずれかのノードに対応するブロックの先頭とする。条件分岐命令を挿入する位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
偽装ブロック挿入後プログラム生成部105は、条件分岐命令を挿入して生成した新たなTMPブロックと、挿入を行わず変更を加えていないTMPブロックからなるブロック群を新たなTMPブロック群とし、再度、グラフ生成を行い、上記に示す動作を行う。
(5)具体例
偽装ブロック挿入後プログラム生成部105は、予め記憶している偽装ブロック数「4」を取得する。
偽装ブロック挿入後プログラム生成部105は、図8に示すように、取得した偽装ブロック数にて示される個数の偽装ブロック本体701i〜701lを生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1の分割後ブロック401cを選択し、選択した分割後ブロック401cから分岐命令である「if(条件1)goto labelF;」を取り除いたプログラム命令群Cを用いて、偽装ブロック本体701iを生成する。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1の分割後ブロック401hを選択し、選択した分割後ブロック401hを用いて、偽装ブロック本体701jを生成する。偽装ブロック本体701k、701lについても同様の生成方法であるため、ここでの説明は省略する。
次に、偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体701i〜701lのそれぞれに対する偽装等価プログラム命令を生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令のそれぞれを偽装ブロック本体701i〜701lに挿入して、図9に示すような偽装等価プログラム命令挿入後偽装ブロック801i〜801lを生成する。
例えば、偽装ブロック挿入後プログラム生成部105は、偽装ブロック本体701iに対する偽装等価プログラム命令「dkey=dkey*34+7;」を生成し、生成した偽装等価プログラム命令を偽装ブロック本体701iに挿入することにより、偽装等価プログラム命令挿入後偽装ブロック801iを生成する。
偽装等価プログラム命令挿入後偽装ブロック801j〜801lについても同様の生成方法であるため、ここでの説明は省略する。
次に、偽装ブロック挿入後プログラム生成部105は、等価プログラム命令挿入後ブロック602a〜602e、等価プログラム命令非挿入ブロック603f〜603h、偽装等価プログラム命令挿入後偽装ブロック801i〜801lのそれぞれの先頭に、ラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001e、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002h、及びラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lを生成する。図10において、生成した各ブロックの一例を示す。ここで、ブロックB1000は、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eと、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hとからなり、上位から順に実行する、又は、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001cの実行後、分岐命令にてラベル挿入後等価プログラム命令非挿入ブロック1002fに分岐し、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hを実行するものとする。また、ブロックB1001は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lからなるものとする。
図10において、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eは、等価プログラム命令挿入後ブロック602a〜602eの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後等価プログラム命令挿入後ブロックである。
ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hは、等価プログラム命令非挿入ブロック603f〜603hの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後等価プログラム命令非挿入ブロックである。なお、等価プログラム命令非挿入ブロック603fの先頭には始めからラベル「labelF:」があったので、ラベルの挿入は行っていない。
ラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lは、偽装等価プログラム命令挿入後偽装ブロック801i〜801lの各ブロックの先頭にそれぞれ重複しないラベルを挿入して生成したラベル挿入後偽装等価プログラム命令挿入後偽装ブロックである。
次に、偽装ブロック挿入後プログラム生成部105は、生成したラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lからTMPブロック1101i〜1101lを生成する。図11において、生成したTMPブロック1101i〜1101lの一例を示す。
例えば、偽装ブロック挿入後プログラム生成部105は、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001e、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002h、及びラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003i〜1003lから、ラベル挿入後等価プログラム命令挿入後ブロック1001aを選択する。偽装ブロック挿入後プログラム生成部105は、選択したラベル挿入後等価プログラム命令挿入後ブロック1001aへ無条件に分岐するように、無条件分岐命令「goto labelA;」を生成し、生成した無条件分岐命令を、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロック1003iの最後に挿入して、TMPブロック1101iを生成する。
TMPブロック1101j〜1101lについても同様の生成方法であるため、ここでの説明は省略する。
次に、偽装ブロック挿入後プログラム生成部105は、以下のようにして図12にて示すグラフG200を生成する。ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eのそれぞれを、ノード1201a〜1201eとし、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hのそれぞれを、ノード1201f〜1201hとし、TMPブロック1101j〜1101lのそれぞれを、ノード1201i〜1201lとして説明する。
ラベル挿入後等価プログラム命令挿入後ブロック1001aの最後のプログラム命令は無条件分岐命令ではない。また、ラベル挿入後等価プログラム命令挿入後ブロック1001aの次のプログラム命令はラベル挿入後等価プログラム命令挿入後ブロック1001bのプログラム命令である。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201aとノード1201bにエッジ1202aを設ける。
同様にして、偽装ブロック挿入後プログラム生成部105は、エッジ1202b〜エッジ1202gを設ける。
ラベル挿入後等価プログラム命令挿入後ブロック1001cにはラベル挿入後等価プログラム命令非挿入ブロック1002fのラベル「labelF:」に条件分岐する条件分岐命令「if(条件1) goto labelF;」がある。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201cとノード1201fにエッジ1202hを設ける。
TMPブロック1101iの最後のプログラム命令は無条件分岐命令であるプログラム命令「goto labelA;」はラベル挿入後等価プログラム命令挿入後ブロック1001aのラベル「labelA:」に無条件分岐するプログラム命令である。よって、偽装ブロック挿入後プログラム生成部105は、ノード1201iとノード1201aにエッジ1202iを設ける。
同様にして、偽装ブロック挿入後プログラム生成部105は、エッジ1202j〜1202kを設ける。
偽装ブロック挿入後プログラム生成部105は、上記の動作を行うことにより、グラフG200を生成することができる。
次に、偽装ブロック挿入後プログラム生成部105は、図12にて示すグラフG200を用いて、「(エッジ数)−(ノード数)」の値が、所定数「13」以上であるか否かを判定する。
ここでは、「(エッジ数)−(ノード数)」の値は0であるので、偽装ブロック挿入後プログラム生成部105は、所定数以上でないと判定し、以下の動作を行う。
偽装ブロック挿入後プログラム生成部105は、TMPブロック1101i〜1101lからTMPブロック1101jをランダムに選択し、選択したTMPブロック1101jに条件分岐命令を挿入して、図13にて示す新たなTMPブロック1301jを生成する。
偽装ブロック挿入後プログラム生成部105は、TMPブロック1301jを生成する際に、まず、選択したTMPブロック1101jに挿入する条件分岐命令を生成する。ここでは、秘密情報用変数を「dkey」とし、ランダムな値を値「273」とし、「dkey」と値「273」との比較を条件式とする。さらに、ノード1201a〜1201lまでのノードからノード1201dを、ランダムにノードを選択する。偽装ブロック挿入後プログラム生成部105は、生成する条件分岐命令の条件分岐先を、選択したノード1201dに対応するブロックであるラベル挿入後等価プログラム命令挿入後ブロック1001dの先頭にする。このようにして生成した条件分岐命令に対応するプログラム命令が、プログラム命令「if(dkey>273)goto labelD;」である。次に、偽装ブロック挿入後プログラム生成部105は、TMPブロック1101jの一番最後のプログラム命令であり、無条件分岐命令でもあるプログラム命令「goto label B;」の一つ手前に生成したプログラム命令を挿入して、TMPブロック1301jを生成する。
以上の動作が終了した後、偽装ブロック挿入後プログラム生成部105は、生成したTMPブロック1301jと、変更を行わなかったTMPブロックであるTMPブロック1101i、1101kおよび1101lからなるブロック群を新たなTMPブロック群とし、グラフの作成を行う。
ここで、新たなTMPブロック群を用いたグラフG210を図14に示す。グラフG200との違いは、ノード1201jがノード1205jとなり、ノード1205jとノード1201bとにエッジ1202jを設け、ノード1205jとノード1201dとにエッジ1302jを設ける。なお、TMPブロック1301jとノード1205jとが対応している。
1.1.7 擬似分岐命令挿入後プログラム生成部106
擬似分岐命令挿入後プログラム生成部106は、偽装ブロック挿入後プログラム生成部105にて生成したラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。ここで、ラベル挿入後等価プログラム命令挿入後ブロックに挿入される擬似分岐命令は、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系のプログラム実行時には必ず真偽が一定の値となる分岐条件分岐命令である。
擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック挿入後プログラム生成部105にて生成した偽装ブロックのそれぞれとからなる擬似分岐命令挿入後プログラムを生成する。
擬似分岐命令挿入後プログラム生成部106は、第Nのラベル挿入後等価プログラム命令挿入後ブロックから第1のラベル挿入後等価プログラム命令挿入後ブロックに対して、等価命令挿入後ブロック秘密情報用の変数値の決定と、擬似分岐命令の挿入とを行うことにより、擬似分岐命令挿入後プログラムを生成する。
以下に、擬似分岐命令挿入後プログラム生成部106が、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックから擬似分岐命令挿入後ブロックを生成する場合について説明する。
擬似分岐命令挿入後プログラム生成部106は、第1の等価プログラム命令から第(N−t+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の分岐先をラベル挿入後等価プログラム命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロックのそれぞれからランダムに選択した1のブロックとし、第2の分岐先を次ブロックとする。
なお、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先と第2の分岐先が、重複しないように、各ブロックを選択する。
以下に具体例を示す。
ここでは、ラベル挿入後等価プログラム命令挿入後ブロック1001a〜1001eから図15に示す擬似分岐命令挿入後ブロック1401a〜1401eが生成される具体例について説明する。
擬似分岐命令挿入後プログラム生成部106は、まず、第N(ここでは、N=5)ラベル挿入後等価プログラム命令挿入後ブロック1001aから擬似分岐命令挿入後ブロック1401aを以下のようにして生成する。
擬似分岐命令挿入後プログラム生成部106は、第1の等価プログラム命令「dkey=18;」を取得し、取得した第1の等価プログラム命令を用いて、等価命令挿入後ブロック秘密情報用の変数値「18」を算出する。
擬似分岐命令挿入後プログラム生成部106は、定数m(ここでは、「46」)及び比較演算子(ここでは、「<」)をランダムに選択し、条件式「dkey < 46」を生成する。
擬似分岐命令挿入後プログラム生成部106は、変数「dkey」に、算出した等価命令挿入後ブロック秘密情報用の変数値「18」を代入し、条件式の真偽を判定する。
この場合、条件式は真となり、擬似分岐命令挿入後プログラム生成部106は、第1の分岐先として次ブロック(ここでは、ラベル名が「labelB」であるブロック)を選択し、第2の分岐先としてラベル名が「labelC」を選択し、擬似分岐命令であるプログラム命令「if(dkey<46)goto labelB;else goto labelC;」を生成する。
擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令を第5のラベル挿入後等価プログラム命令挿入後ブロック1001aの最後に挿入して、擬似分岐命令挿入後ブロック1401aを生成する。
擬似分岐命令挿入後ブロック1401b〜1401eについても同様の生成方法であるため、ここでの説明は省略する。
1.1.8 被入替ブロック群生成部107
被入替ブロック群生成部107は、ラベル挿入後等価プログラム非挿入ブロックのそれぞれと、偽装ブロックのそれぞれと、偽装分岐命令挿入後ブロックのそれぞれからなるブロック群から、デバッガ等を用いてプログラムカウンターを強制的に変更する等の特別な操作を行わない正常系の実行時に、goto文を用いずに他のブロックに移動する経路を有するブロックを1以上抽出する。
被入替ブロック群生成部107は、抽出した1以上のブロックそれぞれに対して、他のブロックへの移動する経路をgoto文を用いた分岐に置き換える。
また、被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロックを抽出し、抽出したブロックの最後の命令がプログラム命令「return;」、「exit();」以外のプログラム命令であった場合には、ブロックの最後にプログラム命令「return;」を追加する。
被入替ブロック群生成部107は、変更を加えたブロックのそれぞれと、置き換えを行わなかったブロックのそれぞれからなる被入替ブロック群を生成する。
なお、以降の説明において、被入替ブロック群に含まれるブロックを被入替ブロックと呼ぶ。
以下に具体例を示す。
被入替ブロック群生成部107が、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hと、偽装ブロックのそれぞれと、擬似分岐命令挿入後ブロック1401a〜1401eとから生成した被入替ブロック群を、図16に示す。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム命令非挿入ブロック1002f〜1002hと、偽装ブロックのそれぞれと、擬似分岐命令挿入後ブロック1401a〜1401eとから、goto文を用いずに他のブロックに移動する経路を有するブロック(ここでは、ラベル挿入後等価プログラム命令非挿入ブロック1002f、及び1002g)を抽出する。
被入替ブロック群生成部107は、抽出したラベル挿入後等価プログラム命令非挿入ブロック1002fに対して、他のブロック(ここでは、次ブロックである。)へ移動する経路を、無条件分岐命令であるプログラム命令「goto labelG;」を挿入し、被入替ブロック1501fを生成する。
抽出したラベル挿入後等価プログラム命令非挿入ブロック1002gに対しても同様に、被入替ブロック群生成部107は、無条件分岐命令であるプログラム命令「goto labelH;」を挿入し、被入替ブロック1501gを生成する。
被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロック(ここでは、ラベル挿入後等価プログラム命令非挿入ブロック1002h)を抽出する。このとき、ラベル挿入後等価プログラム命令非挿入ブロック1002hには処理群Hが含まれ、処理群Hは命令群Hである。その命令群Hの最後のプログラム命令は、「return;」であるため、被入替ブロック群生成部107は、ブロックの最後にプログラム命令「return;」を追加しないで、被入替ブロック1501hを生成する。つまり、ラベル挿入後等価プログラム命令非挿入ブロック1002hと被入替ブロック1501hとは同一である。
また、擬似分岐命令挿入後ブロック1401a〜1401eのそれぞれは、他のブロックへの分岐はgoto文を使っているため、被入替ブロック群生成部107は、擬似分岐命令挿入後ブロック1401a〜1401eのそれぞれに変更を加えることなく、被入替ブロック1501a〜1501eを生成する。
偽装ブロックについても同様に偽装ブロックそのものを被入替ブロックとし、被入替ブロック群生成部107は、被入替ブロック1501j〜1501lを生成する。
1.1.9 配置順序入替部108
配置順序入替部108は、被入替ブロック群生成部107で生成した被入替ブロック群に含まれる各被入替ブロックのうち、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替える。
配置順序入替部108は、等価プログラム生成部104にて生成した新たな変数宣言部と、配置順序を入れ替えた被入替ブロック群とからなる難読化プログラムを生成する。
配置順序入替部108は、生成した難読化プログラムを、当該難読化プログラムを実行する外部装置へ配布する。
以下に具体例を示す。
配置順序入替部108は、図16にて示す被入替ブロック1501b〜1501lの入れ替えを行う。ここでは、配置順序入替部108は、順に、被入替ブロック1501a、被入替ブロック1501g、被入替ブロック1501d、被入替ブロック1501c、被入替ブロック1501e、被入替ブロック1501l、被入替ブロック1501f、被入替ブロック1501b、被入替ブロック1501h、被入替ブロック1501k、被入替ブロック1501i、被入替ブロック1501jとなるように、入れ替えを行う。
配置順序入替部108は、入れ替えを行った被入替ブロック群と、等価プログラム生成部104にて生成した変数宣言部601とから、図17にて示す難読化プログラム1500を生成する。
1.2 プログラム難読化装置10の動作
ここでは、プログラム難読化装置10の動作について説明する。
1.2.1 動作概要
ここでは、プログラム難読化装置10が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて説明する。
プログラム難読化装置10の入力部101は、難読化対象プログラム、及び位置情報を受け付ける(ステップS5)。
入力部101は、受け付けた難読化対象プログラムと位置情報とを記憶部100へ格納する。
ブロック分割部102は、記憶部100から難読化対象プログラムを読み出し、読み出した難読化対象プログラムに含まれる処理部を、1以上の基本ブロックに分割する。その後、ブロック分割部102は、分割した基本ブロックのそれぞれを、詳細に分割して、1以上の分割後ブロックを生成する(ステップS10)。
プログラム難読化装置10は、等価プログラム生成処理を施して、等価プログラムを生成する(ステップS15)。
プログラム難読化装置10は、偽装ブロック挿入後プログラムの生成処理を施して、偽装ブロック挿入後プログラムを生成する(ステップS20)。
プログラム難読化装置10の擬似分岐命令挿入後プログラム生成部106は、ラベル挿入後等価プログラム命令挿入後ブロックに、擬似分岐命令を挿入して擬似分岐命令挿入後ブロックを生成する。擬似分岐命令挿入後プログラム生成部106は、生成した擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック挿入後プログラム生成部105にて生成した偽装ブロックのそれぞれとからなる擬似分岐命令挿入後プログラムを生成する(ステップS25)。
被入替ブロック群生成部107は、ラベル挿入後等価プログラム非挿入ブロックのそれぞれと、偽装ブロックのそれぞれと、偽装分岐命令挿入後ブロックのそれぞれからなるブロック群から、正常系の実行時に、goto文を用いずに他のブロックに移動する経路を有するブロックを1以上抽出する。被入替ブロック群生成部107は、抽出した1以上のブロックそれぞれに対して、他のブロックへの移動する経路をgoto文を用いた分岐に置き換える。また、被入替ブロック群生成部107は、プログラムの出口となるプログラム命令を含むブロックを抽出し、抽出したブロックの最後の命令がプログラム命令「return;」、「exit();」以外のプログラム命令であった場合には、ブロックの最後にプログラム命令「return;」を追加する。被入替ブロック群生成部107は、変更を加えたブロックのそれぞれと、置き換えを行わなかったブロックのそれぞれからなる被入替ブロック群を生成する(ステップS30)。
配置順序入替部108は、被入替ブロック群生成部107で生成した被入替ブロック群に含まれる各被入替ブロックのうち、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替える。配置順序入替部108は、等価プログラム生成部104にて生成した新たな変数宣言部と、配置順序を入れ替えた被入替ブロック群とからなる難読化プログラムを生成する(ステップS35)。
配置順序入替部108は、生成した難読化プログラムを、当該難読化プログラムを実行する外部装置へ配布する(ステップS40)。
1.2.2 等価プログラム生成処理の動作
ここでは、図18に示す等価プログラム生成処理(ステップS15)の動作について、図19に示す流れ図を用いて説明する。
等価プログラム命令生成部103は、難読化対象プログラムを解析し、このプログラム中で使用されている全ての変数名を調べる。次に、使用されているいずれの変数名とも重複しない変数名を生成し、生成した変数名を秘密情報用変数名として決定する(ステップS100)。
等価プログラム命令生成部103は、ブロック分割部102により生成された分割後ブロックのそれぞれをノードと見なし、グラフを生成する。
等価プログラム命令生成部103は、グラフ生成ステップで生成したグラフに基づき、等価プログラム命令を挿入する第1〜第Nの等価プログラム命令挿入対象ブロックを取得する(ステップS105)。ここで、Nは1以上の整数である。
等価プログラム命令生成部103は、取得した1以上の等価プログラム命令挿入対象ブロックそれぞれに対応する等価プログラム命令を生成する(ステップS110)。
等価プログラム生成部104は、等価プログラム命令生成部103にて決定された秘密情報用変数を、難読化対象プログラムの変数宣言部に追加し、新たな変数宣言部を生成する(ステップS115)。
等価プログラム生成部104は、記憶部100にて記憶されている位置情報を取得し、取得した位置情報にて示されるプログラム命令に含まれる被秘匿情報の値を秘密情報用変数に置き換える(ステップS120)。
等価プログラム生成部104は、第t(t=1、2、・・・、N)の等価プログラム命令を第(N―t+1)の等価プログラム命令挿入対象ブロックに挿入し、第(N―t+1)の等価プログラム命令挿入後ブロックを生成する。等価プログラム生成部104は、1以上の等価プログラム挿入後ブロックと、1以上の等価プログラム非挿入ブロックからなる等価プログラムを生成する(ステップS125)。
1.2.3 偽装ブロック挿入後プログラムの生成処理の動作
ここでは、図18に示す偽装ブロック挿入後プログラムの生成処理(ステップS20)の動作について、図20に示す流れ図を用いて説明する。
偽装ブロック挿入後プログラム生成部105は、記憶している偽装ブロック数を取得することにより、偽装ブロック数を決定する(ステップS200)。
偽装ブロック挿入後プログラム生成部105は、ブロック分割部102で生成した分割後ブロックの中から1以上の分割後ブロックをランダムに選択し、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する(ステップS205)。偽装ブロック挿入後プログラム生成部105は、このステップを取得した偽装ブロック数分だけ行う。
偽装ブロック挿入後プログラム生成部105は、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成し、生成した偽装等価プログラム命令を対応する偽装ブロック本体に挿入し、偽装ブロック数にて示される個数分の偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS210)。
偽装ブロック挿入後プログラム生成部105は、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。偽装ブロック挿入後プログラム生成部105は、生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS215)。
偽装ブロック挿入後プログラム生成部105は、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックそれぞれの最後に無条件分岐命令を追加して、偽装ブロック数にて示される個数分のTMPブロックを生成する。偽装ブロック挿入後プログラム生成部105は、生成した1以上のTMPブロックからなるTMPブロック群を生成する(ステップS220)。
偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックのそれぞれと、ラベル挿入後等価プログラム挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれをノードとして、グラフを生成する(ステップS225)。
偽装ブロック挿入後プログラム生成部105は、値「(エッジ数)−(ノード数)」が所定数以上であるか否かを判定する(ステップS230)。
算出結果が所定数以上であると判定する場合には(ステップS230における「YES」)、偽装ブロック挿入後プログラム生成部105は、処理を終了する。
所定数以上でないと判定する場合には(ステップS230における「NO」)、偽装ブロック挿入後プログラム生成部105は、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択し、選択したTMPブロックに、条件分岐命令を挿入し、新たなTMPブロックを生成して、新たなTMPブロック群を更新(生成)し(ステップS235)、ステップS225へ戻る。
1.3 第1の実施の形態の効果
このような構成によると、難読化されたプログラムから、秘密情報を見つけ出すことを困難にすることができる。
まず、等価プログラム命令生成部103、等価プログラム生成部104によって、秘密情報を含む命令を等価プログラム命令に置き換えプログラム上の様々な位置に配置している。このような構成により、不正解析者はプログラム中に含まれる定数値を全て収集したとしても、秘密情報を見つけることができなくなる。また、等価プログラム命令を分割後ブロックをまたがって、難読化後のプログラムの様々な位置に配置したことにより、不正解析者が等価プログラム命令を見つけ出すことを困難にすることが出来る。
さらに、偽装ブロック挿入後プログラム生成部105で、偽装ブロックに等価プログラム命令と同じ変数を用いたプログラム命令である偽装等価プログラム命令を挿入したことで、不正解析者がプログラム中の特定の変数を用いた処理を収集したとしても、その中に等価プログラム命令と、偽装等価プログラム命令が含まれることとなり、等価プログラム命令の収集を困難にすることができる。
さらに、等価プログラム命令生成部103で、複数の演算を組み合わせて等価プログラム命令を生成している。よって、不正解析者がプログラム中に含まれる等価プログラム命令の集合を見つけ出したとしても、見つけ出した集合の等価プログラム命令を正しい順序に並べ替えることが出来なければ、被秘匿情報の値を算出することができない。例えば、等価プログラム命令がプログラム命令「(秘密情報用変数名)=RA_0;」、「(秘密情報用変数名)+=RA_2;」「(秘密情報用変数名)+=RA_3;」であれば、2番目と3番目の処理の順番を逆にしても同じ被秘匿情報の値を算出することが出来てしまうが、実施例で述べた方法では、そのような事が起こらない。
さらに、不正解析者が、難読化対象プログラム(難読化前のプログラム)のアルゴリズム、および、本難読化手法自体を知っている場合、その情報を用いて不正解析を行うことが考えられる。この詳細を説明する。
例えば、DES、AES等の暗号プログラムは広くアルゴリズムが公開されており、不正解析者が難読化対象プログラムのアルゴリズムを知ることは容易である。そのような難読化対象プログラムにおいても、被秘匿情報である暗号鍵を不正解析から保護したいという要求がある。
さて、難読化対象プログラムのアルゴリズムを知る不正解析者は難読化前のプログラムのグラフを作成することができると考えることが出来る(例えば、図5のグラフ)。また、難読化後のプログラムを解析して、難読化後のプログラムのグラフを作成することができると考えることが出来る(例えば、図12のグラフ)。
この2つのグラフを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフに相当するグラフを見つけ出すことで、難読化後のプログラムから偽装ブロックを取り除いた部分を見つけ出すという不正解析が考えられる。
本実施の形態では、偽装ブロック挿入後プログラム生成部105で、偽装ブロックに偽装分岐命令の挿入を行っていることにより、難読化後のプログラムのグラフの構成を複雑になるので、上記の不正解析が困難になる。
さらに、配置順序入替部108により、難読化後のプログラムのグラフの構造を複雑にすることで上記の不正解析を困難にすることができる。
また、暗号鍵を有する暗号化プログラムにおいて、プログラム難読化装置は、前記暗号鍵を被秘匿情報として、暗号化プログラムを難読化するので、不正解析者は、暗号鍵を解析することが困難になる。これにより、著作権を保護すべきデータを暗号化して暗号化データを生成した場合、暗号鍵を不正に取得することが困難であるので、暗号化データを不正に解析することも困難になる。
1.4 変形例1
上記第1の実施の形態では、プログラム難読化装置10は、TMPブロック群を用いてグラフを生成したが、これに限定されない。
プログラム難読化装置は、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを備える代わりに、偽装ブロック挿入後プログラム生成部105と、擬似分岐命令挿入後プログラム生成部106とを1つの構成要素とする擬似分岐命令挿入後プログラム生成部106aを備えるとし、擬似分岐命令挿入後プログラムを用いてグラフを生成してもよい。
1.4.1 擬似分岐命令挿入後プログラム生成部106a
擬似分岐命令挿入後プログラム生成部106aは、偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成と、偽装分岐命令付き偽装ブロックの生成と、TMPブロック群の生成と、擬似分岐命令挿入後プログラムの生成とを行う。
なお、擬似分岐命令挿入後プログラム生成部106aが行う偽装ブロック数の取得と、偽装ブロック本体の生成と、偽装等価プログラム命令挿入後偽装ブロックの生成に係る動作は、偽装ブロック挿入後プログラム生成部105にて示す偽装ブロック数の取得、偽装ブロック本体の生成、及び偽装等価プログラム命令挿入後偽装ブロックの生成に係る動作と同様であるため、ここでの説明は省略する。
以下において、TMPブロック群の生成と、擬似分岐命令挿入後プログラムの生成とについて説明する。
(1)TMPブロック群の生成
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム生成部104にて生成した等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、生成した各々の偽装等価プログラム命令挿入後偽装ブロックの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する。
ここで、各ブロックに挿入するラベルのラベル名は、プログラム中で既に使用されているラベル名とは重複しないようにする。また、既に、ラベルが付与されている場合には、新たなラベルの挿入は行わない。
次に、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックの最後に無条件分岐命令を追加して、TMPブロックを生成する。
擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックのそれぞれに対して、TMPブロックを生成することにより、TMPブロック群を生成する。
次に、擬似分岐命令挿入後プログラム生成部106aは、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックから擬似分岐命令挿入後ブロックを生成する。生成方法は、上記第1の実施の形態にて示す擬似分岐命令挿入後プログラム生成部106が行う生成方法と同様であるため、説明は省略する。
次に、擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムに含まれる各ブロックをノードと見なして、グラフを生成する。グラフの生成方法は、上記第1の実施の形態にて示す偽装ブロック挿入後プログラム生成部105にて示すグラフの生成方法と同様であるため説明は省略する。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する。ここで、閉路とは、始点となるノードから終点となるノードに至る経路のうち、始点と終点が同じノードである経路である。ここで、所定数とは、ユーザが所望する難読化の強度に応じて定まる数であり、例えば、「13」である。
所定数以上でないと判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれ、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれ、TMPブロックのそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成する。
ここで、選択されたブロックが、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックである場合には、擬似分岐命令挿入後プログラム生成部106aは、第1〜第(N−t+1)の等価プログラムを順次実行して、等価命令挿入後ブロック秘密情報用の変数値を算出する。擬似分岐命令挿入後プログラム生成部106aは、定数mをランダムに選択し、秘密情報用変数dkeyに算出した値を代入し、条件式「dkey (比較演算子) m」が偽となるように、比較演算子を決定し、決定した比較演算子を用いた擬似分岐命令「if (dkey (比較演算子) m) then 分岐先」を生成する。ここで、分岐先は、TMPブロックの先頭とする。また、条件分岐命令の挿入位置は、ブロックの最後とする。
選択されたブロックが、ラベル挿入後等価プログラム命令非挿入ブロックである場合には、第1〜第Nの等価プログラムを順次実行して、等価命令挿入後ブロック秘密情報用の変数値を算出する。以降は、上記と同様の動作であるので、説明は省略する。また、条件分岐命令の挿入位置は、ブロックの最後とする。
選択されたブロックが、TMPブロックである場合には、上記に示す偽装ブロック挿入後プログラム生成部105による新たなTMPブロックの生成と同様であるため、説明は省略する。また、条件分岐命令の挿入位置は、挿入対象ブロックが有する一番最初の分岐命令よりも前の位置とする。挿入対象ブロックが分岐命令を有さない場合には、挿入対象ブロックの最後に追加するものとする。
擬似分岐命令挿入後プログラム生成部106aは、条件分岐命令を挿入して生成した新たなブロックと、挿入を行わず変更を加えていない各ブロックとを用いて、再度、グラフ生成を行い、上記に示す動作を行う。
所定数以上であると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、生成したグラフが、平面グラフ(交差を含まないグラフ)であるか否かを判定する。
平面グラフでないと判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、動作を終了する。
平面グラフであると判定する場合には、擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後等価プログラム命令挿入後ブロックのそれぞれ、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれ、TMPブロックのそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、条件分岐命令を挿入して生成した新たなブロックと、挿入を行わず変更を加えていない各ブロックとを用いて、再度、グラフ生成を行い、上記に示す動作を行う。
なお、平面グラフに関しては、グラフ理論の分野で公知であるので、ここでの説明は省略する。
また、擬似分岐命令挿入後プログラム生成部106aは、閉路数を取得する代わりに、生成したグラフのエッジ数、ノード数を数え、式「(エッジ数)―(ノード数)+1」で算出した値を閉路数の近似値として用いてもよい。
1.4.2 動作概要
ここでは、変形例1におけるプログラム難読化装置が難読化対象プログラムを難読化する動作概要について、図18に示す流れ図を用いて変更点のみ説明する。
変形例1におけるプログラム難読化装置は、図18に示すステップS5〜15を実行後、ステップS20における偽装ブロック挿入後プログラムの生成処理を行う代わりに、擬似分岐命令挿入後プログラムの生成処理を行う。
変形例1におけるプログラム難読化装置は、擬似分岐命令挿入後プログラムの生成処理を実行後、ステップS25を省略し、ステップS30以降を行う。
1.4.3 擬似分岐命令挿入後プログラムの生成処理
ここでは、擬似分岐命令挿入後プログラムの生成処理の動作について、図21に示す流れ図を用いて説明する。
擬似分岐命令挿入後プログラム生成部106aは、記憶している偽装ブロック数を取得することにより、偽装ブロック数を決定する(ステップS300)。
擬似分岐命令挿入後プログラム生成部106aは、分割後ブロックの中から1以上の分割後ブロックをランダムに選択し、選択した1以上の分割後ブロックそれぞれのプログラム命令群から、分岐命令(無条件分岐命令および条件分岐命令)を取り除いたプログラム命令群と同じプログラム命令群からなるプログラム命令群を偽装ブロック本体として生成する(ステップS305)。擬似分岐命令挿入後プログラム生成部106aは、このステップを取得した偽装ブロック数分だけ行う。
擬似分岐命令挿入後プログラム生成部106aは、生成した偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を生成し、生成した偽装等価プログラム命令を対応する偽装ブロック本体に挿入し、偽装ブロック数にて示される個数分の偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS310)。
擬似分岐命令挿入後プログラム生成部106aは、等価プログラム命令挿入後ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令挿入後ブロックを生成、プログラム命令非挿入ブロックそれぞれの先頭に異なるラベルを挿入し、ラベル挿入後等価プログラム命令非挿入ブロックを生成、及び生成した偽装等価プログラム命令挿入後偽装ブロックそれぞれの先頭に異なるラベルを追加し、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックを生成する(ステップS315)。
擬似分岐命令挿入後プログラム生成部106aは、ラベル挿入後偽装等価プログラム命令挿入後偽装ブロックそれぞれの最後に無条件分岐命令を追加して、偽装ブロック数にて示される個数分のTMPブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、生成した1以上のTMPブロックからなるTMPブロック群を生成する(ステップS320)。
擬似分岐命令挿入後プログラム生成部106aは、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックに対応する等価命令挿入後ブロック秘密情報用の変数値を算出する(ステップS325)。算出方法は、上記第1の実施の形態にて示す擬似分岐命令挿入後プログラム生成部106が行う算出方法と同様であるため、説明は省略する。
擬似分岐命令挿入後プログラム生成部106aは、算出した変数値のそれぞれから、第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックに挿入する擬似分岐命令を生成し、生成した擬似分岐命令を、挿入対象の第t(t=1、2、・・・、N)のラベル挿入後等価プログラム命令挿入後ブロックに挿入して擬似分岐命令挿入後ブロックを生成する。擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック(TMPブロック)のそれぞれからなる擬似分岐命令挿入後プログラムを生成する(ステップS330)。
擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムに含まれる各ブロックをノードとしてグラフを生成する(ステップS335)。
擬似分岐命令挿入後プログラム生成部106aは、生成したグラフに含まれる閉路数を取得し、取得した閉路数が予め定めた所定数以上であるか否かを判定する(ステップS340)。
所定数以上であると判定する場合には(ステップS340における「YES」)、擬似分岐命令挿入後プログラム生成部106aは、生成したグラフが、平面グラフ(交差を含まないグラフ)であるか否かを判定する(ステップS345)。
平面グラフでないと判定する場合には(ステップS345における「NO」)、擬似分岐命令挿入後プログラム生成部106aは、動作を終了する。
閉路数が所定数以上でないと判定する場合(ステップS340における「NO」)、及び平面グラフであると判定する場合には(ステップS345における「YES」)、擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後ブロックのそれぞれと、ラベル挿入後等価プログラム命令非挿入ブロックのそれぞれと、偽装ブロック(TMPブロック)のそれぞれから、条件分岐命令を挿入する1のブロックをランダムに選択する。擬似分岐命令挿入後プログラム生成部106aは、選択したブロックに、条件分岐命令を挿入し、新たなブロックを生成し(ステップS350)、ステップS335へ戻る。
1.4.4 変形例1の効果
グラフ理論の分野では、2つのグラフG1、G2において、G1がG2に含まれるか否かを判定する問題が難しいことが部分グラフ同型判定問題として知られている。このことは非特許文献2に述べられている。
このことから、G2にG1が含まれることが分っていても、G2のどこにG1が含まれるかを判定することが難しいことが言える。また、部分グラフ同型判定問題が難しい条件として、プログラムが木構造ではないこと、プログラムが平面グラフでないことが知られる。
よって、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す部分グラフ同型判定問題が困難になる指標に基づき、難読化後のプログラムのグラフを構築すれば、先に述べた不正解析を困難にすることができる。
変形例1のプログラム難読化装置は、部分グラフ同型判定問題が困難となる難読化後のプログラムのグラフを構築することができる。
なお、変形例1のプログラム難読化装置は、全ての閉路数を取得する代わりに、予め与えられた範囲のノード数からなる閉路数を取得する構成としても構わない。
また、変形例1のプログラム難読化装置は、全ての閉路数を取得する代わりに、予め難読化前のプログラムに含まれる閉路を調べ、さらに、それぞれの閉路を構成するノード数を調べ、調べたノード数と同数のノードからなる閉路数のみを数える構成としても構わない。このような構成によれば、変形例1のプログラム難読化装置はグラフの閉路数の傾向を大まかに知ることができ、また閉路数を計算する処理時間を短くすることができる。
また、閉路数の判定や、平面グラフの判定の他に、非特許文献3(44〜50)に示されるグラフ同型判定問題の計算複雑さの指標を判定に用いても構わない。グラフ同型判定問題は、部分グラフ同型判定問題の特別な場合であると考えることが出来るので、このような指標を用いれば、部分グラフ同型判定が困難な難読化後のプログラムのグラフを生成することができる。
また、ここでは、偽装ブロックを生成し部分グラフ同型判定が困難でない場合は偽装分岐を追加していく場合について述べたが、予め部分グラフ同型判定が困難になる難読化後のグラフを作成し、そのグラフに合うように偽装分岐命令を追加しても構わない。
1.4.5 その他の変形例
擬似分岐命令挿入後プログラム生成部106aは、擬似分岐命令挿入後プログラムの生成において、閉路数の判定や、平面グラフの判定の双方を用いたが、これに限定されない。
擬似分岐命令挿入後プログラム生成部106aは、閉路数の判定、及び平面グラフの判定のうち1の判定のみを用いて、擬似分岐命令挿入後プログラムを生成してもよい。
1.5 変形例2
変形例1において、図21に示すステップS330及びステップS350の動作を以下のように変更してもよい。
1.5.1 ステップS330の変更
擬似分岐命令挿入後プログラム生成部106aは、挿入する分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
1.5.2 ステップS350の変更
擬似分岐命令挿入後プログラム生成部106aは、挿入する条件分岐命令として、プログラムの終了処理に相当するプログラム命令「return;」、「exit();」を挿入する。
1.5.3 変形例2の効果
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの終了ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501hと、図12におけるノード1201hの対応を見つけることを行えば、難読化後のプログラムのグラフから、難読化前のプログラムを見つける解析が容易になる。
変形例2によれば、終了ノードの候補が増えるため、難読化後のプログラムから終了ノードを見つけ出すことを困難にすることが出来る。
1.6 変形例3
難読化前のプログラムのアルゴリズムを知る不正解析者が、難読化後のプログラムのグラフから、難読化前のプログラムのグラフを見つけ出す解析を行う際に、難読化前のプログラムと難読化後のプログラムの開始ノードを対応付けることで解析を進めることが考えられる。例えば、図5に示すグラフのノード501aと、図12におけるノード1201aの対応を見つけることを行えば、そこから解析が進む。変形例3は、プログラムの開始ノードの抽出を困難にするための変形例であり、変形例3のプログラム難読化装置は、上記第1の実施の形態にて示す配置順序入替部108を、以下に示す配置順序入替部108aに変更する。
1.6.1 配置順序入替部108a
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これらと重複しない変数名を、難読化対象プログラムに開始ノードを指定するための新たな引数である開始ノード指定用変数として、変数宣言部601に追加し、新たな変数宣言部601aを生成する。
次に、配置順序入替部108aは、プログラムの先頭に、条件分岐命令であるswitch文を追加する。追加するswitch文は、開始ノード指定用変数の値によって実行するcase文を選択するプログラム命令とし、各case文は、開始ノードを含むノード群に対応するブロックへの先頭への分岐命令を有するようにする。
次に、配置順序入替部108aは、開始ノードに対応するブロックへの先頭に分岐命令を実行する際のノード指定用変数の値を、難読化対象プログラムを呼び出す側のプログラムにおける難読化対象プログラムを呼び出すプログラム命令の引数に追加する。
次に、開始ノードを含め、全てのブロックの順序をランダムに並び替えて難読化プログラムを生成する。
1.6.2 具体例
配置順序入替部108aは、難読化対象プログラムにおいて、プログラム中で使用されている変数名、および、引数で使用されている変数名を調べ、これと重複しない変数名を開始ノード指定用変数とする。ここでは、開始ノード指定用変数を「start」とする。
次に、プログラムの先頭にswitch文を追加する。
追加するswitch文にあたるプログラム命令を

swtich(start){
case 1:
goto labelC;
case 2:
goto labelA;
case 3:
goto labelL;
default:


とする。
次に、関数宣言および関数名を「func(int a,int b)」から「func(int a,int b,int start)」に置き換える。
また、難読化対象を呼び出すプログラム命令が「func(a,b);」であるならば、これを「func(a,b,2);」に置き換える。ここで、値「2」は、switch文に用いられる開始ノード指定用変数「start」に格納される数値である。なお、難読化対象プログラムを呼び出す側のプログラムを別途難読化して、開始ノード指定用変数がとる値「2」を隠蔽するなどを行ってもよい。
1.6.3 変形例3の効果
このような難読化を適用することにより、開始ノード指定用変数startに格納される正しい値が分からなくては開始ノードがどれであるのかが分からなくなる。すなわち、難読化対象プログラムを局所的に解析したのでは、開始ノードがわからなくなり難読化前のプログラムのグラフと難読化後のプログラムのグラフにおいて開始ノードの対応を取ることを困難にすることが出来る。
1.7 変形例4
上記第1の実施の形態において、難読化後プログラムにおいて秘密情報用変数が右辺にのみ存在するプログラム命令は、被秘匿情報位置のプログラム命令のみである(図17では、被入替ブロック1501e)。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムのグラフにおいて被秘匿情報位置となるノード(図5では、ノード501e)と難読化後のプログラムにおける秘密情報用変数が右辺にのみ存在するブロックとの対応を取って、不正解析を行うことが考えられる。
そこで、変形例4のプログラム難読化装置は、偽装ブロック本体生成の際に秘密情報用変数が右辺にのみ存在するプログラム命令を追加してもよい。これにより、変形例4のプログラム難読化装置は、上記の不正解析を困難にすることができる。
また、変形例4のプログラム難読化装置は、等価プログラム命令挿入後ブロックにおいて、右辺に定数がある命令における定数を、算出した等価命令挿入後ブロック秘密情報用の変数値を用いて算出するプログラム命令に置き換えてもよい。これにより、右辺に秘密情報用変数を含むプログラム命令の数が増えるので、変形例4のプログラム難読化装置は、上記の不正解析を困難にすることができる。
1.8 変形例5
難読化前のプログラムに特徴的な演算、特徴的な数値を用いた演算(例えば、暗号プログラムのアルゴリズムにおけるループの回数など)が含まれる場合がある。そのため、難読化前のプログラムのアルゴリズムを知る不正解析者が難読化前のプログラムにおいて、特徴的な演算または数値を見つけ難読化前のグラフと難読化後のグラフにおいて対応が取れるノードを見つける手がかりにすることが考えられる。
そこで、特徴的な演算を別の処理に置き換えることで、上記の解析を困難にすることを行ってもよい。このような方法については、非特許文献1に述べられている。
また、特徴的な数値も、秘密情報として扱い本手法で述べた難読化方法や他の難読化方法により隠蔽しても構わない。
1.9 その他の変形例
1.9.1 C言語以外
上記第1の実施の形態では、秘密情報を保持するプログラムがC言語の場合を示したが、これに限定されない。Java(登録商標)バイトコード、Java(登録商標)言語、アセンブリ言語、機械語などで記述されたプログラムであってもよい。
Java(登録商標)バイトコードの場合、C言語のプログラム命令「goto」文を生成する処理では、プログラム命令「goto」、「goto_w」を使用する。プログラム命令「goto」、「goto_w」の使い分けについては、公知であるため、ここでの説明は省略する。
その他の生成する命令については、Java(登録商標)バイトコードにおける記述方法にのっとり、同等の命令を生成する。
また、無条件分岐命令を見つける処理では、Java(登録商標)バイトコードにおける無条件分岐を、条件分岐命令を見つける処理では、Java(登録商標)バイトコードにおける複合分岐、条件分岐をみつける。
また、Java(登録商標)言語に適用する際には、Java(登録商標)言語にプログラム命令「goto」に対応する命令がない。よって、各ブロックをメソッドとして生成し、プログラムの出口となるプログラム命令を含むメソッドには例外をスローされるプログラム命令を追加し、プログラムの入口となる命令を含むメソッドにはスローした例外をキャッチするプログラム命令を追加する。メソッド、例外の記述仕方は公知であるため説明は省略する。
その他の生成する命令については、Java(登録商標)言語における記述方法にのっとり、同等の命令を生成する。
Java(登録商標)言語において、無条件分岐命令を見つける処理では、プログラム命令「break」、「continue」,「return」、「throw」を見つける。
条件分岐命令を見つける処理では、「if−else」「switch」、「while」、「do−while」、「for」、「try、catch,finally」を見つける。なお、これらのプログラム命令については、公知であるため説明は省略する。
アセンブリ言語の場合、用いるアセンブラ言語によって命令セットは異なるが、例えばGASによるアセンブル言語の場合、C言語のプログラム命令「goto」文を生成する処理では、プログラム命令「jmp」を使用する。
また、無条件分岐命令を見つける処理では、プログラム命令「jmp」、「call」、「ret」、「hlt」を見つける。
条件分岐命令を見つける処理では、「jmp」以外のジャンプ命令を見つける。なお、GASのアセンブリ言語については、公知であるため説明は省略する。
機械語については、用いる機械語によって命令セットは異なるが、それぞれの記述方法にのっとり記述する。
なお、機械語を用いる場合、変形例3に述べたswitch文の生成の代わりに以下の処理を用いた構成としてもよい。すなわち、switch文を生成する代わりに、引数として開始ノード指定用変数を用いた相対ジャンプ命令(引数として指定された変数の値の分だけプログラムカウンタを動かす命令)を生成する。開始ノード指定用変数には、switch文のcase文で使用する値を設定する代わりに、生成した相対ジャンプ命令で開始ノードに対応するアドレスにジャンプできるような値を設定する。
1.9.2 ブロック分割
上記第1の実施の形態では、ブロック分割の際に基本ブロックに分割した後、さらに分割後ブロックを生成したが、基本ブロックへの分割を行わず、行数のみに基づく分割により分割後ブロックの生成を行っても良い。
このような構成を取る場合には、プログラム難読化装置は、等価プログラム命令を挿入する際に、等価プログラム命令挿入対象ブロックに含まれる一番最初の分岐命令よりも前に、さらに、一番最後の合流位置よりも後に等価プログラム命令を挿入する。
1.10 その他の変形例
なお、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
(1)上記第1の実施の形態において、プログラム難読化装置10が受け付ける位置情報は、難読化対象プログラムにおける秘密情報を保持するプログラム命令の行番号であるとしたが、これに限定されない。
位置情報は、定数のマクロの名前を用いて指定してもよい。すなわち、予め定められた所定の名前のマクロを有するプログラム命令を位置情報として扱う構成としてもよい。
または、位置情報は、ラベルを用いて指定してもよい。すなわち、予め定められた所定の名前のラベルがあるプログラム上の行の次の行を被秘匿情報として扱う構成としてもよい。
または、ここで述べた所定の名前のマクロ/ラベルの変わりに、予め定められた所定の接頭語、接尾語を有するマクロ/ラベルを用いて位置情報を指定する構成としても構わない。
(2)上記第1の実施の形態において、プログラム難読化装置10は、偽装ブロック数を予め記憶するとしたが、これに限定されない。
プログラム難読化装置10は、難読化対象プログラムの複雑度をeとし、下式を用いて、偽装ブロック数を取得しても構わない。
(生成する偽装ブロック数)=(所定数)−e
ここで、複雑度は、プログラムに含まれるプログラム命令数や、ループ数や、プログラムに使用される変数の数、またはそれらの組み合わせ等でプログラムの複雑さを指標化した値であり、バグが発生しやすいプログラムを見つけ出す際などに使用される。
ここで、所定数とは、ユーザが所望する難読化の強度に応じて定まる数である。
ここで、所定数の決定について説明する。所定数と、難読化の強度との関係は、図22に示すように、強度が増加すると、所定数は単調に増加する(図22に示す関数G300)。グラフG300は、y=aX+bにて示される。これにより、ユーザが所望する強度が決定すると、一意的に所定数が決定することになる。プログラム難読化装置は、決定した所定数から難読化対象プログラムの複雑度eを減算することにより得られた結果を、偽装ブロック数とする。
または、決定したノード数から分割後ブロックの個数を減算した結果を偽装ブロック数としてもよい。
(3)上記第1の実施の形態において、プログラム難読化装置10は、ユーザが所望する難読化の強度に応じて定まる数である所定数を予め記憶しているとしたが、これに限定されない。
プログラム難読化装置10は、プログラムを難読化する度に、難読化の強度の指定を、入力部101にて受け付け、指定された強度に応じた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、難読化の強度に応じた所定数を、入力部101にて受け付け、受け付けた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、他のプログラムから難読化の強度の指定を受け付け、指定された強度に応じた所定数を用いて難読化を行ってもよい。
または、プログラム難読化装置10は、プログラムを難読化する度に、他のプログラムから難読化の強度に応じた所定数を受け付け、受け付けた所定数を用いて難読化を行ってもよい。
(4)上記第1の実施の形態において、プログラム難読化装置10は、全ての偽装ブロック本体のそれぞれに対して、偽装等価プログラム命令を挿入して、偽装等価プログラム命令挿入後偽装ブロックを生成したが、これに限定されない。
プログラム難読化装置10は、生成した複数の偽装ブロック本体のうち1以上の偽装ブロック本体に、偽装等価プログラム命令を挿入して、偽装等価プログラム命令挿入後偽装ブロックを生成してもよい。
(5)上記第1の実施の形態において、プログラム難読化装置10は、擬似分岐命令挿入後プログラムから、ブロック分割部を用いて1以上の分割後ブロックを生成し、生成した1以上の分割後ブロックから被入替ブロック群を生成してもよい。
または、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行される1以上のブロックからなる部分プログラムから、ブロック分割部を用いて1以上の分割後ブロックを生成し、生成した1以上の分割後ブロックと、擬似分岐命令挿入後プログラムに含まれる正常系の動作により実行されない1以上のブロック(偽装ブロックに相当する)とから被入替ブロック群を生成してもよい。
(6)上記第1の実施の形態及び変形例において、グラフの難易度(強度)を示す指標の例として、「(エッジ数)−(ノード数)」、閉路数、平面グラフを用いたが、これに限定されない。
グラフの難易度を示す指標として、第1の所定数以上のノードからなる閉路の数としてもよい。このとき、プログラム難読化装置10は、例えば、第1の所定数として「3」、閉路数の最小値を示す第2の所定数として「4」を予め記憶している。
プログラム難読化装置10の偽装ブロック挿入後プログラム生成部105は、生成したグラフから3個以上のノードからなる閉路を全て取得する。
偽装ブロック挿入後プログラム生成部105は、取得した閉路数が、第2の所定数以上であるか否かを判定する。
閉路数が所定数以上であると判定する場合には、偽装ブロック挿入後プログラム生成部105は、処理を中止する。
所定数以上でないと判定する場合には、偽装ブロック挿入後プログラム生成部105は、第1の実施の形態と同様に、TMPブロック群を構成するTMPブロックの中から条件分岐命令を挿入するTMPブロックをランダムに選択し、選択したTMPブロックから新たなTMPブロックを生成する。
(7)上記第1の実施の形態において、被秘匿情報は、定数としたがこれに限定されない。被秘匿情報は、1以上のプログラム命令からなる命令群であってもよい。
例えば、分岐命令による分岐先を被秘匿情報としてもよい。具体的には、分岐命令「goto label D;」の分岐先「label D」を被秘匿情報とする場合、「x=0;」、「x=x+3」、「if (x==2) then goto label B;」、及び「if (x==3) then goto label D;」に分解しても良い。このとき、偽装ブロックには、例えば、変数xを用いた演算式、ラベルDへ分岐する命令、及び変数xに格納された値に応じて分岐先を変更する命令等のうち少なくとも1のプログラム命令が追加される。追加されるプログラム命令の具体例は、「x=x+5;」、「if (x==5) then goto label D;」、及び「if (x==4) then goto label A;」である。ここで、プログラム命令の概念には、演算式も含まれる。また、上記に記載の「label A」及び「label B」は、例えば、難読化対象プログラムに記載されているラベル名である。
また、例えば、2つのプログラム命令「a=a*10;a=a+5;」を被秘匿情報とし、プログラム難読化装置は、これらから等価プログラム命令として、「a=a*2;」、「a=a+1;」、「a=a*5;」を3つ生成する。このとき、偽装ブロックには、変数aを用いた演算式が追加される。例えば、「a=a*5+2;」である。
(8)上記第1の実施の形態において、秘密情報用変数を用いたが、これに限定されない。秘密情報用変数を用いなくてもよい。
例えば、「b=a^3」を被秘匿情報とし、これを、「b=a;」、「b=b*a+4;」、「b=(b−4)*a;」と分解してもよい。このとき、偽装ブロックには、例えば、変数a、bの双方を用いた演算式、若しくはその一方を用いた演算式のうち少なくとも1の演算式が追加される。追加される演算式の具体例は、「b=b*a−6;」、「b=b+2;」、「a=a+1;」である。
また、例えば、「b=9;」を、「値8をファイルAに書き込む命令」、「ファイルAを読み込む命令」、「読み込んだ値を変数bに代入する命令」、「読み込んだ値が代入された変数bに1を加算する命令」に分解してもよい。または、「値8をファイルAに書き込む命令」、「ファイルAを読み込む命令」、「読み込んだ値を変数cに代入する命令」、「読み込んだ値が代入された変数cに1を加算する命令」、及び「加算結果を変数bに代入する命令」に分解してもよい。このとき、偽装ブロックには、例えば、変数bを用いた演算式、ファイルAの書き込み命令又はファイルAの読み込み命令、ファイルAを読み込み、読み込んだ値を変数bに代入する命令等のうち少なくとも1のプログラム命令が追加される。追加される演算式の具体例は、「b=b*3+1;」、「値3をファイルAにwrite;」、「b=read関数(ファイルAの読み込み);」である。ここで、プログラム命令の概念には、演算式も含まれる。
(9)上記第1の実施の形態において、プログラム難読化装置は、複数の分割後ブロックと、1以上の偽装等価プログラム命令挿入後偽装ブロックとを用いて、被入替ブロック群を生成してもよい。また、分割後ブロックのそれぞれに、ラベル名を付与してもよい。
または、プログラム難読化装置は、複数の分割後ブロックと、1以上のTMPブロックとを用いて、被入替ブロック群を生成してもよい。また、分割後ブロックのそれぞれに、ラベル名を付与してもよい。
(10)上記第1の実施の形態において、配置順序入替部108は、開始ノードとなる被入替ブロックを除く他の被入替ブロックの配置順序を、ランダムに入れ替えたが、これに限定されない。
配置順序入替部108は、開始ノードとなる被入替ブロックを含めた全ての被入替ブロックの配置順序を、ランダムに入れ替えてもよい。このとき、配置順序入替部108は、入替結果により、プログラムに含まれる処理部の先頭位置に、偽装ブロックである被入替ブロックが存在する場合には、その被入替ブロックの先頭に、常に処理群Aを含む被入替ブロック(開始ノードとなるブロック)に分岐する無条件分岐命令又は条件分岐命令を挿入する。
これにより、プログラムの開始位置に偽装ブロックが存在する場合でも、難読化プログラムは、常に正しいブロックから実行される。
(11)上記第1の実施の形態において、プログラム難読化装置10は、等価プログラム命令の挿入対象ブロックに対して、1の等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、挿入対象ブロックに対して、2以上の等価プログラム命令を挿入してもよい。
(12)上記第1の実施の形態において、プログラム難読化装置10は、開始ノードであるブロックから、秘密保有ノードであるブロックまでに存在する各ブロックに、等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、開始ノードであるブロックから、秘密保有ノードであるブロックまでに存在する各ブロックのうち1以上のブロックに、等価プログラム命令を順次挿入してもよい。
(13)上記第1の実施の形態において、プログラム難読化装置10は、難読化対象プログラムを、複数の分割後ブロックに分割した後、等価プログラム命令を挿入したが、これに限定されない。プログラム難読化装置10は、難読化対象プログラムにおいて最初に実行されるプログラム命令から、被秘匿情報を含むプログラム命令までの間に、生成した第1〜第Nの等価プログラム命令を挿入してもよい。
このとき、プログラム難読化装置10は、第1〜第Nの等価プログラム命令を挿入後、複数の分割後ブロックに分割してもよい。または、プログラム難読化装置10は、第1〜第Nの等価プログラム命令を挿入後、さらに、偽装ブロックを挿入し、挿入した偽装ブロックを常に迂回する分岐命令を挿入する。この場合、プログラム難読化装置10は、例えば、挿入された偽装ブロックの直後に、ラベルを付与し、挿入する分岐命令の分岐先は、付与したラベルを示すようにする。
ここで、偽装ブロックを迂回する分岐命令とは、偽装ブロックに含まれる全てのプログラム命令を実行しないように、偽装ブロックに含まれない他のプログラム命令へ分岐することを示す命令である。
(14)上記第1の実施の形態において、プログラム難読化装置10は、被秘匿情報の値を秘密情報用変数に置き換え、その後、等価プログラム命令挿入対象ブロックのそれぞれに対応する等価プログラム命令を挿入したが、これに限定されない。
プログラム難読化装置10は、等価プログラム命令挿入対象ブロックのそれぞれに対応する等価プログラム命令を挿入後、被秘匿情報の値を秘密情報用変数に置き換えてもよい。
(15)上記第1の実施の形態において、正常系での実行に全ての命令が必要なプログラムを難読化している。そのため、難読化後のプログラムが正常系で適切に動作することを保証するために、各分割後ブロック(以下、単に、「ブロック」という。)の最後に、次に実行すべきブロックの先頭への分岐命令を挿入する必要がある。
しかし、以下のような場合には、このような分岐命令の挿入の仕方を取る必要はない。
例えば、入力として与えられるプログラムに、正常系では必要のないダミーの命令が既に含まれている場合、プログラムの分割の仕方によっては、ブロックの先頭にダミーの命令が含まれたり、最後にダミーの命令が含まれたりする可能性がある。このような事態は、他の難読化手法により難読化された後のプログラムを、本発明による手法で、さらに難読化を行う場合などが考えられる。
このようなプログラムが入力として与えられる場合、ダミーの命令については実行を省略しても正常系での動作に影響はないため、正常系で必要な命令が始まる箇所を分岐先とした分岐命令を挿入することで、ブロックの先頭にあるダミーの命令の実行を省略してもよい。
また、正常系で必要な命令が終わる箇所に分岐命令を挿入することで、ブロックの最後にあるダミーの命令の実行を省略してもよい。
(16)また、偽装ブロックに挿入する分岐命令や、常に分岐先に分岐しない条件分岐命令の分岐先については、どこに分岐するとして正常系での実行に影響はない。したがって、これらの命令については、ブロックの先頭に分岐する分岐命令とする必要がなく、ブロックの途中に分岐するとしてもよい。
(17)本発明における命令群とは、1以上の命令からなるものとする。つまり、本発明における命令群は、1の命令からなる場合も含まれる。
(18)上記の各装置は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、各装置は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
(19)上記の各装置を構成する構成要素の一部又は全部は、1個のシステムLSI(Large Scale Integration:大規模集積回路)から構成されているとしてもよい。システムLSIは、複数の構成部を1個のチップ上に集積して製造された超多機能LSIであり、具体的には、マイクロプロセッサ、ROM、RAMなどを含んで構成されるコンピュータシステムである。前記RAMには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、システムLSIは、その機能を達成する。
ここでは、LSIとしたが、集積度の違いにより、IC、システムLSI、スーパーLSI、ウルトラLSIと呼称されることもある。
また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
さらには、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
(20)上記の各装置を構成する構成要素の一部又は全部は、各装置に脱着可能なICカード又は単体のモジュールから構成されているとしてもよい。前記ICカード又は前記モジュールは、マイクロプロセッサ、ROM、RAM、などから構成されるコンピュータシステムである。前記ICカード又は前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムに従って動作することにより、前記ICカード又は前記モジュールは、その機能を達成する。このICカード又はこのモジュールは、耐タンパ性を有するとしてもよい。
(21)本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD―ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号を、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
また、前記プログラム又は前記デジタル信号を前記記録媒体に記録して移送することにより、又は前記プログラム又は前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
(22)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
1.11 まとめ
(1)本発明は、プログラムを難読化するプログラム難読化装置であって、 第一の入力プログラムにおける被秘匿情報を使用するプログラム命令または被秘匿命令を含む少なくとも一つ以上のプログラム命令からなる第一のプログラム命令群と同等の機能を有する、第二のプログラム命令群を生成する等価プログラム命令群生成手段と、前記第一の入力プログラムから前記第一のプログラム命令群を取り除き、前記第二のプログラム命令群を挿入して第一の出力プログラムを生成する等価プログラム生成手段と、 正常系の実行結果を得るための任意の実行時には、実行されない1以上のプログラム命令からなる偽装ブロックを生成し、第二の入力プログラムに前記偽装ブロックを挿入し第二の出力プログラムを生成する偽装ブロック挿入後プログラム生成手段とを有し、 少なくとも一つの前記偽装ブロックのプログラム命令の少なくとも一つは、前記第二のプログラム命令群を構成するプログラム命令が使用する変数を用いることを特徴とする。
(2)ここで、上記(1)に示すプログラム難読化装置において、前記偽装ブロックの少なくとも一つは、前記第二の入力プログラムのいずれかのプログラム命令への分岐命令を有するとしてもよい。
(3)ここで、上記(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを、1以上のプログラム命令から構成される分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、閉路が予め与えられた第一の所定数以上となるように前記偽装ブロックを生成するとしてもよい。
(4)ここで、上記(3)にて示すプログラム難読化装置は、さらに、前記与えられた第一の所定数を入力する入力手段を有するとしてもよい。
(5)ここで、上記(2)に示すプログラム難読化装置は、さらに、前記第二の入力プログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、 前記分割後ブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合に前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令に対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードが前記第二の前記ノードであった場合に、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなるグラフにおいて、予め与えられた第一の所定数以上のノード数からなる閉路の数が予め与えられた第二の所定数以上となるように偽装ブロックを生成するとしてもよい。
(6)ここで、上記(5)に示すプログラム難読化装置は、さらに、前記与えられた第一の所定数を入力する入力手段を有するとしてもよい。
(7)ここで、上記(5)に示すプログラム難読化装置は、さらに、前記与えられた第二の所定数を入力する入力手段を有するとしてもよい。
(8)ここで、上記(2)に示すプログラム難読化装置において、前記偽装ブロック挿入後プログラム生成手段は、さらに、前記第二のプログラムを、1以上のプログラム命令から構成されるプログラム命令群である分割後ブロックに分割するプログラム分割手段を有し、前記偽装ブロック挿入後プログラム生成手段は、前記分割後ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第一のグラフを生成し、前記ノードブロックのそれぞれと前記偽装ブロックのそれぞれをノードと見なし、第一の前記ノードに第二の前記ノードへの分岐命令がある場合、前記第一の前記ノードと前記第二の前記ノードの間にはエッジが存在すると見なし、また、前記第一の前記ノードの最後のプログラム命令が無条件分岐命令以外のプログラム命令であって、前記最後のプログラム命令が対応する前記第二の入力プログラムのプログラム命令の一つ後のプログラム命令が対応する前記ノードブロックが前記第二の前記ノードであった場合に、第一の前記ノードと第二の前記ノードの間にはエッジが存在すると見なし、前記ノードと前記エッジからなる第二のグラフを生成し、前記第二のグラフから前記第一のグラフを見つけ出す部分グラフ同型判定問題の難易度が予め与えられた第一の所定数以上になるように偽装ブロックを生成するとしてもよい。
(9)ここで、上記(8)に示すプログラム難読化装置は、さらに、前記与えられた第一の所定数を入力する入力手段を有するとしてもよい。
(10)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第三の入力プログラムを任意の位置で第一のブロックと第二のブロックに分割し、正常系の実行結果を得るための任意の実行時には、真偽値が一定の第一の値となる分岐条件によって分岐先を決定する条件分岐命令を前記第一のブロックの最後に追加して第三のブロックを生成し、 前記第三のブロックと前記第二のブロックからなる第三の出力プログラムを生成する擬似分岐命令挿入後プログラム生成手段を有し、前記条件分岐命令は、前記分岐条件が前記第一の値を取る場合の分岐先が前記第二のブロックの先頭であるとしてもよい。
(11)ここで、上記(1)に示すプログラム難読化装置において、前記等価プログラム命令群生成手段は、前記第一の出力プログラムに含まれる前記第二のプログラム命令群を構成する少なくとも一組の二つのプログラム命令を入れ替えたプログラムが、正常系のいずれかの実行時には前記第一の出力プログラムと機能が異なる前記第二のプログラム命令群を生成するとしてもよい。
(12)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第四の入力プログラムを1以上のプログラム命令から構成される細分化ブロックに分割する細分化ブロック生成手段と、各々の前記細分化ブロックから被入替ブロックを生成する被入替ブロック生成手段と、前記被入替ブロックの配置順序を変えて、第四の出力プログラムを生成する配置順序入替後プログラム生成手段配置順序入替後プログラム生成手段とを有し、前記被入替ブロック生成手段は、第一の前記細分化ブロックの最後のプログラム命令が対応する前記第四の入力プログラムのプログラム命令の、次のプログラム命令が対応する前記第二の前記細分化ブロックへの分岐命令を、前記第一の前記細分化ブロックの最後に追加して被入替ブロックとするとしてもよい。
(13)ここで、上記(12)に示すプログラム難読化装置において、前記被入替ブロック生成手段は、前記第一の前記細分化ブロックの最後のプログラム命令が無条件分岐でない場合に、前記第四の入力プログラムのプログラム命令の、次のプログラム命令が対応する前記第二の前記細分化ブロックへの分岐命令を、前記第一の前記細分化ブロックの最後に追加したものを被入替ブロックとするとしてもよい。
(14)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、前記偽装ブロックを含む第四の入力プログラムにおいて、前記偽装ブロック以外に存在するプログラム命令からなるプログラム命令群を1以上のプログラム命令から構成される細分化ブロックに分割して細分化ブロックを生成する細分化ブロック生成手段と、前記細分化ブロックまたは前記偽装ブロックである小ブロックから被入替ブロックを生成する被入替ブロック生成手段と、前記被入替ブロックの配置順序を変えて、第四の出力プログラムを生成する配置順序入替後プログラム生成手段配置順序入替後プログラム生成手段とを有し、前記被入替ブロック生成手段は、第一の前記小ブロックの最後のプログラム命令が対応する前記第四の入力プログラムのプログラム命令の、次のプログラム命令が対応する前記第二の前記小ブロックへの分岐命令を、前記第一の前記小ブロックの最後に追加したものを被入替ブロックとするとしてもよい。
(15)ここで、上記(1)又は(2)に示すプログラム難読化装置は、さらに、第四の入力プログラムを構成する偽装ブロックの各々と、分割後ブロックの各々を細分化ブロックとし、各々の前記細分化ブロックから被入れ替えブロックを生成する被入替ブロック生成手段と、前記被入替ブロックの配置順序を変えて、第四の出力プログラムを生成する配置順序入替後プログラム生成手段とを有し、前記被入替ブロック生成手段は、第一の前記細分化ブロックの最後のプログラム命令が対応する前記第二の入力プログラムの次のプログラム命令が対応する第二の細分化ブロックへの分岐命令を、前記第一の細分化ブロックの最後に追加したものを被入替ブロックとするとしてもよい。
上記にて示したプログラム難読化装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。また、本発明のプログラム難読化装置は、著作権を有するデータを暗号化して配布するサービス産業において、経営的に、また継続的及び反復的に使用することができる。
プログラム難読化装置10の構成を示すブロック図である。 難読化対象プログラム201の構成の一例を示す図である。 難読化対象プログラム201から生成された複数の基本ブロックの構成の一例を示す図である。 基本ブロックのそれぞれから生成された複数の分割後ブロックの構成の一例を示す図である。 各分割後ブロックに基づいて生成されたグラフを示す図である。 等価プログラム命令挿入後ブロックを示す図である。 ノード数として取り得る範囲を示す図である。 偽装ブロック本体の構成の一例を示す図である。 偽装等価プログラム命令挿入後偽装ブロックの構成の一例を示す図である。 ラベル挿入後等価プログラム命令挿入後ブロック、ラベル挿入後等価プログラム命令非挿入ブロック、及びラベル挿入後等価プログラム命令挿入後偽装ブロックの構成の一例を示す図である。 TMPブロックの構成の一例を示す図である。 ラベル挿入後等価プログラム命令挿入後ブロック、ラベル挿入後等価プログラム命令非挿入ブロック、及びTMPブロックを用いて生成したグラフである。 TMPブロック1101jに条件分岐命令が挿入された新たなTMPブロック1301jの構成の一例を示す図である。 新たなTMPブロック1301jを用いて、再生成したグラフを示す図である。 擬似分岐命令挿入後ブロックの構成の一例を示す図である。 被入替ブロックの構成の一例を示す図である。 難読化対象プログラム201から生成した難読化プログラム1500の構成の一例を示す図である。 プログラム難読化装置10の動作概要を示す流れ図である。 等価プログラム生成処理の動作を示す流れ図である。 偽装ブロック挿入後プログラムの生成処理の動作を示す流れ図である。 擬似分岐命令挿入後プログラムの生成処理の動作を示す流れ図である。 所定数とグラフの強度との関係を示す図である。
符号の説明
10 プログラム難読化装置
100 記憶部
101 入力部
102 ブロック分割部
103 等価プログラム命令生成部
104 等価プログラム生成部
105 偽装ブロック挿入後プログラム生成部
106 擬似分岐命令挿入後プログラム生成部
107 被入替ブロック群生成部
108 配置順序入替部
201 難読化対象プログラム
202 変数宣言部
203 処理部

Claims (20)

  1. 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置であって、
    前記オリジナルプログラムを記憶している記憶手段と、
    複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成手段と、
    前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入手段と、
    前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成手段と、
    前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入手段と
    を備えることを特徴とするプログラム難読化装置。
  2. 前記秘匿処理命令群は、演算対象として前記被秘匿情報を含む秘匿演算式であり、
    前記処理命令は、秘密変数に対して演算結果を代入する演算式であり、
    前記偽装処理命令は、前記秘密変数を演算対象とする偽装演算式であり、
    前記処理命令生成手段は、定められた処理順序に従った演算が行われると最後の演算により、前記秘匿演算式による演算と同一の値が得られる複数の演算式を生成し、
    前記処理命令挿入手段は、
    前記オリジナルプログラムが含む被秘匿情報を前記秘密変数へ置換する置換部と、
    前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の演算式のそれぞれを、前記演算順序で実行されるように挿入する挿入部と
    を備えることを特徴とする請求項1に記載のプログラム難読化装置。
  3. 前記偽装ブロック挿入手段は、
    前記偽装ブロック生成手段にて生成される少なくとも1の偽装ブロックに、前記正当プログラム命令、前記処理命令及び他の偽装ブロックの何れかを分岐先とする分岐命令を挿入する
    ことを特徴とする請求項1に記載のプログラム難読化装置。
  4. 前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、
    前記処理命令挿入手段は、
    前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、
    前記偽装ブロック挿入手段は、
    前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、
    生成したグラフの難易度が、所定の条件を満たすか否かを判定する判定部と、
    所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する第2生成部と、
    前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部による処理を行うように制御する制御部と
    を備えることを特徴とする請求項3に記載のプログラム難読化装置。
  5. 前記プログラム難読化装置は、さらに、
    難読化の強度の指定を受け付ける受付手段を備え、
    前記所定の条件を満たすとは、ノード間を結ぶエッジの数と、ノード数とから算出される値(エッジ数)−(ノード数)が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、
    前記判定部は、前記第1生成部にて生成されたグラフから、エッジ数とノード数とを取得し、値(エッジ数)−(ノード数)が、前記所定数以上であるか否かを判定する
    ことを特徴とする請求項4に記載のプログラム難読化装置。
  6. 前記プログラム難読化装置は、さらに、
    難読化の強度の指定を受け付ける受付手段を備え、
    前記所定の条件を満たすとは、グラフにおける閉路の数が、指定された前記強度に応じたグラフの難易度にて定まる所定数以上であることであり、
    前記判定部は、前記第1生成部にて生成されたグラフから閉路数を取得し、取得した閉路数が、前記所定数以上であるか否かを判定する
    ことを特徴とする請求項4に記載のプログラム難読化装置。
  7. 前記所定の条件を満たすとは、グラフが平面グラフでないことであり、
    前記判定部は、前記第1生成部にて生成されたグラフが平面グラフであるか否かを判定し、平面グラフでないと判定する場合に、前記所定の条件を満たすとする
    ことを特徴とする請求項4に記載のプログラム難読化装置。
  8. 前記プログラム難読化装置は、さらに、
    難読化の強度の指定を受け付ける受付手段を備え、
    前記所定の条件を満たすとは、第1の所定数以上のノード数からなる閉路の数が、ユ指定された前記強度に応じたグラフの難易度にて定まる第2の所定数以上であることであり、
    前記判定部は、前記第1生成部にて生成されたグラフから、第1の所定数以上のノード数からなる閉路の数を取得し、取得した閉路数が、前記第2所定数以上であるか否かを判定する
    ことを特徴とする請求項4に記載のプログラム難読化装置。
  9. 前記偽装ブロック挿入手段は、
    前記オリジナルブロックに対して、前記演算式が前記演算順位で実行された場合に真偽値が一定値となる比較式を含み、前記比較式により真偽値が前記一定値となる場合の分岐先を次に実行する次オリジナルブロックとする条件分岐命令を、前記オリジナルブロックに挿入し、
    前記偽装ブロックが、前記オリジナルブロックの直後に挿入された場合には、前記条件分岐命令を前記制御命令とする
    ことを特徴とする請求項4に記載のプログラム難読化装置。
  10. 前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数のオリジナルブロックが実行順序で並べられており、
    前記処理命令挿入手段は、
    前記複数の処理命令のそれぞれを、最初に実行されるオリジナルブロックから前記秘匿処理命令群を有するオリジナルブロックまでの何れかに挿入し、
    前記偽装ブロック挿入手段は、
    前記複数のオリジナルブロック、及び前記偽装ブロックのそれぞれをノードとし、前記オリジナルブロックの実行順序と、前記オリジナルブロックに含まれる分岐命令と、前記偽装ブロックに含まれる分岐命令とに基づいて、グラフを生成する第1生成部と、
    生成したグラフの強度が、所定の条件を満たすか否かを判定する判定部と、
    所定の条件を満たすと判定する場合に、前記偽装ブロックと前記制御命令とを前記オリジナルプログラムに挿入し、所定の条件を満たさないと判断する場合には、前記複数のオリジナルブロック、及び他の偽装ブロックのうち1のブロックを分岐先とする条件分岐命令を、1の偽装ブロックに挿入する、又は1のオリジナルブロックに、1の偽装ブロックを分岐先とし、常に前記分岐先には分岐しない条件分岐命令を前記オリジナルブロックに挿入する第2生成部と、
    前記所定の条件を満たすまで、前記第1生成部と前記判定部と前記第2生成部を行うように制御する制御部と
    を備えることを特徴とする請求項3に記載のプログラム難読化装置。
  11. 処理命令生成手段は、
    前記処理順序で実行した場合のみに、前記秘匿処理命令群による処理と同一の結果が得られるように、前記複数の処理命令を生成する
    ことを特徴とする請求項1に記載のプログラム難読化装置。
  12. 前記偽装ブロック挿入手段は、
    前記オリジナルプログラムを、1以上の正当プログラム命令からなる複数の分割ブロックに分割する分割部と、
    前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、
    前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、
    前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、
    前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とする
    ことを特徴とする請求項1に記載のプログラム難読化装置。
  13. 前記分割部は、さらに、
    前記偽装ブロックを、1以上のプログラム命令からなる複数の偽装分割ブロックに分割し、
    前記被入替ブロック生成部は、さらに、
    前記偽装分割ブロックのそれぞれから、偽装分割ブロックに、他の偽装分割ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、
    前記挿入部は、
    前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入する
    ことを特徴とする請求項12に記載のプログラム難読化装置。
  14. 前記被入替ブロック生成部は、さらに、
    前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、
    前記挿入部は、
    前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入する
    ことを特徴とする請求項12に記載のプログラム難読化装置。
  15. 前記オリジナルプログラムは、1以上の前記正当プログラム命令を含む複数の分割ブロックに予め分割され、前記複数の分割ブロックが実行順序で並べられており、
    前記処理命令挿入手段は、最初に実行される分割ブロックから前記秘匿処理命令群を有する分割ブロックまでの間に、前記複数の処理命令のそれぞれを挿入し、
    前記偽装ブロック挿入手段は、
    前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックを除く1以上の分割ブロックのそれぞれから、分割ブロックに、次に実行する分割ブロックを示す分岐命令を含む被入替ブロックを生成する被入替ブロック生成部と、
    前記オリジナルプログラムにおいて最初に実行される正当プログラム命令を含む被入替ブロックを除く他の被入替ブロックのそれぞれと、前記オリジナルプログラムにおいて最後に実行される正当プログラム命令を含む分割ブロックとの配置順序を入れ替えるブロック入替部と、
    前記偽装ブロックを前記オリジナルプログラムに挿入する挿入部とを備え、
    前記偽装ブロックが挿入された直前に位置する被入替ブロックに含まれる分岐命令を前記制御命令とする
    ことを特徴とする請求項1に記載のプログラム難読化装置。
  16. 前記被入替ブロック生成部は、さらに、
    前記偽装ブロックから、前記偽装ブロックに、1の分割ブロック又は他の偽装ブロックを示す分岐命令を含む偽装被入替ブロックを生成し、
    前記挿入部は、
    前記偽装被入替ブロックのそれぞれを前記オリジナルプログラムに挿入する
    ことを特徴とする請求項15に記載のプログラム難読化装置。
  17. 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置で用いられる難読化方法であって、
    前記プログラム難読化装置は、
    前記オリジナルプログラムを記憶している記憶手段を備え、
    前記難読化方法は、
    複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成ステップと、
    前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入ステップと、
    前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成ステップと、
    前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入ステップと
    を含むことを特徴とする難読化方法。
  18. 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置で用いられる難読化プログラムであって、
    前記プログラム難読化装置は、
    前記オリジナルプログラムを記憶している記憶手段を備え、
    前記難読化方法は、
    複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成ステップと、
    前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入ステップと、
    前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成ステップと、
    前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入ステップと
    を含むことを特徴とする難読化プログラム。
  19. 前記難読化プログラムは、コンピュータ読み取り可能な記録媒体に記録されていることを特徴とする請求項15に記載の難読化プログラム。
  20. 1以上の正当プログラム命令からなり、秘匿すべき被秘匿情報を含む秘匿処理命令群を含むオリジナルプログラムからプログラム解析が困難であるプログラムを生成するプログラム難読化装置の集積回路であって、
    前記オリジナルプログラムを記憶している記憶手段と、
    複数の処理命令であって、定められた処理順序に従った処理が行われると最後の処理により、前記秘匿処理命令群による処理と同一の結果が得られる複数の処理命令を生成する処理命令生成手段と、
    前記秘匿処理命令群に代えて、前記オリジナルプログラムの開始から前記秘匿処理命令群が出現するまでの間に、前記複数の処理命令のそれぞれを、前記処理順序で実行されるように挿入する処理命令挿入手段と、
    前記複数の処理命令を攪乱する偽装処理命令を含む偽装ブロックを少なくとも1つ生成する偽装ブロック生成手段と、
    前記オリジナルプログラムに、前記偽装ブロックと、前記偽装ブロックを迂回するように制御する制御命令とを挿入する偽装ブロック挿入手段と
    を備えることを特徴とする集積回路。
JP2007514688A 2005-04-21 2006-04-21 プログラム難読化装置及び難読化方法 Active JP4806402B2 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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

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