説明

ソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラム

【課題】オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長の異なる複数の変数を同時に符号化してソフトウェアを難読化する。
【解決手段】データ変換用クラスを定義し、ソフトウェアから符号化の対象となる任意型の変数をn個(n;正の整数)選択する。次に、選択されたn個の任意型の変数をそれぞれ固定長のデータに分割し、m個(m;正の整数)の符号化式を定義して、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する。そして、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換し、符号化変数に初期値を与え、連続する代入命令をマージする。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長の異なる複数の変数を同時に符号化してソフトウェアを難読化するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムに関する。
【背景技術】
【0002】
一般に、ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵など、利用者に対して秘密にすべき情報が含まれる場合がある。このような情報が外部に露呈すると、サービスの継続に大きな影響を及ぼす可能性が高い。そのため、例えば、著作権管理プログラムに含まれる鍵等は、保護すべきデータであり、こうした鍵の生成や廃棄などの鍵管理処理は、保護すべき処理内容である。
【0003】
一方で、ソフトウェアを解析するための技術(RE:Reverse Engineering)が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【0004】
例えば、ソフトウェアに含まれるデータを符号化することにより、ソフトウェアの解析を困難にする方式として、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を実現する技術が知られている(例えば、特許文献1参照。)。
【0005】
また、C言語の共用体を利用して、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割し、分割された変数を含むソフトウェアを変換することにより、ソフトウェアに含まれるバイト長の異なる複数の変数を同時に符号化してソフトウェアの解析を困難にすることも考えられる。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2006−079347号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、特許文献1に記載の技術では、符号化の対象が同じバイト長の変数のみに制約されてしまう。そのため、例えば、バイト長が異なる整数型変数と倍精度浮動小数型変数を同時に符号化することは不可能であるという問題があった。
【0008】
また、上記のように、C言語については、C言語の共用体を利用することにより、バイト長が異なる整数型変数と倍精度浮動小数型変数を同時に符号化することも可能であると考えられるが、オブジェクト指向言語では、共用体を利用することができないため、上記の技術では、オブジェクト指向言語で記述されたソフトウェアについて、バイト長が異なる整数型変数と倍精度浮動小数型変数を同時に符号化することは不可能であるという問題があった。
【0009】
そこで、本発明は、上述の課題に鑑みてなされたものであり、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長の異なる複数の変数を同時に符号化してソフトウェアを難読化するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【0010】
本発明は、上記の課題を解決するために以下の事項を提案している。なお、理解を容易にするために、本発明の実施形態に対応する符号を付して説明するが、これに限定されるものではない。
【0011】
(1)本発明は、オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化装置であって、データ変換用クラスを定義するデータ変換用クラス定義手段(例えば、図1のクラス定義部110に相当)と、前記ソフトウェアから前記符号化の対象となる任意型の変数をn個(n;正の整数)選択する選択手段(例えば、図1の選択部120に相当)と、前記選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する分割手段(例えば、図1の分割部130に相当)と、m個(m;正の整数)の符号化式を定義する符号化式定義手段(例えば、図1の符号化式定義部140に相当)と、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する導出手段(例えば、図1の式導出部150に相当)と、前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する置換手段(例えば、図1の置換部160に相当)と、該符号化変数に初期値を与え、連続する代入命令をマージするマージ手段(例えば、図1のマージ部170に相当)と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【0012】
この発明によれば、データ変換用クラス定義手段は、データ変換用クラスを定義する。選択手段は、ソフトウェアから符号化の対象となる任意型の変数をn個(n;正の整数)選択する。分割手段は、選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する。符号化式定義手段は、m個(m;正の整数)の符号化式を定義する。導出手段は、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する。置換手段は、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換する。マージ手段は、符号化変数に初期値を与え、連続する代入命令をマージする。したがって、本発明においては、データ変換クラスを用いて、バイト長が異なる複数の変数を任意長のデータに分割して、これらを個別に符号化できるため、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長が異なる複数の変数を同時に符号化して、ソフトウェアの難読化を行うことができる。
【0013】
(2)本発明は、(1)のソフトウェアの難読化装置について、前記符号化変数に対する復号処理において、命令列を変更することを特徴とするソフトウェアの難読化装置を提案している。
【0014】
この発明によれば、符号化変数に対する復号処理において、命令列を変更する。これにより、処理の正しさを保証し、かつ不正な第三者による処理の解析を防止することができる。
【0015】
(3)本発明は、(1)のソフトウェアの難読化装置について、前記置換手段が、前記符号化変数にm−nの非自明な関係式を満たす任意の初期値を与えることを特徴とするソフトウェアの難読化装置を提案している。
【0016】
この発明によれば、置換手段が、符号化変数にm−nの非自明な関係式を満たす任意の初期値を与える。これにより、不正な第三者によるソフトウェアの解析を困難にすることができる。
【0017】
(4)本発明は、(1)のソフトウェアの難読化装置について、前記符号化式定義手段が、m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成する生成手段を備え、前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義することを特徴とするソフトウェアの難読化装置を提案している。
【0018】
この発明によれば、生成手段が、m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成し、生成した行列およびベクトルを変換鍵としてn個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する。したがって、ソフトウェア中のn個の変数を線形変換により同時にm個の整数に符号化するため、ソフトウェア中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【0019】
(5)本発明は、(1)のソフトウェアの難読化装置について、前記任意型の変数が、整数型変数および倍精度浮動小数型変数であることを特徴とするソフトウェアの難読化装置を提案している。
【0020】
この発明によれば、任意型の変数が、整数型変数および倍精度浮動小数型変数である。つまり、本発明により、オブジェクト指向言語で記述されたソフトウェア内に、代表的なバイト長4バイトの整数型変数とバイト長8バイトの倍精度浮動小数型変数が含まれていても、これらの変数を同時に符号化することができる。
【0021】
(6)本発明は、(1)のソフトウェアの難読化装置について、前記オブジェクト指向言語がjava言語であることを特徴とするソフトウェアの難読化装置を提案している。
【0022】
この発明によれば、オブジェクト指向言語がjava言語である。したがって、最も代表的なjava言語で記述されたソフトウェアにおいても、本発明を適用することができる。
【0023】
(7)本発明は、オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法であって、データ変換用クラスを定義する第1のステップ(例えば、図2のステップS101に相当)と、前記ソフトウェアから前記符号化の対象となる任意型の変数をn個(n;正の整数)選択する第2のステップ(例えば、図2のステップS102に相当)と、前記選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する第3のステップ(例えば、図2のステップS103に相当)と、m個(m;正の整数)の符号化式を定義する第4のステップ(例えば、図2のステップS104に相当)と、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する第5のステップ(例えば、図2のステップS105に相当)と、前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する第6のステップ(例えば、図2のステップS106に相当)と、該符号化変数に初期値を与え、連続する代入命令をマージする第7のステップ(例えば、図2のステップS107に相当)と、を備えたことを特徴とするソフトウェアの難読化方法を提案している。
【0024】
この発明によれば、データ変換用クラスを定義し、ソフトウェアから符号化の対象となる任意型の変数をn個(n;正の整数)選択する。次に、選択されたn個の任意型の変数をそれぞれ固定長のデータに分割し、m個(m;正の整数)の符号化式を定義して、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する。そして、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換し、符号化変数に初期値を与え、連続する代入命令をマージする。したがって、本発明においては、データ変換クラスを用いて、バイト長が異なる複数の変数を任意長のデータに分割して、これらを個別に符号化できるため、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長が異なる複数の変数を同時に符号化して、ソフトウェアの難読化を行うことができる。
【0025】
(8)本発明は、(7)のソフトウェアの難読化方法について、前記第4のステップが、m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成する第8のステップ(例えば、図3のステップS1401に相当)と、前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する第9のステップ(例えば、図3のステップS1402に相当)とを備えたことを特徴とするソフトウェアの難読化方法を提案している。
【0026】
この発明によれば、第4のステップにおいて、m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成し、生成した行列およびベクトルを変換鍵としてn個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する。したがって、ソフトウェア中のn個の変数を線形変換により同時にm個の整数に符号化するため、ソフトウェア中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【0027】
(9)本発明は、オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、データ変換用クラスを定義する第1のステップ(例えば、図2のステップS101に相当)と、前記ソフトウェアから前記符号化の対象となる任意型の変数をn個(n;正の整数)選択する第2のステップ(例えば、図2のステップS102に相当)と、前記選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する第3のステップ(例えば、図2のステップS103に相当)と、m個(m;正の整数)の符号化式を定義する第4のステップ(例えば、図2のステップS104に相当)と、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する第5のステップ(例えば、図2のステップS105に相当)と、前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する第6のステップ(例えば、図2のステップS106に相当)と、該符号化変数に初期値を与え、連続する代入命令をマージする第7のステップ(例えば、図2のステップS107に相当)と、をコンピュータに実行させるためのプログラムを提案している。
【0028】
この発明によれば、データ変換用クラスを定義し、ソフトウェアから符号化の対象となる任意型の変数をn個(n;正の整数)選択する。次に、選択されたn個の任意型の変数をそれぞれ固定長のデータに分割し、m個(m;正の整数)の符号化式を定義して、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する。そして、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換し、符号化変数に初期値を与え、連続する代入命令をマージする。したがって、本発明においては、データ変換クラスを用いて、バイト長が異なる複数の変数を任意長のデータに分割して、これらを個別に符号化できるため、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長が異なる複数の変数を同時に符号化して、ソフトウェアの難読化を行うことができる。
【0029】
(10)本発明は、(9)のプログラムについて、前記第4のステップが、m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成する第8のステップ(例えば、図3のステップS1401に相当)と、前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する第9のステップ(例えば、図3のステップS1402に相当)とをコンピュータに実行させるためのプログラムを提案している。
【0030】
この発明によれば、第4のステップにおいて、m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成し、生成した行列およびベクトルを変換鍵としてn個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する。したがって、ソフトウェア中のn個の変数を線形変換により同時にm個の整数に符号化するため、ソフトウェア中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【発明の効果】
【0031】
本発明によれば、オブジェクト指向言語で記述されたソフトウェアにおいて、任意のデータ長の変数、すなわち、すべての型の変数を符号化することができるという効果がある。また、本発明により、セマンティクスが異なる複数のデータをまとめて変換することにより、従来よりも安全性が向上するという効果がある。さらに、オブジェクト指向言語で記述されたソフトウェア内の各変数の初期値を任意の値で設定できるため、さらに、安全性が向上するという効果がある。
【図面の簡単な説明】
【0032】
【図1】本発明の実施形態に係るソフトウェアの難読化装置の構成を示す図である。
【図2】本発明の実施形態に係るソフトウェアの難読化装置の処理を示す図である。
【図3】本発明の実施形態に係るソフトウェアの難読化装置の難読化の処理を示す図である。
【図4】本発明の実施例に係るデータ変換用クラスを定義するソースコードを例示する図である。
【図5】本発明の実施例に係る変換前のソースコードを例示する図である。
【図6】本発明の実施例に係る変換後のソースコードを例示する図である。
【発明を実施するための形態】
【0033】
以下、本発明の実施形態について、図面を用いて、詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【0034】
<実施形態>
以下、図1から図3を用いて、本発明の実施形態について説明する。
【0035】
<ソフトウェアの難読化装置の構成>
本実施形態に係るソフトウェアの難読化装置は、図1に示すように、クラス定義部110と、選択部120と、分割部130と、符号化式定義部140と、式導出部150と、置換部160と、マージ部170とから構成されている。
【0036】
クラス定義部110は、データ変換用クラスを定義する。選択部120は、ソフトウェアから符号化の対象となる任意型の変数をn個(n;正の整数)選択する。分割部130は、選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する。
【0037】
符号化式定義部140は、m個(m;正の整数)の符号化式を定義する。式導出部150は、n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する。置換部160は、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換する。マージ部170は、符号化変数に初期値を与え、連続する代入命令をマージする。
【0038】
<ソフトウェアの難読化装置の処理>
図2および図3を用いて、ソフトウェアの難読化装置の処理について説明する。なお、本実施形態においては、java言語により記述されたソースコードを難読化する場合を例にとって説明する。また、以下では、double型の変数long_datとint型の変数とを同時に符号化する例について説明するが、これに限らず、その他のバイト長の変数も同様に、int型のデータに分割して符号化することができる。
【0039】
対象のjava言語により記述されたソースコードにデータ変換用クラスの定義を追加する。また、このクラスのクラス変数を定義する。次に、対象のjava言語により記述されたソースコードにint型変数iHおよびiLの定義を追加する。これらの変数は、それぞれ変数long_datの上位4バイトおよび下位4バイトを格納するために用いる。さらに、long_datに対する代入命令long_dat=valを下記、数1の代入命令に置換する。ここで、先に宣言したクラス変数をdiとする。
【0040】
【数1】

【0041】
ソースコードの中から、難読化の対象として符号化を施すn個(nは整数数)の変数を任意に選択する。この操作で選ばれたn個の変数x1,x2…,xn,とする(ステップS102)。
【0042】
次に、ステップS102において、選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する(ステップS103)。さらに、m個(m;正の整数)の符号化式を定義する(ステップS104)。具体的には、図3に示すように、m×n型行列A、m次元ベクトルcを任意に生成し、これらを秘密鍵とする(ステップS1041)。但し、mは、m≧nなる正整数である。さらに、生成した行列Aおよびベクトルcを用いて以下の変換式数2を定義する。
【0043】
【数2】

【0044】
ここで、X1,X2,…,Xmは、難読化後のソフトウェアで用いられる符号化されたm個の変数である。
【0045】
上記した変換式をn個の変数x1,x2,…,xnに関するm本の連立方程式と見なし、それぞれの変数について解く。その結果、それぞれの変数x1,x2,…,xnに関して以下の数3で示す復号式が成立する(ステップS1402)。
【0046】
【数3】

【0047】
なお、変数log_datに対する復号処理は、以下の数4に示す命令列を用いる。
【0048】
【数4】

【0049】
ただし、数4において、d_iHおよびd_iLは、それぞれint型変数iHおよびiLに対する復号式である。
【0050】
また、上記の符号化処理の過程においては、符号化変数に対して、初期値を設定する必要がある。本実施形態においては、符号化処理の過程で得られるm−n個の非自明な関係式を満たす任意の値を符号化変数の初期値として設定することができる。これにより、攻撃者の解析コストが増大するという利点がある。
【0051】
数3に示す復号式および数4に示す命令列によって、元のソースコード中のそれぞれの変数x1,x2,…,xnの値を復号化された変数X1,X2,…Xmを用いて表すことが可能になる。また、この手順では、m本の連立方程式から、n個の変数x1,x2…xnの値を求める。このため、符号化された変数X1,X2,…Xmの間には、m−n個の自明でない以下の関係式数5が成り立つことになる(ステップS105)。
【0052】
【数5】

【0053】
この自明でない関係式を用いることにより、上記の復号式における各変数X1,X2,…,Xmの係数を可変とすることができる。
【0054】
次に、ソースコード中で用いられている変数x1,x2,…,xnを以下の規則に従い、符号化された変数X1,X2,…Xmで置き換える(ステップS106)。
(a)変数xiへの代入命令への置き換え
ソースコード中の変数xiに対する代入命令xi←uを、以下の演算式数6で示されるように、変数X1,X2,…XMに対する代入命令に置き換える。
【0055】
【数6】

【0056】
この代入命令が実行されると、符号化されたm個全ての変換X1,X2,…Xmが、同時に変更される。
(b)参照されている変数xjの置き換え
プログラム中で参照されている変数xjを、数3で示す復号式xj(X1,X2,…Xm)を用いて、変数X1,X2,…Xmの式に置き換える。
【0057】
後処理として、符号化された変数X1,X2,…,Xmへの初期値を与える。また、連続する変数X1,X2,…Xmへの代入命令のマージを行う(ステップS107)。
(a)符号化された変数への初期値代入
上記で示したステップS106の(a)、(b)の処理により、ソースコード中の変数x1,x2,…,xnは全てX1,X2,…,Xmで置き換えられる。これらの変数の初期値は、自明でない関係式f1,f2,…fm−nを満たす任意の整数とする。
(b)連続する代入命令のマージ
ステップS106の(b)の処理により生成された、符号化された変数X1,X2,…Xmへの代入命令の中で、連続するものをマージする。
【0058】
最後に、ソフトウェアの解析が十分に困難であると判定されれば、難読化処理を終了する。さらなる難読化が必要であると判定されれば、ステップS103からステップS107までの処理を繰り返す。
【0059】
したがって、本実施形態によれば、オブジェクト指向言語で記述されたソフトウェアにおいて、任意のデータ長の変数、すなわち、すべての型の変数を符号化することができる。また、本実施形態により、セマンティクスが異なる複数のデータをまとめて変換することにより、従来よりも安全性が向上する。さらに、オブジェクト指向言語で記述されたソフトウェア内の各変数の初期値を任意の値で設定できるため、さらに、安全性が向上する。
【0060】
<実施例>
本実施例においては、区分求積により、関数fの区間[a、b]における定積分を求める関数の変換例を示す。ここで、int型変数cntとdouble型変数sumを符号化の対象変数とする。
【0061】
また、図4は、データ変換用クラスを定義するソースコードを示しているが、この変換に用いたルールは、数7である。
【0062】
【数7】

【0063】
図5は、変換前のソースコードを示し、図6は、上記実施形態に示した処理を上記変換ルールにより変換したソースコードを示している。
【0064】
なお、ソフトウェアの難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをソフトウェアの難読化装置に読み込ませ、実行することによって本発明のソフトウェアの難読化装置を実現することができる。ここでいうコンピュータシステムとは、OSや周辺装置等のハードウェアを含む。
【0065】
また、「コンピュータシステム」は、WWW(World Wide Web)システムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことをいう。
【0066】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル(差分プログラム)であっても良い。
【0067】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【0068】
110;クラス定義部
120;選択部
130;分割部
140;符号化式定義部
150;式導出部
160;置換部
170;マージ部

【特許請求の範囲】
【請求項1】
オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化装置であって、
データ変換用クラスを定義するデータ変換用クラス定義手段と、
前記ソフトウェアから前記符号化の対象となる任意型の変数をn個(n;正の整数)選択する選択手段と、
前記選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する分割手段と、
m個(m;正の整数)の符号化式を定義する符号化式定義手段と、
n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する導出手段と、
前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する置換手段と、
該符号化変数に初期値を与え、連続する代入命令をマージするマージ手段と、
を備えたことを特徴とするソフトウェアの難読化装置。
【請求項2】
前記符号化変数に対する復号処理において、命令列を変更することを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項3】
前記置換手段が、前記符号化変数にm−nの非自明な関係式を満たす任意の初期値を与えることを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項4】
前記符号化式定義手段が、
m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成する生成手段を備え、
前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義することを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項5】
前記任意型の変数が、整数型変数および倍精度浮動小数型変数であることを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項6】
前記オブジェクト指向言語がjava言語であることを特徴とする請求項1に記載のソフトウェアの難読化装置。
【請求項7】
オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法であって、
データ変換用クラスを定義する第1のステップと、
前記ソフトウェアから前記符号化の対象となる任意型の変数をn個(n;正の整数)選択する第2のステップと、
前記選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する第3のステップと、
m個(m;正の整数)の符号化式を定義する第4のステップと、
n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する第5のステップと、
前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する第6のステップと、
該符号化変数に初期値を与え、連続する代入命令をマージする第7のステップと、
を備えたことを特徴とするソフトウェアの難読化方法。
【請求項8】
前記第4のステップが、
m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成する第8のステップと、
前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する第9のステップとを備えたことを特徴とするソフトウェアの難読化方法。
【請求項9】
オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、
データ変換用クラスを定義する第1のステップと、
前記ソフトウェアから前記符号化の対象となる任意型の変数をn個(n;正の整数)選択する第2のステップと、
前記選択されたn個の任意型の変数をそれぞれ固定長のデータに分割する第3のステップと、
m個(m;正の整数)の符号化式を定義する第4のステップと、
n個の独立な符号化式からn個の復号式およびm−nの非自明な関係式を導出する第5のステップと、
前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する第6のステップと、
該符号化変数に初期値を与え、連続する代入命令をマージする第7のステップと、
をコンピュータに実行させるためのプログラム。
【請求項10】
前記第4のステップが、
m×nの行列(但し、mは、m≧nの正の整数)およびm次元の任意のベクトルを生成する第8のステップと、
前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する符号化式を定義する第9のステップとをコンピュータに実行させるためのプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2012−133736(P2012−133736A)
【公開日】平成24年7月12日(2012.7.12)
【国際特許分類】
【出願番号】特願2010−287563(P2010−287563)
【出願日】平成22年12月24日(2010.12.24)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
【出願人】(000208891)KDDI株式会社 (2,700)
【Fターム(参考)】