(57)【要約】【課題】  新規な評価方法を用いて安全性を遂次計算することで効率的な難読化を実現する。【解決手段】  プログラム難読化装置は、データ入力取込み部２を介して難読化前のプログラムを取込み、難読化処理部３を起動してあらかじめ複数用意された難読化アルゴリズムの一つに従って難読化処理を実行し、難読化判定出力部６が、難読化処理を１回実行する毎に安全性評価を行い、ユーザが定義した安全性評価のための要求条件を達成していれば処理を終了し、達成していなければ再度難読化処理を実行して上記判定を繰り返し最終的に最適な難読化プログラムを出力する。なお、安全性は、難読化前のプログラムに対する命令単位での差分を評価することによって行われる。【選択図】      図１
2006235688.tif 000002
【特許請求の範囲】
【請求項１】
難読化前のプログラムとユーザによって定義される安全性評価のための要求条件を、入力装置を介して取り込むデータ入力取込み部と、
演算装置を用い、前記取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化手法のそれぞれを実行して難読化された複数のプログラムを生成出力する難読化処理部と、
前記難読化手法のそれぞれを実行する毎、前記難読化後のプログラムと前記取り込まれた難読化前のプログラムとの命令単位での差分を評価し、前記要求条件を満たしたときに前記難読化処理部による難読化処理の実行を終了させ、前記難読化後のプログラムを出力する難読化判定出力部と、
を具備することを特徴とするプログラム難読化装置。
【請求項２】
前記難読化判定出力部は、
前記難読化前後のプログラムを構成する命令のうち、同一である命令数を前記難読化後のプログラムにおける全体の命令数で除算した値を整数１から減算して得られる値に基づき前記差分の評価を行うことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記難読化処理部は、
同じ難読化処理手法を数回実行して前記難読化判定出力部により生成される前記値の上昇の程度を評価し、前記複数の難読化手法のうち最適な難読化手法を選択して前記難読化処理を実行することを特徴とする請求項２に記載のプログラム難読化装置。
【請求項４】
前記難読化判定出力部は、
前記データ入力取込み部を介して更に取り込まれるファイルサイズに従ってその上限値との比較を行い、該ファイルサイズが該上限値以下である場合には、前記難読化処理を終了させることを特徴とする請求項１から３のいずれか１項に記載のプログラム難読化装置。
【請求項５】
プログラムを第三者が理解しにくいように改変する、入出力装置と演算装置を備えたプログラム難読化装置に用いられるプログラム難読化方法であって、
難読化前のプログラムとユーザによって定義される安全性評価のための要求条件とを、前記入力装置を介して取り込むステップと、
前記演算装置を用い、前記取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化処理手法のそれぞれを実行し、難読化された複数のプログラムを生成出力するステップと、
前記難読化処理手法のそれぞれを実行する毎、前記難読化後のプログラムと前記取り込まれた難読化前のプログラムとの命令単位での差分を評価し、前記要求条件を満たしたときに前記難読化処理を終了させ、前記難読化後のプログラムを出力するステップと、
を有することを特徴とするプログラム難読化方法。
【請求項６】
プログラムを第三者が理解しにくいように改変するプログラム難読化装置に用いられるプログラムであって、
難読化前のプログラムとユーザによって定義される安全性評価のための要求条件とを取り込む処理と、
前記取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化処理手法のそれぞれを実行し、難読化された複数のプログラムを生成出力する処理と、
前記難読化処理手法のそれぞれを実行する毎、前記難読化後のプログラムと前記取り込まれた難読化前のプログラムとの命令単位での差分を評価し、前記要求条件を満たしたときに前記難読化処理を終了させ、前記難読化後のプログラムを出力する処理と、
をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを第三者が理解しにくいように効率的に改変することのできるプログラム難読化装置およびその方法ならびにプログラムに関する。
【背景技術】
【０００２】
近年、コンピュータを利用した様々なサービスが提供されるようになった。このとき、サービス提供者は、ユーザに対してサービスを利用するためのプログラムを提供する。このようなプログラムには、例えば、暗号化鍵等を用い何らかの秘密情報を隠蔽する処理が施される。そのような場合、プログラムに対して攻撃者が理解しにくいように改変する必要があり、この技術を難読化と呼ぶ。
【０００３】
難読化は、プログラムの解析を困難にする用途でも使用される。例えば、プログラムが機密データや機密アルゴリズムを持つ場合、安全な構成で問題解析を困難にするように、ソースコードに対し、プログラムの仕様を変更しないように、関数へのポインタ変数を新たに複数導入し、また、関数ポインタの変数のいずれかに関数のアドレスを代入する命令文を複数挿入し、プログラムにおける関数の呼び出しを関数ポインタ変数の値に応じて呼び出すように変換する難読化方法が知られている（例えば、特許文献１参照）。
【特許文献１】特開２００３−３３７６２９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、上記した従来技術によれば、難読化手法を適用するに際して、安全性とファイルサイズの増加に対して効率的に難読化処理を施すことができず、結果的に冗長な難読化処理になってしまう。また、ファイルサイズの増加に対して十分に安全性を確保できないなどの問題があった。
【０００５】
本発明は、上記事情に基づいてなされたものであり、新規な評価方法を用いて安全性を遂次計算することで効率的な難読化を実現するプログラム難読化装置およびその方法ならびにプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
上記した課題を解決するために、本発明のプログラム難読化装置は、難読化前のプログラムとユーザによって定義される安全性評価のための要求条件を、入力装置を介して取り込むデータ入力取込み部と、演算装置を用い、前記取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化手法のそれぞれを実行して難読化された複数のプログラムを生成出力する難読化処理部と、前記難読化処理アルゴリズムのそれぞれを実行する毎、前記難読化後のプログラムと前記取り込まれた難読化前のプログラムとの命令単位での差分を評価し、前記要求条件を満たしたときに前記難読化処理部による難読化処理の実行を終了させ、前記難読化後のプログラムを出力する難読化判定出力部と、を具備することを特徴とする。
【０００７】
また、本発明において、前記難読化判定出力部は、前記難読化前後のプログラムを構成する命令のうち、同一である命令数を前記難読化後の全体の命令数で除算した値を整数１から減算して得られる値の大小に基づき前記差分の評価を行うことを特徴とする。
【０００８】
また、本発明において、前記難読化処理部は、同じ難読化手法を数回実行して前記難読化判定出力部により生成される前記値の上昇の程度を評価し、前記複数の難読化手法のうち最適な難読化手法を選択して前記難読化処理を実行することを特徴とする。
【０００９】
また、本発明において、前記難読化判定出力部は、前記データ入力取込み部を介して更に取り込まれるファイルサイズに従ってその上限値との比較を行い、該ファイルサイズが該上限値以下である場合には、前記難読化処理を終了させることを特徴とする。
【００１０】
また、本発明は、プログラムを第三者が理解しにくいように改変する入出力装置と演算装置を備えたプログラム難読化装置に用いられるプログラム難読化方法であって、難読化前のプログラムとユーザによって定義される安全性評価のための要求条件とを、前記入力装置を介して取り込むステップと、前記演算装置を用い、前記取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化手法のそれぞれを実行し、難読化された複数のプログラムを生成出力するステップと、前記難読化手法のそれぞれを実行する毎、前記難読化後のプログラムと前記取り込まれた難読化前のプログラムとの命令単位での差分を評価し、前記要求条件を満たしたときに前記難読化処理を終了させ、前記難読化後のプログラムを出力するステップと、を有することを特徴とする。
【００１１】
また、本発明は、プログラムを第三者が理解しにくいように改変するプログラム難読化装置に用いられるプログラムであって、難読化前のプログラムとユーザによって定義される安全性評価のための要求条件とを取り込む処理と、前記取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化手法のそれぞれを実行し、難読化された複数のプログラムを生成出力する処理と、前記難読化手法のそれぞれを実行する毎、前記難読化後のプログラムと前記取り込まれた難読化前のプログラムとの命令単位での差分を評価し、前記要求条件を満たしたときに前記難読化処理を終了させ、前記難読化後のプログラムを出力する処理と、をコンピュータに実行させることを特徴とする。
【発明の効果】
【００１２】
本発明によれば、難読化処理部が、データ入力取込み部を介して難読化前のプログラムを取込み、あらかじめ複数用意された難読化手法に従って難読化処理を実行し、難読化判定出力部が、難読化処理を１回実行する毎に安全性評価を行い、ユーザが定義した安全性評価のための要求条件を達成していれば難読化処理を終了し、達成していなければ再度難読化処理を実行する。また、ユーザが、ファイルサイズの上限を定義した場合には、その上限内で安全性の評価値が最大となるように難読化手法を再帰的に実行する。そして、安全性を達成し、かつファイルサイズが上限以下であれば処理を終了する。この場合の安全性評価は、難読化前のプログラムに対する命令単位での差分として評価される。
このことにより、効率的に難読化前のプログラムが難読化処理されて改変されるためにプログラムの保護が可能であり、また、ファイルサイズが増加しても安全なシステムの構築が可能になる。
【発明を実施するための最良の形態】
【００１３】
図１は、本発明の実施形態に係るプログラム難読化装置を機能展開して示したブロック図である。
図１に示されるように、本発明のプログラム難読化装置は、中央制御部１と、データ入力取込み部２と、難読化処理部３と、Ｐ値評価部４と、Ｑ値評価部５と、難読化判定出力部６とで構成される。
【００１４】
データ入力取込み部２は、難読化前のプログラムと、ユーザによって定義される安全性評価およびファイルサイズに関する要求条件を、図示せぬ入力装置を介して取り込む機能を持つ。要求条件としては他に処理時間等も考えられる。また、難読化処理部３は、図示せぬ演算装置を用い、データ入力取込み部２によって取り込まれた難読化前のプログラムに関し、あらかじめ用意された複数の難読化手法（難読化アルゴリズム）のそれぞれを実行して複数の難読化されたプログラムを生成出力する機能を持つ。
また、難読化判定出力部６は、難読化アルゴリズムのそれぞれを実行する毎、難読化後のプログラムと取り込まれた難読化前のプログラムとを命令単位での差分で評価し、データ入力取込み部２によって取り込まれた要求条件を満たしたときに難読化処理部３による難読化処理の実行を終了させる機能を持つ。難読化判定出力部６はまた、データ入力取込み部２を介して更に取り込まれるファイルサイズに従ってその上限値との比較を行い、ファイルサイズが上限値以下である場合には、難読化処理部３による難読化処理を終了させ、難読化後のプログラムを出力する。
【００１５】
一方、Ｐ値評価部４は、難読化前後のプログラムを構成する命令のうち、同一である命令数を難読化後の全体の命令数で除算した値を整数１から減算して得られる値の大小に基づき差分の評価を行い、また、Ｑ値評価部５は、難読化処理部３が同じ難読化処理手順を数回実行してＰ値評価部４により生成されるＰ値の上昇の程度を評価し、難読化処理部３が、複数の難読化アルゴリズムのうち最適な難読化アルゴリズムを選択して難読化処理を実行する。
なお、中央制御部１は、本発明のプログラム難読化装置の制御中枢となり、上記したデータ入力取込み部２、難読化処理部３、Ｐ値評価部４、Ｑ値評価部５、難読化判定出力部６間のシーケンス制御を行う。
【００１６】
以下、図２、図３を参照しながら本発明の実施形態に関する動作について説明するが、ここでは、ユーザに有効期限のあるプログラムを提供し、対価を得るようなサービスを想定する。
本サービスの利用手順は以下のようになる。すなわち、まず、ユーザは、プログラム提供サイトにアクセスし、対価の支払いを行うと共にコンテンツのダウンロード要求を行う。一方、プログラム提供サイトは、ユーザからのダウンロード要求に対して、オリジナルプログラムを本発明のプログラム難読化装置に入力し、難読化されたプログラムを得る。また、プログラム提供サイトは、難読化処理が施されたプログラムをユーザに返信する。
このことにより、ユーザは受信した難読化プログラムを利用することができる。なお、受信した難読化プログラムには有効期限をチェックする機能が含まれており、有効期限を過ぎると使用不能になる。
【００１７】
図２は、本発明実施形態において用いられる難読化手法（難読化アルゴリズム）の一例をフローチャートで示した図である。
ここでは、難読化処理部３は、まず、乱数を生成し（Ｓ２１）、生成した乱数をＮビット出力のハッシュ関数に入力してＮビットの初期値を得ている（Ｓ２２）。そして、ここで得られたＮビットの初期値を、使用する難読化手法の個数分ｎに分割し（Ｓ２３）、分割したビット列に対して、２Ｎビットになるまで別の乱数を結合させ、再びハッシュ関数へ入力して、難読化手法の個数分のＮビット乱数を得る（Ｓ２４）。
【００１８】
続いて冗長度の導入を行う（Ｓ２５〜Ｓ２７）。具体的に、Ｓ２５では、Ｎビット乱数を、ｎ×１×ｍビットに分割し、ｎビットの変数名の宣言をｍで指定される部分に１行追加する（冗長度の導入１）。そして、Ｓ２６では、Ｎビット乱数をｎ×１ｍ×ｍ×ｐに分割し、ｎビットの変数名の宣言をｍで指定される部分に１行追加する。また、上記の処理で生成した演算を、乱数ｐを使用してダミー処理を生成し追加する。ダミー処理の生成方法は、後述する処理手順の変更に準ずる（冗長度の導入２）。
次に、Ｎビット乱数をａ×ｂビットに分割し、事前に作成されているａ個のダミーコートサンプルから、値ａを用いて選択し、ｂで指定される位置に挿入する（冗長度の導入３）。
【００１９】
次に処理手順の変更を行う（Ｓ２８、Ｓ２９）。具体的には、Ｓ２８では、Ｎビット乱数をｓ×ｔ×ｕ×ｖに分割し、プログラムで使用されている変数を値ｓで指定し、ｔで指定される演算を指定された変数とｕを入力とし、その後、逆演算を行う処理をｖで指定される場所に追加する（処理手順の変更１）。
次に、Ｓ２９では、Ｎビット乱数をｅ×ｆ×ｇ×ｈ×ｉに分割し、プログラムで使用されている変数を値ｅで指定し、ｆで指定される演算を指定された変数とｇを入力としてｈ回行い、その後逆演算を行う処理をｉで指定される場所に追加する（処理手順の変更２）。
【００２０】
図３は、本発明の実施形態に係るプログラム難読化装置の動作を説明するために引用したフローチャートであり、本発明のプログラムの処理手順をも示している。
フローチャートの説明に先立ち、本発明の実施形態で用いられる安全性評価のための評価式について説明する。Ｐ値評価部４が実行する演算は、以下の数１で示される。
【００２１】
【数１】
2006235688.tif 000003
【００２２】
ここで、Ｔは難読化後のプログラム全体の命令数、αは元コードと難読化後のコードにおいて同一である命令数である。また、命令単位以外にも、バイト単位でも同様の評価を行ってもよい。また、プログラムごとに最適な難読化方式は異なるため、Ｑ値評価部５は、以下の数２を実行して評価し、複数用意された難読化アルゴリズムを決定しても良い。
【００２３】
【数２】
2006235688.tif 000004
【００２４】
ここで、α’は、あるプログラムＡを同一回数難読化処理を実行したプログラムＡ’，Ａ’’において、同一である命令の個数である。すなわち、同じ難読化を何回も実行した場合に、どの程度Ｐ値が上昇するかを評価している。また、ここでも、命令単位以外に、バイト単位でも同様の評価を行っている。なお、Ｑ値は、複数の難読化プログラム（Ａ’’’，Ａ’’’．．．）を利用して、その平均をとっても良い。
【００２５】
以下、図３に示すフローチャートを参照しながら図１の本発明の実施形態に係るプログラム難読化装置の動作について詳細に説明する。
ユーザは、まず、本発明のプログラム難読化装置に対し、図示せぬ入力装置を用いて難読化したいプログラム（被難読化プログラム）、および、達成したい安全性レベル（Ｐ値）及び、ファイルサイズなどの要求条件を入力する。
プログラム難読化装置は、データ入力取込み部２を介して被難読化プログラムと要求条件を取込み（Ｓ３１）、中央制御部１によるコントロールの下、難読化処理部３へ供給する。難読化処理部３は、事前評価作業として、それぞれの難読化手法で難読化プログラムを複数作成し、Ｑ値評価部５により得られるＱ値を評価して最適な難読化アルゴリズムを求める（Ｓ３２）。
【００２６】
具体的に、難読化処理部３は、最初、適当な難読化アルゴリズムを選択し、図２に示すフローチャートに従い図示せぬ演算装置を用いてその難読化アルゴリズムを実行する。ここで、Ｑ値評価部５は、難読化前後のプログラムを用いてＱ値を算出して安全性を達成しているか否かを評価する。ここでの評価式は上記した数２に従う。
続いて、難読化判定出力部６は、Ｐ値評価部４を介して上記した数１に従うＰ値を計算して安全性についての評価を行い（Ｓ３４）、要求条件（Ｐ値）に従う安全性を達成していれば、続いてファイルサイズについて、これが適切であるか否かの要求条件の評価を行う（Ｓ３５）。ここで、適切でなければ難読化処理部３による同じ難読化手法を用いた難読化処理（Ｓ３２）、もしくは別の難読化手法に従う難読化処理（Ｓ３３）へ戻る。
なお、Ｓ３２の処理へ戻る場合は、難読化後のプログラムに対してＱ値を評価することで、次に実行すべき難読化アルゴリズムを再決定する。
【００２７】
次に、Ｓ３５において、ファイルサイズが適切であれば、難読化判定出力部６は、難読化されたプログラムを出力する。適切でなければＳ３２もしくはＳ３３の処理に戻る。Ｓ３２の処理へ戻る場合は、難読化後のプログラムに対してＱ値を評価することで、次に実行すべき難読化アルゴリズムを再決定する。
【００２８】
以上、説明したように本発明は、プログラム難読化装置が、データ入力取込み部を介して難読化前のプログラムを取込み、難読化処理部３を起動してあらかじめ複数用意された難読化アルゴリズムの一つに従って難読化処理を実行し、難読化判定出力部６が、難読化処理を１回実行する毎に安全性評価を行い、ユーザが定義した安全性評価のための要求条件を達成していれば処理を終了し、達成していなければ再度難読化処理を実行して上記判定を繰り返し、最終的に最適な難読化プログラムを出力するものである。
また、ユーザが、ファイルサイズの上限を定義した場合には、その上限内で安全性の評価値が最大となるように難読化アルゴリズムを再帰的に実行する。そして、安全性を達成し、かつ、ファイルサイズが上限以下であれば上記同様処理を終了する。この場合の安全性評価は、難読化前のプログラムに対する命令単位での差分として評価される。このことにより、効率的に難読化のためのプログラムの改変が実現されるためプログラムの保護が可能であり、また、ファイルサイズが増加しても安全なシステム構築が可能になる。
【００２９】
なお、図１に示す中央制御部１と、データ入力取込み部２と、難読化処理部３と、Ｐ値評価部４と、Ｑ値評価部５と、難読化判定出力部６のそれぞれで実行される手順をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することによって本発明のプログラム難読化装置を実現することができる。ここでいうコンピュータシステムとは、ＯＳや周辺装置等のハードウェアを含む。
【００３０】
また、「コンピュータシステム」は、ＷＷＷシステムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【００３１】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【００３２】
【図１】本発明実施形態にかかわるプログラム難読化装置を機能展開して示したブロック図である。
【図２】本発明実施形態において用いられる難読化手法（難読化アルゴリズム）の一例をフローチャートで示した図である。
【図３】本発明実施形態にかかわるプログラム難読化装置の動作を説明するために引用したフローチャートである。
【符号の説明】
【００３３】
１…中央制御部、２…データ入力取込み部、３…難読化処理部、４…Ｐ値評価部、５…Ｑ値評価部、６…難読化判定出力部
【図１】
2006235688.tif 000005
【図２】
2006235688.tif 000006
【図３】
2006235688.tif 000007