説明

プログラム難読化装置、プログラム難読化方法およびプログラム

【課題】プログラムの動作を保ちつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化する。
【解決手段】プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択し、符号化後の変数の個数m(mは正の整数)を決定して、符号化データ用の変数を定義する。次に、符号化ルールおよび復号化ルールを定義し、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、本発明は、プログラム中のポインタ変数を含む複数の変数を符号化してプログラムを難読化するプログラム難読化装置、プログラム難読化方法およびプログラムに関する。
【背景技術】
【0002】
一般に、ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵など、利用者に対して秘密にすべき情報が含まれる場合がある。一方では、ソフトウェアを解析するための技術(RE:Reverse Engineering)が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【0003】
このような技術としては、例えば、変数の符号化によるソフトウェアの難読化として、ソースコード中の変数を線形変換により符号化する方法が提案されている(例えば、非特許文献1参照)。この方法では、単一の変数xを線形変換により、変数X(=ax+b)に符号化することで、ソフトウェアの解析を難しくすることを意図するものである。ここでは、線形変換の際に用いる整数a,bが秘密鍵となり、ソースコード中の変数の値や演算を隠蔽することを目的としている。
【0004】
しかし、上記の非特許文献1に開示された技術によれば、ソースコード中の変数の値や演算を秘匿することはできても、難読化前のソースコードで用いられている変数の個数、ならびに変数間における参照・代入の関係を秘匿することは不可能であった。また、秘密鍵の候補数は少なく、秘密鍵の全数探索による攻撃についても脆弱であると考えられる。さらに、上記の方法は、単一の変数を一次変数により符号化する方式であり、符号化された1つ変数に対して、対応する符号化前の変数が1つ存在する。このため、攻撃者が1つの変数の復号式を入手できれば、その変数に対する符号化を解くことができるという問題があった。
【0005】
上記の問題点に対して、プログラムに含まれる複数の変数を同時に符号化する難読化手法も考えられる。この方式の場合、1つの復号式には、符号化された変数が複数存在するため、単一の復号式からは、符号化前の変数と符号化された変数の関係を得ることはできない。このため、攻撃者が1つの変数の復号式を入手したとしても、その変数に対する符号化を解くことはできないという利点がある。
【0006】
しかし、上記の方式では、変数の符号化・復号の演算が複雑であり、難読化を適用することにより、プログラム全体の計算効率が大きく低下し、さらに、符号化による桁上がりが生じるために、計算可能範囲が小さくなる可能性があった。
【0007】
こうしたことから、プログラム全体の計算効率の低下と計算可能範囲の減少を防止しつつ、プログラムに含まれる秘密情報を秘匿化する符号化方法が提案されている(例えば、特許文献1参照。)。
【0008】
この符号化方法は、図6に示すように、プログラムから符号化の対象となる変数をn個(nは2以上の正の整数)選択し、選択したn個の変数と任意の定数との排他的論理和からなる符号化関数により、n個の独立した符号化関数を含むm個(mは正の整数であり、m≧n)の符号化式を定義する。n個の独立な符号化関数からなる符号化式をn個の変数について演算し、n個の変数に対応した符号化されたn個の変数を求め、この符号化されたn個の変数を用いて、符号化前のn個の変数を表し、次いで、符号化された変数に初期値を与え、連続する代入命令のマージを実行するものである。
【0009】
これにより、元のソフトウェア中のn個の変数を、排他的論理和演算により同時にm個の変数に符号化するため、元のソフトウェア中で用いられている変数の個数、変数の初期値、変数が保持する値等を隠蔽することが可能である。また、変数の符号化に伴い、行われる演算も変更されるためプログラムに含まれるアルゴリズムも同時に隠蔽でき、さらに、複数の変数を同時に符号化するため、1つの変数の復号式が仮に、入手されたとしても、その変数を復号することはできない。また、変数の符号化および復号ともに排他的論理和演算のみで行うことから、実行効率の低下が小さく、排他的論理和の演算が桁上がりを生じない演算であるため、変数の符号化により計算可能な範囲が制限されることがない。
【先行技術文献】
【特許文献】
【0010】
【特許文献1】特開2007−79916号公報
【非特許文献】
【0011】
【非特許文献1】佐藤他、信学技報、Vol.IT‐2002−49,pp.13−18,Mar.2002“データの符号化と演算子の変換によるプログラムの難読化手法”
【発明の概要】
【発明が解決しようとする課題】
【0012】
しかしながら、特許文献1に記載の符号化方法では、プログラム全体の計算効率の低下と計算可能範囲の減少を防止しつつ、プログラムに含まれる秘密情報を秘匿化することは可能であるが、あくまでも整数型の変数のみを符号化の対象としているため、この方式では、整数型変数が含まれないプログラムにそのまま適用できないという課題があった。
【0013】
そこで、本発明は、上述の課題に鑑みてなされたものであり、プログラムの動作を保ちつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化できるプログラム難読化装置、プログラム難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【0014】
本発明は、上記の課題を解決するために、以下の事項を提案している。
【0015】
(1)本発明は、プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化装置であって、前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する変数選択手段と、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する変数定義手段と、符号化ルールおよび復号化ルールを定義するルール定義手段と、前記プログラム内の符号化対象変数を符号化データ用変数に置き換える置換手段と、該変数が置き換えられたプログラムを実行可能なプログラムに修正する修正手段と、を備えたことを特徴とするプログラム難読化装置を提案している。
【0016】
この発明によれば、変数選択手段は、プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する。変数定義手段は、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する。ルール定義手段は、符号化ルールおよび復号化ルールを定義する。置換手段は、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、修正手段は、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。したがって、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。ここで、ポインタ変数とは、通常の変数と同様の計算機能に加えて、アドレスの読み書き機能を持った変数をいう。
【0017】
(2)本発明は、(1)のプログラム難読化装置について、前記ポインタ変数に、少なくとも、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数を含むことを特徴とするプログラム難読化装置を提案している。
【0018】
この発明によれば、ポインタ変数に、少なくとも、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数を含む。したがって、一般的な整数型変数以外に、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数についても符号化を実行することができる。
【0019】
(3)本発明は、(1)のプログラム難読化装置について、前記ポインタ変数と同一のビット長である変数を前記符号化の対象となる変数とすることを特徴とするプログラム難読化装置を提案している。
【0020】
この発明によれば、ポインタ変数と同一のビット長である変数を符号化の対象となる変数とする。これにより、ポインタ変数と他の変数を同時に符号化することができる。
【0021】
(4)本発明は、(1)のプログラム難読化装置について、利用者の入力が直接書き込まれる変数を前記符号化の対象となる変数としないことを特徴とするプログラム難読化装置を提案している。
【0022】
この発明によれば、利用者の入力が直接書き込まれる変数を符号化の対象となる変数としない。つまり、難読化の原則は、難読化後のプログラムにおいても、利用者の入力とその出力を変化させないことにある。したがって、上記変数を対象から除外することにより、本来の難読化の原則を維持できる。
【0023】
(5)本発明は、(1)のプログラム難読化装置について、アドレス演算子によりその変数のアドレスが取得されている変数を前記符号化の対象となる変数としないことを特徴とするプログラム難読化装置を提案している。
【0024】
この発明によれば、アドレス演算子によりその変数のアドレスが取得されている変数を符号化の対象となる変数としない。ここで、アドレス演算子とは、1つの変数のアドレスを取得するための演算子であるが、変数の変換が1対多のような場合には、1つの変数が複数の変数に分散されるためにそのアドレスを特定できない。そこで、上記のような変数を除外することにより、変数の変換が1対1に対応しない場合にも、適用することができる。
【0025】
(6)本発明は、(1)のプログラム難読化装置について、前記ルール定義手段が、m行n列のプール行列Aとm次元の整数型ベクトルbを決定するとともに、数1で示す関係式を構築し、この関係式の各行を符号化ルールとすることを特徴とするプログラム難読化装置を提案している。
【0026】
この発明によれば、ルール定義手段が、m行n列のプール行列Aとm次元の整数型ベクトルbを決定するとともに、数1で示す関係式を構築し、この関係式の各行を符号化ルールとする。したがって、演算の処理負荷が小さい関係式を用いて、符号化ルールを構築することができる。
【0027】
(7)本発明は、(1)のプログラム難読化装置について、前記ルール定義手段が、前記符号化ルールを未知変数に対する連立方程式とみなして、得た前記未知変数に対する解を復号ルールとすることを特徴とするプログラム難読化装置を提案している。
【0028】
この発明によれば、ルール定義手段が、前記符号化ルールを未知変数に対する連立方程式とみなして、得た前記未知変数に対する解を復号ルールとする。したがって、連立方程式を解くという演算の処理負荷が小さい方法により、復号ルールを構築することができる。
【0029】
(8)本発明は、(1)のプログラム難読化装置について、前記置換手段が、前記符号化対象変数に対する代入命令を変換するとともに、前記符号化対象変数を各変数の前記復号化ルールに基づいて置換することを特徴とするプログラム難読化装置を提案している。
【0030】
この発明によれば、置換手段が、符号化対象変数に対する代入命令を変換するとともに、符号化対象変数を各変数の復号化ルールに基づいて置換する。したがって、符号化対象変数に対する代入命令については、左辺の変数の置換と右辺の変数の置換を行うことにより符号化を行い、その他の命令については、復号化ルールに基づいて置換することにより符号化を行う。
【0031】
(9)本発明は、(8)のプログラム難読化装置について、前記修正手段が、前記符号化対象変数の宣言を削除し、前記符号化データ用変数とこれらの値を保持するための一時変数の定義を追加し、前記置換手段が変換した代入命令を実行可能な命令列に変換することを特徴とする請求項8に記載のプログラム難読化装置を提案している。
【0032】
この発明によれば、修正手段が、符号化対象変数の宣言を削除し、符号化データ用変数とこれらの値を保持するための一時変数の定義を追加し、置換手段が変換した代入命令を実行可能な命令列に変換する。したがって、これにより、符号化した変数を含むプログラムを実行可能なプログラムとすることができる。
【0033】
(10)本発明は、プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法であって、前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する第1のステップと、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する第2のステップと、符号化ルールおよび復号化ルールを定義する第3のステップと、前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第4のステップと、該変数が置き換えられたプログラムを実行可能なプログラムに修正する第5のステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【0034】
この発明によれば、プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択し、符号化後の変数の個数m(mは正の整数)を決定して、符号化データ用の変数を定義する。次に、符号化ルールおよび復号化ルールを定義し、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。したがって、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。
【0035】
(11)本発明は、プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法をコンピュータに実行させるためのプログラムであって、前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する第1のステップと、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する第2のステップと、符号化ルールおよび復号化ルールを定義する第3のステップと、前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第4のステップと、該変数が置き換えられたプログラムを実行可能なプログラムに修正する第5のステップと、をコンピュータに実行させるためのプログラム。
【0036】
この発明によれば、プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択し、符号化後の変数の個数m(mは正の整数)を決定して、符号化データ用の変数を定義する。次に、符号化ルールおよび復号化ルールを定義し、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。したがって、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。
【発明の効果】
【0037】
本発明によれば、任意のポインタ変数を対象とすることから、一般的な整数型変数以外に、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数についても符号化を実行することができるという効果がある。また、ポインタ変数と整数型変数とを同時に符号化することができるため、従来よりも多くのプログラムに適用して、その難読化を実現することができるという効果がある。
【図面の簡単な説明】
【0038】
【図1】本実施形態に係るプログラム難読化装置の構成を示す図である。
【図2】本実施形態に係るプログラム難読化装置の処理フローである。
【図3】符号化処理前のプログラムのソースコードを例示した図である。
【図4】符号化式を例示した図である。
【図5】難読化後のソースコードを例示した図である。
【図6】従来例の処理を示す図である。
【発明を実施するための形態】
【0039】
以下、図面を用いて、本発明の実施形態について詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組み合わせを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【0040】
図1および図2を用いて、本発明の実施形態について説明する。
【0041】
<プログラム難読化装置の構成>
図1に示すように、本実施形態に係るプログラム難読化装置は、変数選択部1と、変数定義部2と、ルール定義部3と、置換部4と、修正部5とから構成されている。
【0042】
ここで、変数選択部1は、プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する。なお、nは任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。また、1)利用者の入力が直接書き込まれる変数および2)アドレス演算子により当該変数のアドレスが取得されている変数は、除外する。前者は、難読化の原則が、難読化後のプログラムにおいても、利用者の入力とその出力を変化させないことであり、この変数を対象から除外することにより、本来の難読化の原則を維持するためである。後者は、アドレス演算子が、1つの変数のアドレスを取得するための演算子であり、変数の変換が1対多のような場合に、1つの変数が複数の変数に分散されるためにそのアドレスを特定できない。そこで、このような変数を除外することにより、変数の変換が1対1に対応しない場合にも、適用するためである。なお、ここで選択した変数をx_1、x_2、...、x_nとする。
【0043】
変数定義部2は、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する。ただし、個数mは、符号対象変数の個数n以上とする。安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。ここで定義した変数をy_1、y_2、...、y_nとする。
【0044】
ルール定義部3は、符号化ルールおよび復号化ルールを定義する。具体的には、m行n列のプール行列A及びm次元の整数型ベクトルbを任意に決定する。ただし、行列Aのランクは、nとする。そして、行列A、ベクトルbにより数1に示す関係式を構成する。
【0045】
【数1】

【0046】
ただし()は、ベクトルの転置を意味し、xorは行ごとの排他的論理和演算を意味する。ここで、数1の各行を数2のように表して符号化ルールとする。
【0047】
【数2】

【0048】
また、符号化ルールを未知変数x_1、x_2、...、x_nに対する連立方程式とみなして解くことにより、数3を得る。この各式を復号ルールとする。
【0049】
【数3】

【0050】
置換部4は、プログラム内の符号化対象変数を符号化データ用変数に置き換える。ここでは具体的に、符号化対象変数に対する代入命令に対する処理とその他の命令とに対する処理とをそれぞれ示す。まず、符号化対象変数に対する代入命令については、符号化対象変数x_iに対する代入命令 x_i←e (eは任意の定数又は式)を以下の手順で変換する。
【0051】
1)左辺の変数の置き換え
代入命令 x_i←eを数4に示す命令に置き換える。ただし、数4の右辺の関数f_1、f_2、...、f_mにおいては、代入が行われる対象変数x_iをeで置換する。
【0052】
【数4】

【0053】
2)右辺の変数の書き換え
上記の左辺の変数の置き換え処理で得られた命令列の右辺に含まれる符号化対象変数x_1、x_2、...、x_nをそれぞれg_1、g_2、...、g_nで置き換える。
【0054】
また、その他の命令については、参照されている符号化対象変数を各変数の復号ルールで置換する。
【0055】
修正部5は、変数が置き換えられたプログラムを実行可能なプログラムに修正する。具体的には、変数宣言の修正と、命令の変換を行う。
【0056】
変数宣言の修正は、符号化対象変数x_1、x_2、...、x_nの宣言を削除し、符号化データ用変数y_1、y_2、...、y_m及びこれらの変数の値を保持するための一時変数y_1_tmp、y_2_tmp、...、y_m_tmpの定義を追加する。
【0057】
命令の変換では、置換部4において変換した命令を逐次実行できる命令列に変換する。具体的には、変換前の命令を数5とすると、これを数6のように変換する。ただし、関数f‘_1、f’_2、...、f‘_mは、関数f_1、f_2....、f_mにおいて、変数y_1、y_2、...、_mをy_1_tmp、y_2_tmp、...、y_m_tmpで置き換えたものである。
【0058】
【数5】

【0059】
【数6】

【0060】
<プログラム難読化装置の処理>
図2を用いて、本実施形態に係るプログラム難読化装置の処理について説明する。
【0061】
プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する(ステップS101)。なお、なお、nは任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。また、1)利用者の入力が直接書き込まれる変数および2)アドレス演算子により当該変数のアドレスが取得されている変数は、除外する。
【0062】
次に、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する(ステップS102)。具体的には、符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する。ただし、個数mは、符号対象変数の個数n以上とする。安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。
【0063】
また、符号化ルールおよび復号化ルールを定義する(ステップS103)。具体的には、m行n列のプール行列A及びm次元の整数型ベクトルbを任意に決定する。ただし、行列Aのランクは、nとする。そして、行列A、ベクトルbにより数7に示す関係式を構成する。
【0064】
【数7】

【0065】
そして、数1の各行を数2のように表して符号化ルールとする。
【0066】
また、符号化ルールを未知変数x_1、x_2、...、x_nに対する連立方程式とみなして解くことにより、この各式を復号ルールとする。
【0067】
次に、プログラム内の符号化対象変数を符号化データ用変数に置き換える(ステップS104)。そして、変数が置き換えられたプログラムを実行可能なプログラムに修正する(ステップS105)。具体的には、符号化対象変数x_1、x_2、...、x_nの宣言を削除し、符号化データ用変数y_1、y_2、...、y_m及びこれらの変数の値を保持するための一時変数y_1_tmp、y_2_tmp、...、y_m_tmpの定義を追加して、変数宣言の修正を行い、次いで、命令の変換を行う。
【0068】
したがって、本実施形態によれば、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。
【0069】
<実施例>
図3から図5を用いて、本発明のプログラム難読化装置を用いた具体的な実施例について説明する。なお、図3は、符号化処理前のプログラムのソースコードを例示した図であり、図4は、符号化式を例示した図である。また、図5は、難読化後のソースコードを例示した図である。
【0070】
この例では、整数型変数indexと2つのポインタ変数pintおよびpdoubleを符号化の対象としている。つまり、符号化処理前のプログラムのソースコードを例示した図3と難読化後のソースコードを例示した図5を比較すると、符号化の対象である整数型変数indexと2つのポインタ変数pintおよびpdoubleが図2に示す符号化式により符号化され、さらに、変数宣言の修正として、符号化の対象である整数型変数indexと2つのポインタ変数pintおよびpdoubleの宣言が削除され、符号化用データ変数a、b、cおよびこれらの変数の値を保持するための一時変数a_tmp、b_tmp、c_tmpの定義が追加されている。こうした処理により、対象変数を符号化した後のプログラムを実行可能なプログラムとしている。
【0071】
なお、プログラム難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをプログラム難読化装置に読み込ませ、実行することによって本発明のプログラム難読化装置を実現することができる。ここでいうコンピュータシステムとは、OSや周辺装置等のハードウェアを含む。
【0072】
また、「コンピュータシステム」は、WWW(World Wide Web)システムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことをいう。
【0073】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。更に、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル(差分プログラム)であっても良い。
【0074】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【0075】
1・・・変数選択部
2・・・変数定義部
3・・・ルール定義部
4・・・置換部
5・・・修正部

【特許請求の範囲】
【請求項1】
プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化装置であって、
前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する変数選択手段と、
符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する変数定義手段と、
符号化ルールおよび復号化ルールを定義するルール定義手段と、
前記プログラム内の符号化対象変数を符号化データ用変数に置き換える置換手段と、
該変数が置き換えられたプログラムを実行可能なプログラムに修正する修正手段と、
を備えたことを特徴とするプログラム難読化装置。
【請求項2】
前記ポインタ変数に、少なくとも、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数を含むことを特徴とする請求項1に記載のプログラム難読化装置。
【請求項3】
前記ポインタ変数と同一のビット長である変数を前記符号化の対象となる変数とすることを特徴とする請求項1に記載のプログラム難読化装置。
【請求項4】
利用者の入力が直接書き込まれる変数を前記符号化の対象となる変数としないことを特徴とする請求項1に記載のプログラム難読化装置。
【請求項5】
アドレス演算子によりその変数のアドレスが取得されている変数を前記符号化の対象となる変数としないことを特徴とする請求項1に記載のプログラム難読化装置。
【請求項6】
前記ルール定義手段が、m行n列のプール行列Aとm次元の整数型ベクトルbを決定するとともに、数1で示す関係式を構築し、この関係式の各行を符号化ルールとすることを特徴とする請求項1に記載のプログラム難読化装置。
【数1】

【請求項7】
前記ルール定義手段が、前記符号化ルールを未知変数に対する連立方程式とみなして、得た前記未知変数に対する解を復号ルールとすることを特徴とする請求項1に記載のプログラム難読化装置。
【請求項8】
前記置換手段が、前記符号化対象変数に対する代入命令を変換するとともに、前記符号化対象変数を各変数の前記復号化ルールに基づいて置換することを特徴とする請求項1に記載のプログラム難読化装置。
【請求項9】
前記修正手段が、前記符号化対象変数の宣言を削除し、前記符号化データ用変数とこれらの値を保持するための一時変数の定義を追加し、前記置換手段が変換した代入命令を実行可能な命令列に変換することを特徴とする請求項8に記載のプログラム難読化装置。
【請求項10】
プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法であって、
前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する第1のステップと、
符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する第2のステップと、
符号化ルールおよび復号化ルールを定義する第3のステップと、
前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第4のステップと、
該変数が置き換えられたプログラムを実行可能なプログラムに修正する第5のステップと、
を備えたことを特徴とするプログラム難読化方法。
【請求項11】
プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法をコンピュータに実行させるためのプログラムであって、
前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をn個(nは正の整数)選択する第1のステップと、
符号化後の変数の個数m(mは正の整数)を決定し、符号化データ用の変数を定義する第2のステップと、
符号化ルールおよび復号化ルールを定義する第3のステップと、
前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第4のステップと、
該変数が置き換えられたプログラムを実行可能なプログラムに修正する第5のステップと、
をコンピュータに実行させるためのプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2010−262334(P2010−262334A)
【公開日】平成22年11月18日(2010.11.18)
【国際特許分類】
【出願番号】特願2009−110440(P2009−110440)
【出願日】平成21年4月30日(2009.4.30)
【出願人】(000208891)KDDI株式会社 (2,700)
【Fターム(参考)】