(57)【要約】【課題】プログラムの動作を保ちつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化する。【解決手段】プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択し、符号化後の変数の個数ｍ（ｍは正の整数）を決定して、符号化データ用の変数を定義する。次に、符号化ルールおよび復号化ルールを定義し、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。【選択図】図２
2010262334.tif 000002
【特許請求の範囲】
【請求項１】
プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化装置であって、
前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する変数選択手段と、
符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する変数定義手段と、
符号化ルールおよび復号化ルールを定義するルール定義手段と、
前記プログラム内の符号化対象変数を符号化データ用変数に置き換える置換手段と、
該変数が置き換えられたプログラムを実行可能なプログラムに修正する修正手段と、
を備えたことを特徴とするプログラム難読化装置。
【請求項２】
前記ポインタ変数に、少なくとも、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数を含むことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記ポインタ変数と同一のビット長である変数を前記符号化の対象となる変数とすることを特徴とする請求項１に記載のプログラム難読化装置。
【請求項４】
利用者の入力が直接書き込まれる変数を前記符号化の対象となる変数としないことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項５】
アドレス演算子によりその変数のアドレスが取得されている変数を前記符号化の対象となる変数としないことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項６】
前記ルール定義手段が、ｍ行ｎ列のプール行列Ａとｍ次元の整数型ベクトルｂを決定するとともに、数１で示す関係式を構築し、この関係式の各行を符号化ルールとすることを特徴とする請求項１に記載のプログラム難読化装置。
【数１】
2010262334.tif 000010
【請求項７】
前記ルール定義手段が、前記符号化ルールを未知変数に対する連立方程式とみなして、得た前記未知変数に対する解を復号ルールとすることを特徴とする請求項１に記載のプログラム難読化装置。
【請求項８】
前記置換手段が、前記符号化対象変数に対する代入命令を変換するとともに、前記符号化対象変数を各変数の前記復号化ルールに基づいて置換することを特徴とする請求項１に記載のプログラム難読化装置。
【請求項９】
前記修正手段が、前記符号化対象変数の宣言を削除し、前記符号化データ用変数とこれらの値を保持するための一時変数の定義を追加し、前記置換手段が変換した代入命令を実行可能な命令列に変換することを特徴とする請求項８に記載のプログラム難読化装置。
【請求項１０】
プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法であって、
前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する第１のステップと、
符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する第２のステップと、
符号化ルールおよび復号化ルールを定義する第３のステップと、
前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第４のステップと、
該変数が置き換えられたプログラムを実行可能なプログラムに修正する第５のステップと、
を備えたことを特徴とするプログラム難読化方法。
【請求項１１】
プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法をコンピュータに実行させるためのプログラムであって、
前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する第１のステップと、
符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する第２のステップと、
符号化ルールおよび復号化ルールを定義する第３のステップと、
前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第４のステップと、
該変数が置き換えられたプログラムを実行可能なプログラムに修正する第５のステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、本発明は、プログラム中のポインタ変数を含む複数の変数を符号化してプログラムを難読化するプログラム難読化装置、プログラム難読化方法およびプログラムに関する。
【背景技術】
【０００２】
一般に、ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵など、利用者に対して秘密にすべき情報が含まれる場合がある。一方では、ソフトウェアを解析するための技術（ＲＥ：Ｒｅｖｅｒｓｅ  Ｅｎｇｉｎｅｅｒｉｎｇ）が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【０００３】
このような技術としては、例えば、変数の符号化によるソフトウェアの難読化として、ソースコード中の変数を線形変換により符号化する方法が提案されている（例えば、非特許文献１参照）。この方法では、単一の変数ｘを線形変換により、変数Ｘ（＝ａｘ＋ｂ）に符号化することで、ソフトウェアの解析を難しくすることを意図するものである。ここでは、線形変換の際に用いる整数ａ，ｂが秘密鍵となり、ソースコード中の変数の値や演算を隠蔽することを目的としている。
【０００４】
しかし、上記の非特許文献１に開示された技術によれば、ソースコード中の変数の値や演算を秘匿することはできても、難読化前のソースコードで用いられている変数の個数、ならびに変数間における参照・代入の関係を秘匿することは不可能であった。また、秘密鍵の候補数は少なく、秘密鍵の全数探索による攻撃についても脆弱であると考えられる。さらに、上記の方法は、単一の変数を一次変数により符号化する方式であり、符号化された１つ変数に対して、対応する符号化前の変数が１つ存在する。このため、攻撃者が１つの変数の復号式を入手できれば、その変数に対する符号化を解くことができるという問題があった。
【０００５】
上記の問題点に対して、プログラムに含まれる複数の変数を同時に符号化する難読化手法も考えられる。この方式の場合、１つの復号式には、符号化された変数が複数存在するため、単一の復号式からは、符号化前の変数と符号化された変数の関係を得ることはできない。このため、攻撃者が１つの変数の復号式を入手したとしても、その変数に対する符号化を解くことはできないという利点がある。
【０００６】
しかし、上記の方式では、変数の符号化・復号の演算が複雑であり、難読化を適用することにより、プログラム全体の計算効率が大きく低下し、さらに、符号化による桁上がりが生じるために、計算可能範囲が小さくなる可能性があった。
【０００７】
こうしたことから、プログラム全体の計算効率の低下と計算可能範囲の減少を防止しつつ、プログラムに含まれる秘密情報を秘匿化する符号化方法が提案されている（例えば、特許文献１参照。）。
【０００８】
この符号化方法は、図６に示すように、プログラムから符号化の対象となる変数をｎ個（ｎは２以上の正の整数）選択し、選択したｎ個の変数と任意の定数との排他的論理和からなる符号化関数により、ｎ個の独立した符号化関数を含むｍ個（ｍは正の整数であり、ｍ≧ｎ）の符号化式を定義する。ｎ個の独立な符号化関数からなる符号化式をｎ個の変数について演算し、ｎ個の変数に対応した符号化されたｎ個の変数を求め、この符号化されたｎ個の変数を用いて、符号化前のｎ個の変数を表し、次いで、符号化された変数に初期値を与え、連続する代入命令のマージを実行するものである。
【０００９】
これにより、元のソフトウェア中のｎ個の変数を、排他的論理和演算により同時にｍ個の変数に符号化するため、元のソフトウェア中で用いられている変数の個数、変数の初期値、変数が保持する値等を隠蔽することが可能である。また、変数の符号化に伴い、行われる演算も変更されるためプログラムに含まれるアルゴリズムも同時に隠蔽でき、さらに、複数の変数を同時に符号化するため、１つの変数の復号式が仮に、入手されたとしても、その変数を復号することはできない。また、変数の符号化および復号ともに排他的論理和演算のみで行うことから、実行効率の低下が小さく、排他的論理和の演算が桁上がりを生じない演算であるため、変数の符号化により計算可能な範囲が制限されることがない。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００７−７９９１６号公報
【非特許文献】
【００１１】
【非特許文献１】佐藤他、信学技報、Ｖｏｌ．ＩＴ‐２００２−４９，ｐｐ．１３−１８，Ｍａｒ．２００２“データの符号化と演算子の変換によるプログラムの難読化手法”
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、特許文献１に記載の符号化方法では、プログラム全体の計算効率の低下と計算可能範囲の減少を防止しつつ、プログラムに含まれる秘密情報を秘匿化することは可能であるが、あくまでも整数型の変数のみを符号化の対象としているため、この方式では、整数型変数が含まれないプログラムにそのまま適用できないという課題があった。
【００１３】
そこで、本発明は、上述の課題に鑑みてなされたものであり、プログラムの動作を保ちつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化できるプログラム難読化装置、プログラム難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明は、上記の課題を解決するために、以下の事項を提案している。
【００１５】
（１）本発明は、プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化装置であって、前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する変数選択手段と、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する変数定義手段と、符号化ルールおよび復号化ルールを定義するルール定義手段と、前記プログラム内の符号化対象変数を符号化データ用変数に置き換える置換手段と、該変数が置き換えられたプログラムを実行可能なプログラムに修正する修正手段と、を備えたことを特徴とするプログラム難読化装置を提案している。
【００１６】
この発明によれば、変数選択手段は、プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する。変数定義手段は、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する。ルール定義手段は、符号化ルールおよび復号化ルールを定義する。置換手段は、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、修正手段は、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。したがって、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。ここで、ポインタ変数とは、通常の変数と同様の計算機能に加えて、アドレスの読み書き機能を持った変数をいう。
【００１７】
（２）本発明は、（１）のプログラム難読化装置について、前記ポインタ変数に、少なくとも、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数を含むことを特徴とするプログラム難読化装置を提案している。
【００１８】
この発明によれば、ポインタ変数に、少なくとも、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数を含む。したがって、一般的な整数型変数以外に、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数についても符号化を実行することができる。
【００１９】
（３）本発明は、（１）のプログラム難読化装置について、前記ポインタ変数と同一のビット長である変数を前記符号化の対象となる変数とすることを特徴とするプログラム難読化装置を提案している。
【００２０】
この発明によれば、ポインタ変数と同一のビット長である変数を符号化の対象となる変数とする。これにより、ポインタ変数と他の変数を同時に符号化することができる。
【００２１】
（４）本発明は、（１）のプログラム難読化装置について、利用者の入力が直接書き込まれる変数を前記符号化の対象となる変数としないことを特徴とするプログラム難読化装置を提案している。
【００２２】
この発明によれば、利用者の入力が直接書き込まれる変数を符号化の対象となる変数としない。つまり、難読化の原則は、難読化後のプログラムにおいても、利用者の入力とその出力を変化させないことにある。したがって、上記変数を対象から除外することにより、本来の難読化の原則を維持できる。
【００２３】
（５）本発明は、（１）のプログラム難読化装置について、アドレス演算子によりその変数のアドレスが取得されている変数を前記符号化の対象となる変数としないことを特徴とするプログラム難読化装置を提案している。
【００２４】
この発明によれば、アドレス演算子によりその変数のアドレスが取得されている変数を符号化の対象となる変数としない。ここで、アドレス演算子とは、１つの変数のアドレスを取得するための演算子であるが、変数の変換が１対多のような場合には、１つの変数が複数の変数に分散されるためにそのアドレスを特定できない。そこで、上記のような変数を除外することにより、変数の変換が１対１に対応しない場合にも、適用することができる。
【００２５】
（６）本発明は、（１）のプログラム難読化装置について、前記ルール定義手段が、ｍ行ｎ列のプール行列Ａとｍ次元の整数型ベクトルｂを決定するとともに、数１で示す関係式を構築し、この関係式の各行を符号化ルールとすることを特徴とするプログラム難読化装置を提案している。
【００２６】
この発明によれば、ルール定義手段が、ｍ行ｎ列のプール行列Ａとｍ次元の整数型ベクトルｂを決定するとともに、数１で示す関係式を構築し、この関係式の各行を符号化ルールとする。したがって、演算の処理負荷が小さい関係式を用いて、符号化ルールを構築することができる。
【００２７】
（７）本発明は、（１）のプログラム難読化装置について、前記ルール定義手段が、前記符号化ルールを未知変数に対する連立方程式とみなして、得た前記未知変数に対する解を復号ルールとすることを特徴とするプログラム難読化装置を提案している。
【００２８】
この発明によれば、ルール定義手段が、前記符号化ルールを未知変数に対する連立方程式とみなして、得た前記未知変数に対する解を復号ルールとする。したがって、連立方程式を解くという演算の処理負荷が小さい方法により、復号ルールを構築することができる。
【００２９】
（８）本発明は、（１）のプログラム難読化装置について、前記置換手段が、前記符号化対象変数に対する代入命令を変換するとともに、前記符号化対象変数を各変数の前記復号化ルールに基づいて置換することを特徴とするプログラム難読化装置を提案している。
【００３０】
この発明によれば、置換手段が、符号化対象変数に対する代入命令を変換するとともに、符号化対象変数を各変数の復号化ルールに基づいて置換する。したがって、符号化対象変数に対する代入命令については、左辺の変数の置換と右辺の変数の置換を行うことにより符号化を行い、その他の命令については、復号化ルールに基づいて置換することにより符号化を行う。
【００３１】
（９）本発明は、（８）のプログラム難読化装置について、前記修正手段が、前記符号化対象変数の宣言を削除し、前記符号化データ用変数とこれらの値を保持するための一時変数の定義を追加し、前記置換手段が変換した代入命令を実行可能な命令列に変換することを特徴とする請求項８に記載のプログラム難読化装置を提案している。
【００３２】
この発明によれば、修正手段が、符号化対象変数の宣言を削除し、符号化データ用変数とこれらの値を保持するための一時変数の定義を追加し、置換手段が変換した代入命令を実行可能な命令列に変換する。したがって、これにより、符号化した変数を含むプログラムを実行可能なプログラムとすることができる。
【００３３】
（１０）本発明は、プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法であって、前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する第１のステップと、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する第２のステップと、符号化ルールおよび復号化ルールを定義する第３のステップと、前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第４のステップと、該変数が置き換えられたプログラムを実行可能なプログラムに修正する第５のステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００３４】
この発明によれば、プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択し、符号化後の変数の個数ｍ（ｍは正の整数）を決定して、符号化データ用の変数を定義する。次に、符号化ルールおよび復号化ルールを定義し、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。したがって、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。
【００３５】
（１１）本発明は、プログラム内の複数の変数を符号化し、プログラムを難読化するプログラム難読化方法をコンピュータに実行させるためのプログラムであって、前記プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する第１のステップと、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する第２のステップと、符号化ルールおよび復号化ルールを定義する第３のステップと、前記プログラム内の符号化対象変数を符号化データ用変数に置き換える第４のステップと、該変数が置き換えられたプログラムを実行可能なプログラムに修正する第５のステップと、をコンピュータに実行させるためのプログラム。
【００３６】
この発明によれば、プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択し、符号化後の変数の個数ｍ（ｍは正の整数）を決定して、符号化データ用の変数を定義する。次に、符号化ルールおよび復号化ルールを定義し、プログラム内の符号化対象変数を符号化データ用変数に置き換える。そして、その変数が置き換えられたプログラムを実行可能なプログラムに修正する。したがって、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。
【発明の効果】
【００３７】
本発明によれば、任意のポインタ変数を対象とすることから、一般的な整数型変数以外に、整数ポインタ変数、文字列ポインタ変数、構造体ポインタ変数についても符号化を実行することができるという効果がある。また、ポインタ変数と整数型変数とを同時に符号化することができるため、従来よりも多くのプログラムに適用して、その難読化を実現することができるという効果がある。
【図面の簡単な説明】
【００３８】
【図１】本実施形態に係るプログラム難読化装置の構成を示す図である。
【図２】本実施形態に係るプログラム難読化装置の処理フローである。
【図３】符号化処理前のプログラムのソースコードを例示した図である。
【図４】符号化式を例示した図である。
【図５】難読化後のソースコードを例示した図である。
【図６】従来例の処理を示す図である。
【発明を実施するための形態】
【００３９】
以下、図面を用いて、本発明の実施形態について詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組み合わせを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【００４０】
図１および図２を用いて、本発明の実施形態について説明する。
【００４１】
＜プログラム難読化装置の構成＞
図１に示すように、本実施形態に係るプログラム難読化装置は、変数選択部１と、変数定義部２と、ルール定義部３と、置換部４と、修正部５とから構成されている。
【００４２】
ここで、変数選択部１は、プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する。なお、ｎは任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。また、１）利用者の入力が直接書き込まれる変数および２）アドレス演算子により当該変数のアドレスが取得されている変数は、除外する。前者は、難読化の原則が、難読化後のプログラムにおいても、利用者の入力とその出力を変化させないことであり、この変数を対象から除外することにより、本来の難読化の原則を維持するためである。後者は、アドレス演算子が、１つの変数のアドレスを取得するための演算子であり、変数の変換が１対多のような場合に、１つの変数が複数の変数に分散されるためにそのアドレスを特定できない。そこで、このような変数を除外することにより、変数の変換が１対１に対応しない場合にも、適用するためである。なお、ここで選択した変数をｘ＿１、ｘ＿２、．．．、ｘ＿ｎとする。
【００４３】
変数定義部２は、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する。ただし、個数ｍは、符号対象変数の個数ｎ以上とする。安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。ここで定義した変数をｙ＿１、ｙ＿２、．．．、ｙ＿ｎとする。
【００４４】
ルール定義部３は、符号化ルールおよび復号化ルールを定義する。具体的には、ｍ行ｎ列のプール行列Ａ及びｍ次元の整数型ベクトルｂを任意に決定する。ただし、行列Ａのランクは、ｎとする。そして、行列Ａ、ベクトルｂにより数１に示す関係式を構成する。
【００４５】
【数１】
2010262334.tif 000003
【００４６】
ただし（）Ｔは、ベクトルの転置を意味し、ｘｏｒは行ごとの排他的論理和演算を意味する。ここで、数１の各行を数２のように表して符号化ルールとする。
【００４７】
【数２】
2010262334.tif 000004
【００４８】
また、符号化ルールを未知変数ｘ＿１、ｘ＿２、．．．、ｘ＿ｎに対する連立方程式とみなして解くことにより、数３を得る。この各式を復号ルールとする。
【００４９】
【数３】
2010262334.tif 000005
【００５０】
置換部４は、プログラム内の符号化対象変数を符号化データ用変数に置き換える。ここでは具体的に、符号化対象変数に対する代入命令に対する処理とその他の命令とに対する処理とをそれぞれ示す。まず、符号化対象変数に対する代入命令については、符号化対象変数ｘ＿ｉに対する代入命令 ｘ＿ｉ←ｅ （ｅは任意の定数又は式）を以下の手順で変換する。
【００５１】
１）左辺の変数の置き換え
代入命令 ｘ＿ｉ←ｅを数４に示す命令に置き換える。ただし、数４の右辺の関数ｆ＿１、ｆ＿２、．．．、ｆ＿ｍにおいては、代入が行われる対象変数ｘ＿ｉをｅで置換する。
【００５２】
【数４】
2010262334.tif 000006
【００５３】
２）右辺の変数の書き換え
上記の左辺の変数の置き換え処理で得られた命令列の右辺に含まれる符号化対象変数ｘ＿１、ｘ＿２、．．．、ｘ＿ｎをそれぞれｇ＿１、ｇ＿２、．．．、ｇ＿ｎで置き換える。
【００５４】
また、その他の命令については、参照されている符号化対象変数を各変数の復号ルールで置換する。
【００５５】
修正部５は、変数が置き換えられたプログラムを実行可能なプログラムに修正する。具体的には、変数宣言の修正と、命令の変換を行う。
【００５６】
変数宣言の修正は、符号化対象変数ｘ＿１、ｘ＿２、．．．、ｘ＿ｎの宣言を削除し、符号化データ用変数ｙ＿１、ｙ＿２、．．．、ｙ＿ｍ及びこれらの変数の値を保持するための一時変数ｙ＿１＿ｔｍｐ、ｙ＿２＿ｔｍｐ、．．．、ｙ＿ｍ＿ｔｍｐの定義を追加する。
【００５７】
命令の変換では、置換部４において変換した命令を逐次実行できる命令列に変換する。具体的には、変換前の命令を数５とすると、これを数６のように変換する。ただし、関数ｆ‘＿１、ｆ’＿２、．．．、ｆ‘＿ｍは、関数ｆ＿１、ｆ＿２.．．．、ｆ＿ｍにおいて、変数ｙ＿１、ｙ＿２、．．．、＿ｍをｙ＿１＿ｔｍｐ、ｙ＿２＿ｔｍｐ、．．．、ｙ＿ｍ＿ｔｍｐで置き換えたものである。
【００５８】
【数５】
2010262334.tif 000007
【００５９】
【数６】
2010262334.tif 000008
【００６０】
＜プログラム難読化装置の処理＞
図２を用いて、本実施形態に係るプログラム難読化装置の処理について説明する。
【００６１】
プログラムの中から、符号化の対象となるポインタ変数を含む変数をｎ個（ｎは正の整数）選択する（ステップＳ１０１）。なお、なお、ｎは任意であり、安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。また、１）利用者の入力が直接書き込まれる変数および２）アドレス演算子により当該変数のアドレスが取得されている変数は、除外する。
【００６２】
次に、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する（ステップＳ１０２）。具体的には、符号化後の変数の個数ｍ（ｍは正の整数）を決定し、符号化データ用の変数を定義する。ただし、個数ｍは、符号対象変数の個数ｎ以上とする。安全性を高くする場合には、より大きな値を選択し、実行効率を高くする場合は、より小さな値を選択する。
【００６３】
また、符号化ルールおよび復号化ルールを定義する（ステップＳ１０３）。具体的には、ｍ行ｎ列のプール行列Ａ及びｍ次元の整数型ベクトルｂを任意に決定する。ただし、行列Ａのランクは、ｎとする。そして、行列Ａ、ベクトルｂにより数７に示す関係式を構成する。
【００６４】
【数７】
2010262334.tif 000009
【００６５】
そして、数１の各行を数２のように表して符号化ルールとする。
【００６６】
また、符号化ルールを未知変数ｘ＿１、ｘ＿２、．．．、ｘ＿ｎに対する連立方程式とみなして解くことにより、この各式を復号ルールとする。
【００６７】
次に、プログラム内の符号化対象変数を符号化データ用変数に置き換える（ステップＳ１０４）。そして、変数が置き換えられたプログラムを実行可能なプログラムに修正する（ステップＳ１０５）。具体的には、符号化対象変数ｘ＿１、ｘ＿２、．．．、ｘ＿ｎの宣言を削除し、符号化データ用変数ｙ＿１、ｙ＿２、．．．、ｙ＿ｍ及びこれらの変数の値を保持するための一時変数ｙ＿１＿ｔｍｐ、ｙ＿２＿ｔｍｐ、．．．、ｙ＿ｍ＿ｔｍｐの定義を追加して、変数宣言の修正を行い、次いで、命令の変換を行う。
【００６８】
したがって、本実施形態によれば、プログラムの動作を維持しつつ、プログラムに含まれるポインタ変数を符号化することにより、ポインタ変数を含む任意のプログラムを難読化することができる。
【００６９】
＜実施例＞
図３から図５を用いて、本発明のプログラム難読化装置を用いた具体的な実施例について説明する。なお、図３は、符号化処理前のプログラムのソースコードを例示した図であり、図４は、符号化式を例示した図である。また、図５は、難読化後のソースコードを例示した図である。
【００７０】
この例では、整数型変数ｉｎｄｅｘと２つのポインタ変数ｐｉｎｔおよびｐｄｏｕｂｌｅを符号化の対象としている。つまり、符号化処理前のプログラムのソースコードを例示した図３と難読化後のソースコードを例示した図５を比較すると、符号化の対象である整数型変数ｉｎｄｅｘと２つのポインタ変数ｐｉｎｔおよびｐｄｏｕｂｌｅが図２に示す符号化式により符号化され、さらに、変数宣言の修正として、符号化の対象である整数型変数ｉｎｄｅｘと２つのポインタ変数ｐｉｎｔおよびｐｄｏｕｂｌｅの宣言が削除され、符号化用データ変数ａ、ｂ、ｃおよびこれらの変数の値を保持するための一時変数ａ＿ｔｍｐ、ｂ＿ｔｍｐ、ｃ＿ｔｍｐの定義が追加されている。こうした処理により、対象変数を符号化した後のプログラムを実行可能なプログラムとしている。
【００７１】
なお、プログラム難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをプログラム難読化装置に読み込ませ、実行することによって本発明のプログラム難読化装置を実現することができる。ここでいうコンピュータシステムとは、ＯＳや周辺装置等のハードウェアを含む。
【００７２】
また、「コンピュータシステム」は、ＷＷＷ（Ｗｏｒｌｄ  Ｗｉｄｅ  Ｗｅｂ）システムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
【００７３】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。更に、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【００７４】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【００７５】
１・・・変数選択部
２・・・変数定義部
３・・・ルール定義部
４・・・置換部
５・・・修正部 
【図１】
2010262334.tif 000011
【図２】
2010262334.tif 000012
【図３】
2010262334.tif 000013
【図４】
2010262334.tif 000014
【図５】
2010262334.tif 000015
【図６】
2010262334.tif 000016