"ソフトウェアの解析を困難にするソフトウェアの難読化装置であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備えたことを特徴とするソフトウェアの難読化装置。前記依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築することを特徴とする請求項1に記載のソフトウェアの難読化装置。前記依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージすることを特徴とする請求項2に記載のソフトウェアの難読化装置。前記依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージすることを特徴とする請求項2に記載のソフトウェアの難読化装置。さらに、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する分割手段と、該分割された変数を含むソフトウェアを変換する変換手段と、を備えたことを特徴とするソフトウェアの難読化装置。前記変換手段が、符号化の対象となる変数を選択する選択手段と、該選択した符号化変数からm個の符号化変数を決定する符号化変数決定手段と、符号化ルールおよび復号化ルールを決定するルール決定手段と、ソフトウェア内の符号化変数を他の符号化変数に置き換える置き換え手段と、変換したソフトウェアを正しく実行できるように修正する修正手段と、を備えたことを特徴とする請求項5に記載のソフトウェアの難読化装置。前記置き換え手段が、代入が行われている対象変数を置換する第1の置換手段と、参照が行われている対象変数を置換する第2の置換手段と、を備えたことを特徴とする請求項6に記載のソフトウェアの難読化装置。前記修正手段が、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加する追加手段と、前記第1の置換手段で置換した代入命令を実行できる命令列に変換する変換手段と、を備えたことを特徴とする請求項7に記載のソフトウェアの難読化装置。ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップを備えたことを特徴とするソフトウェアの難読化方法。ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップと、該分割された変数を含むソフトウェアを変換する第3のステップと、を備えたことを特徴とするソフトウェアの難読化方法。ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップをコンピュータに実行させるためのプログラム。ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップと、該分割された変数を含むソフトウェアを変換する第3のステップと、をコンピュータに実行させるためのプログラム。つまり、従来の技術は、プログラムにおけるデータ及び処理内容の解析あるいは改ざんの防止を目的とした難読化方式であるため、こうした難読化方式は関数の機能を保ちつつ解析あるいは改ざんを防止するための方式であり、対象となる関数の入出力の仕様が、難読化により変更されることはない。そのため、単一の関数を対象とした難読化方式では、関数を抜き出して流用する攻撃に対しては、十分な安全性を実現できないという問題があった。そこで、本発明は、上述の課題に鑑みてなされたものであり、関数を抜き出して流用する攻撃に対しても、十分な耐性を有するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムを提供することを目的とする。本発明は、上記の課題を解決するために以下の事項を提案している。なお、理解を容易にするために、本発明の実施形態に対応する符号を付して説明するが、これに限定されるものではない。1本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段例えば、図1のマージ部200に相当を備えたことを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する依存関係生成手段を備える。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。2本発明は、1のソフトウェアの難読化装置について、前記依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築することを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、依存関係生成手段が、複数の関数を1つの関数にマージすることにより、依存関係を構築する。つまり、複数の関数を1つの関数にマージして、その規模を大きくすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。3本発明は、2のソフトウェアの難読化装置について、前記依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージすることを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、依存関係生成手段が、機能の異なる複数の関数について、機能選択用の引数を用いて1つの関数にマージする。つまり、機能の異なる複数の関数については、機能選択用の引数を用いて1つの関数にマージすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。4本発明は、2のソフトウェアの難読化装置について、前記依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージすることを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、依存関係生成手段が、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージする。つまり、戻り値のデータ型が異なる複数の関数については、データ出力用のポインタ型変数を用いて、1つの関数にマージすることにより、関数の解析を困難にし、機能の抜き出しを困難にする。5本発明は、さらに、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する分割手段例えば、図4の分割部300に相当と、該分割された変数を含むソフトウェアを変換する変換手段例えば、図4の変換部400に相当と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、分割手段は、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。変換手段は、分割された変数を含むソフトウェアを変換する。したがって、分割手段により、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となる。なお、ここで、共用体とは、複数の変数が同一のメモリ領域を共有する構造を指し、共用体を用いることで、バイト長が大きな変数を複数の変数に分割して、既存方式で符号化できる.例えば、倍精度浮動小数点型変数double型変数は、2つの整数int型変数に分割できる。6本発明は、5のソフトウェアの難読化装置について、前記変換手段が、符号化の対象となる変数を選択する選択手段例えば、図6の選択部410に相当と、該選択した符号化変数からm個の符号化変数を決定する符号化変数決定手段例えば、図6の符号化変数決定部420に相当と、符号化ルールおよび復号化ルールを決定するルール決定手段例えば、図6のルール決定部430に相当と、ソフトウェア内の符号化変数を他の符号化変数に置き換える置き換え手段例えば、図6の置き換え部440に相当と、変換したソフトウェアを正しく実行できるように修正する修正手段例えば、図6の修正部450に相当と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、選択手段は、符号化の対象となる変数を選択し、符号化変数決定手段は、選択した符号化変数からm個の符号化変数を決定する。そして、ルール決定手段が、符号化ルールおよび復号化ルールを決定し、置き換え手段が、ソフトウェア内の符号化変数を他の符号化変数に置き換え、修正手段が変換したソフトウェアを正しく実行できるように修正する。したがって、ソフトウェアを変換することによって、ソフトウェアの難読化を実現することができる。7本発明は、6のソフトウェアの難読化装置について、前記置き換え手段が、代入が行われている対象変数を置換する第1の置換手段例えば、図7の第1の置換部441に相当と、参照が行われている対象変数を置換する第2の置換手段例えば、図7の第2の置換部442に相当と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、第1の置換手段は、代入が行われている対象変数を置換し、第2の置換手段は、参照が行われている対象変数を置換する。これにより、効果的に難読化を実行することができる。8本発明は、7のソフトウェアの難読化装置について、前記修正手段が、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加する追加手段例えば、図8の追加部451に相当と、前記第1の置換手段で置換した代入命令を実行できる命令列に変換する変換手段例えば、図8の変換部452に相当と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。この発明によれば、追加手段は、符号化変数およびこれらの変数の値を退避するための一次変数の定義を追加し、変換手段は、第1の置換手段で置換した代入命令を実行できる命令列に変換する。したがって、この処理により、難読化を図りつつ、実行可能なソフトウェアとすることができる。9本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップを備えたことを特徴とするソフトウェアの難読化方法を提案している。この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。10本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法であって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップ例えば、図9のステップS101に相当と、該分割された変数を含むソフトウェアを変換する第3のステップ例えば、図9のステップS102に相当と、を備えたことを特徴とするソフトウェアの難読化方法を提案している。この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成し、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。そして、その分割された変数を含むソフトウェアを変換する。つまり、複数の関数について、依存関係を生成することにより、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。さらに、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となるため、さらに、安全性が向上する。11本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成するステップをコンピュータに実行させるためのプログラムを提案している。この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成する。つまり、複数の関数について依存関係を構築して、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。12本発明は、ソフトウェアの解析を困難にするソフトウェアの難読化装置におけるソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、前記ソフトウェアに含まれる複数の関数について、依存関係を生成する第1のステップと、前記ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する第2のステップ例えば、図9のステップS101に相当と、該分割された変数を含むソフトウェアを変換する第3のステップ例えば、図9のステップS102に相当と、をコンピュータに実行させるためのプログラムを提案している。この発明によれば、ソフトウェアに含まれる複数の関数について、依存関係を生成し、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。そして、その分割された変数を含むソフトウェアを変換する。つまり、複数の関数について、依存関係を生成することにより、その規模を大きくすることによって、関数の解析を困難にし、機能の抜き出しを困難にする。さらに、バイト長が長い変数を複数の変数に分割できるため、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となるため、さらに、安全性が向上する。本発明によれば、複数の関数に依存関係を持たせることができるため、単一の関数の抜き出しによる流用を困難にすることができるという効果がある。以下、本発明の実施形態について、図面を用いて、詳細に説明する。なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。<第1の実施形態>図1を用いて、本実施形態に係るソフトウェアの難読化装置について説明する。<ソフトウェアの難読化装置の構成>本実施形態に係るソフトウェアの難読化装置は、関数抽出部100と、マージ部200とから構成されている。関数抽出部100は、ソフトウェアから関数を抽出する。マージ部200は、関数抽出部100が抽出した複数の関数をマージする処理を行う。なお、機能の異なる複数の関数については、機能選択用の引数を用いて1つの関数にマージし、戻り値のデータ型が異なる複数の関数について、データ出力用のポインタ型変数を用いて、1つの関数にマージする。<ソフトウェアの難読化装置の処理>本実施形態に係るソフトウェアの難読化装置の処理を図2および図3に示す実施例に基づいて、説明する。図2は、マージを行う2つの関数を示している。ここで、上段の関数は、整数値を取得して、これを2倍に演算してリターンするものであり、下段の関数は、x、yという2つの引数を取得して、これらの和を演算してリターンするものである。図3は、図2に示す2つの関数をマージした後の関数を示している。ここで、x1は、doubleという関数に情報を与えるための引数であり、x2、y2は、addという関数に情報を与えるための引数である。また、dは、2つの関数をマージしているため、これらの関数を使い分けるために新たに設けられた引数である。また、マージ後の関数においては、引数dに0を設定した場合、関数doubleの機能が利用でき、1つめの引数x1の値を2倍した値を求めることができる。この場合は,2つめx2と3つめx3の引数は無視される。また、引数dに0以外の値例えば1を設定した場合は、関数addの機能が利用でき、2つめの引数x2の値と3つめの引数x3の値の和を求めることができる。この場合は、1つめの引数x1は、無視される。また、本実施例では、一方が、整数を出力とし、もう一方が、実数を出力としている。このように、出力のデータ型が異なる関数をマージする場合には、上記のように、計算結果をデータ領域に格納するとともに、当該データ領域のアドレスをポインタ変数pに格納し、アドレスを返すことにより、ポインタ変数を介したデータの出力を行う。一方で、出力のデータ型が同一の関数をマージする場合は、戻り値をそのまま返す方法でのデータの出力が可能である。さらに、上記の例では、関数の使い分けのために、単一の引数dを用いているが、複数の引数を用いることにより、さらに解析を困難にすることができる。以上、説明したように、本実施形態によれば、複数の関数を1つの関数にマージするため、関数の規模が増大し,解析が困難になる。また、マージ後の関数については、新たに導入する引数を用いることにより、関数を使い分けることができる。<第2の実施形態>図4から図12を用いて、本実施形態に係るソフトウェアの難読化装置について説明する。なお、本実施形態は、第1の実施形態で行った関数のマージ後に、ソフトウェア内の任意の変数を符号化するものである。<ソフトウェアの難読化装置の構成>本実施形態に係るソフトウェアの難読化装置は、図4に示すように、関数抽出部100と、マージ部200と、分割部300と、変換部400とから構成されている。なお、第1の実施形態と同一の符号を付す構成要素については、同一の機能を有することから、その詳細な説明は、省略する。分割部300は、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割する。変換部400は、分割された変数を含むソフトウェアを変換する。<共用体について>分割部300で用いられる共用体について説明する。共用体とは、複数の変数が同一のメモリ領域を共有する構造を指す。共用体を用いることで、バイト長が大きな変数を複数の変数に分割して、既存方式で符号化できる。例えば、倍精度浮動小数点型変数double型変数は、2つの整数int型変数に分割できる。図5に、共用体の例を示す。定義されたDATA型変数datは、そのメンバ変数dat.dをdouble型変数として利用できる。一方で、メンバ変数dat.i[0]をこのdouble型変数の下位4バイトを操作するためのint型変数として利用できる。また、dat.i[1]も同様に、上位4バイトを操作するためのint型変数として利用できる。<変換部の内部構成>図6に示すように、変換部400は、さらに、選択部410と、符号化変数決定部420と、ルール決定部430と、置き換え部440と、修正部450とから構成されている。なお、以下では、対象ソフトウェアには、N個の変数、x1、x2、、xnが含まれているものとし、変数x1に格納される値が実行結果として出力されているものと仮定して、一般性を失わないものとする。また、実行結果を格納する変数が複数存在する場合も、1つの変数に実行結果を格納するソフトウェアが複数存在するものとみなすことで、個々のソフトウェアについて同様に扱うことができる。選択部410は、符号化の対象とするn個の変数x1、x2、、xnを選択する。ここで、実行結果が格納される変数x1は、符号化対象として選択する必要がある。また、個数nは、任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合には、より小さな値を選択する。但し、以下の変数は、符号化対象から除外するものとする。1利用者の入力が直接書き込まれる変数。2アドレス演算子により当該変数のアドレスが取得されている変数。符号化変数決定部420は、m個の符号化変数y1、y2、、ymを決定する。ここで、個数mは、符号化対象変数の個数nよりも大きく設定する。なお、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合には、より小さな値を選択する。ルール決定部430は、m行n列のプール行列Aとm次元の整数型ベクトルbを任意に決定する。但し、行列Aは、ランクがnとなるように選択する。行列Aと整数型ベクトルbとにより、以下の関係式数1を構成する。上式の各行を符号化ルールとすると、数2のようになる。次に、符号化ルールを未知変数x1、x2、、xnに対する連立方程式とみなし、解くことにより、数3を得る。この各式を復号ルールとする。なお、上記の連立方程式を解く過程では、n個の符号化ルールが使われる。使われなかった符号化ルールに含まれる変数x1、x2、、xnを復号ルールを用いて符号化変数に置き換えることで、m-n個の非自明な関係式が得られる。ここで、符号化変数y1、y2、、ymは、常にこれらの関係式をみたす。置き換え部440は、プログラム内の符号化対象変数x1、x2、、xnを、符号化変数y1、y2、、ymで置き換える、まず、代入が行われている変数を符号化変数に置き換え、次に、参照が行われている変数を符号化変数に置き換える。具体的には、図7に示す第1の置換部441が代入命令xi←fを以下、数4に示す命令に置き換える。これにより、右辺の関数e1、e2、、emにおいては、代入が行われる対象変数xiが、式fに置換されている。また、図7に示す第2の置換部442は、上記の処理で得られた命令列において、参照されている対象変数x1、x2、、xnを、それぞれ、復号ルールd1、d2、、dnで置き換え、式を整理する。修正部450は、変換したソフトウェアを正しく実行できるようにするため、修正する。具体的には、図8に示す追加部451が符号化変数y1、y2、、ymおよびこれらの変数の値を退避するための一時変数t1、t2、、tmの定義を追加する。また、図8に示す変換部452は、第1の置換部441で変換した命令を逐次実行できる命令列に変換する。つまり、数5に示す命令列を数6に示す命令列に変更する。このように、更新前の符号化変数の値を一時変数に退避しておくことで、更新後の符号化変数の値を順次計算できる。ここで、関数e1 ́、e2 ́、、em ́は、それぞれ、関数e1、e2、、emにおいて、符号化変数y1、y2、、ymを一時変数t1、t2、、tmで置き換えたものである。<ソフトウェアの難読化装置の処理>図9を用いて、本実施形態に係るソフトウェアの難読化装置の処理について説明する。なお、マージに関する処理については、第1の実施形態と同様であるため、その詳細な説明は、省略する。まず、分割部300が、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割するステップS101。そして、変換部400が分割された変数を含むソフトウェアを変換するステップS102。なお、変換部400においては、上述のように、選択処理、符号化変数決定処理、ルール決定処理、置き換え処理、修正処理が行われる。したがって、本実施形態によれば、複数の関数を1つの関数にマージするため、関数の規模が増大し,解析が困難になる。また、マージ後の関数については、新たに導入する引数を用いることにより、関数を使い分けることができる。さらに、任意のデータ長の変数、すなわち、すべての型の変数を符号化することが可能となることにより、セマンティクスが異なる複数のデータまとめて変換できるようになり、さらに、安全性が向上する。<実施例>図10は、難読化前のソースコードであり、本実施例では、区分求積により、関数fの区間[a;b]における定積分を求める関数の変換例を示す。ここで、変数の符号化に用いたルールは、数7に示すとおりである。但し、sumHは、sumの上位4バイトを、sumLは下位4バイトを意味する。図11に変数変換を導入したソースコードを、図12に難読化後のソースコードを示す。なお、ソフトウェアの難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをソフトウェアの難読化装置に読み込ませ、実行することによって本発明のソフトウェアの難読化装置を実現することができる。ここでいうコンピュータシステムとは、OSや周辺装置等のハードウェアを含む。また、コンピュータシステムは、WWWWorldWideWebシステムを利用している場合であれば、ホームページ提供環境あるいは表示環境も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する伝送媒体は、インターネット等のネットワーク通信網や電話回線等の通信回線通信線のように情報を伝送する機能を有する媒体のことをいう。また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル差分プログラムであっても良い。以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。"