(57)【要約】【課題】難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限のないプログラムの難読化を実現すること。【解決手段】プログラム入力部１０１でプログラムを読み込み、そのプログラムに含まれる繰り返し制御文を難読化処理部１０２で検出し、さらに難読化処理部１０２で当該繰り返し制御文のインデックス変数に入力される値の順番を変更するようにプログラムの内容を変換し、プログラム出力部１０３から出力する。【選択図】      図１
2004185064.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段と、を具備することを特徴とするプログラムの難読化装置。
【請求項２】
前記難読化手段は、検出した前記繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換することを特徴とする請求項１記載のプログラムの難読化装置。
【請求項３】
前記難読化手段は、プログラムの内容を変換する際、請求項１記載の変換方式と請求項２記載の変換方式をランダムに選択して変換することを特徴とする請求項２記載のプログラムの難読化装置。
【請求項４】
プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段と、を具備することを特徴とするプログラムの難読化装置。
【請求項５】
プログラムを読み込むステップと、前記プログラムに含まれる繰り返し制御文を検出するステップと、当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換するステップと、前記変換されたプログラムを出力するステップと、を具備することを特徴とするプログラムの難読化方法。
【請求項６】
前記プログラムの内容を変換する際、検出した前記繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換することを特徴とする請求項５記載のプログラムの難読化方法。
【請求項７】
前記プログラムの内容を変換する際、請求項５記載の変換方式と請求項６記載の変換方式をランダムに選択して変換することを特徴とする請求項６記載のプログラムの難読化方法。
【請求項８】
プログラムを読み込むステップと、前記プログラムに含まれる繰り返し制御文を検出するステップと、当該繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換するステップと、前記変換されたプログラムを出力するステップと、を具備することを特徴とするプログラムの難読化方法。
【請求項９】
コンピュータを、プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段として機能させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項１０】
コンピュータを、プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段として機能させるためのプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムの難読化装置及び難読化方法に関する。
【０００２】
【従来の技術】
プログラムには暗号化されたデータを復号するための復号化鍵や、その復号アルゴリズム自体など、ユーザに対して秘密にすべき情報（以下、「秘密情報」という）が含まれる場合がある。このような秘密情報は、秘密に管理されて初めて本来の機能を発揮するものであり、これがユーザに把握されてしまうのは好ましくない。
【０００３】
しかしながら、プログラムは、通常、デバッガなどにより容易に動作解析が可能である。このため、プログラムに秘密情報が含まれている場合には、プログラムを解析することによって容易に秘密情報が盗み出されるという事態が生じ得る。
【０００４】
たとえば、プログラムが自分自身のライセンス認証を行う場合においては、秘密情報としての認証ルーチンが解析され、この認証ルーチンを無効にするようにプログラムを改竄される場合がある。これにより、ライセンスを保有しない不正なユーザに当該プログラムが使用されてしまうという事態が生じる。
【０００５】
したがって、プログラムに秘密情報を含む場合には、秘密情報の盗用や、プログラムの不正な改竄を防ぐにように何らかの形でプログラムを保護する必要がある。
【０００６】
従来のプログラムを保護する技術の一つとして、プログラムの難読化がある。難読化とは、プログラムの仕様を変更せずにプログラムの解析を困難にすること、言い換えると、プログラムの仕様を理解することを困難にする技術である。
【０００７】
プログラムの難読化方法として、例えば、ループを含むプログラムを、その仕様を変更せずに複雑にする方法が提案されている（例えば、非特許文献１参照）。より具体的には、ループ部分の制御構造を複雑化する方法及びループ部分の処理の順序を複雑化する方法が提案されている。
【０００８】
【非特許文献１】
門田他、信学会論文誌，  ｖｏｌ．Ｊ８０−Ｄ−Ｉ，  Ｎｏ．７，  ｐｐ．６４４−６５２，  Ｊｕｌｙ  １９９７“ループを含むプログラムを難読化する方法の提案”
【０００９】
【発明が解決しようとする課題】
しかしながら、上述したようなプログラムを難読化する方法においては、制御構造を複雑化する方法ではプログラムのループ部分を複製して２つ以上に増やす処理が必要となり、難読化処理後のプログラム自体のサイズが大きくなってしまうという課題を有し、また、処理の順序を複雑化する方法では難読化処理を施した前後でそのプログラムの仕様の一致を確認することが容易でなく、難読化のための変換規則を多数作成することが困難であるという課題を有する。
【００１０】
本発明は、かかる事情に鑑みて為されたものであり、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限のないプログラムの難読化装置及び難読化方法を提供することを目的とする。
【００１１】
【課題を解決するための手段】
本発明は、プログラムに含まれる繰り返し制御文を検出し、当該繰り返し制御文のインデックス変数に入力される値の順番を変更するようにプログラムの内容を変換するようにしたものである。
【００１２】
これにより、繰り返し制御文に含まれるインデックス変数に入力される値の順番を変更するようにしたので、変換前に比べてプログラムの解析を困難にすることができると共に、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要とせず、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００１３】
【発明の実施の形態】
本発明の第１の態様に係るプログラムの難読化装置は、プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段と、を具備する構成を採る。
【００１４】
この構成によれば、繰り返し制御文に含まれるインデックス変数に入力される値の順番を変更するようにしたので、変換前に比べてプログラムの解析を困難にすることができる。
【００１５】
特に、第１の態様に係る変換方式を用いてプログラムの内容を変換した場合には、インデックス変数に入力される値の順番が変更されるだけなので、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要とせず、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００１６】
本発明の第２の態様は、第１の態様に係るプログラムの難読化装置において、前記難読化手段は、検出した前記繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換する構成を採る。
【００１７】
この構成によれば、第１の態様に係る変換方式に加えて、検出した前記繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換するので、複数の変換方式でプログラムの内容を変換することができる。
【００１８】
また、第２の態様に係る変換方式を用いてプログラムの内容を変換した場合には、解析者は、複数の工程を経なければプログラムの解析を行うことができない。このため、変換前のプログラムと比べて解析を困難にすることができる。
【００１９】
特に、第２の態様に係る変換方式を用いてプログラムの内容を変換した場合には、インデックス変数に入力される値の規則性を排除し、インデックス変数に入力される値を複雑に変化させるようにしている。インデックス変数に入力される値を複雑に変化させるだけなので、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要としない。この結果、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００２０】
本発明の第３の態様は、第２の態様に係るプログラムの難読化装置において、前記難読化手段は、プログラムの内容を変換する際、第１の態様に係る変換方式と第２の態様に係る変換方式をランダムに選択して変換する構成を採る。
【００２１】
この構成によれば、第１の態様に係る変換方式と第２の態様に係る変換方式を用いてランダムにプログラムの内容が変換される。このため、プログラムを解析しようとする場合には、複数の変換方式を解明しなければ、プログラムの解析を行うことができない。この結果、プログラムの解析をより困難にすることができる。
【００２２】
本発明の第４の態様に係るプログラムの難読化装置は、プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段と、を具備する構成を採る。
【００２３】
この構成によれば、繰り返し制御文に含まれるインデックス変数に入力される値を複雑に変化させるようにしたので、変換前に比べてプログラムの解析を困難にすることができる。
【００２４】
特に、第４の態様に係る変換方式を用いてプログラムの内容を変換した場合には、インデックス変数に入力される値を複雑に変化させるだけなので、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要としない。この結果、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００２５】
本発明の第５の態様に係るプログラムの難読化方法は、プログラムを読み込むステップと、前記プログラムに含まれる繰り返し制御文を検出するステップと、当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換するステップと、前記変換されたプログラムを出力するステップと、を具備するものである。
【００２６】
本発明の第６の態様は、第５の態様に係るプログラムの難読化方法において、前記プログラムの内容を変換する際、検出した前記繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換するものである。
【００２７】
本発明の第７の態様は、第６の態様に係るプログラムの難読化方法において、前記プログラムの内容を変換する際、第５の態様に係る変換方式と第６の態様に係る変換方式をランダムに選択して変換するものである。
【００２８】
本発明の第８の態様に係るプログラムの難読化方法は、プログラムを読み込むステップと、前記プログラムに含まれる繰り返し制御文を検出するステップと、当該繰り返し文のインデックス変数に入力される値を関数により生成し、前記インデックス変数を参照する部分を配列に変更し、当該配列に前記関数の逆関数により生成される値を入力するようにプログラムの内容を変換するステップと、前記変換されたプログラムを出力するステップと、を具備するものである。
【００２９】
本発明の第９の態様は、コンピュータを、プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段として機能させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体である。
【００３０】
本発明の第１０の態様は、コンピュータを、プログラムを読み込む入力手段と、前記プログラムに含まれる繰り返し制御文を検出すると当該繰り返し制御文のインデックス変数に入力される値の順番を変更するように前記プログラムの内容を変換する難読化手段と、前記難読化手段により変換したプログラムを出力する出力手段として機能させるためのプログラムである。
【００３１】
以下、本発明の一実施の形態に係る難読化装置及び難読化方法について、図を用いて説明する。
【００３２】
本発明の一実施の形態に係るプログラムの難読化装置及び難読化方法は、プログラムに含まれる繰り返し制御文におけるインデックス変数の値の規則性がプログラムの解析を容易にしている点に着目し、インデックス変数に入力される値の順番を変更させ、あるいは、複雑に変化させるようにプログラムを改変するものである。
【００３３】
図１は、本発明の一実施の形態に係るプログラムの難読化装置１００の構成を示すブロック図である。
【００３４】
本難読化装置１００は、例えば、ＣＤ−ＲＯＭ等の記録媒体に記録するプログラムを難読化する場合に用いられる。本難読化装置１００におけるプログラムに対する難読化は、例えば、記録媒体に記録されたプログラムを読み出して難読化を行った後に再び記録媒体に書き込むことが考えられる。しかし、これに限定されず、完成したプログラムに対して難読化を行った後にこの難読化したプログラムを複製して記録媒体に記録する等、様々な態様でプログラムを難読化することが可能である。本実施の形態においては、記録媒体に記録されたプログラムを読み出して難読化を行った後に再び記録媒体に書き込む場合について説明する。
【００３５】
図１に示す難読化装置１００において、プログラム入力部１０１は、難読化を行う対象となるプログラムを入力する部分である。具体的にはＣＤ−ＲＯＭ等の記録媒体に記録されたプログラムを読み込む部分である。
【００３６】
難読化処理部１０２は、入力されたプログラムの難読化を行う部分である。難読化を行う際、難読化処理部１０２は、本難読化装置１００の操作者により予め設定されたプログラムの変換規則パターンやこの変換規則パターンに適用する各種パラメータを用いて難読化を行う。
【００３７】
プログラム出力部１０３は、難読化が行われたプログラムを出力する部分である。具体的には、ＣＤ−ＲＯＭ等の記録媒体に難読化が行われたプログラムを記録する部分である。
【００３８】
パラメータ設定部１０４は、本難読化装置１００の操作者が上述の変換規則パターン等を設定する部分である。操作者により設定された各種パラメータ等は、パラメータ設定部１０４に保存され、難読化処理部１０２により参照される。
【００３９】
図２は、パラメータ設定部１０４に保存される変換規則パターンの一例を示す図である。図２においては、３つの変換規則パターンが保存された場合について示している。なお、図２においては、Ｃ言語で記述されたプログラムについて開示しているが、これに限定されず、ＪＡＶＡ（登録商標）等により記述された、繰り返し制御文を含むプログラムについても適用することが可能である。
【００４０】
各変換規則パターンは、同図に示すように、“番号２０１：［（変換適用パターン）］２０２−＞［（変換適用後パターン）］２０３：（適用条件）２０４”で構成される。
【００４１】
ここで、番号２０１は、変換規則パターンを一意に決定するための識別子である。以下、番号２０１が「０１」の変換規則パターンを変換規則パターン０１と呼ぶものとする。番号２０１が「０２」や「０３」の変換規則パターンも同様とする。
【００４２】
変換適用パターン２０２は、各変換規則パターンを適用可能なｆｏｒ文を検出するためのパターンである。なお、変換適用パターン２０２において、”＃”が先頭に付与された変数は、変換対象のプログラム中で使われる変数が、変換適用パターン２０２と一致していなくてもよいことを表すワイルドカードである。また、”ＦＵＮＣＴＩＯＮ（）”は、ｆｏｒ文中の全ての命令を現すワイルドカードである。
【００４３】
変換適用後パターン２０３は、変換適用パターン２０２によりマッチングしたｆｏｒ文をどのように変換するかを示すものである。なお、先頭に”＃”が付与された変数は、変換適用パターン２０２によりマッチングしたワイルドカード部分に対応する変数を適用することを示す。変換適用後パターン２０３において、”＄”が先頭に付与された変数には、操作者により設定されたパラメータが入力される。
【００４４】
適用条件２０４は、上記変換規則パターンを適用する条件を示すものである。適用条件２０４が記述されていない場合には、変換適用パターン２０２が一致する全てのプログラムに適用可能であることを示す。一方、適用条件２０４が記述されている場合には、変換適用パターン２０２が一致するプログラムのうち、適用条件２０４にマッチする場合にのみ当該変換規則パターンを適用することを示す。
【００４５】
例えば、図２に示す変換規則パターン０１では、ｆｏｒ文中で出力、分岐が発生しないことが条件であることを”ＮＯＮ＿ＯＵＴＰＵＴ”という表現で示している。なお、変換規則パターン０２及び０３では、適用条件２０４がないため、変換適用パターン２０２が一致する全てのプログラムに適用可能であることを示している。
【００４６】
以下、図２に示した変換規則パターンを具体的に説明する。
【００４７】
変換規則パターン０１は、プログラムに含まれるｆｏｒ文が、
ｆｏｒ（＃ｉ＝０；＃ｉ＜＃ＶＡＬ；＃ｉ＋＋）
にマッチングする場合に、そのプログラムを難読化するものである。すなわち、図２に示す変換適用パターン２０２Ａとマッチングする場合に難読化を行う。
【００４８】
変換規則パターン０１により難読化されるプログラムを具体的に説明する。以下のプログラムＡは、変換規則パターン０１により難読化されるプログラムの一例を示している。
2004185064.tif 000003
【００４９】
このプログラムＡは、０以上１０未満の整数の和を出力するプログラムである。このプログラムＡにおいては、ｉが０，１，２，・・・９と規則的に変化するため、インデックス変数に１から１０の値が１回ずつ入力されることが一見して判定でき、プログラムの解析が容易となってしまう。
【００５０】
本難読化装置１００では、このようなプログラムＡを検出すると、変換規則パターン０１を適用することで難読化を行う。プログラムＢは、変換規則パターン０１により難読化した場合のプログラムの一例を示している。
2004185064.tif 000004
【００５１】
このプログラムＢにおいては、インデックス変数に入力される値は、７→４→１→８→５→２→９→６→３→０となる。このように変換規則パターン０１では、ｆｏｒ文中でインデックス変数のとる値の順番を入れ替えてもその仕様に影響を与えない場合、ｆｏｒ文を、
2004185064.tif 000005
と変換する。
【００５２】
ここで、Ｃｉｎｉｔは適当な初期値を表し、ｆＮ（Ｃｉｎｉｔ）はＣｉｎｉｔに関数ｆ（ｉ）をＮ回適用することを表す。なお、この場合において、ｆ（ｉ）の満たすべき性質は、ｆ（ｉ）に０〜Ｎ−１までの数が１回ずつ表れるということである。プログラムＢにおいては、ｆ（ｉ）＝（ｉ＋ｂ）％Ｎであり、Ｃｉｎｉｔ＝ｂ（上述の例ではｂ＝７）としている。
【００５３】
なお、プログラムＢのｆｏｒ文中では、インデックス変数に入力される値の順番がプログラムＡとは異なるが、ｆｏｒ文中には出力がないため、プログラムの仕様に影響を与えることはない。
【００５４】
このように変換規則パターン０１によりプログラムＡをプログラムＢに変換した場合、ｉに１以上１０未満の整数が１回ずつ現れることは、一見して判定しにくく、プログラムＡと比べて解析が困難になるという効果を得ることができる。
【００５５】
特に、変換規則パターン０１では、プログラムに含まれる繰り返し制御文を検出し、当該繰り返し制御文のインデックス変数に入力される値の順番を変更するようにしている。より具体的には、インデックス変数に入力される値の規則性を排除し、不規則的にインデックス変数に入力される値を変化させるようにしている。インデックス変数に入力される値を変化させるだけなので、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要としない。この結果、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００５６】
また、変換規則パターン０２は、プログラムに含まれるｆｏｒ文が、
ｆｏｒ（Ｉ＝０；Ｉ＜Ｎ；Ｉ＋＋）｛ＦＵＮＣＴＩＯＮ（Ｉ）；｝・・・（プログラムＣ）
にマッチングする場合に、そのプログラムを難読化するものである。すなわち、図２に示す変換適用パターン２０２Ｂとマッチングする場合に難読化を行う。
【００５７】
このプログラムＣは、ｆｏｒ文の一般的な形式である。プログラムＣにおいて、ＦＵＮＣＴＩＯＮ（Ｉ）の引数Ｉは規則的に変化する。プログラムＡの例でも見たように、インデックス変数の変化が規則的な場合、プログラムの解析が容易になってしまう。
【００５８】
変換規則パターン０２による難読化は、以下の変換方式に基づいている。本難読化装置１００においては、プログラムＣを、
2004185064.tif 000006
と変換することで、プログラムＣの仕様を変化させずに、インデックス変数を複雑化する。
【００５９】
ここで、ｆ−１（ｉ）は、ｆ（ｉ）の逆関数を表している。この変換は、ｆ−１（ｆ（ｉ））＝ｉとなる性質を利用したものであり、予めｐ［ｉ］にｆ−１（ｉ）を代入することで、ｐ［ｉｄｘ］＝ｐ［ｆ（ｉ）］＝ｆ−１（ｆ（ｉ））＝ｉが出現するようにするものである。変換規則パターン０２では、ｆ（ｉ）＝２＊ｉ＋１とした場合の一例を示している。しかし、これに限定されず、逆関数を有するいかなる関数も適用することができる。
【００６０】
変換規則パターン０２を適用した場合、プログラムＣは、プログラムＤに変換される。プログラムＤは、変換規則パターン０２により難読化した場合のプログラムの例を示す。
2004185064.tif 000007
【００６１】
プログラムＤにおいては、ｐ［Ｉ］のとる値は、−０．５→０→０．５→１→１．５→２→２．５→３→・・・となり、ｉｄｘのとる値は、１→３→５→７…となる。したがって、ＦＵＮＣＴＩＯＮ（ｐ［ｉｄｘ］）に引数として渡される値は、０→１→２→３→・・・となり、難読化前とインデックス変数に入力される値の順番が変化しておらず、仕様を変更していないことが分かる。
【００６２】
このように変換規則パターン０２によりプログラムＣをプログラムＤに変換した場合、プログラムの解析者は、まず、ｐ［Ｉ］に対してどのような値が入力されるかを調べ、かつ、ｉｄｘがどのように変化するかを調べ、その結果からＦＵＮＣＴＩＯＮ（）の引数として、どのような値が与えられるかを調べるという手順をふまなければプログラムの解析ができない。このため、難読化前のプログラムＣと比べて解析が困難になるという効果を得ることができる。
【００６３】
特に、変換規則パターン０２では、インデックス変数に入力される値の規則性を排除し、インデックス変数に入力される値を複雑に変化させるようにしている。インデックス変数に入力される値を複雑に変化させるだけなので、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要としない。この結果、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００６４】
さらに、変換規則パターン０３は、変換規則パターン０２と同様に、プログラムに含まれるｆｏｒ文が、
ｆｏｒ（Ｉ＝０；Ｉ＜Ｎ；Ｉ＋＋）｛ＦＵＮＣＴＩＯＮ（Ｉ）；｝・・・（プログラムＣ）
にマッチングする場合に、そのプログラムを難読化するものである。すなわち、図２に示す変換適用パターン２０２Ｃとマッチングする場合に難読化を行う。
【００６５】
変換規則パターン０３による難読化は、以下の変換方式に基づいている。本難読化装置１００においては、プログラムＣを、
2004185064.tif 000008
と変換することで、プログラムＣの仕様を変化させずに、インデックス変数を複雑化する。
【００６６】
ここで、Ｆ（Ｎ）は、ｆ（ｉｄｘ）を漸化式とみなしたときの一般式である。変換規則パターン０３では、ｆ（ｎ）＝ａ＊ｎ＋ｂ（ａ＝２、ｂ＝１）とした場合の一例を示している。しかし、これに限定されず、一般式を導出可能であり、その一般式が逆関数を有するいかなる漸化式も適用することができる。
【００６７】
このｆ（ｎ）＝ａ＊ｎ＋ｂについて具体的に検討すると、
Ｆ（ｎ）＝（１−ａｎ）／（１−ａ）＊ｂ
（ｎ！＝０のとき）
Ｆ−１（ｎ）＝１／ｌｏｇ（ａ）＊ｌｏｇ（１−（１−ａ）／ｂ＊ｎ）
（ｎ＝０のとき）
Ｆ−１（ｎ）＝０
となり、プログラムは、以下のプログラムＥに変換される。
2004185064.tif 000009
【００６８】
ここで、上述のプログラムをａ＝２，ｂ＝１で計算すると、ｐ［Ｉ］のとる値は、０→１→１．５８５０→２→２．３２１９→２．５８５０→２．８０７４→３→３．１６９９→３．３２１９→…となり、ｉｄｘのとる値は、０→１→３→７→…となる。したがって、ｐ［ｉｄｘ］のとる値は、１→２→３→…→Ｎ−１となり、変換前のプログラムと同じ順番で、同じ値がＦＵＮＣＴＩＯＮ（）関数の引数として渡されることが分かる。
【００６９】
このように変換規則パターン０３によりプログラムＣをプログラムＥに変換した場合、プログラムの解析者は、まず、ｐ［Ｉ］に対してどのような値が入力されるかを調べ、かつ、ｉｄｘがどのように変化するかを調べ、その結果からＦＵＮＣＴＩＯＮ（）の引数として、どのような値が与えられるかを調べるという手順をふまなければプログラムの解析ができない。このため、難読化前のプログラムＣと比べて解析が困難になるという効果を得ることができる。
【００７０】
特に、変換規則パターン０３では、インデックス変数に入力される値の規則性を排除し、インデックス変数に入力される値を複雑に変化させるようにしている。インデックス変数に入力される値を複雑に変化させるだけなので、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要としない。この結果、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限なくプログラムの難読化を実現することができる。
【００７１】
次に、このような変換規則パターンを用いた難読化処理部１０２の動作について説明する。図３は、本実施の形態に係る難読化装置１００における難読化処理部１０２の動作を説明するためのフロー図である。
【００７２】
プログラム入力部１０１から難読化を行う対象となるプログラムを受け取ると、難読化処理部１０２は、そのプログラム中の変換適用パターンに一致する箇所を検索する（ＳＴ３０１）。すなわち、入力されたプログラムに含まれるｆｏｒ文が変換適用パターン２０２と一致する箇所を検索する。
【００７３】
変換適用パターンが一致する箇所を検索した後、難読化処理部１０２は、当該変換規則パターンを適用できるかを判断する。具体的には、適用条件２０４が一致するものがあるかを判断することで、当該変換規則パターンを適用できるかを判断する（ＳＴ３０２）。
【００７４】
変換規則パターンを適用できる場合、すなわち、適用条件２０４が一致するものがある場合には、当該変換規則パターンに応じてプログラムの変換を行う（ＳＴ３０３）。
【００７５】
なお、適用可能な変換規則パターンが複数存在する場合には、適用可能な変換規則パターンのいずれか１つをランダムに選択して変換する。
【００７６】
このように複数の変換規則パターンのいずれか１つをランダムに選択してプログラムの内容が変換される。このため、プログラムを解析しようとする場合には、複数の変換規則パターンを解明しなければ、プログラムの解析を行うことができない。この結果、プログラムの解析をより困難にすることができる。
【００７７】
当該箇所のプログラムを変換した後、難読化処理部１０２は、対象となるプログラム全体を変換したかを判断する（ＳＴ３０４）。ここで、プログラム全体を変換していない場合には処理をＳＴ３０１に戻し、ＳＴ３０１〜ＳＴ３０４の処理を繰り返す。一方、プログラム全体を変換し終えた場合には、プログラムの難読化処理を終了する。
【００７８】
このように本実施の形態の難読化装置１００によれば、プログラムの仕様を変化することなく、プログラムに含まれるｆｏｒ文のインデックス変数の変化が複雑になるようプログラムを変換する。これにより、インデックス変数の変化が容易に理解されるのを防止することができるので、プログラムの解析を困難にすることができるという効果を有する。
【００７９】
特に、本実施の形態の難読化装置１００によれば、インデックス変数に入力される値の規則性を排除し、インデックス変数に入力される値の順番を変更、あるいは、インデックス変数に入力される値を複雑に変化させる。このため、プログラムのループ部分を複製して２つ以上に増やす処理や難読化処理を施した前後でそのプログラムの仕様の一致を確認する処理を必要としないので、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限のないプログラムの難読化装置及び難読化方法を提供することができる。
【００８０】
なお、本実施の形態では、繰り返し制御文としてｆｏｒ文を例にして説明している。しかし、繰り返し制御文としては、これに限定されず、ｗｈｉｌｅ文などにも適用することができる。
【００８１】
【発明の効果】
以上説明したように本発明によれば、難読化処理後のプログラム自体のサイズを大きくすることなく、変換規則の作成に制限のないプログラムの難読化装置及び難読化方法を提供することが可能となる。
【図面の簡単な説明】
【図１】本発明の一実施の形態に係るプログラムの難読化装置の構成を示すブロック図
【図２】上記実施の形態に係る難読化装置におけるパラメータ設定部に保存される変換規則パターンの一例を示す図
【図３】上記実施の形態に係る難読化装置における難読化処理部の動作を説明するためのフロー図
【符号の説明】
１０１  プログラム入力部
１０２  難読化処理部
１０３  プログラム出力部
１０４  パラメータ設定部
【図１】
2004185064.tif 000010
【図２】
2004185064.tif 000011
【図３】
2004185064.tif 000012