ソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラム
【課題】関数を抜き出して流用する攻撃に対しても、十分な耐性を備える。
【解決手段】ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備える。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【解決手段】ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備える。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェアの機能の流出を防止できるソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムに関する。
【背景技術】
【0002】
ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵等、利用者に対して秘密にすべき情報が含まれる場合がある。一方では、ソフトウェアを解析するための技術(RE:Reverse Engineering)が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【0003】
この一例として、プログラム中の変数を演算装置によって線形変換して符号化を施す符号化方法であって、符号化を施すn個(但し、nは正整数)の変数を任意に選択し、m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成する。そして、生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数に符号化する。これにより、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を行う技術が開示されている(例えば、特許文献1参照。)。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2006−079347号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
つまり、従来の技術は、プログラムにおけるデータ及び処理内容の解析あるいは改ざんの防止を目的とした難読化方式であるため、こうした難読化方式は関数の機能を保ちつつ解析あるいは改ざんを防止するための方式であり、対象となる関数の入出力の仕様が、難読化により変更されることはない。そのため、単一の関数を対象とした難読化方式では、関数を抜き出して流用する攻撃に対しては、十分な安全性を実現できないという問題があった。
【0006】
そこで、本発明は、上述の課題に鑑みてなされたものであり、関数を抜き出して流用する攻撃に対しても、十分な耐性を有するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
本発明は、上記の課題を解決するために以下の事項を提案している。なお、理解を容易にするために、本発明の実施形態に対応する符号を付して説明するが、これに限定されるものではない。
【0008】
(1)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段(例えば、図1のマージ部200に相当)を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0009】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備える。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【0010】
(2)本発明は、(1)のソフトウェアの難読化装置について、前記依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築することを特徴とするソフトウェアの難読化装置を提案している。
【0011】
この発明によれば、依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築する。つまり、複数の関数を1つの関数にマージして、その規模を大きくすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。
【0012】
(3)本発明は、(2)のソフトウェアの難読化装置について、前記依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージすることを特徴とするソフトウェアの難読化装置を提案している。
【0013】
この発明によれば、依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージする。つまり、機能の異なる複数の関数については、機能選択用の引数を用いて1つの関数にマージすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。
【0014】
(4)本発明は、(2)のソフトウェアの難読化装置について、前記依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージすることを特徴とするソフトウェアの難読化装置を提案している。
【0015】
この発明によれば、依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージする。つまり、戻り値のデータ型が異なる複数の関数については、データ出力用のポインタ型変数を用いて、1つの関数にマージすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。
【0016】
(5)本発明は、さらに、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する分割手段(例えば、図4の分割部300に相当)と、該分割された変数を含むソフトウェアを変換する変換手段(例えば、図4の変換部400に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0017】
この発明によれば、分割手段は、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。変換手段は、分割された変数を含むソフトウェアを変換する。したがって、分割手段により、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となる。なお、ここで、共用体とは、複数の変数が同一のメモリ領域を共有する構造を指し、共用体を用いることで、バイト長が大きな変数を複数の変数に分割して、既存方式で符号化できる.例えば、倍精度浮動小数点型変数(double)型変数は、2つの整数(int)型変数に分割できる。
【0018】
(6)本発明は、(5)のソフトウェアの難読化装置について、前記変換手段が、符号化の対象となる変数を選択する選択手段(例えば、図6の選択部410に相当)と、該選択した符号化変数からm個の符号化変数を決定する符号化変数決定手段(例えば、図6の符号化変数決定部420に相当)と、符号化ルールおよび復号化ルールを決定するルール決定手段(例えば、図6のルール決定部430に相当)と、ソフトウェア内の符号化変数を他の符号化変数に置き換える置き換え手段(例えば、図6の置き換え部440に相当)と、変換したソフトウェアを正しく実行できるように修正する修正手段(例えば、図6の修正部450に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0019】
この発明によれば、選択手段は、符号化の対象となる変数を選択し、符号化変数決定手段は、選択した符号化変数からm個の符号化変数を決定する。そして、ルール決定手段が、符号化ルールおよび復号化ルールを決定し、置き換え手段が、ソフトウェア内の符号化変数を他の符号化変数に置き換え、修正手段が変換したソフトウェアを正しく実行できるように修正する。したがって、ソフトウェアを変換することによって、ソフトウェアの難読化を実現することができる。
【0020】
(7)本発明は、(6)のソフトウェアの難読化装置について、前記置き換え手段が、代入が行われている対象変数を置換する第1の置換手段(例えば、図7の第1の置換部441に相当)と、参照が行われている対象変数を置換する第2の置換手段(例えば、図7の第2の置換部442に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0021】
この発明によれば、第1の置換手段は、代入が行われている対象変数を置換し、第2の置換手段は、参照が行われている対象変数を置換する。これにより、効果的に難読化を実行することができる。
【0022】
(8)本発明は、(7)のソフトウェアの難読化装置について、前記修正手段が、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加する追加手段(例えば、図8の追加部451に相当)と、前記第1の置換手段で置換した代入命令を実行できる命令列に変換する変換手段(例えば、図8の変換部452に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0023】
この発明によれば、追加手段は、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加し、変換手段は、第1の置換手段で置換した代入命令を実行できる命令列に変換する。したがって、この処理により、難読化を図りつつ、実行可能なソフトウェアとすることができる。
【0024】
(9)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップを備えたことを特徴とするソフトウェアの難読化方法を提案している。
【0025】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【0026】
(10)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップ(例えば、図9のステップS101に相当)と、該分割された変数を含むソフトウェアを変換する第3のステップ(例えば、図9のステップS102に相当)と、を備えたことを特徴とするソフトウェアの難読化方法を提案している。
【0027】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成し、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。そして、その分割された変数を含むソフトウェアを変換する。つまり、複数の関数について、依存関係を生成することにより、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。さらに、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となるため、さらに、安全性が向上する。
【0028】
(11)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップをコンピュータに実行させるためのプログラムを提案している。
【0029】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【0030】
(12)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップ(例えば、図9のステップS101に相当)と、該分割された変数を含むソフトウェアを変換する第3のステップ(例えば、図9のステップS102に相当)と、をコンピュータに実行させるためのプログラムを提案している。
【0031】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成し、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。そして、その分割された変数を含むソフトウェアを変換する。つまり、複数の関数について、依存関係を生成することにより、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。さらに、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となるため、さらに、安全性が向上する。
【発明の効果】
【0032】
本発明によれば、複数の関数に依存関係を持たせることができるため、単一の関数の抜き出しによる流用を困難にすることができるという効果がある。
【図面の簡単な説明】
【0033】
【図1】本発明の第1の実施形態に係るソフトウェアの難読化装置の構成を示す図である。
【図2】実施例に係る元のソフトウェアを例示した図である。
【図3】実施例に係る変換後のソフトウェアを例示した図である。
【図4】本発明の第2の実施形態に係るソフトウェアの難読化装置の構成を示す図である。
【図5】共用体を説明するための図である。
【図6】本発明の変換部の詳細な構成を示す図である。
【図7】本発明の置き換え部の詳細な構成を示す図である。
【図8】本発明の修正部の詳細な構成を示す図である。
【図9】本発明のソフトウェアの難読化装置の処理フローである。
【図10】実施例に係る元のソフトウェアのソースコードを例示した図である。
【図11】実施例に係る変数変換されたソフトウェアのソースコードを例示した図である。
【図12】実施例に係る難読化後のソフトウェアのソースコードを例示した図である。
【発明を実施するための形態】
【0034】
以下、本発明の実施形態について、図面を用いて、詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【0035】
<第1の実施形態>
図1を用いて、本実施形態に係るソフトウェアの難読化装置について説明する。
【0036】
<ソフトウェアの難読化装置の構成>
本実施形態に係るソフトウェアの難読化装置は、関数抽出部100と、マージ部200とから構成されている。
【0037】
関数抽出部100は、ソフトウェアから関数を抽出する。マージ部200は、関数抽出部100が抽出した複数の関数をマージする処理を行う。なお、機能の異なる複数の関数については、機能選択用の引数を用いて1つの関数にマージし、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージする。
【0038】
<ソフトウェアの難読化装置の処理>
本実施形態に係るソフトウェアの難読化装置の処理を図2および図3に示す実施例に基づいて、説明する。
【0039】
図2は、マージを行う2つの関数を示している。ここで、上段の関数は、整数値を取得して、これを2倍に演算してリターンするものであり、下段の関数は、x、yという2つの引数を取得して、これらの和を演算してリターンするものである。
【0040】
図3は、図2に示す2つの関数をマージした後の関数を示している。ここで、「x1」は、double()という関数に情報を与えるための引数であり、「x2」、「y2」は、add()という関数に情報を与えるための引数である。また、「d」は、2つの関数をマージしているため、これらの関数を使い分けるために新たに設けられた引数である。
【0041】
また、マージ後の関数においては、引数dに0を設定した場合、関数doubleの機能が利用でき、1つめの引数(x1)の値を2倍した値を求めることができる。この場合は,2つめ(x2)と3つめ(x3)の引数は無視される。また、引数dに0以外の値(例えば1)を設定した場合は、関数addの機能が利用でき、2つめの引数(x2)の値と3つめの引数(x3)の値の和を求めることができる。この場合は、1つめの引数(x1)は、無視される。
【0042】
また、本実施例では、一方が、整数を出力とし、もう一方が、実数を出力としている。このように、出力のデータ型が異なる関数をマージする場合には、上記のように、計算結果をデータ領域に格納するとともに、当該データ領域のアドレスをポインタ変数(p)に格納し、アドレスを返すことにより、ポインタ変数を介したデータの出力を行う。一方で、出力のデータ型が同一の関数をマージする場合は、戻り値をそのまま返す方法でのデータの出力が可能である。さらに、上記の例では、関数の使い分けのために、単一の引数(d)を用いているが、複数の引数を用いることにより、さらに解析を困難にすることができる。
【0043】
以上、説明したように、本実施形態によれば、複数の関数を1つの関数にマージするため、関数の規模が増大し,解析が困難になる。また、マージ後の関数については、新たに導入する引数を用いることにより、関数を使い分けることができる。
【0044】
<第2の実施形態>
図4から図12を用いて、本実施形態に係るソフトウェアの難読化装置について説明する。なお、本実施形態は、第1の実施形態で行った関数のマージ後に、ソフトウェア内の任意の変数を符号化するものである。
【0045】
<ソフトウェアの難読化装置の構成>
本実施形態に係るソフトウェアの難読化装置は、図4に示すように、関数抽出部100と、マージ部200と、分割部300と、変換部400とから構成されている。なお、第1の実施形態と同一の符号を付す構成要素については、同一の機能を有することから、その詳細な説明は、省略する。
【0046】
分割部300は、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。変換部400は、分割された変数を含むソフトウェアを変換する。
【0047】
<共用体について>
分割部300で用いられる共用体について説明する。
共用体とは、複数の変数が同一のメモリ領域を共有する構造を指す。共用体を用いることで、バイト長が大きな変数を複数の変数に分割して、既存方式で符号化できる。例えば、倍精度浮動小数点型変数(double)型変数は、2つの整数(int)型変数に分割できる。図5に、共用体の例を示す。定義されたDATA型変数datは、そのメンバ変数dat.dをdouble型変数として利用できる。一方で、メンバ変数dat.i[0]をこのdouble型変数の下位4バイトを操作するためのint型変数として利用できる。また、dat.i[1]も同様に、上位4バイトを操作するためのint型変数として利用できる。
【0048】
<変換部の内部構成>
図6に示すように、変換部400は、さらに、選択部410と、符号化変数決定部420と、ルール決定部430と、置き換え部440と、修正部450とから構成されている。
【0049】
なお、以下では、対象ソフトウェアには、N個の変数、x1、x2、・・・、xnが含まれているものとし、変数x1に格納される値が実行結果として出力されているものと仮定して、一般性を失わないものとする。また、実行結果を格納する変数が複数存在する場合も、1つの変数に実行結果を格納するソフトウェアが複数存在するものとみなすことで、個々のソフトウェアについて同様に扱うことができる。
【0050】
選択部410は、符号化の対象とするn個の変数x1、x2、・・・、xnを選択する。ここで、実行結果が格納される変数x1は、符号化対象として選択する必要がある。また、個数nは、任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合には、より小さな値を選択する。但し、以下の変数は、符号化対象から除外するものとする。1)利用者の入力が直接書き込まれる変数。2)アドレス演算子により当該変数のアドレスが取得されている変数。
【0051】
符号化変数決定部420は、m個の符号化変数y1、y2、・・・、ymを決定する。ここで、個数mは、符号化対象変数の個数nよりも大きく設定する。なお、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合には、より小さな値を選択する。
【0052】
ルール決定部430は、m行n列のプール行列Aとm次元の整数型ベクトルbを任意に決定する。但し、行列Aは、ランクがnとなるように選択する。行列Aと整数型ベクトルbとにより、以下の関係式数1を構成する。
【0053】
【数1】
【0054】
上式の各行を符号化ルールとすると、数2のようになる。
【0055】
【数2】
【0056】
次に、符号化ルールを未知変数x1、x2、・・・、xnに対する連立方程式とみなし、解くことにより、数3を得る。
【0057】
【数3】
【0058】
この各式を復号ルールとする。なお、上記の連立方程式を解く過程では、n個の符号化ルールが使われる。使われなかった符号化ルールに含まれる変数x1、x2、・・・、xnを復号ルールを用いて符号化変数に置き換えることで、m−n個の非自明な関係式が得られる。ここで、符号化変数y1、y2、・・・、ymは、常にこれらの関係式をみたす。
【0059】
置き換え部440は、プログラム内の符号化対象変数x1、x2、・・・、xnを、符号化変数y1、y2、・・・、ymで置き換える、まず、代入が行われている変数を符号化変数に置き換え、次に、参照が行われている変数を符号化変数に置き換える。
【0060】
具体的には、図7に示す第1の置換部441が代入命令xi←fを以下、数4に示す命令に置き換える。
【0061】
【数4】
【0062】
これにより、右辺の関数e1、e2、・・・、emにおいては、代入が行われる対象変数xiが、式fに置換されている。
【0063】
また、図7に示す第2の置換部442は、上記の処理で得られた命令列において、参照されている対象変数x1、x2、・・・、xnを、それぞれ、復号ルールd1、d2、・・・、dnで置き換え、式を整理する。
【0064】
修正部450は、変換したソフトウェアを正しく実行できるようにするため、修正する。具体的には、図8に示す追加部451が符号化変数y1、y2、・・・、ymおよびこれらの変数の値を退避するための一時変数t1、t2、・・・、tmの定義を追加する。
【0065】
また、図8に示す変換部452は、第1の置換部441で変換した命令を逐次実行できる命令列に変換する。つまり、数5に示す命令列を数6に示す命令列に変更する。このように、更新前の符号化変数の値を一時変数に退避しておくことで、更新後の符号化変数の値を順次計算できる。ここで、関数e1´、e2´、・・・、em´は、それぞれ、関数e1、e2、・・・、emにおいて、符号化変数y1、y2、・・・、ymを一時変数t1、t2、・・・、tmで置き換えたものである。
【0066】
【数5】
【0067】
【数6】
【0068】
<ソフトウェアの難読化装置の処理>
図9を用いて、本実施形態に係るソフトウェアの難読化装置の処理について説明する。なお、マージに関する処理については、第1の実施形態と同様であるため、その詳細な説明は、省略する。
【0069】
まず、分割部300が、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する(ステップS101)。そして、変換部400が分割された変数を含むソフトウェアを変換する(ステップS102)。
【0070】
なお、変換部400においては、上述のように、選択処理、符号化変数決定処理、ルール決定処理、置き換え処理、修正処理が行われる。
【0071】
したがって、本実施形態によれば、複数の関数を1つの関数にマージするため、関数の規模が増大し,解析が困難になる。また、マージ後の関数については、新たに導入する引数を用いることにより、関数を使い分けることができる。さらに、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となることにより、セマンティクスが異なる複数のデータまとめて変換できるようになり、さらに、安全性が向上する。
【0072】
<実施例>
図10は、難読化前のソースコードであり、本実施例では、区分求積により、関数fの区間[a;b]における定積分を求める関数の変換例を示す。
【0073】
ここで、変数の符号化に用いたルールは、数7に示すとおりである。但し、sumHは、sumの上位4バイトを、sumLは下位4バイトを意味する。図11に変数変換を導入したソースコードを、図12に難読化後のソースコードを示す。
【0074】
【数7】
【0075】
なお、ソフトウェアの難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをソフトウェアの難読化装置に読み込ませ、実行することによって本発明のソフトウェアの難読化装置を実現することができる。ここでいうコンピュータシステムとは、OSや周辺装置等のハードウェアを含む。
【0076】
また、「コンピュータシステム」は、WWW(World Wide Web)システムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことをいう。
【0077】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル(差分プログラム)であっても良い。
【0078】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【0079】
100;関数抽出部
200;マージ部
300;分割部
400;変換部
210;選択部
220;符号化変数決定部
230;ルール決定部
240;置き換え部
241;第1の置換部
242;第2の置換部
250;修正部
251;追加部
252;変換部
【技術分野】
【0001】
本発明は、ソフトウェアの機能の流出を防止できるソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムに関する。
【背景技術】
【0002】
ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵等、利用者に対して秘密にすべき情報が含まれる場合がある。一方では、ソフトウェアを解析するための技術(RE:Reverse Engineering)が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【0003】
この一例として、プログラム中の変数を演算装置によって線形変換して符号化を施す符号化方法であって、符号化を施すn個(但し、nは正整数)の変数を任意に選択し、m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成する。そして、生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数に符号化する。これにより、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を行う技術が開示されている(例えば、特許文献1参照。)。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2006−079347号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
つまり、従来の技術は、プログラムにおけるデータ及び処理内容の解析あるいは改ざんの防止を目的とした難読化方式であるため、こうした難読化方式は関数の機能を保ちつつ解析あるいは改ざんを防止するための方式であり、対象となる関数の入出力の仕様が、難読化により変更されることはない。そのため、単一の関数を対象とした難読化方式では、関数を抜き出して流用する攻撃に対しては、十分な安全性を実現できないという問題があった。
【0006】
そこで、本発明は、上述の課題に鑑みてなされたものであり、関数を抜き出して流用する攻撃に対しても、十分な耐性を有するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
本発明は、上記の課題を解決するために以下の事項を提案している。なお、理解を容易にするために、本発明の実施形態に対応する符号を付して説明するが、これに限定されるものではない。
【0008】
(1)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段(例えば、図1のマージ部200に相当)を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0009】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備える。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【0010】
(2)本発明は、(1)のソフトウェアの難読化装置について、前記依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築することを特徴とするソフトウェアの難読化装置を提案している。
【0011】
この発明によれば、依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築する。つまり、複数の関数を1つの関数にマージして、その規模を大きくすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。
【0012】
(3)本発明は、(2)のソフトウェアの難読化装置について、前記依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージすることを特徴とするソフトウェアの難読化装置を提案している。
【0013】
この発明によれば、依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージする。つまり、機能の異なる複数の関数については、機能選択用の引数を用いて1つの関数にマージすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。
【0014】
(4)本発明は、(2)のソフトウェアの難読化装置について、前記依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージすることを特徴とするソフトウェアの難読化装置を提案している。
【0015】
この発明によれば、依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージする。つまり、戻り値のデータ型が異なる複数の関数については、データ出力用のポインタ型変数を用いて、1つの関数にマージすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。
【0016】
(5)本発明は、さらに、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する分割手段(例えば、図4の分割部300に相当)と、該分割された変数を含むソフトウェアを変換する変換手段(例えば、図4の変換部400に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0017】
この発明によれば、分割手段は、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。変換手段は、分割された変数を含むソフトウェアを変換する。したがって、分割手段により、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となる。なお、ここで、共用体とは、複数の変数が同一のメモリ領域を共有する構造を指し、共用体を用いることで、バイト長が大きな変数を複数の変数に分割して、既存方式で符号化できる.例えば、倍精度浮動小数点型変数(double)型変数は、2つの整数(int)型変数に分割できる。
【0018】
(6)本発明は、(5)のソフトウェアの難読化装置について、前記変換手段が、符号化の対象となる変数を選択する選択手段(例えば、図6の選択部410に相当)と、該選択した符号化変数からm個の符号化変数を決定する符号化変数決定手段(例えば、図6の符号化変数決定部420に相当)と、符号化ルールおよび復号化ルールを決定するルール決定手段(例えば、図6のルール決定部430に相当)と、ソフトウェア内の符号化変数を他の符号化変数に置き換える置き換え手段(例えば、図6の置き換え部440に相当)と、変換したソフトウェアを正しく実行できるように修正する修正手段(例えば、図6の修正部450に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0019】
この発明によれば、選択手段は、符号化の対象となる変数を選択し、符号化変数決定手段は、選択した符号化変数からm個の符号化変数を決定する。そして、ルール決定手段が、符号化ルールおよび復号化ルールを決定し、置き換え手段が、ソフトウェア内の符号化変数を他の符号化変数に置き換え、修正手段が変換したソフトウェアを正しく実行できるように修正する。したがって、ソフトウェアを変換することによって、ソフトウェアの難読化を実現することができる。
【0020】
(7)本発明は、(6)のソフトウェアの難読化装置について、前記置き換え手段が、代入が行われている対象変数を置換する第1の置換手段(例えば、図7の第1の置換部441に相当)と、参照が行われている対象変数を置換する第2の置換手段(例えば、図7の第2の置換部442に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0021】
この発明によれば、第1の置換手段は、代入が行われている対象変数を置換し、第2の置換手段は、参照が行われている対象変数を置換する。これにより、効果的に難読化を実行することができる。
【0022】
(8)本発明は、(7)のソフトウェアの難読化装置について、前記修正手段が、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加する追加手段(例えば、図8の追加部451に相当)と、前記第1の置換手段で置換した代入命令を実行できる命令列に変換する変換手段(例えば、図8の変換部452に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0023】
この発明によれば、追加手段は、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加し、変換手段は、第1の置換手段で置換した代入命令を実行できる命令列に変換する。したがって、この処理により、難読化を図りつつ、実行可能なソフトウェアとすることができる。
【0024】
(9)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップを備えたことを特徴とするソフトウェアの難読化方法を提案している。
【0025】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【0026】
(10)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップ(例えば、図9のステップS101に相当)と、該分割された変数を含むソフトウェアを変換する第3のステップ(例えば、図9のステップS102に相当)と、を備えたことを特徴とするソフトウェアの難読化方法を提案している。
【0027】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成し、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。そして、その分割された変数を含むソフトウェアを変換する。つまり、複数の関数について、依存関係を生成することにより、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。さらに、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となるため、さらに、安全性が向上する。
【0028】
(11)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップをコンピュータに実行させるためのプログラムを提案している。
【0029】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。
【0030】
(12)本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップ(例えば、図9のステップS101に相当)と、該分割された変数を含むソフトウェアを変換する第3のステップ(例えば、図9のステップS102に相当)と、をコンピュータに実行させるためのプログラムを提案している。
【0031】
この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成し、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。そして、その分割された変数を含むソフトウェアを変換する。つまり、複数の関数について、依存関係を生成することにより、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。さらに、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となるため、さらに、安全性が向上する。
【発明の効果】
【0032】
本発明によれば、複数の関数に依存関係を持たせることができるため、単一の関数の抜き出しによる流用を困難にすることができるという効果がある。
【図面の簡単な説明】
【0033】
【図1】本発明の第1の実施形態に係るソフトウェアの難読化装置の構成を示す図である。
【図2】実施例に係る元のソフトウェアを例示した図である。
【図3】実施例に係る変換後のソフトウェアを例示した図である。
【図4】本発明の第2の実施形態に係るソフトウェアの難読化装置の構成を示す図である。
【図5】共用体を説明するための図である。
【図6】本発明の変換部の詳細な構成を示す図である。
【図7】本発明の置き換え部の詳細な構成を示す図である。
【図8】本発明の修正部の詳細な構成を示す図である。
【図9】本発明のソフトウェアの難読化装置の処理フローである。
【図10】実施例に係る元のソフトウェアのソースコードを例示した図である。
【図11】実施例に係る変数変換されたソフトウェアのソースコードを例示した図である。
【図12】実施例に係る難読化後のソフトウェアのソースコードを例示した図である。
【発明を実施するための形態】
【0034】
以下、本発明の実施形態について、図面を用いて、詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【0035】
<第1の実施形態>
図1を用いて、本実施形態に係るソフトウェアの難読化装置について説明する。
【0036】
<ソフトウェアの難読化装置の構成>
本実施形態に係るソフトウェアの難読化装置は、関数抽出部100と、マージ部200とから構成されている。
【0037】
関数抽出部100は、ソフトウェアから関数を抽出する。マージ部200は、関数抽出部100が抽出した複数の関数をマージする処理を行う。なお、機能の異なる複数の関数については、機能選択用の引数を用いて1つの関数にマージし、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージする。
【0038】
<ソフトウェアの難読化装置の処理>
本実施形態に係るソフトウェアの難読化装置の処理を図2および図3に示す実施例に基づいて、説明する。
【0039】
図2は、マージを行う2つの関数を示している。ここで、上段の関数は、整数値を取得して、これを2倍に演算してリターンするものであり、下段の関数は、x、yという2つの引数を取得して、これらの和を演算してリターンするものである。
【0040】
図3は、図2に示す2つの関数をマージした後の関数を示している。ここで、「x1」は、double()という関数に情報を与えるための引数であり、「x2」、「y2」は、add()という関数に情報を与えるための引数である。また、「d」は、2つの関数をマージしているため、これらの関数を使い分けるために新たに設けられた引数である。
【0041】
また、マージ後の関数においては、引数dに0を設定した場合、関数doubleの機能が利用でき、1つめの引数(x1)の値を2倍した値を求めることができる。この場合は,2つめ(x2)と3つめ(x3)の引数は無視される。また、引数dに0以外の値(例えば1)を設定した場合は、関数addの機能が利用でき、2つめの引数(x2)の値と3つめの引数(x3)の値の和を求めることができる。この場合は、1つめの引数(x1)は、無視される。
【0042】
また、本実施例では、一方が、整数を出力とし、もう一方が、実数を出力としている。このように、出力のデータ型が異なる関数をマージする場合には、上記のように、計算結果をデータ領域に格納するとともに、当該データ領域のアドレスをポインタ変数(p)に格納し、アドレスを返すことにより、ポインタ変数を介したデータの出力を行う。一方で、出力のデータ型が同一の関数をマージする場合は、戻り値をそのまま返す方法でのデータの出力が可能である。さらに、上記の例では、関数の使い分けのために、単一の引数(d)を用いているが、複数の引数を用いることにより、さらに解析を困難にすることができる。
【0043】
以上、説明したように、本実施形態によれば、複数の関数を1つの関数にマージするため、関数の規模が増大し,解析が困難になる。また、マージ後の関数については、新たに導入する引数を用いることにより、関数を使い分けることができる。
【0044】
<第2の実施形態>
図4から図12を用いて、本実施形態に係るソフトウェアの難読化装置について説明する。なお、本実施形態は、第1の実施形態で行った関数のマージ後に、ソフトウェア内の任意の変数を符号化するものである。
【0045】
<ソフトウェアの難読化装置の構成>
本実施形態に係るソフトウェアの難読化装置は、図4に示すように、関数抽出部100と、マージ部200と、分割部300と、変換部400とから構成されている。なお、第1の実施形態と同一の符号を付す構成要素については、同一の機能を有することから、その詳細な説明は、省略する。
【0046】
分割部300は、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。変換部400は、分割された変数を含むソフトウェアを変換する。
【0047】
<共用体について>
分割部300で用いられる共用体について説明する。
共用体とは、複数の変数が同一のメモリ領域を共有する構造を指す。共用体を用いることで、バイト長が大きな変数を複数の変数に分割して、既存方式で符号化できる。例えば、倍精度浮動小数点型変数(double)型変数は、2つの整数(int)型変数に分割できる。図5に、共用体の例を示す。定義されたDATA型変数datは、そのメンバ変数dat.dをdouble型変数として利用できる。一方で、メンバ変数dat.i[0]をこのdouble型変数の下位4バイトを操作するためのint型変数として利用できる。また、dat.i[1]も同様に、上位4バイトを操作するためのint型変数として利用できる。
【0048】
<変換部の内部構成>
図6に示すように、変換部400は、さらに、選択部410と、符号化変数決定部420と、ルール決定部430と、置き換え部440と、修正部450とから構成されている。
【0049】
なお、以下では、対象ソフトウェアには、N個の変数、x1、x2、・・・、xnが含まれているものとし、変数x1に格納される値が実行結果として出力されているものと仮定して、一般性を失わないものとする。また、実行結果を格納する変数が複数存在する場合も、1つの変数に実行結果を格納するソフトウェアが複数存在するものとみなすことで、個々のソフトウェアについて同様に扱うことができる。
【0050】
選択部410は、符号化の対象とするn個の変数x1、x2、・・・、xnを選択する。ここで、実行結果が格納される変数x1は、符号化対象として選択する必要がある。また、個数nは、任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合には、より小さな値を選択する。但し、以下の変数は、符号化対象から除外するものとする。1)利用者の入力が直接書き込まれる変数。2)アドレス演算子により当該変数のアドレスが取得されている変数。
【0051】
符号化変数決定部420は、m個の符号化変数y1、y2、・・・、ymを決定する。ここで、個数mは、符号化対象変数の個数nよりも大きく設定する。なお、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合には、より小さな値を選択する。
【0052】
ルール決定部430は、m行n列のプール行列Aとm次元の整数型ベクトルbを任意に決定する。但し、行列Aは、ランクがnとなるように選択する。行列Aと整数型ベクトルbとにより、以下の関係式数1を構成する。
【0053】
【数1】
【0054】
上式の各行を符号化ルールとすると、数2のようになる。
【0055】
【数2】
【0056】
次に、符号化ルールを未知変数x1、x2、・・・、xnに対する連立方程式とみなし、解くことにより、数3を得る。
【0057】
【数3】
【0058】
この各式を復号ルールとする。なお、上記の連立方程式を解く過程では、n個の符号化ルールが使われる。使われなかった符号化ルールに含まれる変数x1、x2、・・・、xnを復号ルールを用いて符号化変数に置き換えることで、m−n個の非自明な関係式が得られる。ここで、符号化変数y1、y2、・・・、ymは、常にこれらの関係式をみたす。
【0059】
置き換え部440は、プログラム内の符号化対象変数x1、x2、・・・、xnを、符号化変数y1、y2、・・・、ymで置き換える、まず、代入が行われている変数を符号化変数に置き換え、次に、参照が行われている変数を符号化変数に置き換える。
【0060】
具体的には、図7に示す第1の置換部441が代入命令xi←fを以下、数4に示す命令に置き換える。
【0061】
【数4】
【0062】
これにより、右辺の関数e1、e2、・・・、emにおいては、代入が行われる対象変数xiが、式fに置換されている。
【0063】
また、図7に示す第2の置換部442は、上記の処理で得られた命令列において、参照されている対象変数x1、x2、・・・、xnを、それぞれ、復号ルールd1、d2、・・・、dnで置き換え、式を整理する。
【0064】
修正部450は、変換したソフトウェアを正しく実行できるようにするため、修正する。具体的には、図8に示す追加部451が符号化変数y1、y2、・・・、ymおよびこれらの変数の値を退避するための一時変数t1、t2、・・・、tmの定義を追加する。
【0065】
また、図8に示す変換部452は、第1の置換部441で変換した命令を逐次実行できる命令列に変換する。つまり、数5に示す命令列を数6に示す命令列に変更する。このように、更新前の符号化変数の値を一時変数に退避しておくことで、更新後の符号化変数の値を順次計算できる。ここで、関数e1´、e2´、・・・、em´は、それぞれ、関数e1、e2、・・・、emにおいて、符号化変数y1、y2、・・・、ymを一時変数t1、t2、・・・、tmで置き換えたものである。
【0066】
【数5】
【0067】
【数6】
【0068】
<ソフトウェアの難読化装置の処理>
図9を用いて、本実施形態に係るソフトウェアの難読化装置の処理について説明する。なお、マージに関する処理については、第1の実施形態と同様であるため、その詳細な説明は、省略する。
【0069】
まず、分割部300が、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する(ステップS101)。そして、変換部400が分割された変数を含むソフトウェアを変換する(ステップS102)。
【0070】
なお、変換部400においては、上述のように、選択処理、符号化変数決定処理、ルール決定処理、置き換え処理、修正処理が行われる。
【0071】
したがって、本実施形態によれば、複数の関数を1つの関数にマージするため、関数の規模が増大し,解析が困難になる。また、マージ後の関数については、新たに導入する引数を用いることにより、関数を使い分けることができる。さらに、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となることにより、セマンティクスが異なる複数のデータまとめて変換できるようになり、さらに、安全性が向上する。
【0072】
<実施例>
図10は、難読化前のソースコードであり、本実施例では、区分求積により、関数fの区間[a;b]における定積分を求める関数の変換例を示す。
【0073】
ここで、変数の符号化に用いたルールは、数7に示すとおりである。但し、sumHは、sumの上位4バイトを、sumLは下位4バイトを意味する。図11に変数変換を導入したソースコードを、図12に難読化後のソースコードを示す。
【0074】
【数7】
【0075】
なお、ソフトウェアの難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをソフトウェアの難読化装置に読み込ませ、実行することによって本発明のソフトウェアの難読化装置を実現することができる。ここでいうコンピュータシステムとは、OSや周辺装置等のハードウェアを含む。
【0076】
また、「コンピュータシステム」は、WWW(World Wide Web)システムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことをいう。
【0077】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル(差分プログラム)であっても良い。
【0078】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【0079】
100;関数抽出部
200;マージ部
300;分割部
400;変換部
210;選択部
220;符号化変数決定部
230;ルール決定部
240;置き換え部
241;第1の置換部
242;第2の置換部
250;修正部
251;追加部
252;変換部
【特許請求の範囲】
【請求項1】
ソフトウェアの解析を困難にするソフトウェアの難読化装置であって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備えたことを特徴とするソフトウェアの難読化装置。
【請求項2】
前記依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築することを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項3】
前記依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージすることを特徴とする請求項2に記載のソフトウェアの難読化装置。
【請求項4】
前記依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージすることを特徴とする請求項2に記載のソフトウェアの難読化装置。
【請求項5】
さらに、
前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する分割手段と、
該分割された変数を含むソフトウェアを変換する変換手段と、
を備えたことを特徴とするソフトウェアの難読化装置。
【請求項6】
前記変換手段が、
符号化の対象となる変数を選択する選択手段と、
該選択した符号化変数からm個の符号化変数を決定する符号化変数決定手段と、
符号化ルールおよび復号化ルールを決定するルール決定手段と、
ソフトウェア内の符号化変数を他の符号化変数に置き換える置き換え手段と、
変換したソフトウェアを正しく実行できるように修正する修正手段と、
を備えたことを特徴とする請求項5に記載のソフトウェアの難読化装置。
【請求項7】
前記置き換え手段が、
代入が行われている対象変数を置換する第1の置換手段と、
参照が行われている対象変数を置換する第2の置換手段と、
を備えたことを特徴とする請求項6に記載のソフトウェアの難読化装置。
【請求項8】
前記修正手段が、
符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加する追加手段と、
前記第1の置換手段で置換した代入命令を実行できる命令列に変換する変換手段と、
を備えたことを特徴とする請求項7に記載のソフトウェアの難読化装置。
【請求項9】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップを備えたことを特徴とするソフトウェアの難読化方法。
【請求項10】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、
前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップと、
該分割された変数を含むソフトウェアを変換する第3のステップと、
を備えたことを特徴とするソフトウェアの難読化方法。
【請求項11】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップをコンピュータに実行させるためのプログラム。
【請求項12】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、
前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップと、
該分割された変数を含むソフトウェアを変換する第3のステップと、
をコンピュータに実行させるためのプログラム。
【請求項1】
ソフトウェアの解析を困難にするソフトウェアの難読化装置であって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備えたことを特徴とするソフトウェアの難読化装置。
【請求項2】
前記依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築することを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項3】
前記依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージすることを特徴とする請求項2に記載のソフトウェアの難読化装置。
【請求項4】
前記依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージすることを特徴とする請求項2に記載のソフトウェアの難読化装置。
【請求項5】
さらに、
前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する分割手段と、
該分割された変数を含むソフトウェアを変換する変換手段と、
を備えたことを特徴とするソフトウェアの難読化装置。
【請求項6】
前記変換手段が、
符号化の対象となる変数を選択する選択手段と、
該選択した符号化変数からm個の符号化変数を決定する符号化変数決定手段と、
符号化ルールおよび復号化ルールを決定するルール決定手段と、
ソフトウェア内の符号化変数を他の符号化変数に置き換える置き換え手段と、
変換したソフトウェアを正しく実行できるように修正する修正手段と、
を備えたことを特徴とする請求項5に記載のソフトウェアの難読化装置。
【請求項7】
前記置き換え手段が、
代入が行われている対象変数を置換する第1の置換手段と、
参照が行われている対象変数を置換する第2の置換手段と、
を備えたことを特徴とする請求項6に記載のソフトウェアの難読化装置。
【請求項8】
前記修正手段が、
符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加する追加手段と、
前記第1の置換手段で置換した代入命令を実行できる命令列に変換する変換手段と、
を備えたことを特徴とする請求項7に記載のソフトウェアの難読化装置。
【請求項9】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップを備えたことを特徴とするソフトウェアの難読化方法。
【請求項10】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、
前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップと、
該分割された変数を含むソフトウェアを変換する第3のステップと、
を備えたことを特徴とするソフトウェアの難読化方法。
【請求項11】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップをコンピュータに実行させるためのプログラム。
【請求項12】
ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、
前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、
前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップと、
該分割された変数を含むソフトウェアを変換する第3のステップと、
をコンピュータに実行させるためのプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【公開番号】特開2012−234248(P2012−234248A)
【公開日】平成24年11月29日(2012.11.29)
【国際特許分類】
【出願番号】特願2011−100465(P2011−100465)
【出願日】平成23年4月28日(2011.4.28)
【出願人】(000208891)KDDI株式会社 (2,700)
【Fターム(参考)】
【公開日】平成24年11月29日(2012.11.29)
【国際特許分類】
【出願日】平成23年4月28日(2011.4.28)
【出願人】(000208891)KDDI株式会社 (2,700)
【Fターム(参考)】
[ Back to top ]