(57)【要約】【課題】  動的解析に対する安全性を高めたプログラム難読化手法を提案する。【解決手段】  プログラム難読化装置Ｔは、プログラムを難読化するための難読化規則を記憶する難読化規則記憶部１１、入力された難読化対象のプログラムを解析する解析処理部１２、難読化規則記憶部１１に記憶された難読化規則および解析処理部１２による解析結果に基づく難読化処理を施してその結果を出力する難読化処理部１３、を備えており、入力された難読化対象のプログラムに含まれる演算式部分について、その演算式に含まれる変数を条件式に用いた分岐を生成すると共に、難読化前と同じ演算結果となる複数のダミーコードを前記分岐に係る変数を使用して生成し、これら複数のダミーコードを前記分岐先のコード部分にそれぞれ含めたプログラムを生成して、これを難読化結果として出力する。【選択図】  図１
2011018119.tif 000002
【特許請求の範囲】
【請求項１】
プログラムリストの入力を受け付ける受付手段と、
前記受付手段により受け付けられたプログラムリストを、当該プログラムリストにおいて使用されている変数を条件式に用いた分岐を含むと共に、当該分岐先のコード部分に当該変数を使用したダミーコードを含むプログラムリストに変換する変換手段と、
前記変換手段により変換されたプログラムリストを出力する出力手段と、
を備えたことを特徴とするプログラム難読化装置。
【請求項２】
前記ダミーコードは、有限群の任意の要素に対して当該有限群の位数回演算を施したものが単位元になる性質を利用したものである、
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記ダミーコードは、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を利用したものである、
ことを特徴とする請求項２に記載のプログラム難読化装置。
【請求項４】
前記加法群として剰余環Ｚ／ｎＺ（ｎは整数）上の加法群を用いる、
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項５】
前記加法群として楕円曲線上の有限群を用いる、
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項６】
前記ダミーコードは、乗法群の任意の要素に対して当該乗法群の位数回演算を施したものが単位元になる性質を利用したものである、
ことを特徴とする請求項２に記載のプログラム難読化装置。
【請求項７】
前記乗法群として剰余環Ｚ／ｎＺ（ｎは整数）上の乗法群を用いる、
ことを特徴とする請求項６に記載のプログラム難読化装置。
【請求項８】
プログラムリストの入力を受け付ける受付機能と、
前記受付機能により受け付けられたプログラムリストを、当該プログラムリストにおいて使用されている変数を条件式に用いた分岐を含むと共に、当該分岐先のコード部分に当該変数を使用したダミーコードを含むプログラムリストに変換する変換機能と、
前記変換機能により変換されたプログラムリストを出力する出力機能と、
をコンピュータに実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム難読化装置及びプログラムに関する。
【背景技術】
【０００２】
プログラムを悪意あるリバースエンジニアリング（逆解析）から守るために、様々なプログラム難読化技術が提案されている。なお、難読化とは、プログラムの実行結果を変化させること無くプログラムを複雑に変換することで、プログラムの解析コストを増大させる技術である。
【０００３】
難読化手法の１つとして、不明瞭な条件式（Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ）を用いた難読化手法がある。“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”とは、難読化のために利用される恒真／恒偽の条件式のことをいう。
図７には、図６に例示するプログラム（関数ｆｕｎｃ）に“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”を用いた難読化を適用した例を示してある。すなわち、図６のプログラムに対し、条件式「ａ＊（ａ−１）  ｍｏｄ  ２＝＝１」及び条件節「＋＋ａ；」からなる条件分岐７１を加えることで、図７のプログラムは生成されている。ここで、「ｍｏｄ」とは、当該演算子の左にある整数値を右にある整数値で割った時の剰余を返す演算である（例えば、７  ｍｏｄ  ２＝１）。そして、「ａ」がどのような整数値であっても「ａ＊（ａ−１）」は“２”の倍数であるため、「ａ＊（ａ−１）  ｍｏｄ  ２」の値は常に“０”、つまり、条件式「ａ＊（ａ−１）  ｍｏｄ  ２＝＝１」は恒偽の“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”である。そのため、条件節「＋＋ａ；」は決して実行されない。
【０００４】
図６のプログラムと図７のプログラムを比較すると、その機能・動作は変わらない一方で、図７のプログラム（難読化後のプログラム）には冗長な条件分岐７１が含まれている分、図２のプログラム（元のプログラム）よりもプログラム全体の長さが長くなり、解析コスト、つまりプログラムの挙動解析に必要となるコストは大きくなる。これにより、プログラムの解析が困難になり、難読化が施されたプログラムは元のプログラムに比較して安全性が向上する。
【０００５】
次に、難読化を施されたプログラムに対する動的解析を説明する。動的解析とは、プログラムを実行しつつ、プログラムにランダムに入力を与えたり、プログラム内部を書き換えたりすることで、出力結果や実行フローの違いを観察することでプログラムの挙動を分析することを言う。
攻撃者は、“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”の無効化を行う場合には、以下のような動的解析を行う。すなわち、通常考えられる条件分岐の場合には、プログラムの入力を変えれば或る割合でその真偽値も変化するが、“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”の真偽値はどのような入力に対しても変化しないため、“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”を用いた条件分岐の条件節は、どのような入力においても必ず実行されるか、必ず実行されないかのいずれかであることを利用する。具体的には、動的解析において入力を変えて何度も実行フローを観察するうちに、攻撃者は、必ず実行される又は必ず実行されない条件節を特定でき、これにより、“Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ”を利用した難読化の無効化を図る。
【０００６】
プログラム難読化に関する発明として、例えば、特許文献１には、プログラムのソースコードに対して、前記プログラムの仕様を変更しないように、関数へのポインタ変数を新たに複数個導入し、前記関数ポインタ変数のいずれかに関数のアドレスを代入する命令文を複数個挿入し、前記プログラムにおける関数の呼出しを、前記関数ポインタ変数の値に応じて関数を呼出すように変換する発明が提案されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００３−３３７６２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明は、動的解析に対する安全性を高めたプログラム難読化手法を提案することを目的とする。
【課題を解決するための手段】
【０００９】
第１の本発明は、プログラムリストの入力を受け付ける受付手段と、前記受付手段により受け付けられたプログラムリストを、当該プログラムリストにおいて使用されている変数を条件式に用いた分岐を含むと共に、当該分岐先のコード部分に当該変数を使用したダミーコードを含むプログラムリストに変換する変換手段と、前記変換手段により変換されたプログラムリストを出力する出力手段と、を備えたことを特徴とするプログラム難読化装置である。
【００１０】
第２の本発明は、第１の本発明において、前記ダミーコードは、有限群の任意の要素に対して当該有限群の位数回演算を施したものが単位元になる性質を利用したものである。
【００１１】
第３の本発明は、第２の本発明において、前記ダミーコードは、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を利用したものである。
【００１２】
第４の本発明は、第３の本発明において、前記加法群として剰余環Ｚ／ｎＺ（ｎは整数）上の加法群を用いる。
【００１３】
第５の本発明は、第３の本発明において、前記加法群として楕円曲線上の有限群を用いる。
【００１４】
第６の本発明は、第２の本発明において、前記ダミーコードは、乗法群の任意の要素に対して当該乗法群の位数回演算を施したものが単位元になる性質を利用したものである。
【００１５】
第７の本発明は、第６の本発明において、前記乗法群として剰余環Ｚ／ｎＺ（ｎは整数）上の乗法群を用いる。
【００１６】
第８の本発明は、プログラムリストの入力を受け付ける受付機能と、前記受付機能により受け付けられたプログラムリストを、当該プログラムリストにおいて使用されている変数を条件式に用いた分岐を含むと共に、当該分岐先のコード部分に当該変数を使用したダミーコードを含むプログラムリストに変換する変換機能と、前記変換機能により変換されたプログラムリストを出力する出力機能と、をコンピュータに実現させるためのプログラムである。
【発明の効果】
【００１７】
第１の本発明によると、本発明を適用しない場合に比べ、動的解析に対する安全性を高めた難読化プログラムを得ることができるようになる。
【００１８】
第２の本発明によると、難読性の高いダミーコードを内容に含む難読化プログラムを得ることができるようになる。
【００１９】
第３の本発明によると、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を利用して、難読性の高いダミーコードを生成することができる。
【００２０】
第４の本発明によると、加法群として剰余環Ｚ／ｎＺ（ｎは整数）上の加法群を用いて、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を利用した難読性の高いダミーコードを生成することができる。
【００２１】
第５の本発明によると、加法群として楕円曲線上の有限群を用いて、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を利用した難読性の高いダミーコードを生成することができる。
【００２２】
第６の本発明によると、乗法群の任意の要素に対して当該乗法群の位数回演算を施したものが単位元になる性質を利用して、難読性の高いダミーコードを生成することができる。
【００２３】
第７の本発明によると、乗法群として剰余環Ｚ／ｎＺ（ｎは整数）上の乗法群を用いて、乗法群の任意の要素に対して当該乗法群の位数回演算を施したものが単位元になる性質を利用した難読性の高いダミーコードを生成することができる。
【００２４】
第８の本発明によると、本発明を適用しない場合に比べ、動的解析に対する安全性を高めた難読化プログラムを得ることができるようになる。
【図面の簡単な説明】
【００２５】
【図１】本発明の一実施形態に係るプログラム難読化装置の機能ブロックを例示する図である。
【図２】本発明の一実施形態に係るプログラム難読化装置により難読化されたプログラムを例示する図である。
【図３】本発明の一実施形態に係るプログラム難読化装置の利用形態を例示する図である。
【図４】本発明の一実施形態に係る難読化プログラムが利用ユーザに渡された状態を例示する図である。
【図５】本発明の一実施形態に係るプログラム難読化装置として動作するコンピュータのハードウェア構成を例示する図である。
【図６】難読化対象のプログラムを例示する図である。
【図７】不明瞭な条件式を用いた難読化手法により難読化されたプログラムを例示する図である。
【発明を実施するための形態】
【００２６】
本発明の一実施形態について、図面を参照して説明する。
図１には、本発明の一実施形態に係るプログラム難読化装置Ｔの機能ブロックを例示してある。
本例のプログラム難読化装置Ｔは、プログラムリスト（以下、単に「プログラム」という）を難読化するための難読化規則を記憶する難読化規則記憶部１１、入力された難読化対象のプログラムを解析する解析処理部１２、難読化規則記憶部１１に記憶された難読化規則および解析処理部１２による解析結果に基づく難読化処理を施してその結果を出力する難読化処理部１３、を備えており、難読化対象のプログラムに使用されている変数をＩｆ文の条件式に利用してプログラムのフローを分岐させた上で、その分岐先のコード部分に、有限群の任意の要素に対して当該有限群の位数回演算を施したものが単位元になる性質を利用したダミーコードを含めることで、動的解析に対して堅牢なプログラム難読化を施すものである。
【００２７】
本例のプログラム難読化装置Ｔによる難読化処理について、図６に例示したプログラム（関数ｆｕｎｃ）を難読化する場合を例に説明する。
本例のプログラム難読化装置Ｔでは、一例として、以下の各手順（〔手順１〕〜〔手順９〕）に従って、難読化対象として入力されたプログラム中の入力変数「ａ」の正負により分岐し、その分岐先ではＺ／ｎＺ（ｎは整数）の加法群を用いた難読化を施した上で、戻り値として整数ｃを返すように変換したプログラムを作成して出力する。なお、以下の各手順に関する情報は、難読化規則記憶部１１に難読化規則として記憶されている。また、以下の手順中の演算式における演算子「％」は、演算子「ｍｏｄ」と同様に、その演算子の左にある整数値を右にある整数値で割った時の剰余を返すものである。
【００２８】
〔手順１〕入力変数ａの正負に応じた分岐を作成。
〔手順２〕素数ｐ1，…，ｐkをランダムに生成（ｋは整数）。
〔手順３〕ｋ≧ｉ，ｊ＞２を満たす整数ｉ，ｊを生成。
〔手順４〕素数群｛ｐ1，…，ｐk｝の中からｉ個の素数ｓ1，ｓ2，…，ｓiを選択し、Ｓ＝ｓ1＊ｓ2＊…＊ｓiを計算。
〔手順５〕素数群｛ｐ1，…，ｐk｝の中からｊ個の素数ｔ1，ｔ2，…，ｔjを選択し、Ｔ＝ｔ1＊ｔ2＊…＊ｔjを計算。
〔手順６〕乱数（整数）ｒを生成し、ｄ＝ｓ1＊ｓ2＊…＊si-2＊ｒを計算。
〔手順７〕一つ目の分岐先において実行する演算式を以下の通りとする。
ｄ＊＝ｓi-1＊ａ；  ｃ＝ａ＋（ｄ＊ｓi）％Ｓ＋２＊ｂ；
〔手順８〕ｄ’＝ｔ1＊ｔ2＊…＊ｔj-2−ｄを計算。
〔手順９〕二つ目の分岐先において実行する演算式を以下の通りとする。
ｄ＋＝ｄ’；  ｄ＊＝ｔj-1；  ｃ＝ａ＊（（ｄ＊ｔj）％Ｔ＋１）＋２＊ｂ；
【００２９】
図２には、上記の〔手順１〕〜〔手順９〕により難読化されたプログラムを例示してある。図２の例では、以下の設定を用いて難読化されている。
ｐ1＝１１，ｐ2＝７，ｐ3＝３，ｐ4＝４１，ｐ5＝１３，
ｉ＝３，ｓ1＝７（＝ｐ2），ｓ2＝３（＝ｐ3），ｓ3＝１１（＝ｐ1），
ｊ＝３，ｔ1＝４１（＝ｐ4），ｔ2＝１３（＝ｐ5），ｔ3＝７（＝ｐ2），
ｒ＝５，
Ｓ＝２３１（＝ｓ1＊ｓ2＊ｓ3），Ｔ＝３７３１（＝ｔ1＊ｔ2＊ｔ3）
【００３０】
この例では、関数ＯｂｆＦｕｎｃへの入力変数「ａ」の正負に依存して分岐が発生する。分岐先のコード群２１およびコード群２２は、元のプログラム中の演算式「ａ＝ａ＋２＊ｂ」に対応して加法群の零元を利用した難読化が施されて生成されたコード群である。
【００３１】
次に、上記の各手順（〔手順１〕〜〔手順９〕）によって難読化されたプログラム（図２）の実行結果は元のプログラム（図６）の実行結果に等しいことを説明する。
上記の〔手順７〕における二つ目の演算式内にある「ｄ＊ｓi」は、剰余環Ｚ／ＳＺ上の加法群の零元になっている。つまり、この値はＳの倍数になっており、Ｓで割った場合の余りは“０”となる。このため、二つ目の演算式「ｃ＝ａ＋（ｄ＊ｓi）％Ｓ＋２＊ｂ；」は「ｃ＝ａ＋２＊ｂ；」に等しく、これは元のプログラムにおける演算式と同じ演算結果になる。同様に、上記の〔手順９〕における三つ目の演算式内にある「ｄ＊ｔj」の値も剰余環Ｚ／ＴＺ上の加法群の零元であり、三つ目の演算式内にある「（ｄ＊ｔj）％Ｔ＋１」の値は“１”に等しい。したがって、〔手順９〕における三つ目の演算式「ｃ＝ａ＊（（ｄ＊ｔj）％Ｔ＋１）＋２＊ｂ；」もやはり「ｃ＝ａ＋２＊ｂ；」に等しく、元のプログラムにおける演算式と同じ演算結果になる。
【００３２】
つまり、上記の各手順に従って難読化されたプログラムは、入力変数の値により分岐先が変化するという特徴を持っている。また、分岐先において実行される演算式は、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を利用したものであり、コード内容は異なるが、その実行結果は元のプログラムと同様なものとなる。このため、どの分岐先が実行される場合でも、元のプログラムと同一の実行結果が保証される。そして、プログラムの入力変数に関連して処理フローが変化するため、上記の難読化プログラムは動的解析に対して安全性が高いものとなっている。更に、本手法では、各分岐先のコード部分にそれぞれ異なるダミーコード群を生成するため、攻撃者が処理フローを理解することが困難になる。
【００３３】
以上のように、本例のプログラム難読化装置Ｔでは、入力された難読化対象のプログラムに含まれる演算式部分について、その演算式に含まれる変数を条件式に用いた分岐を生成すると共に、有限群の任意の要素に対して当該有限群の位数回演算を施したものが単位元になる性質を利用して、難読化前と同じ演算結果となる複数のダミーコードを前記分岐に係る変数を使用して生成し、これら複数のダミーコードを前記分岐先のコード部分にそれぞれ含めたプログラムを生成して、これを難読化結果として出力する。
【００３４】
特に、本例では、加法群の任意の要素に対して当該加法群の位数回演算を施したものが零元になる性質を使用してダミーコードを生成している。つまり、分岐の条件式に用いた変数を用いた演算式であり且つその演算結果が常に“０”となる演算式（「（ｄ＊ｓi）％Ｓ」又は（ｄ＊ｔj）％Ｔ）を生成し、その演算結果を加算する演算を含む演算式を生成することにより、難読化対象に係る演算式部分を変換したコード群を生成している。このため、難読化されたプログラムは難読化前に比べて冗長であるものの、その実行結果は難読化前のものと同じになる。
【００３５】
なお、上述した〔手順１〕〜〔手順９〕による難読化手法は一例に過ぎず、これに限定するものではない。
例えば、本例では、入力変数「ａ」の正負に応じた分岐としているが、入力変数「ａ」が偶数又は奇数のいずれであるかに応じた分岐とする等、その分岐の条件を種々なものとすることができる。
また例えば、本例では、入力変数「ａ」に基づく分岐やダミーコードを生成しているが、入力変数「ｂ」に基づく分岐やダミーコードを生成するようにしてもよく、或いはプログラム中の内部変数に基づく分岐やダミーコードを生成するようにしてもよい。
また例えば、本例では、分岐の数を“２”に設定したが、これをより大きな数に設定するようにしてもよく、これにより難読化の効果を高めることができる。
また例えば、本例では、素数（ｐ1，…，ｐk）を用いてＳ，Ｔを計算しているが、素数に代えて、“０”以外の整数又は自然数を用いるようにしてもよい。
【００３６】
ここで、本例では、有限群として環Ｚ／ｎＺ上の加法群を使用したが、乗法群を用いても同様の効果を得ることができる。すなわち、例えば、（Ｚ／ｎＺ）*上の乗法群の単位元（つまり“１”）を用いるようにする。つまり、分岐の条件式に用いた変数を用いた演算式であり且つその演算結果が常に“１”となる演算式を生成し、その演算結果を乗算する演算を含む演算式を生成することにより、難読化対象に係る演算式部分を変換したコード群を生成する。また、有限体上に構成される楕円曲線上の加法群も同様に用いることができる。
【００３７】
図３には、本例のプログラム難読化装置Ｔの利用形態を例示してある。
本例のプログラム難読化装置Ｔは、一般的なプログラム開発者（図中のＡ）によって利用されることを想定している。
プログラム開発者Ａは、他の人物（本例では利用ユーザＢ）の利用に供されるプログラムの開発を完了すると、当該プログラムＰ１をプログラム難読化装置Ｔに対して入力として与える（ステップＳ１）。
プログラム難読化装置Ｔは、受け取ったプログラムＰ１に対して難読化を施し、その結果として生成される難読化プログラムＰ２を出力する（ステップＳ２）。このとき、プログラム難読化装置Ｔは、入力されたプログラムＰ１と難読化プログラムＰ２の機能および出力が変化しないように変換を行う。ただし、難読化プログラムＰ２にはダミーコードが追加されているので、元のプログラムＰ１よりも解析コストは大きくなる。
プログラム開発者Ａは、物理的に離れたところにいる利用ユーザＢに対し、難読化プログラムＰ２を渡す（ステップＳ３）。渡す手段としては、インターネット等の通信回線を介する方法、或いは、ＣＤ−ＲＯＭ等の外部記憶媒体にデータとして格納して渡す方法などがある。
【００３８】
図４には、難読化プログラムＰ２が利用ユーザＢに渡された時点での、プログラム開発者Ａ、利用ユーザＢ、ソフトウェア開発者Ａが作成したプログラム（元のプログラム）Ｐ１、難読化プログラムＰ２の関係を例示してある。
図４は、プログラム開発者Ａが元のプログラムＰ１と難読化プログラムＰ２を所持しており、利用ユーザＢが難読化プログラムＰ２のみを所持している状態を示している。プログラムＰ１と難読化プログラムＰ２の機能および出力は同じであり、利用ユーザＢは難読化プログラムＰ２により元のプログラムＰ１と同じ機能および出力を利用できる。更に、利用ユーザＢは元のプログラムＰ１を所持していないので、 プログラムＰ１の持つ機密情報（例えば、ライセンスに関する情報など）を得るためには、難読化プログラムＰ２を解析しなければならない。 プログラムＰ１の解析コストよりも難読化プログラムＰ２の解析コストの方が大きいため、元のプログラムＰ１をユーザに手渡す状況と比較すると、プログラム中の機密情報が流出する機会はより小さいものとなる。
【００３９】
図５には、本例に係るプログラム難読化装置Ｔとして動作するコンピュータの主要なハードウェアを例示してある。
本例では、各種演算処理を行うＣＰＵ４１、ＣＰＵ４１の作業領域となるＲＡＭ４２、基本的な制御プログラムを記録したＲＯＭ４３、本発明の一実施形態に係るプログラムや各種データを記憶する補助記憶装置（例えば、ＨＤＤ等の磁気ディスクや、フラッシュメモリ等の書き換え可能な不揮発性メモリなど）４４、各種情報を表示出力するための表示装置や操作者により入力操作に用いられるキーボードやマウス等の入力機器とのインターフェースである入出力Ｉ／Ｆ４５、他の装置との間で有線又は無線により通信を行うインターフェースである通信Ｉ／Ｆ４６、等のハードウェア資源を有するコンピュータにより構成されている。
そして、本発明の一実施形態に係るプログラムを補助記憶装置４４等から読み出してＲＡＭ４２に展開し、これをＣＰＵ４１により実行させることで、本発明の一実施形態に係るプログラム難読化装置Ｔをコンピュータ上に実現している。
【００４０】
なお、１台のコンピュータによりプログラム難読化装置Ｔを実現してもよく、各機能部を複数台のコンピュータに分散して設けてプログラム難読化装置Ｔを実現してもよい。
また、本発明の一実施形態に係るプログラムは、例えば、当該プログラムを記憶したＣＤ−ＲＯＭ等の外部記憶媒体から読み込む形式や、通信回線等を介して受信する形式などにより、本例に係るコンピュータに設定される。
また、本例のようなソフトウェア構成により各機能部を実現する態様に限られず、それぞれの機能部を専用のハードウエアモジュールで実現するようにしてもよい。
【符号の説明】
【００４１】
Ｔ：プログラム難読化装置、  １１：難読化規則記憶部、  １２：解析処理部、  １３：難読化処理部、  Ｐ１：元プログラム、  Ｐ２：難読化プログラム
【図１】
2011018119.tif 000003
【図２】
2011018119.tif 000004
【図３】
2011018119.tif 000005
【図４】
2011018119.tif 000006
【図５】
2011018119.tif 000007
【図６】
2011018119.tif 000008
【図７】
2011018119.tif 000009