(57)【要約】  プログラムの難読化を十分に評価し得る難読化評価方法を提供する。この難読化評価方法は、プログラムたるオリジナルコードモジュール（２００）が難読化されて生成された難読化済みコードモジュール（２０４）を実行して、実行状態をロギングすることによりトレース出力ファイル（２１８）を生成するステップ（Ｓ４２４）と、トレース出力ファイル（２１８）を評価することにより、難読化済みコードモジュール（２０４）における難読化の程度を特定するステップ（Ｓ４２８）とを含む。
2009514060.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの難読化を評価する方法であって、
プログラムたるオリジナルコードが難読化されて生成された難読化コードを実行する第１の実行ステップと、
前記第１の実行ステップによる実行状態をロギングすることにより第１のロギングデータを生成する第１のロギングステップと、
前記第１のロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと
を含むことを特徴とする難読化評価方法。
【請求項２】
前記評価ステップでは、第１のロギングデータに基づいて、難読化の程度の指標となる数値をメトリクスとして算出する
ことを特徴とする請求項１記載の難読化評価方法。
【請求項３】
前記難読化評価方法は、さらに、
前記オリジナルコードを実行する第２の実行ステップと、
前記第２の実行ステップによる実行状態をロギングすることにより第２のロギングデータを生成する第２のロギングステップとを含み、
前記評価ステップでは、前記第１のロギングデータを前記第２のロギングデータと比較して評価する
ことを特徴とする請求項２記載の難読化評価方法。
【請求項４】
前記難読化コードは、前記オリジナルコードに含まれる基本ブロックごとに当該基本ブロックが難読化されて構成されており、
前記評価ステップでは、前記オリジナルコードと難読化コードとの間での基本ブロックの対応関係を示すブロックマッピング情報を用い、互いに対応する基本ブロックごとに、前記第１のロギングデータを評価する
ことを特徴とする請求項３記載の難読化評価方法。
【請求項５】
前記評価ステップでは、前記第１のロギングデータにより示される実行されたパスの数と、前記第２のロギングデータにより示される実行されたパスの数とを比較し、前記比較結果を前記メトリクスとして算出する
ことを特徴とする請求項４記載の難読化評価方法。
【請求項６】
前記評価ステップでは、前記第１のロギングデータにより示される実行されたパスの数と、前記第２のロギングデータにより示される実行されたパスの数との比率を、前記メトリクスとして算出する
ことを特徴とする請求項５記載の難読化評価方法。
【請求項７】
前記評価ステップでは、前記第１のロギングデータにより示されるパスカバレッジの、前記第２のロギングデータにより示されるパスカバレッジからの変化を、前記メトリクスとして算出する
ことを特徴とする請求項４記載の難読化評価方法。
【請求項８】
前記評価ステップでは、前記第１のロギングデータにより示されるパスカバレッジと、前記第２のロギングデータにより示されるパスカバレッジとの比率を、前記メトリクスとして算出する
ことを特徴とする請求項７記載の難読化評価方法。
【請求項９】
前記評価ステップでは、前記第１および第２のロギングデータの類似性を前記メトリクスとして算出する
ことを特徴とする請求項４記載の難読化評価方法。
【請求項１０】
前記評価ステップでは、前記第１および第２のロギングデータの類似性をレーベンシュタイン距離で表す
ことを特徴とする請求項９記載の難読化評価方法。
【請求項１１】
前記評価ステップでは、前記第１のロギングデータに基づいて、パスカバレッジ内において実行されたパスの頻度分布を前記メトリクスとして算出する
ことを特徴とする請求項３記載の難読化評価方法。
【請求項１２】
前記評価ステップでは、前記パスカバレッジ内の等分布性検定のカイ２乗値を前記メトリクスとして算出する
ことを特徴とする請求項１１記載の難読化評価方法。
【請求項１３】
前記評価ステップでは、前記パスカバレッジ内のポーカー検定のカイ２乗値を前記メトリクスとして算出する
ことを特徴とする請求項１１記載の難読化評価方法。
【請求項１４】
前記難読化評価方法は、さらに、
前記難読化コードと異なる方法で前記オリジナルコードが難読化されて生成された他の難読化コードを実行する第３の実行ステップと、
前記第３の実行ステップによる実行状態をロギングすることにより第３のロギングデータを生成する第３のロギングステップとを含み、
前記評価ステップでは、前記第１のロギングデータを前記第３のロギングデータと比較して評価する
ことを特徴とする請求項２記載の難読化評価方法。
【請求項１５】
プログラムの難読化を行う方法であって、
プログラムたるオリジナルコードを難読化することにより難読化コードを生成する難読化ステップと、
前記難読化ステップで生成された難読化コードを実行する第１の実行ステップと、
前記第１の実行ステップによる実行状態をロギングすることにより第１のロギングデータを生成する第１のロギングステップと、
前記第１のロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと、
前記評価ステップにおける評価結果に基づいて、前記オリジナルコードを再び難読化する再難読化ステップと
を含むことを特徴とする難読化方法。
【請求項１６】
前記難読化方法は、さらに、
前記オリジナルコードを実行する第２の実行ステップと、
前記第２の実行ステップによる実行状態をロギングすることにより第２のロギングデータを生成する第２のロギングステップとを含み、
前記評価ステップでは、
前記第１のロギングデータを前記第２のロギングデータと比較して評価する
ことを特徴とする請求項１５記載の難読化方法。
【請求項１７】
前記難読化ステップでは、
前記オリジナルコードに含まれる基本ブロックごとに難読化を行い、前記オリジナルコードと難読化コードとの間での基本ブロックの対応関係を示すブロックマッピング情報を生成し、
前記評価ステップでは、
前記ブロックマッピング情報を用い、互いに対応する基本ブロックごとに、前記第１のロギングデータを評価する
ことを特徴とする請求項１６記載の難読化方法。
【請求項１８】
前記再難読化ステップでは、
前記評価ステップにおける評価結果に基づいて、前記オリジナルコードのブロックを選択し、選択されたブロックを再び難読化する
ことを特徴とする請求項１７記載の難読化方法。
【請求項１９】
前記難読化ステップでは、
難読化のためのパラメータを含む制御情報を用い、前記パラメータにしたがって前記オリジナルコードの難読化を行う
ことを特徴とする請求項１５記載の難読化方法。
【請求項２０】
前記評価ステップでは、
前記第１のロギングデータの評価結果を示す評価結果データを、前記再難読化ステップにおいて読み取り可能なフォーマットで生成する
ことを特徴とする請求項１５記載の難読化方法。
【請求項２１】
前記評価ステップでは、
前記第１のロギングデータの評価結果を示す評価結果データを生成し、前記評価結果データのフォーマットを、前記再難読化ステップにおいて読み取り可能なフォーマットに変換する
ことを特徴とする請求項１５記載の難読化方法。
【請求項２２】
前記評価ステップでは、
第１のロギングデータに基づいて、難読化の程度の指標となる数値をメトリクスとして算出する
ことを特徴とする請求項１５記載の難読化方法。
【請求項２３】
前記難読化方法は、さらに、
前記評価ステップで算出されたメトリクスが許容範囲に収まるか否かを判別するメトリクス判別ステップを含み、
前記メトリクス判別ステップで許容範囲に収まらないと判別されるごとに、
前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行うことで新たな難読化コードを生成し、前記新たな難読化コードを処理対象にして、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップ、および前記メトリクス判別ステップが繰り返し実行され、
前記メトリクス判別ステップで許容範囲に収まると判別されたときには、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行わない
ことを特徴とする請求項２２記載の難読化方法。
【請求項２４】
前記評価ステップでは、
前記第１のロギングデータに基づいて、難読化の程度の指標となる複数種の数値の平均値を、前記メトリクスとして算出する
ことを特徴とする請求項２３記載の難読化方法。
【請求項２５】
前記評価ステップでは、
前記第１のロギングデータに基づいて、難読化の程度の指標となる複数種の数値に対して重み付けを行い、重み付けられた複数種の数値の平均値を、前記メトリクスとして算出する
ことを特徴とする請求項２３記載の難読化方法。
【請求項２６】
前記難読化方法は、さらに、
前記オリジナルコードに対して行われた難読化の回数が、予め定められた設定回数に達したか否かを判別する回数判別ステップを含み、
前記回数判別ステップで設定回数に達していないと判別されるごとに、
前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行うことで新たな難読化コードを生成し、前記新たな難読化コードを処理対象として、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップ、および前記回数判別ステップが繰り返し実行され、
前記回数判別ステップで設定回数に達していると判別されたときには、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行わない
ことを特徴とする請求項１５記載の難読化方法。
【請求項２７】
前記難読化方法は、さらに、
前記オリジナルコードに対する難読化に要した処理時間が、予め定められた設定時間に達したか否かを判別する時間判別ステップを含み、
前記時間判別ステップで設定時間に達していないと判別されるごとに、
前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行うことで新たな難読化コードを生成し、前記新たな難読化コードを処理対象として、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップ、および前記時間判別ステップが繰り返し実行され、
前記時間判別ステップで設定時間に達していると判別されたときには、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行わない
ことを特徴とする請求項１５記載の難読化方法。
【請求項２８】
前記再難読化ステップにおける再度の難読化によって生成された新たな難読化コードを処理対象として、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップが繰り返し実行され、
前記難読化方法は、さらに、
直前の評価ステップにおいて特定された難読化の程度と、前記直前よりも前の評価ステップにおいて特定された難読化の程度とを比較し、比較結果に応じて、前記再難読化ステップ以降のステップを繰り返し実行させる継続ステップを含む
ことを特徴とする請求項１５記載の難読化方法。
【請求項２９】
プログラムの難読化を評価する難読化評価装置であって、
プログラムたるオリジナルコードが難読化されて生成された難読化コードを実行する実行手段と、
前記実行手段による実行状態をロギングすることによりロギングデータを生成するロギング手段と、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価手段と
を備えることを特徴とする難読化評価装置。
【請求項３０】
プログラムの難読化を行う難読化装置であって、
プログラムたるオリジナルコードを難読化することにより難読化コードを生成する難読化手段と、
前記難読化手段で生成された難読化コードを実行する実行手段と、
前記実行手段による実行状態をロギングすることによりロギングデータを生成するロギング手段と、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価手段と、
前記評価手段における評価結果に基づいて、前記オリジナルコードを再び難読化する再難読化手段と
を備えることを特徴とする難読化装置。
【請求項３１】
プログラムの難読化を評価するための難読化評価プログラムであって、
プログラムたるオリジナルコードが難読化されて生成された難読化コードを実行する実行ステップと、
前記実行ステップによる実行状態をロギングすることによりロギングデータを生成するロギングステップと、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと
をコンピュータに実行させることを特徴とする難読化評価プログラム。
【請求項３２】
プログラムの難読化を行うための難読化プログラムであって、
プログラムたるオリジナルコードを難読化することにより難読化コードを生成する難読化ステップと、
前記難読化ステップで生成された難読化コードを実行する実行ステップと、
前記実行ステップによる実行状態をロギングすることによりロギングデータを生成するロギングステップと、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと、
前記評価ステップにおける評価結果に基づいて、前記オリジナルコードを再び難読化する再難読化ステップと
をコンピュータに実行させることを特徴とする難読化プログラム。
【請求項３３】
プログラムの難読化を評価するための難読化評価プログラムを記憶している記憶媒体であって、
前記難読化評価プログラムは、
プログラムたるオリジナルコードが難読化されて生成された難読化コードを実行する実行ステップと、
前記実行ステップによる実行状態をロギングすることによりロギングデータを生成するロギングステップと、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと
をコンピュータに実行させることを特徴とする記憶媒体。
【請求項３４】
プログラムの難読化を行うための難読化プログラムを記憶している記憶媒体であって、
前記難読化プログラムは、
プログラムたるオリジナルコードを難読化することにより難読化コードを生成する難読化ステップと、
前記難読化ステップで生成された難読化コードを実行する実行ステップと、
前記実行ステップによる実行状態をロギングすることによりロギングデータを生成するロギングステップと、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと、
前記評価ステップにおける評価結果に基づいて、前記オリジナルコードを再び難読化する再難読化ステップと
をコンピュータに実行させることを特徴とする記憶媒体。
【請求項３５】
プログラムの難読化を評価する集積回路であって、
プログラムたるオリジナルコードが難読化されて生成された難読化コードを実行する実行手段と、
前記実行手段による実行状態をロギングすることによりロギングデータを生成するロギング手段と、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価手段と
を備えることを特徴とする集積回路。
【請求項３６】
プログラムの難読化を行う集積回路であって、
プログラムたるオリジナルコードを難読化することにより難読化コードを生成する難読化手段と、
前記難読化手段で生成された難読化コードを実行する実行手段と、
前記実行手段による実行状態をロギングすることによりロギングデータを生成するロギング手段と、
前記ロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価手段と、
前記評価手段における評価結果に基づいて、前記オリジナルコードを再び難読化する再難読化手段と
を備えることを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムに対して行われた難読化の評価方法およびプログラムを難読化する方法に関する。
【背景技術】
【０００２】
ソフトウェアアプリケーション（以下、単にアプリケーションという）は、開発者の事業計画に従ってアプリケーションが確実に導入および使用できるようにする上で不可欠な特定の特徴を備えていることが多い。例えば、ソフトウェアのライセンシング方式を実施しようとしてドングルのような装置が長年にわたって使用されてきたが、最近では、音楽、映像、書かれた文章といったデジタルコンテンツが、コンテンツのライセンシング方式に従って確実に消費者によって体験されるようにするために、ソフトウェアベースのＤＲＭ（デジタル著作権管理）方式が用いられている。こういった特徴を実施するアルゴリズムが、ハッカーの攻撃に対して確実に強固に機能するように、数多くのコード難読化方法、基本的にコードを理解しにくくかつ変更しにくいよう書き変えることが提案され、その多くは商品化されている。
【０００３】
現在使用されている難読化方法の設計の背景には、程度の異なる様々な理論的根拠がある。しかし残念なことに、たとえ机上では立派な理論的解析であったとしても、現実の世界に当てはめると実際の効果が欠けているかもしれない。たとえアプリケーションが正確でも、難読化をソースコードやオブジェクトコードに適用する際の静的性質により、現実の条件下で実行したときの難読化の効果は予測できない可能性がある。最終的に、開発者が難読化の理論またはアプリケーションの不備をうまく検出したとしても、その問題を正すのは容易ではないだろう。Java（登録商標）バイトコードがAddTracerのようなプログラムによってトレースできるような世界、あるいはBochsのようなフリープログラムやVMware（登録商標）のような商業用ソリューションを使ってバーチャルなインサーキットエミュレータ内でマシンコードが実行されるような世界では、動的解析ベースのリバースエンジニアリングによるコードへの脅威は着実に高まりつつある。
【０００４】
制御フロー再構築のためのChow他による米国特許No. 6,594,761およびNo. 6,779,114、またはCollberg他による米国特許No. 6,668,325に開示されたような従来の難読化方法には、必要な難読化の程度を選択するための大まかなパラメータ以外に品質制御方法がほとんどまたは全く含まれていない。すなわち、開発者は変換プロセスが信頼性のあるものであったことを信じなくてはならない、あるいはその結果としての難読化済みモジュールをまるごと測定し、それが所望の性能またはその他の要件を満たすものであるかどうか評価しなくてはならない。しかし、米国特許No. 6,668,325はこの問題に取り組もうとしてはいるものの、ホットスポット（最適化が望まれる部分）のようなものを識別できるようオリジナルコードをプロファイルすることによって、難読化プロセスを難読化前コードモジュールの重要な領域に導くという限られた方法によるものである。しかしながら、適用される難読化の強度は、最終的な出力コードとの関係によってではなく、予め決められた経験的方法により評価されているだけであり、基準として使われているのは理論上の強度にすぎない。
【０００５】
開発者が、所望しているほど難読化がうまくいきそうにないことを検知しようとしても、発見された弱点を考慮して難読化を繰り返す簡単または自動的な方法はない。開発者はパラメータを微調整して何かよい結果が得られるよう期待するしかない。このような手動的な調整方法では、開発者は難読化プロセスを目標に向かって非常におおざっぱに導くことしかできないため、非常に時間がかかる可能性があり、変換がうまくいかなかった場合
に有効な難読化をも廃棄してしまうことも多い。
【０００６】
例えば、以下に示す文献には、難読化に関する従来の技術および本発明で用いる基礎技術が開示されている。
【非特許文献１】Advanced Compiler Design & Implementation; Steven S Muchnick; Academic Press c 1997; ISBN 1-55860-320-4」
【非特許文献２】Cloakware/Transcoder（登録商標） The core of Cloakware Code Protection（登録商標）; Cloakware product overview advertising material; data unknown
【非特許文献３】AddTracer:http://se.aist-nara.ac.jp/addtracer/
【非特許文献４】Bochs: http://bochs.sourceforge.net
【非特許文献５】VMware（登録商標）: http://www.vmware.com/
【非特許文献６】Javaプログラミングの動的解析のためのトレーサ埋め込みツールInjecting Tracers into Java Class Files for Dynamic Analysis; 玉田春昭、門田暁人、中村匡秀、松本健一; 第４６回プログラミング・シンポジウム報告集/Proc. 46th Programming Symposium, pp.51--62, Jan 2005
【非特許文献７】Efficient path profiling; T. Ball and J. R. Larus; Proc. Of Micro 96, pages 46--57, Dec. 1996.
【非特許文献８】The Art of Computer Programming Volume 2 / Seminumerical Algorithms;Donald Knuth; Addison-Wesley c 1969; ISBN 0-201-03822-6
【非特許文献９】Binary codes capable of correcting spurious insertions and deletions of ones(original in Russian); LEVENSHTEIN, V. I.; Russian Problemy Peredachi Informatsii 1 (January 1965), 12-25.
【特許文献１】米国特許第6,594,761 B1 7/2003 Chow et al.
【特許文献２】米国特許第6,668,325 B1 12/2003 Collberg et al.
【特許文献３】米国特許第6,779,114 B1 8/2004 Chow et al.
【発明の開示】
【発明が解決しようとする課題】
【０００７】
図１は、Tamada他による論文 "Injecting Tracers into Java Class Files for Dynamic Analysis" に記載された先行技術の難読化方法を説明するための説明図である。オリジナルコードモジュール１００は、ロギングライブラリ１０２とリンクされてプログラム（オリジナルコードモジュール１００）の動作の様子を記録するトレース出力ファイル１０４を生成する。同様に、難読化装置１０６による処理の後、難読化済みコードモジュール１０８はロギングライブラリ１１０とリンクされて難読化済みプログラム（難読化済みコードモジュール１０８）の動作の様子を記録するトレース出力ファイル１１２を生成する。このようなトレース出力ファイル１１２は、リバースエンジニアリングの目的で利用される。
【０００８】
図２は、Collbergによる米国特許No. 6,668,325に示された先行技術の難読化方法を説明するための説明図である。ここで、オリジナルコードモジュール１５０は、（特にプロファイリング用の）ロギングライブラリ１５２とリンクされてプログラム（オリジナルコードモジュール１５０）の動作の様子を記録するトレース出力ファイル１５４を生成する。このトレース出力ファイル１５４は、よりよい難読化済みコードモジュール１５８を作成するために難読化装置１５６の難読化プロセスにフィードインする。
【０００９】
しかし、本先行技術は実際の変換の質を解析するために難読化済みコードモジュール１５８を解析しようとするものではなく、明記されているメトリクスは変換の複雑さの理論的評価だけである。よって先行技術のいずれの目的にも重大な弱点がある。
【００１０】
図３は、Cloakwareに記載の難読化方法を表すフローチャートである。ここで、難読化方法は（Ｓ３００）から始まり、パラメータの選択（Ｓ３０２）へ進む。これらのパラメータはオリジナルコードモジュールの難読化（Ｓ３０４）に用いられる。性能の評価（Ｓ３０６）は、主に難読化済みコードモジュール全体としてのありのままのサイズと性能に基づく大まかな経験的プロセスである。十分に良好でない場合（Ｓ３０８の「いいえ」）は、「より良い」パラメータの選択（Ｓ３１２）によって、難読化（Ｓ３０４）プロセスのために別の値のセットが選択され（例えば、難読化済みコードモジュールが大きすぎる場合は、より小さいサイズが選択される）、ループは続く。十分に良好であれば（Ｓ３０８の「はい」）、プロセスは（Ｓ３１０）で終了する。
【００１１】
しかし、本先行技術は、よりよいパラメータを選択するための詳細な手段を全く示唆しておらず、次の難読化（Ｓ３０４）プロセスの反復は最初からスタートし、有効な難読化も有効でない難読化も破棄してしまう。これを「ブラックボックス難読化プロセス」といい、難読化プロセスのメカニズムが当該システムの他の要素から隠されている。逆に、本発明が提案する「ホワイトボックス難読化プロセス」においては、難読化プロセスの特定の内容が調整用に公開され利用可能となるため、優れた結果が得られる。
【００１２】
図４は、図２に示す難読化方法を表すフローチャートである。ここで、難読化方法は（Ｓ３５０）からスタートし、玉田他の文献にもかなり示唆されているロギングライブラリを伴うオリジナルコードモジュールのコンパイル（Ｓ３５２）へ進む。データセットを用いたプログラム（オリジナルコードモジュール）の実行（Ｓ３５６）は、データセット３５４を用いて、オリジナルコードモジュールの性能を記載したトレース出力ファイル１５４を生成する。スペースや性能等の難読化限度の設定（Ｓ３６０）では、コードが十分に難読化された時点を決定するメトリクスを指定する。しかし、これらのメトリクスはありのままのコードサイズ基準か、特定の難読化技術の理論上の複雑さの基準のいずれかである。
【００１３】
次に難読化対象部分の選択（Ｓ３６２）では、オリジナルコードのどの部分、すなわち基本ブロックかモジュールかその他の再分割された部分を、次に難読化すべきか、およびどのように難読化すべきかを、オリジナルコードモジュールのどの部分が重要かについてのトレース出力ファイル１５４からのヒントを含む様々な経験的方法に基づいて選択する。部分の難読化（Ｓ３６４）では、選択された部分に対して必要な変換を行い、十分に難読化されたか（Ｓ３６６）では、（Ｓ３６０）で設定された難読化メトリクス限度を検定して、反復を（Ｓ３６８）で終了すべきか、他の部分を選択して難読化（Ｓ３６２）するためループバックすべきかを判断する。しかし、本先行技術は出力された難読化済みコードモジュール（図２に示す難読化済みコードモジュール１５８）を検定する手段を全く示唆しておらず、実データセットを用いた難読化済みコードモジュール１５８の実際の性能を測定するといった課題については何の対処もしていない。
【００１４】
このように上記従来の難読化評価方法では、難読化済みコードモジュールをベースに難読化を評価している。また、上記従来の難読化方法では、理論的な難読化手法に従ってオリジナルコードモジュールを難読化したり、静的な目標値（コードサイズなど）に基づいてオリジナルコードモジュールを難読化する。
【００１５】
しかしながら、上記従来の難読化評価方法では、難読化済みコードモジュールだけに基づいて難読化の評価が静的に行われているため、その評価が不十分であるという問題がある。
【００１６】
また、上記従来の難読化方法では、動的には十分難読化が行われず、つまり十分な難読化が行われず、難読化済みコードモジュールがハッカーの攻撃に対して脆弱となってしま
うという問題がある。
【００１７】
そこで本発明は、かかる問題に鑑みてなされたものであって、難読化を十分に評価して、ハッカーなどによるプログラムの解読を確実に防ぐことが可能な難読化評価方法および難読化方法を提供することを目的とする。
【課題を解決するための手段】
【００１８】
上記目的を達成するために、本発明の難読化評価方法は、プログラムの難読化を評価する方法であって、プログラムたるオリジナルコードが難読化されて生成された難読化コードを実行する第１の実行ステップと、前記第１の実行ステップによる実行状態をロギングすることにより第１のロギングデータを生成する第１のロギングステップと、前記第１のロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップとを含むことを特徴とする。例えば、前記評価ステップでは、第１のロギングデータに基づいて、難読化の程度の指標となる数値をメトリクスとして算出する。
【００１９】
これにより、難読化コードが実行された結果に基づいて、つまり動的解析結果に基づいて難読化の程度が特定されるため、難読化を十分に評価することができる。
【００２０】
また、前記難読化評価方法は、さらに、前記オリジナルコードを実行する第２の実行ステップと、前記第２の実行ステップによる実行状態をロギングすることにより第２のロギングデータを生成する第２のロギングステップとを含み、前記評価ステップでは、前記第１のロギングデータを前記第２のロギングデータと比較して評価することを特徴としてもよい。例えば、前記評価ステップでは、前記第１のロギングデータにより示される実行されたパスの数と、前記第２のロギングデータにより示される実行されたパスの数との比率を、前記メトリクスとして算出する。または、前記評価ステップでは、前記第１および第２のロギングデータの類似性をレーベンシュタイン距離で表す。
【００２１】
これにより、オリジナルコードの実行状態と比較して難読化の程度が特定されるため、難読化をより十分に評価することができる。
【００２２】
また、前記評価ステップでは、前記第１のロギングデータに基づいて、パスカバレッジ内において実行されたパスの頻度分布を前記メトリクスとして算出することを特徴としてもよい。例えば、前記評価ステップでは、前記パスカバレッジ内の等分布性検定のカイ２乗値を前記メトリクスとして算出する。または、前記評価ステップでは、前記パスカバレッジ内のポーカー検定のカイ２乗値を前記メトリクスとして算出する。
【００２３】
これにより、パスカバレッジの分布の観点から難読化を十分に評価することができる。
【００２４】
さらに、本発明の難読化方法は、プログラムの難読化を行う方法であって、プログラムたるオリジナルコードを難読化することにより難読化コードを生成する難読化ステップと、前記難読化ステップで生成された難読化コードを実行する第１の実行ステップと、前記第１の実行ステップによる実行状態をロギングすることにより第１のロギングデータを生成する第１のロギングステップと、前記第１のロギングデータを評価することにより、前記難読化コードにおける難読化の程度を特定する評価ステップと、前記評価ステップにおける評価結果に基づいて、前記オリジナルコードを再び難読化する再難読化ステップとを含むことを特徴とする。例えば、前記評価ステップでは、第１のロギングデータに基づいて、難読化の程度の指標となる数値をメトリクスとして算出する。
【００２５】
これにより、難読化コードが実行された結果に基づいて、つまり動的解析結果に基づいて難読化の程度が特定されるため、難読化を十分に評価することができる。さらに、その
評価結果に基づいてオリジナルコードが再び難読化されることによって、つまり動的解析に基づくフィードバックを行うことによって、難読化の質を高めることができる。その結果、ハッカーなどによるプログラムの解読を確実に防ぐことができる。
【００２６】
また、前記難読化方法は、さらに、前記オリジナルコードを実行する第２の実行ステップと、前記第２の実行ステップによる実行状態をロギングすることにより第２のロギングデータを生成する第２のロギングステップとを含み、前記評価ステップでは、前記第１のロギングデータを前記第２のロギングデータと比較して評価することを特徴としてもよい。
【００２７】
これにより、オリジナルコードの実行状態と比較して難読化の程度が特定されるため、難読化をより十分に評価することができる。その結果、難読化の質をさらに高めることができる。
【００２８】
また、前記難読化方法は、さらに、前記評価ステップで算出されたメトリクスが許容範囲に収まるか否かを判別するメトリクス判別ステップを含み、前記メトリクス判別ステップで許容範囲に収まらないと判別されるごとに、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行うことで新たな難読化コードを生成し、前記新たな難読化コードを処理対象にして、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップ、および前記メトリクス判別ステップが繰り返し実行され、前記メトリクス判別ステップで許容範囲に収まると判別されたときには、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行わないことを特徴としてもよい。
【００２９】
これにより、メトリクスが許容範囲に収まるまで、実行状態に基づくオリジナルコードの難読化が繰り返して行われるため、難読化の質を確実に高めることができる。
【００３０】
また、前記難読化方法は、さらに、前記オリジナルコードに対して行われた難読化の回数が、予め定められた設定回数に達したか否かを判別する回数判別ステップを含み、前記回数判別ステップで設定回数に達していないと判別されるごとに、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行うことで新たな難読化コードを生成し、前記新たな難読化コードを処理対象として、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップ、および前記回数判別ステップが繰り返し実行され、前記回数判別ステップで設定回数に達していると判別されたときには、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行わないことを特徴としてもよい。または、前記難読化方法は、さらに、前記オリジナルコードに対する難読化に要した処理時間が、予め定められた設定時間に達したか否かを判別する時間判別ステップを含み、前記時間判別ステップで設定時間に達していないと判別されるごとに、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行うことで新たな難読化コードを生成し、前記新たな難読化コードを処理対象として、前記第１の実行ステップ、前記第１のロギングステップ、前記評価ステップ、および前記時間判別ステップが繰り返し実行され、前記時間判別ステップで設定時間に達していると判別されたときには、前記再難読化ステップでは、前記オリジナルコードに対する再度の難読化を行わないことを特徴としてもよい。
【００３１】
これにより、設定回数や設定時間内で、実行状態に基づくオリジナルコードの難読化が繰り返して行われるため、難読化の質を確実に高めることができる。さらに、繰り返して生成された難読化コードの中から、最も難読化の質の高いコードを選択することができる。
【００３２】
また、前記難読化ステップおよび前記再難読化ステップの少なくとも一方では、前記オ
リジナルコードの一部を選択的に難読化することを特徴としてもよい。
【００３３】
これにより、オリジナルコードの重要な部分に対して、高い質の難読化を行うことができる。
【００３４】
このように、本発明では、従来の課題に関して、実際に難読化変換がどれくらい有効であったかを定量化することができる。
【００３５】
さらに、そういった定量化を採用し、それを使って難読化プロセスにフィードバックすることによって、同じオリジナルコードモジュールの前回の難読化を評価した際に検知した問題があればそれを反映して調整したパラメータを使って、難読化変換を再度適用できる。
【００３６】
背景技術は、難読化済みコードの観察された実行パスに関して、難読化の質を定量化しようとする方法を全く示唆していない。さらに、難読化プロセスへのフィードバックのアイデアは、背景技術に開示されていない。
【００３７】
難読化の質はメトリクスによって測定され、これらメトリクスを個別に審査することによって、またはこれらメトリクスと難読化前のプログラムの対応するメトリクスとを比較することによって、難読化変換の有効性を観測することができる。
【００３８】
メトリクス解析を行うための第一の手段は、制御フローグラフを通る実行パスを調査することである。制御フローグラフはコード構成の一般的な表現であり、例えば、Steven S. Muchnick著“Advanced Compiler Design and Implementation”の第７章など、多くの一般的参考書に詳細に説明されている。
【００３９】
難読化プロセスへのフィードバックとは、前回の難読化プロセスの実行性能に基づき、静的な入力パラメータセットだけでなく第二の動的な入力セットも使って、実行を何回か行うよう設計した難読化プロセスを行うことを意味する。したがって、前回の難読化から算出したメトリクスに基づいて、難読化の特定の側面を調整するよう難読化プロセスを導くことができる。調整プロセスには以下を含むが、それに限定されない。すなわち、セキュリティを高めるためモジュールの一部についてより重度な難読化を行う、性能を高めるためモジュールの一部についてより軽度な難読化を行う、多様性を高めるためモジュールの一部について別の難読化方法を行う。
【００４０】
したがって、以下のようなシステムおよび方法にはまだ対処されていないニーズがあり、そのようなシステムや方法があれば大いに有用であろう。すなわち、難読化、特に、ダミーコード（つまり決して実行されないコード）、フェイクロバストダミーコード（決して実行されないが、それでもなお有効に見えるコード）および別の難読化を施されたアクティブコードのクローンを含む、さらに複雑な制御フローを実施する難読化済みコードにオリジナルコードを置き換える制御フローグラフ難読化の質を評価し、さらに難読化プロセスにこの評価結果をフィードバックして、難読化プロセスがより適切な結果を生むことができるようにするシステムおよび方法である。このようなフィードバックシステムの設計は、そのシステムが適切な既存または新しい難読化技術に適用できるように一般的な態様で行わなくてはならない。
【００４１】
本発明では、変換プロセスの評価は、実行トレース機能を用いて適切にオリジナルコードおよび難読化済みコードを実行することにより行われ、変換前後の制御フローの詳細なログを生成する。
【００４２】
また本発明では、オリジナルコードにはロギングステートメントが挿入され、制御グラフを通してプログラムフローが記録できるようにする。
【００４３】
また本発明では、難読化プロセスは、オリジナルロギングステートメントに示された基本ブロックから、難読化済みコード中の新しい基本ブロックへのマッピングの生成も行い、難読化済みコードの実行トレーシングロギングステートメントがオリジナルコードのログと相互参照できるようにする。
【００４４】
また本発明では、解析ツールにおいて２つのコードモジュールおよびそれらモジュールそれぞれの出力ログを用いて、これら出力ログ間の類似点と相違点とを解析して難読化の質をレポートする。
【００４５】
また本発明では、難読化の質に関するレポートは、難読化プロセスへの別の入力として難読化プロセスの調整に用いられ、前回の変換において認められた弱点に対処する。
【００４６】
なお、本発明は、上記難読化評価方法や難読化方法だけでなく、それらの方法を用いて評価または難読化を行う難読化評価装置や難読化装置、集積回路、それらの方法を用いた評価または難読化をコンピュータに実行させるプログラム、およびそのプログラムを格納する記憶媒体としても実現することができる。
【発明を実施するための最良の形態】
【００４７】
まず、本発明の実施の形態を説明するために用いる用語について説明する。これ以降、以下の語は、特に明記しない限り次の意味を持つ。
【００４８】
「メトリクス」という語は、調査したコードがある評価基準をどの程度満たしているかを表す値を意味する。例えば、ソースコードを測定するための一般的なメトリクスは、関数ごとの行数である。数だけ取り上げてもあまり意味はないが、ふたつの関数を比較したとき、評価基準が低ければ低いほどメンテナンスのし易さという観点でのメトリクスはよくなるだろう。
【００４９】
「基本ブロック」という語は、オリジナルモジュール中のコードの行に対応する、ひとつもしくは複数の実行可能なステートメントの集まりを意味する。本好適な実施の形態において、各基本ブロックは、例えば Aho, Sethi および Ullman がその著書“Compilers:Principles, Techniques and Tools International Edition 第9.4章、528ページ”の中で定義しているように、１つの基本ブロックを表しているが、必要に応じてさらにキメの大きなまたは小さなブロックを使ったり、コードの行のグループ分けをばらばらにしてもよい。
【００５０】
「難読化」または「難読化変換」という語は、例えば複雑さを高めることによってコードのオリジナルの意図を隠すためにプログラムコードを変換することを意味する。難読化は、変換済みコードの複雑さ等を理解するために、難読化済みコードのメトリクスまたはオリジナルおよび難読化済みプログラム両方のメトリクスを解析することによって測定される。
【００５１】
「基本ブロック変換」という語は、オリジナルコードモジュールにおける１つもしくは複数の基本ブロックが、難読化装置によってどのように難読化済みコードモジュールにおける１つまたは複数の基本ブロックに変換されたかを意味する。
【００５２】
「対応する基本ブロック」という語は、一部前述の定義に従う。すなわち、この用語の１つの使用例としては、オリジナルモジュールにおける１つまたは複数の基本ブロックと
、難読化済みモジュールにおける対応する難読化済みブロックの説明である。この用語の別の使用例としては、オリジナルコードにおいて同一の対応する基本ブロックを有する難読化済みモジュールにおける１つまたは複数の基本ブロック２セットの説明に用いられる。この２セットは、共通の１つまたは複数の基本ブロックを有してもよいが、同一のセットであってはならない。すなわち、この２つのセットは、コードの同じオリジナルセグメントの２つの代替可能な難読化変換を表している。
【００５３】
「ブラックボックス難読化変換」という語は、変換プロセス全体の基本制御だけを有する難読化変換を意味し、前回の難読化変換に関する情報を入力する能力については明確に除外される。
【００５４】
「ホワイトボックス難読化変換」という語は、変換プロセス全体の詳細な制御を有する難読化変換を意味し、基本ブロックレベルでの前回の難読化変換に関する情報を入力する能力を明確に含む。
【００５５】
「フェイクロバスト」という語は、真に有効なコードのように見えるが小さなエラーを含む変換結果を意味する。すなわち、この変換結果は、ハッカーからの攻撃によって実行されると正しく動作しているように見えるが、望ましくは検知が難しいようなバグをプログラム中に含ませる。
【００５６】
「フィードバックループ」という語は、何度も繰り返されるプロセスを説明する語で、前回の繰り返しの結果は、次の繰り返しをその目標を達成する方向に導くのに用いられる。簡単な例として、標準的なバイナリサーチアルゴリズムは、フィードバックループを処理するものと考え得る。バイナリサーチアルゴリズムにおいて、各反復は、チェックすべき値の範囲の中点と目標値とを比較し、次の反復では比較結果に基づいて新たなより高いまたはより低い範囲を選択し、所望の値を目指す。本発明の１つの側面も、フィードバックループを含むが、その場合メトリクスは前回の反復の基準を提供し、次の反復は、これらメトリクスを使って、ホワイトボックス難読化変換といった技術によって所望の目標値に近づくような別の難読化変換をいかにして生成するかを決める手助けとする。
【００５７】
「動的解析フィードバックによる難読化」という語は、上記用語の組み合わせであって、好適な実施の形態において、ホワイトボックス難読化プロセスを制御するフィードバックループのことを意味する。「動的解析」という語は、オリジナルコードの静的な解析しか考慮していない先行技術の例とは対照的に、プログラムを実際に動作させながら解析することを意味する。
【００５８】
「オリジナルコード」および関連のある「オリジナルコードモジュール」と「オリジナルモジュール」という語は、難読化変換を適用しなくてはならない命令セットを含むファイルを指している。本実施の形態において、各ファイルのプログラミング言語はＣ、Ｃ＋＋またはＪａｖａのうちのいずれかであるが、その他の言語、アセンブリ言語であっても使用可能である。同様に、「難読化済みコード」および「難読化済みコードモジュール」も命令セットを含むファイルを指しているが、それらは難読化変換が適用された後のファイルである。本好適な実施の形態において、同じコンピュータプログラミング言語または符号化がオリジナルモジュールにも難読化済みモジュールにも用いられるが、オリジナルモジュールの言語から難読化済みモジュールの言語へのマッピングがあるならば、難読化変換用の入力言語が出力言語と違っていても、本明細書に記載の技術を適用することができる。
【００５９】
その他の用語については、以下の詳細な説明の中で紹介、定義する。
【００６０】
以下、本発明の実施の形態について図面を用いて詳細に説明する。
【００６１】
本発明の実施の形態における難読化方法および難読化装置は、難読化強化のために動的解析からのフィードバックを導入したものである。以下、本発明を十分に理解できるよう説明するために、詳細な事項が数多く示されている。しかし、このような詳細な事項がなくても本発明が実践できることは、当業者にとって明らかであろう。また、本実施の形態の説明は、本発明を限定するものではない。
【００６２】
図５は、本実施の形態における難読化方法を説明するための説明図である。
【００６３】
本実施の形態における難読化方法は、図５に示すように、オリジナルコードモジュールおよび難読化済みコードモジュールを、ロギングライブラリを用いて実行することから生成される出力を解析および評価することにより、フィードバックによる難読化プロセスを最適化する。
【００６４】
本実施の形態における難読化方法では、オリジナルコードモジュール２００が難読化装置に入力され、難読化されることにより、難読化済みコードモジュール２０４が生成される。オリジナルコードモジュール２００と難読化済みコードモジュール２０４は、それぞれのロギングライブラリ２０６、２１２（本実施の形態において両ライブラリは同一であるが、２つのコードモジュールのそれぞれについて別のライブラリを使用してもよい）にリンクすることができ、検定への入力としてデータセット２２０を使って実行される。
【００６５】
ロギングライブラリ２０６、２１２はそれぞれ、コードモジュールの実行ログを出力するライブラリであって、トレース出力ファイル２１４、２１８を生成する。トレース出力ファイル２１４、２１８は、次に比較器／メトリクスモジュール２１６により入力されて利用される。なお、本実施の形態では、トレース出力ファイル２１８が第１のロギングデータとして構成されており、トレース出力ファイル２１４が、第２のロギングデータとして構成されている。
【００６６】
この比較器／メトリクスモジュール２１６は、難読化処理によって出力されるブロックマッピングレポート２１０も使って、難読化処理にフィードバックされるメトリクスレポート２０８を生成し、ホワイトボックス難読化変換フィードバックループを形成する。
【００６７】
このように本実施の形態における難読化方法では、動的解析による難読化処理を行う。つまり、難読化済みコードモジュール２０４の実行状態を示すトレース出力ファイル２１８に対するメトリクスを評価することにより、難読化済みコードモジュール２０４が最適に難読化されているか否かを判断する。その結果、難読化済みコードモジュール２０４が最適に難読化されていなければ、上述のメトリクスの評価結果を難読化処理に反映させて、再び難読化処理を実行する。
【００６８】
図６は、上記の動的解析による難読化方法によりオリジナルコードモジュール２００の難読化を行う難読化装置の構成を示すブロック図である。
【００６９】
本実施の形態における難読化装置１０００は、ブロック識別部９０２、ロギング挿入部９０４ａ、オリジナルコード実行部９０６ａ、難読化部９１０、ロギング挿入部９０４ｂ、難読化コード実行部９０６ｂ、比較部９１２、および難読化調整部９１４を備えている。
【００７０】
ブロック識別部９０２は、オリジナルコードモジュール２００に対して、そのモジュール２００に含まれる各基本ブロックを識別するためのブロック識別子を挿入する。
【００７１】
ロギング挿入部９０４ａは、ロギングライブラリ２０６を伴うオリジナルコードモジュール２００に対してコンパイルを行い、実行プログラムを生成する。
【００７２】
オリジナルコード実行部９０６ａは、データセット２２０を使って、ロギング挿入部９０４ａで生成された実行プログラムを実行する。さらに、オリジナルコード実行部９０６ａは、実行プログラムの実行状態を示すトレース出力ファイル２１４を生成する。
【００７３】
難読化部９１０は、ブロック識別子が挿入されたオリジナルコードモジュール２００を取得し、そのモジュール２００に対して難読化処理を行うことにより、難読化済みコードモジュール２０４を生成する。また、難読化部９１０は、難読化処理を行なうときには、難読化調整部９１４から出力されたメトリクスレポート２０８に応じた難読化処理を行なう。さらに、難読化部９１０は、オリジナルコードモジュール２００に含まれる基本ブロックごとに難読化を行い、その各基本ブロックと、難読化済みコードモジュール２０４に含まれる各ブロックとの対応関係を示すブロックマッピングレポート２１０を生成する。
【００７４】
ロギング挿入部９０４ｂは、ロギングライブラリ２１２を伴う難読化済みコードモジュール２０４に対してコンパイルを行い、実行プログラムを生成する。
【００７５】
難読化コード実行部９０６ｂは、データセット２２０を使って、ロギング挿入部９０４ｂで生成された実行プログラムを実行する。さらに、難読化コード実行部９０６ｂは、実行プログラムの実行状態を示すトレース出力ファイル２１８を生成する。なお、本実施の形態では、難読化コード実行部９０６ｂが実行手段として構成されている。
【００７６】
比較部９１２は、上述の比較器／メトリクスモジュール２１６に基づき、オリジナルコード実行部９０６ａおよび難読化コード実行部９０６ｂによって生成されたトレース出力ファイル２１４、２１８の解析と比較を行う。つまり、比較部９１２は、難読化部９１０によって生成されたブロックマッピングレポート２１０を用い、後述するメトリクスに基づいてトレース出力ファイル２１４、２１８を比較評価する。そして、比較部９１２は、その比較評価結果を示すメトリクスレポート２０８を生成する。
【００７７】
なお、比較部９１２は、難読化部９１０による１回目の難読化処理のときにのみ、難読化コード実行部９０６ｂで生成されたトレース出力ファイル２１８の比較対象を、オリジナルコード実行部９０６ａで生成されたトレース出力ファイル２１８としてもよい。この場合、難読化部９１０による２回目の難読化処理以降、比較部９１２は、前回に生成されたトレース出力ファイル２１８を、新たなトレース出力ファイル２１８の比較対象とする。また、比較部９１２は、トレース出力ファイル２１８を、トレース出力ファイル２１４や前回のトレース出力ファイル２１８と比較することなく、トレース出力ファイル２１８を評価してメトリクスレポート２０８を生成してもよい。この場合、比較部９１２は、難読化済みコードモジュール２０４を用いてトレース出力ファイル２１８を評価してもよい。
【００７８】
難読化調整部９１４は、比較部９１２で生成されたメトリクスレポート２０８を難読化部９１０にフィードバックする。ここで、難読化調整部９１４は、そのメトリクスレポート２０８に示されるメトリクスが許容範囲に含まれていない場合に、つまり、難読化が十分に行われていないと判断した場合に、そのメトリクスレポート２０８を難読化部９１０にフィードバックする。なお、難読化調整部９１４は、難読化部９１０によって難読化が行われた回数をカウントし、そのカウントされた回数が、予め定められた設定回数以下の場合に、そのメトリクスレポート２０８を難読化部９１０にフィードバックしてもよい。また、難読化調整部９１４は、難読化部９１０によって難読化が行われた累積時間を計測
し、その計測された累積時間が、予め定められた設定時間以下の場合に、そのメトリクスレポート２０８を難読化部９１０にフィードバックしてもよい。
【００７９】
また、難読化部９１０は、メトリクスレポート２０８により示されるメトリクスに基づいて、難読化の程度が向上されるような難読化手法、つまり、より十分に難読化されるような難読化手法を選択し、その難読化手法によりオリジナルコードモジュール２００に対する難読化処理を行なってもよい。この場合、難読化の程度が向上されるような難読化手法を取ったにも関わらず難読化の程度が向上しなかった場合に、既に十分な難読化が行われたと判断できる。つまり、難読化調整部９１４は、直前のメトリクスレポート２０８によって特定される難読化の程度を、その直前よりも前のメトリクスレポート２０８によって特定される難読化の程度と比較する。そして、難読化調整部９１４は、難読化の程度が向上している場合には、そのメトリクスレポート２０８を難読化部９１０にフィードバックし、難読化の程度が向上していない場合には、メトリクスレポート２０８のフィードバックを実行しない。
【００８０】
図７は、本実施の形態における難読化装置１０００の動作を示すフローチャートである。
【００８１】
まず、動的フィードバックを用いた難読化がスタートすると、難読化装置１０００のブロック識別部９０２は、ブロック識別子の挿入を行う（Ｓ４０２）。このプロセスは、難読化および解析対象のオリジナルコードモジュール２００の範囲内の基本ブロックを識別し、後の解析および比較プロセスが確実に正しく行われるようにする重要なステップである。
【００８２】
次に、ロギング挿入部９０４ａは、ロギングライブラリ２０６を伴うオリジナルコードモジュール２００に対してコンパイルを行う（Ｓ４０４）。このコンパイルでは、オリジナルコードモジュール２００が、そのモジュールの言語にふさわしいコンパイラツールセットを使ってコンパイルおよびリンクされ、ロギングライブラリ２０６が、出力される実行ファイルに組み入れられる。
【００８３】
そして、オリジナルコード実行部９０６ａは、このようなオリジナルコードモジュール２００とロギングライブラリ２０６の実行可能な組み合わせである実行ファイルを、データセット２２０を用いて実行する（Ｓ４０６）。なお、データセット２２０は、トレース出力ファイル２１４の生成に用いられる。
【００８４】
難読化部９１０は、初期難読化のための制御レコード４１２の作成を行う（Ｓ４１０）。つまり、難読化部９１０は、ユーザ入力からの値または予め定義された値のセットを使って、難読化制御パラメータの基本セットである制御レコード４１２を作成する。この制御レコード４１２は、後述するようにフィードバックプロセスにおいて重要な役割を果たすことになる。
【００８５】
さらに難読化部９１０は、難読化を行う（Ｓ４１６）。ここで、難読化部９１０は、入力されたオリジナルコードモジュール２００と制御レコード４１２と、もしあれば結果レコード４１８と難読化レコード４２０とを使って、１つもしくは複数の難読化技術をオリジナルコードモジュール２００に適用する。
【００８６】
なお、本発明は様々な難読化技術に対応するよう適合させることができるので、使用される難読化技術は、以前に開示された技術でもまだ発見されていない新しい技術でもかまわない。
【００８７】
また、難読化部９１０は、オリジナルコードモジュール２００に対する難読化を行うときには、適用される難読化技術を示す難読化レコード４２０を生成して記憶しておく。
【００８８】
難読化部９１０は、フィードバックループにおいてこの難読化レコード４２０を参照する。つまり、ブロック識別子によって識別された基本ブロックの難読化が十分な質であったかどうかが決定されて、十分な質でないと決定された場合に、難読化部９１０は、記憶している難読化レコード４２０を使って、前の難読化に用いられた難読化技術を見つけ出し、代わりの難読化技術を新たな難読化に適用する。つまり、難読化部９１０は、オリジナルコードモジュール２００の一部を選択的に難読化する。
【００８９】
難読化部９１０は、ステップＳ４１６の難読化が終了すると、変換済みコードを含む難読化済みコードモジュール２０４を出力する。さらに、難読化部９１０は、難読化レコード４２０を更新する。また、難読化部９１０は、新たに適用された変換（難読化技術）が反映され、オリジナルコードモジュール２００の基本ブロックが難読化済みコードモジュール２０４の基本ブロックとどのように関連しているかを示すブロックマッピングレポート２１０を作成する。フィードバックループおよび関連ファイルの詳細については、後述の図８〜１０の説明を参照のこと。
【００９０】
次に、ロギング挿入部９０４ｂは、ロギングライブラリ２１２を伴う難読化済みコードモジュール２０４に対してコンパイルを行う（Ｓ４２２）。ここで行われるコンパイルは、ステップＳ４０４におけるコンパイルに似ている。しかし、ステップＳ４２２におけるコンパイルでは、難読化済みコードモジュール２０４が、そのモジュールの言語にふさわしいコンパイラツールセットを使ってコンパイルおよびリンクされ、ロギングライブラリ２１２が、出力される実行ファイルに含められる。
【００９１】
そして、難読化コード実行部９０６ｂは、このような難読化済みコードモジュール２０４とロギングライブラリ２１２との実行可能な組み合わせである実行ファイルを、データセット２２０を用いて実行する（Ｓ４２４）。データセット２２０は、トレース出力ファイル２１８の生成に使われる。
【００９２】
次に、比較部９１２は、トレース出力ファイル２１８の解析と比較を行う（Ｓ４２８）。このステップＳ４２８での処理は、本発明の重要な特徴の１つである。要約すると、比較部９１２は、トレース出力ファイル２１４、２１８をオリジナルコード実行部９０６ａおよび難読化コード実行部９０６ｂから入手する。そして比較部９１２は、ブロックマッピングレポート２１０に示される情報、即ち、基本ブロックがどのように難読化されたかに関する情報を使って、後述する様々なメトリクスに従って、基本ブロックの難読化の質に関するメトリクスレポート２０８を生成する。つまり、この解析と比較の結果は、人間が読める形式もしくは当業者によって人間が読める形式に変換可能なＸＭＬ（Extensible
Markup Language）といったコンピュータ読み取り可能なフォーマットのいずれかで、メトリクスレポート２０８に記録される。
【００９３】
難読化調整部９１４は、ステップＳ４２８で生成されたメトリクスレポート２０８に基づいて、ステップＳ４１６で生成された難読化済みコードモジュール２０４における難読化の程度が十分に良好か否かを判断する（Ｓ４３２）。つまり、難読化調整部９１４は、フィードバックループを反復し続けるかどうかを決定する。
【００９４】
本発明において、この反復するという決定は、以下の１つもしくは複数のファクタに基づいて行われる。すなわち、（特定のメトリクスを効果的に無視するためのゼロの重みを含む）所望の重み付けをした（実行スピード、コードサイズ、パスカバレッジといった）特定のメトリクスの平均スコアがユーザ定義のしきい値（許容範囲）を超える、特定のメ
トリクスがユーザ定義のしきい値（許容範囲）を超える、行われた反復の数がある限界（設定回数）を超える、フィードバックプロセス実行時間または必要なメモリサイズがある限界を超える、等である。なお、上述の重み付けをせずに、複数種のメトリクスの平均値が許容範囲に収まらない場合に、反復するという決定を行ってもよい。
【００９５】
また、反復のたびに難読化の程度が向上されるような難読化手法を取る場合には、過去の反復におけるメトリクスレポートと今回のメトリクスレポートとを比較して、今回の難読化の程度が向上していない場合に、反復をしないという決定を行ってもよい。
【００９６】
ステップＳ４３２で十分に良好と判断されると（Ｓ４３２の「はい」）、難読化装置１０００は、動的解析フィードバックプロセスによる難読化処理を終了する。
【００９７】
ステップＳ４３２で十分に良好でないと判断されると（Ｓ４３２の「いいえ」）、難読化調整部９１４は、難読化の結果レコード４１８の更新を行う（Ｓ４３８）。つまり、難読化調整部９１４は、ステップＳ４２８において比較部９１２から出力されたメトリクスレポート２０８を使って、ステップＳ４１６での難読化にフィードバックとして用いられる結果レコード４１８を生成するために必要に応じてデータを処理し変換する。つまり、難読化調整部９１４は、メトリクスレポート２０８のフォーマットを、難読化部９１０で読み取り可能なフォーマットに変換することにより、結果レコード４１８を生成する。
【００９８】
本実施の形態において、ステップＳ４２８におけるトレース出力ファイルの解析と比較と、ステップＳ４１６における難読化とは共に動作するよう設計されているため、これは簡単な変換プロセスであろう。
【００９９】
なお、トレース出力ファイルの解析と比較（Ｓ４２８）と、難読化（Ｓ４１６）とを独立して設計してもよい。この場合には、難読化の結果レコード４１８の更新（Ｓ４３８）において、難読化（Ｓ４１６）への入力にふさわしい形式で結果レコード４１８を生成するために、もっと複雑な変換を行う必要があるかもしれない。
【０１００】
ここで、図７において、ステップＳ４１６の難読化と、３つのデータ項目である、難読化レコード４２０、制御レコード４１２および結果レコード４１８とは、１つにリンクされて動的解析フィードバックシステムの中核の一部を成している。本実施の形態におけるこれらの役割について説明する。
【０１０１】
ステップＳ４１６の難読化の前に、初期難読化のための制御レコード４１２を生成する処理（Ｓ４１０）がある。この制御レコード４１２は、難読化のやり方についての命令セットを含む。本実施の形態においては、この制御レコード４１２は、オリジナルコードモジュール２００内の（ブロック識別子の挿入（Ｓ４０２）によって識別される）コードのゼロまたはそれ以上の基本ブロックについて、少なくとも当該ブロックに対する好適な難読化タイプまたは好適な難読化レベルを示唆するエントリを含むと共に、その他のコードのブロックに対するデフォルト値も含んでいる。
【０１０２】
図８は、オリジナルコードモジュール２００および難読化済みコードモジュール２０４の一例を示す図である。
【０１０３】
例えば、Ｂｌｏｃｋ（Ａ）を含むオリジナルコードモジュール２００は、５つのブロックＡ０、Ａ１、Ａ２、Ａ３、Ａ４を含む難読化済みコードモジュール２０４に難読化される。つまり、難読化装置１０００は、ブロックＡ０、Ａ１、Ａ２、Ａ３、Ａ４を作成する。
【０１０４】
ブロックＡ０は、これらブロックＡ１、Ａ２、Ａ３、Ａ４の中から何れかを選択するために、擬似乱数生成ルーチン（本例ではrand＿func()）への呼び出しを行う。そして、ブロックＡ０は、この呼び出しからの戻り値を用いて他のブロックのうちどれを実行すべきかを決める。なお、本例においてrand＿func()は０．０から１．０の間の値を返すため、ブロックＡ４は、意図的に決して実行されることのないダミーブロックとしている。
【０１０５】
図９は、ブロックマッピングレポート２１０の一例を示す図である。
【０１０６】
例えば、図８に示すような難読化プロセスが実行されて終了すると、図９に示すようなブロックマッピングレポート２１０が生成される。ただし、本発明の新規性を損なうことがなければ、ＸＭＬのような他のフォーマットも使用可能である。
【０１０７】
ブロックマッピングレポート２１０の内容には、オリジナルコードモジュール２００の基本ブロックＡが、新しい基本ブロックＡ０と、その後に続く４つの並行ブロックＡ１、Ａ２、Ａ３、Ａ４とに、どのようにして変換されたかに関する情報が含まれる。本実施の形態において、ブロックマッピングレポート２１０の２行目に示されたマッピングの構文は、「＋」を使って、順次実行される基本ブロックを示し、「｜」を使って、選択して実行される基本ブロックを示している。希望により括弧を使って入れ子を生成することもできるし、もちろん当業者であれば他の表現を使ってブロックの関係を表すこともできる。
【０１０８】
つまり、図９に示すブロックマッピングレポート２１０は、オリジナルコードモジュール２００のブロックＡが、難読化済みコードモジュール２０４におけるブロックＡ０、Ａ１、Ａ２、Ａ３、Ａ４に変換されたことを示す。さらに、ブロックマッピングレポート２１０は、ブロックＡ０の後に、ブロックＡ１、Ａ２、Ａ３、Ａ４の何れかが実行されることを示す。さらに、ブロックマッピングレポート２１０は、ブロックＡ４がダミーブロックであることを示す。
【０１０９】
なお、このブロックマッピングレポート２１０における情報は、難読化部９１０の要求により他の内部的な詳細な情報と共に難読化レコード４２０にも書き込まれ、後に続くフィードバックループの反復において適用される難読化をどのように強化するかを決めることができるようになる。
【０１１０】
図１０は、メトリクスレポート２０８の一例を示す図である。
【０１１１】
本実施の形態において、トレース出力の解析と比較（図７のステップＳ４２８）では、例えば、図１０に示されるメトリクスレポート２０８が生成される。
【０１１２】
このメトリクスレポート２０８の内容は、ブロックマッピングレポート２１０と、トレース出力ファイル２１４、２１８の内容のサマリと、オリジナルコードモジュール２００および難読化済みコードモジュール２０４用のメトリクスとに基づく。
【０１１３】
例えば、メトリクスレポート２０８は、典型的な内容として、ループ実行回数、実行パスカバレッジおよび難読化の質に関する情報を含む。当業者であれば、このレイアウトを拡大して、後述するその他の多くのファクタを含めることもできる。また、このメトリクスレポート２０８は、実行パスカバレッジ、または実行されたパスの頻度分布をメトリクスとして示す。
【０１１４】
図１１は、結果レコード４１８の一例を示す図である。
【０１１５】
難読化調整部９１４は、図７のステップＳ４３２において、十分に良好でないと判断す
ると、フィードバックループにおける難読化の結果レコード４１８を更新する。つまり、難読化調整部９１４は、メトリクスレポート２０８を、難読化プロセス（図７のステップＳ４１６）へのフィードバックに適したフォーマットに翻訳する。
【０１１６】
例えば、図１１に示す結果レコード４１８は、図１０に示すメトリクスレポート２０８に基づいて生成されたものである。
【０１１７】
難読化部９１０は、難読化プロセス（図７のステップＳ４１６）において、この結果レコード４１８に基づいて、異なる技術を使ってオリジナルコードモジュール２００を再難読化しようとする。
【０１１８】
例えば、難読化部９１０は、ブロックＡ０において異なる乱数生成方法を選択することによって、ブロックＡ１、Ａ２、Ａ３、Ａ４にわたるより均一な広がりの実行パスを生成しようとする。または、難読化部９１０は、各ブロックの“if”ステートメントの条件を異なる制約で書き換える。なお、再難読化の方法は、他の方法であってもよい。
【０１１９】
上記パラグラフの理解の一助となるように、図８に示すコード解析に基づく、図１０および図１１のサンプル出力結果についてさらに詳細に説明する。
【０１２０】
トレース出力の解析と比較（図７のステップＳ４２８）では、図１０で示されるメトリクスレポート２０８が生成される。メトリクスレポート２０８は、使用された難読化方法（本例では「ランダム分岐」）およびオリジナルコードモジュール２００のオリジナル基本ブロックＡが実行された回数の合計、本例では３００回を示している。次に、難読化済みコードモジュール２０４の新しい基本ブロックの可能なパスそれぞれが、各パスのパーセンテージ数とともに列挙されている。なお、トレース出力の解析と比較（図７のステップＳ４２８）では、比較部９１２は、図９に示されるブロックマッピングレポート２１０から、難読化前および難読化後の基本ブロックの関係に関する情報を入手する。
【０１２１】
メトリクスレポート２０８は、トレース出力の解析と比較（図７のステップＳ４２８）によって算出されたメトリクスに基づく、難読化の質の評価（図７に示すＱｕａｌｉｔｙ）も有している。図示された実施の形態において、評価はメトリクス結果の重み付けに基づくパーセンテージのスコアである。なお、評価は単純な合否マークでもよい。さらに、評価は各メトリクススコアの詳細なリストでもよい。
【０１２２】
評価の表現がなんであれ、難読化調整部９１４の１つの役割は、メトリクスレポート２０８により示される評価を、トレース出力の解析と比較（図７のステップＳ４２８）で生成するフォーマットから、難読化（図７のステップＳ４１６）で理解できるフォーマットに変換することである。本実施の形態における難読化（図７のステップＳ４１６）では、フィードバック中に、各ブロックにおける実行回数の絶対値に関する情報を見つけ出すことが期待されるため、メトリクスレポート２０８と結果レコード４１８を比較することによって、フォーマットがどのように変換されたかを見ることができる。もちろん、難読化（図７のステップＳ４１６）で必要とされるフォーマットであれば、結果レコード４１８のフォーマットは別のフォーマットであってもよい。
【０１２３】
難読化（図７のステップＳ４１６）への戻りが繰り返されるとき、上記の結果レコード４１８が、難読化部９１０に入力される。難読化部９１０は、結果レコード４１８内に含まれるデータを使って、オリジナルコードモジュール２００をどのように再難読化するかを決定することができる。上述したように、難読化レコード４２０は、難読化を正確に再現するための難読化用の十分な情報を含んでいる。したがって、本実施の形態では、できればより質の高い難読化を生成するために、結果レコード４１８内に含まれる追加情報を
利用することもできる。もちろん質は、次のトレース出力の解析と比較（図７のステップＳ４２８）の実行によって検証される。図１１の結果レコード４１８において、本実施の形態では、ブロックＡ１、Ａ３の相対的実行回数を増やすために、ブロックＡ０、Ａ２の終わりの“if”ステートメントの変更を選択してもよい。採用可能な他の方法として、例えば全く異なる難読化方法を試してみることも可能である。
【０１２４】
なお、上記実施の形態では、必ずしも必要ではない難読化（図７のステップＳ４１６）と結果レコード４１８の更新（図７のステップＳ４３８）とのかなり強固な連携が必要とされる。また、トレース出力の解析と比較（図７のステップＳ４２８）と結果レコード４１８の更新（図７のステップＳ４３８）も同様に強固に結合される。当業者であれば、このような相互依存関係を軽減するようにプロトコルやファイルフォーマットのセットを設計することができるであろう。また、標準化ＸＭＬスキーマが有用な出発点となるだろう。
【０１２５】
ここで、難読化済みコードモジュール２０４の実行状態を示すトレース出力ファイル２１８を評価するためのメトリクスについて、幾つかの例を挙げて説明する。
【０１２６】
（パスカバレッジ）
本実施の形態では、例えば、メトリクスとしてパスカバレッジを用いる。
【０１２７】
つまり、変換後の難読化済みコードモジュール２０４の制御フローグラフのパスの数を計算し、次にこの数字をトレース出力ファイル２１８に記録された実際のパスの数と比較することによって、難読化後のコードから得たパスを解析する。好適な実施の形態において、この情報は、例えば難読化済みコードモジュール２０４から決して実行されることのないコードを削除することにより、より少ないデッドパスを含む難読化を生成するよう、あるいは、例えば使用されなかったパスを使用されるパスに変更するよう条件値を変更することにより、より多くのライブパスを生成するように（このような動作の例として図１０および図１１の上記説明を参照のこと）、難読化部９１０を導くために使ってもよい。この解析をどのように行うかについての詳細を、以下に説明する。
【０１２８】
難読化済みコードモジュール２０４の制御フローグラフを考えたとき、Ｎpathを、当該モジュールの制御フローグラフを通るパスのうち、ブロックマッピングレポート２１０のダミーコードとして明確にマークされた基本ブロックを通るパスを除く、パスの総数とする。もちろんダミーコードとしてのブロックマッピングレポート２１０中にマークされた基本ブロックが、トレース出力ファイル２１８内に含まれる情報に従って実際に実行されないことを保証するため整合性チェックが行われる。Ｎexecを、難読化済みコードモジュール２０４のトレース出力ファイル２１８の解析によってコードにおいて観察された実行パスの数とする。
【０１２９】
ここで、簡単なパスカバレッジを測定するメトリクスＭSPCは、以下の（数１）に示す通りに特定される。
【０１３０】
【数１】
2009514060.tif 000003
【０１３１】
この値が小さくなればなるほど、コードを通るパスの広がりがよくなる。
【０１３２】
図１２は、パスの数え方を説明するための説明図である。
【０１３３】
上記Ｎpathなどのパスの数を数える際に、同一のＳｔａｒｔおよびＥｘｉｔノードを持つ周期的制御フローグラフでは、以下に示す手順でパスが数えられる。
【０１３４】
周期中のノードｗ→ノードｖについて１つのバックエッジを特定し、Ｓｔａｒｔ→ノードｖおよびノードｗ→Ｅｘｉｔのエッジを加え、さらに当該バックエッジを削除することによって、そのグラフを非周期形式に変換する。
【０１３５】
例えば、図１２に示す周期的制御フローグラフの場合には、５つのパスが数えられる。つまり、Ａにより示されるパスと、Ｄ→Ｂにより示されるパスと、Ｄ→Ｃにより示されるパスと、Ｅ→Ｂにより示されるパスと、Ｅ→Ｃにより示されるパスとが数えられる。なお、いずれかのバックエッジを通るトレース出力ファイル２１８からのパスは、必要に応じサブパスに分割される。
【０１３６】
（パスカバレッジの変化）
また、本実施の形態では、例えば、メトリクスとしてパスカバレッジの変化を用いる。
【０１３７】
つまり、オリジナルコードモジュール２００と難読化済みコードモジュール２０４の難読化前後の制御フローグラフおよび前後のトレース出力ファイル２１４、２１８を見て、パスカバレッジの変化を解析することにより、難読化プロセスに従ってパスがどのように変化したかを識別し、例えば難読化プロセスが既存のパスからより均一な広がりの新しいパスを生成するように調整することができる。この解析のやりかたについての詳細を以下に説明する。
【０１３８】
ここで、以下の（数２）に示す数を、トレース出力ファイル２１４の解析によってオリジナルコードモジュール２００から観察された実行パスの数とする。
【０１３９】
【数２】
2009514060.tif 000004
【０１４０】
また、以下の（数３）に示す数を、トレース出力ファイル２１８の解析によって難読化済みコードモジュール２０４から観測された実行パスの数とする。
【０１４１】
【数３】
2009514060.tif 000005
【０１４２】
なお、同一のＳｔａｒｔおよびＥｘｉｔノードを持つ周期的制御フローグラフにおけるパスの数え方は、図１２を用いて説明した通りである。
【０１４３】
ここで、パスカバレッジの変化を測定するメトリクスＭCPCは、以下の（数４）に示す通りに特定される。
【０１４４】
【数４】
2009514060.tif 000006
【０１４５】
この値が大きくなればなるほど、パスカバレッジの変化がよくなる。
【０１４６】
（実行パスのパターン）
また、本実施の形態では、例えば、メトリクスとして実行パスのパターンを用いる。
【０１４７】
例えば、所定のループのパスがどのように時間変化するか、または以降の反復においてどのくらい定期的にパスが変化するかを観察するというように、実行後のトレース出力ファイル２１８で見つかる実行パスのパターンを評価する。
【０１４８】
このような実行パスのパターンの測定方法の１つでは、「等分布の検定」（Ｋｎｕｔｈの５９ページ）を使い、期待理論値に対する観察結果のカイ２乗値（Ｋｎｕｔｈの３９ページ）を計算することにより、難読化済み基本ブロックセットを通るパスがどれくらいランダムかを決定する。これにより、難読化済み制御フローを通るパスが、（所望の分布と比較して）どれくらい均等に分布しているかがわかる。例えば観察された実行フローが不釣合いなほど何回も１つのコードパスを通る場合、もっと均一にパスが分布している場合と比べて、攻撃者はその単一のパスに狙いを定め、おそらくはより短時間で機密情報の大半を暴露することができるため、この検定は重要である。
【０１４９】
まず、難読化済みコードモジュール２０４のトレース出力ファイル２１８を解析することにより、難読化済みコードモジュール２０４において観察された実行パスのすべてを集める。
【０１５０】
なお、同一のＳｔａｒｔおよび同一のＥｘｉｔノードを持つ周期的制御フローグラフにおけるパスの数え方または集め方は、図１２を用いて説明した通りである。
【０１５１】
次にパスに番号をつけるためのＢａｌｌ−Ｌａｒｕｓ方式を使ってパスに番号をつける。ブロックマッピングレポート２１０を解析することによって決定される、同一の支配ノードを持つゼロまたはそれ以上の特定の難読化済みブロックセットについて、まずその支配ノードを通る実行済みパスセットを選択し、そのセットのサイズをＮexecとする。次にＮpathを、難読化済みコードモジュール２０４において、通る可能性のあるパスの数とする。１≦ｐ＜Ｎpathである各別個のパスＤｐについて、Ｐｐを当該パスが実行されている期待確率とすると、デフォルトでは、期待確率Ｐｐは各パスＤｐについて、以下の（数５）のように表される。
【０１５２】
【数５】
2009514060.tif 000007
【０１５３】
図１３は、実行パスのパターンに基づいて行われる難読化のフィードバックを説明する
ための説明図である。
【０１５４】
難読化装置１０００は、例えば、「ｘ＝ｘ＊２」を示すオリジナルコードモジュール２００に対して難読化を行う。なお、「＊」は、乗算を意味する。その結果、難読化装置１０００は、４つのブロックＡ、Ｂ、Ｃ、Ｄを有する難読化済みコードモジュール２０４ａ（２０４）を生成する。
【０１５５】
例えば、ブロックＡは「ｘ＝ｘ＜＜２」を示し、ブロックＢは「ｘ＝ｘ＊４」を示す。また、ブロックＢは「ｘ＝ｘ＞＞１」を示し、ブロックＤは「ｘ＝ｘ／２」を示す。なお、「＜＜」は左側へのビットシフトを示し、「＞＞」は右側へのビットシフトを示す。したがって、「ｘ＝ｘ＜＜２」は「ｘ＝ｘ＊４」と同じ処理を示す。同様に、「ｘ＝ｘ＞＞１」は「ｘ＝ｘ／２」を示す。
【０１５６】
難読化装置１０００は、このような難読化済みコードモジュール２０４ａが生成されると、その難読化済みコードモジュール２０４ａを実行する。そして、難読化装置１０００は、実行パスのパターンを評価するためのメトリクスを示すメトリクスレポート２０８ａ（２０８）を生成する。
【０１５７】
このメトリクスレポート２０８ａには、難読化済みコードモジュール２０４ａにおいて実行される可能性のある各パスに対する、実際に実行されたパスの割合がメトリクスとして記されている。
【０１５８】
例えば、ブロックＡ→ブロックＣのパスの割合である０％と、ブロックＡ→ブロックＤのパスの割合である５０％と、ブロックＢ→ブロックＣのパスの割合である５０％と、ブロックＢ→ブロックＤのパスの割合である０％とが記されている。なお、図１３に示す難読化済みコードモジュール２０４ａにおいて、そのモジュールを実行するまでもなく、ブロックＡ→ブロックＣのパスが実行される可能性はない。しかし、ここでは、このようなパスであっても、難読化済みコードモジュール２０４ａだけでは、実行される可能性があると判断されるものとして説明する。
【０１５９】
難読化装置１０００は、このようなトレース出力ファイル２１８ａを解析し、ブロックＡ→ブロックＣのパスの割合と、ブロックＢ→ブロックＤのパスの割合とが、上述の期待確率Ｐｐよりも大幅に小さいため、難読化が十分に行われていないと判断し、これらのパスの割合が増えるように、再び難読化を行う。
【０１６０】
難読化装置１０００は、再び難読化を行った結果、難読化済みコードモジュール２０４ｂ（２０４）を生成する。この難読化済みコードモジュール２０４ｂでは、前回の難読化済みコードモジュール２０４ａと比較して、ブロックＢとブロックＣとの間のｉｆ文が変更されている。
【０１６１】
難読化装置１０００は、このような難読化済みコードモジュール２０４ｂが生成されると、上述と同様、その難読化済みコードモジュール２０４ｂを実行する。そして、難読化装置１０００は、実行パスのパターンを評価するためのメトリクスを示すメトリクスレポート２０８ｂ（２０８）を生成する。
【０１６２】
このメトリクスレポート２０８ｂには、ブロックＡ→ブロックＣのパスの割合である２０％と、ブロックＡ→ブロックＤのパスの割合である３０％と、ブロックＢ→ブロックＣのパスの割合である２０％と、ブロックＢ→ブロックＤのパスの割合である３０％とが記されている。
【０１６３】
難読化装置１０００は、このようなメトリクスレポート２０８ｂを解析し、各パスの割合が上述の期待確率Ｐｐに近いため、つまり許容範囲に収まるため、オリジナルコードモジュール２００が難読化済みコードモジュール２０４ｂに最適に難読化されたと判断する。その結果、難読化装置１０００は、難読化のフィードバック処理を終了する。
【０１６４】
なお、ブロックマッピングレポート２１０は、代わりの期待確率を含んでもよい。１≦ｐ＜Ｎpathである各別個のパスＤｐについて、Ｏｐを観察された当該パスの実行回数とする。ここで、観察されたパス実行回数と期待パス確率とを比較するために、以下の等式（数６）を使ってカイ２乗検定を行い、カイ２乗等分布の検定メトリクスを生成する。
【０１６５】
【数６】
2009514060.tif 000008
【０１６６】
この（数６）の示すカイ２乗値が小さければ小さいほど、観察されたパス分布と期待パス分布との一致度が良くなる。ただし、カイ２乗値があまりに小さすぎると、実際には見たところランダムでない分布を示すかもしれない。カイ２乗分布の臨界値の表のサンプルは、http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htmでオンラインアクセスが可能な“NIST/SEMATECH e-Handbook of Statistical Methods”といった多くの標準的な統計学の参考書に出ているが、代わりに、必要に応じて明示的に値を計算してもよい。
【０１６７】
このような実行パスのパターンの別の測定方法では、ポーカー検定（Ｋｎｕｔｈの６２ページ）を使い、期待理論値に対する観察結果のカイ２乗値を計算することにより、難読化済み基本ブロックセットを通るパスがどれくらいランダムかを決定する。これにより、上記の等分布の検定とは別の評価機能に従って、難読化済み制御フローを通るパスが、どれくらい十分に分布しているかがわかる。観察された実行フローが規則的な実行パターンに従っている場合、攻撃者は、例えばパス選択方法が単に難読化のためのアーチファクトであって無視できると結論付けることができるため、この検定は重要である。
【０１６８】
例えばａ、ｂ、ｃ、ｄの４つのパスがあり、観察されるパターンがａ、ｂ、ｃ、ａ、ｂ、ｃ、ａ、ｂ、ｃ、ａ、ｄ、ａ、ｂ、ｃ、ａ、ｂ、ｃ、ａ、ｂ、ｃ、ａ、ｄであったとすると、ハッカーは、なんらかのインデックス値を３で割った後のモジュールの余りからパスａ、ｂ、ｃが選択され、ｄはおそらくなんらかの終了条件であろうと結論づける可能性があるため、条件ステートメントの理解を試みるハッカーの関心を容易に逸らし、難読化の裏に隠された本当のプロセスの決定へと進むことができる。
【０１６９】
従ってこの値を計算するには、まず難読化済みコードモジュール２０４のトレース出力ファイル２１８を解析することにより難読化済みコードモジュール２０４において観察された実行パスのすべてを集める。
【０１７０】
なお、同一のＳｔａｒｔおよび同一のＥｘｉｔノードを持つ周期的制御フローグラフにおけるパスの数え方または集め方は、図１２を用いて説明した通りである。
【０１７１】
次にパスに番号をつけるためのＢａｌｌ−Ｌａｒｕｓ方式を使ってパスに番号をつけ、ＮBLをＢａｌｌ−Ｌａｒｕｓナンバリング方式により特定された一意のパスの数とする。次に、パスから、従来のｋ＝５を使って、一度にｋ個のパスから成るパスセットを順番に
取り、各セットにおいて一意であるパス番号の数を数える。例えば、１０個のパスがあれば、５つのパス[１、６、４、１、７]のセットには４つの一意のエントリがあり、[１、１、２、３、３]のセットは３つのエントリとなる。０＜ｒ≦ｋについて、Ｏｒはｒ個の一意のエントリを持つセットが観察される観察回数とする。Ｐｒは、以下の（数７）により算出される、当該一意のエントリ数の期待確率とする。
【０１７２】
【数７】
2009514060.tif 000009
【０１７３】
ここで、（数８）に示す第２種のスターリング数は、（数９）によって定義される。
【０１７４】
【数８】
2009514060.tif 000010
【０１７５】
【数９】
2009514060.tif 000011
【０１７６】
また、（数１０）に示す二項式係数は、（数１１）によって定義される。
【０１７７】
【数１０】
2009514060.tif 000012
【０１７８】
【数１１】
2009514060.tif 000013
【０１７９】
ここで、カイ２乗ポーカー検定メトリックを生成するために以下の等式（数１２）を使って、すべてのセットにおける一意のエントリの観察された数と期待確率とを比較するためにカイ２乗検定を行う。
【０１８０】
【数１２】
2009514060.tif 000014
【０１８１】
この（数１２）の示すカイ２乗値が小さければ小さいほど、観察されたパス分布と期待パス分布との一致度が良くなる。ただし、カイ２乗値があまりに小さすぎると、実際の分布にしては良すぎる結果を示すかもしれない。カイ２乗分布の臨界値に関する情報をどこで見つけるかについての詳細は上記を参照のこと。
【０１８２】
（類似性）
また、本実施の形態では、例えば、メトリクスとして類似性を用いる。
【０１８３】
つまり、難読化済みコードモジュール２０４により利用された異なるパスにおける対応する基本ブロック間の類似点または相違点を評価する。このマッピング情報は、難読化部９１０により生成されたブロックマッピングレポート２１０から入手される。例えば、同じ基本ブロックの異なる難読化間で高度な類似点がある場合は、難読化プロセスの有効性が潜在的に低いことを示している。この解析のやりかたについての詳細を以下に説明する。
【０１８４】
同じ機能を持ちながら２つの異なる表現で表される２つのコードブロック（すなわち、２つの異なる難読化方法、または同じ難読化方法だが異なる難読化パラメータを使って難読化されたコードのブロック）である、２つの個別の基本ブロックまたは連続する基本ブロックから構築される２つのパスセグメントを比較するため、これらブロックのトレース出力ファイル２１４またはトレース出力ファイル２１８を審査し、次の方法で、そのトレースをアルファベットに置き換える。
【０１８５】
すなわち、各オペレーションを各オペレーションに一意の異なるコードで表す、オプションとして、モジュールの実行トレースを文字列のような形で符号化した２つのデータストリームを生成するために、変数参照を異なるコードで表す、そしてさらにオプションとして、制御フロー構成と他のプログラム要素をさらに別のコードで表すことにより、そのトレースをアルファベットに翻訳する。このような２つのストリーム間のレーベンシュタイン距離を計算することができる。本好適な実施の形態において、単にオペレーションを符号化するような簡単な符号化には、８ビット幅の文字で十分である。完全な符号化には３２ビット幅の文字が必要かもしれない。
【０１８６】
つまり、共通の機能を有する２つのパスセグメントが、それぞれアルファベット列に変換され、それらのアルファベット列の間において、アルファベットの置き換えや移動、削除、挿入などが検出される。そして、その検出結果に基づいて、上記２つのバスセグメントの類似の程度がレーベンシュタイン距離たるメトリクスとして決定される。
【０１８７】
このレーベンシュタイン距離の値が大きくなればなるほど、基本ブロックまたは実行パスのペア間の相違が大きくなるため、スコア（レーベンシュタイン距離）は高ければ高いほどよい。スコアが非常に低い場合は、別の技術を使ってもう一度ブロックの難読化を行う必要があることを示している。
【０１８８】
ここで、レーベンシュタイン距離は、文字列同士の類似度を評価する基準である。この距離は、一方の文字列を他方の文字列にするために、その一方の文字列に対して行われる
処理（置換、移動、消去、または挿入）の回数で表される。
【０１８９】
本発明では、プログラムコード中の各処理をアルファベット化して並べ、そのプログラムコードを文字列として扱うことで、プログラムコード間の類似度をレーベンシュタイン距離で求めることができる。
【０１９０】
例えば、アルファベット「Ｍ」を掛け算、アルファベット「Ａ」を足し算、アルファベット「Ｂ」をアサインとすると、図１４に示すオリジナルコードモジュール２００と難読化済みコードモジュール２０４ａの類似度は、文字列「ＭＢＡＢＡＢ」と「ＡＢＢＡＡＢ」との間のレーベンシュタイン距離で評価される。
【０１９１】
なお、説明を分かり易くするために、以下の説明では、Ｍ、Ａ、Ｂなどのアルファベットの代わりに、「ＭＵＬＴＩＰＬＥ、ＡＤＤ、ＡＳＳＩＧＮ」という表現を用いる。
【０１９２】
レーベンシュタイン距離は、難読化のフィードバックが行われるごとに、前回の難読化済みコードモジュール２０４のトレース出力ファイル２１８と、今回の難読化済みコードモジュール２０４のトレース出力ファイル２１８との間で測定されてもよく、オリジナルコードモジュール２００のトレース出力ファイル２１４と、今回の難読化済みコードモジュール２０４のトレース出力ファイル２１８との間で測定されてもよい。いずれの間で測定されても、スコアが低い場合は難読化装置１０００の性能が低いことを示している。つまり、低いスコアは、難読化が十分に良好でないことを示す。
【０１９３】
なお、難読化済みコードモジュール２０４におけるダミーコードやフェイクロバストダミーコードなどに対しては、レーベンシュタイン距離のスコアが低ければ低いほどよい。このようなダミーコードなどの生成の目標は、ハッカーの関心をメインコードから逸らすことであり、非常によく似たコードであることが望ましい結果であるため、レーベンシュタイン距離のスコアが低いということは好ましい結果である。
【０１９４】
図１４は、類似性に基づいて行われる難読化を説明するための説明図である。
【０１９５】
難読化装置１０００は、例えば、「ｘ＝ｘ＊２、ｙ＝ｘ＋７、ｚ＝ｘ＋ｙ」を示すオリジナルコードモジュール２００に対して難読化を行う。その結果、難読化装置１０００は、フェイクロバスト用の「ｘ＝ｘ＋ｘ、ｙ＝ｘ、ｚ＝ｙ＋ｘ＋６」を示す難読化済みコードモジュール２０４ａ（２０４）と、「ｙ＝２＊（ｘ＋３）＋１、ｚ＝ｙ＋ｘ＋ｘ、ｘ＝ｘ＜＜１」を示す難読化済みコードモジュール２０４ｂ（２０４）とを生成する。
【０１９６】
なお、オリジナルコードモジュール２００の実行状態を示すトレース出力ファイル２１４も、図１４に示すオリジナルコードモジュール２００と同様の内容を示す。同様に、難読化済みコードモジュール２０４の実行状態を示すトレース出力ファイル２１８も、図１４に示す難読化済みコードモジュール２０４と同様の内容を示す。
【０１９７】
難読化装置１０００は、このような難読化済みコードモジュール２０４ａが生成されて実行されると、その難読化済みコードモジュール２０４ａのトレース出力ファイル２１８をオリジナルコードモジュール２００のトレース出力ファイル２１４と比較して、これらの類似性をメトリクスとして算出する。
【０１９８】
難読化装置１０００は、例えば、オリジナルコードモジュール２００のトレース出力ファイル２１４に対して、第１行目の「乗算」から「加算」への置き換えと、第２行目の「加算」の移動とが行われることによって、フェイクロバスト用の難読化済みコードモジュール２０４ａのトレース出力ファイル２１８が構成されると判断する。つまり、難読化装
置１０００は、１つの「置き換え」と１つの「移動」とに基づくメトリクスを算出する。その結果、難読化装置１０００は、そのメトリクスのスコアが低く、難読化済みコードモジュール２０４ａがオリジナルコードモジュール２００に類似していると判断する。即ち、難読化装置１０００は、難読化が十分に行われていると判断する。
【０１９９】
なお、難読化済みコードモジュール２０４ａは、フェイクロバスト用のコードである。フェイクロバスト用のコードは、オリジナルコードモジュール２００と同一の機能を果たしているように見えるものの、判別が難しいバグを潜ませることで不正解析者を混乱させるコードである。したがって、難読化済みコードモジュール２０４ａがオリジナルコードモジュール２００に類似しているほど、よい難読化が行われていると評価される。
【０２００】
さらに、難読化装置１０００は、例えば、オリジナルコードモジュール２００のトレース出力ファイル２１４に対して、第１行目における２つの「加算」の追加と、第２行目における１つの「加算」の追加と、第３行目の「加算」から「シフト」への置き換えとが行われることによって、難読化済みコードモジュール２０４ｂのトレース出力ファイル２１８が構成されると判断する。つまり、難読化装置１０００は、３つの「追加」と１つの「置き換え」とに基づくメトリクスを算出する。その結果、難読化装置１０００は、そのメトリクスのスコアが高く、難読化済みコードモジュール２０４ｂがオリジナルコードモジュール２００に類似していないと判断する。即ち、難読化装置１０００は、難読化が十分に行われていると判断する。
【０２０１】
難読化済みコードモジュール２０４ｂは、オリジナルコードモジュール２００と同一の機能を実現することを目的としている。したがって、不正解析者による解析を困難にするためには、難読化済みコードモジュール２０４ｂがオリジナルコードモジュール２００と異なるように見せかけることが望ましい。そのため、難読化済みコードモジュール２０４ｂがオリジナルコードモジュール２００に類似していないほど、よい難読化が行われていると評価される。
【０２０２】
このように、難読化装置１０００は、難読化が十分に行われたと判断すると、難読化のフィードバック処理を終了する。
【０２０３】
（コードサイズおよび実行スピード）
また、本実施の形態では、例えば、メトリクスとしてコードサイズや実行スピードを用いる。
【０２０４】
コードサイズなどをメトリクスとして用いる場合には、上記のように定義したかなり複雑なメトリクスを用いる場合よりも、簡単でより直接的に難読化の性能を測定方法することができる。例えば、難読化前後のコード実行スピードを評価する。この性能測定は、全体的なモジュール粒度ではなく、個別の基本ブロック変換を測定することができるため、先行技術により示唆された方法を調整してはるかによい性能を得ることができる。同様に、コードサイズは、アクティブコードとデッドコードとが含まれる難読化済みコードモジュール２０４のサイズだけではなく、実際に実行されたコードのサイズとして測定される。
【０２０５】
このように、本実施の形態では、あらゆる種類のメトリクスを用いてトレース出力ファイル２１８を評価して、メトリクスレポート２０８を生成することができる。また、複数種のメトリクスを含むメトリクスレポート２０８を生成してもよい。
【０２０６】
なお、複数種のメトリクスがメトリクスレポート２０８に記されている場合には、それらのメトリクスの平均値や、それらのメトリクスに重み付けをして平均化した値などを、
代表的なメトリクスとして算出してもよい。この場合、その代表的なメトリクスが許容範囲に収まる場合に、フィードバックによる難読化を終了し、その代表的なメトリクスに対応する難読化済みコードモジュール２０４を、最も難読化の質の高い、最適なモジュールとして決定してもよい。
【０２０７】
なお、上述のように、難読化調整部９１４は、難読化の回数や累積時間を計測し、その回数や累積時間が設定回数や設定時間以下の場合に、そのメトリクスレポート２０８を難読化部９１０にフィードバックしてもよい。この場合、生成された複数の難読化済みコードモジュール２０４のうち、最も高い難読化の質を示すメトリクスに対応する難読化済みコードモジュール２０４を、最も難読化の質の高い、最適なモジュールとして決定してもよい。
【０２０８】
なお、本発明を上記実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【０２０９】
（１）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。上記ＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。上記マイクロプロセッサが、上記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。
【０２１０】
（２）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。上記ＲＡＭには、コンピュータプログラムが記憶されている。上記マイクロプロセッサが、上記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。
【０２１１】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されていてもよいし、一部またはすべてを含むように１チップ化されていてもよい。
【０２１２】
また、ここでは、システムＬＳＩと呼称したが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限られるものではなく、専用回路または汎用プロセッサで実現してもよい。また、ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用してもよい。
【０２１３】
さらには、半導体技術の進歩または派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて構成要素の集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
【０２１４】
（３）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。上記ＩＣカードまたは上記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。上記ＩＣカードまたは上記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作する
ことにより、上記ＩＣカードまたは上記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【０２１５】
（４）本発明は、上記に示す方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、上記コンピュータプログラムからなるデジタル信号であるとしてもよい。
【０２１６】
また、本発明は、上記コンピュータプログラムまたは上記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている上記デジタル信号であるとしてもよい。
【０２１７】
また、本発明は、上記コンピュータプログラムまたは上記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
【０２１８】
また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、上記メモリは、上記コンピュータプログラムを記憶しており、上記マイクロプロセッサは、上記コンピュータプログラムにしたがって動作するとしてもよい。
【０２１９】
また、上記プログラムまたは上記デジタル信号を上記記録媒体に記録して移送することにより、または上記プログラムまたは上記デジタル信号を上記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
【０２２０】
上記に詳細に説明した本発明の実施の形態は単なる例示にすぎず、本発明の新規な教示および効果から実質的に逸脱することなく例示として挙げた実施の形態において様々な変更が可能であることは、当業者であれば容易に理解するところである。したがって、かかる変更はすべて本発明の範囲内に含まれるものである。
【産業上の利用可能性】
【０２２１】
本発明に係る難読化評価方法および難読化方法は、難読化を十分に評価して、ハッカーなどによるプログラムの解読を確実に防ぐことができるという効果を奏し、例えば、ソフトウェアアプリケーションプログラムなどの難読化を行う難読化装置などに適用される。
【図面の簡単な説明】
【０２２２】
本願におけるこれらの目的および他の目的や、効果、特徴は、実施の形態を示す付属図面に関する以下の説明から明確になる。当該図面において、
【図１】図１は、従来の難読化方法を説明するための説明図である。
【図２】図２は、従来の他の難読化方法を説明するための説明図である。
【図３】図３は、従来のさらに他の難読化方法を表すフローチャートである。
【図４】図４は、図２に示す難読化方法を表すフローチャートである。
【図５】図５は、本実施の形態における難読化方法を説明するための説明図である。
【図６】図６は、本実施の形態における難読化装置の構成を示すブロック図である。
【図７】図７は、本実施の形態における難読化装置の動作を示すフローチャートである。
【図８】図８は、本実施の形態におけるオリジナルコードモジュールおよび難読化済みコードモジュールの一例を示す図である。
【図９】図９は、本実施の形態におけるブロックマッピングレポートの一例を示す図である。
【図１０】図１０は、本実施の形態におけるメトリクスレポートの一例を示す図である。
【図１１】図１１は、本実施の形態における結果レコードの一例を示す図である。
【図１２】図１２は、本実施の形態におけるパスの数え方を説明するための説明図である。
【図１３】図１３は、本実施の形態における実行パスのパターンに基づいて行われる難読化のフィードバックを説明するための説明図である。
【図１４】図１４は、本実施の形態における類似性に基づいて行われる難読化を説明するための説明図である。
【図１】
2009514060.tif 000015
【図２】
2009514060.tif 000016
【図３】
2009514060.tif 000017
【図４】
2009514060.tif 000018
【図５】
2009514060.tif 000019
【図６】
2009514060.tif 000020
【図７】
2009514060.tif 000021
【図８】
2009514060.tif 000022
【図９】
2009514060.tif 000023
【図１０】
2009514060.tif 000024
【図１１】
2009514060.tif 000025
【図１２】
2009514060.tif 000026
【図１３】
2009514060.tif 000027
【図１４】
2009514060.tif 000028
【国際調査報告】
2009514060.tif 000029
2009514060.tif 000030
2009514060.tif 000031