(57)【要約】【課題】高水準言語で記述されたソースコードの難読化を図る。【解決手段】入力部１１は、高水準言語で記述されたソースコードの入力を受け付ける。意味解析部１２は、入力部１１が受け付けたソースコードを中間表現に変換する。最適化部１３は、意味解析部１２が変換した中間表現に対してコンパイラ最適化処理を行う。生成部１５は、最適化部１３によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する。【選択図】図１
2013186647.tif 000002
【特許請求の範囲】
【請求項１】
高水準言語で記述されたソースコードの難読化を図る難読化装置であって、
高水準言語で記述されたソースコードの入力を受け付ける入力部と、
前記入力部が受け付けたソースコードを中間表現に変換する意味解析部と、
前記意味解析部が変換した中間表現に対してコンパイラ最適化処理を行う最適化部と、
前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する生成部と
を備えることを特徴とする難読化装置。
【請求項２】
前記生成部は、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、スクリプト言語で記述されたソースコードを生成する
ことを特徴とする請求項１に記載の難読化装置。
【請求項３】
前記生成部は、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、前記入力部が入力を受け付けたソースコードを記述する高水準言語と同じ高水準言語で記述されたソースコードを生成する
ことを特徴とする請求項１または請求項２に記載の難読化装置。
【請求項４】
前記意味解析部は、前記入力部が受け付けたソースコードを抽象構文木に変換し、
前記最適化部は、前記抽象構文木を静的単一代入形式に変換することでコンパイラ最適化処理を行う
ことを特徴とする請求項１から請求項３の何れか１項に記載の難読化装置。
【請求項５】
高水準言語で記述されたソースコードをコンピュータを用いて難読化する難読化方法であって、
前記コンピュータの入力部は、高水準言語で記述されたソースコードの入力を受け付け、
前記コンピュータの意味解析部は、前記入力部が受け付けたソースコードを中間表現に変換し、
前記コンピュータの最適化部は、前記意味解析部が変換した中間表現に対してコンパイラ最適化処理を行い、
前記コンピュータの生成部は、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する
ことを特徴とする難読化方法。
【請求項６】
高水準言語で記述されたソースコードの難読化を図る難読化装置を、
高水準言語で記述されたソースコードの入力を受け付ける入力部、
前記入力部が受け付けたソースコードを中間表現に変換する意味解析部、
前記意味解析部が変換した中間表現に対してコンパイラ最適化処理を行う最適化部、
前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する生成部
として機能させるための難読化プログラム。
【請求項７】
高水準言語で記述されたソースコードを中間表現に変換する工程、
前記中間表現に対してコンパイラ最適化処理を行う工程、
前記コンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する工程
からなる工程により得られる難読化されたソースコード。
【発明の詳細な説明】
【技術分野】
【０００１】
高水準言語で記述されたソースコードの難読化を図る難読化装置、難読化方法、及び難読化プログラム、並びに当該難読化方法によって難読化されたソースコードに関する。
【背景技術】
【０００２】
近年、ＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）を動的に表示するために、ＪａｖａＳｃｒｉｐｔ（登録商標）などのスクリプト言語によって記述されたソースコードをＨＴＭＬファイルに埋め込み、または参照させることで、ウェブブラウザに当該ソースコードを実行させる技術がある。これにより、クライアント装置は、動的な制御をする際にサーバ装置からの応答を待つ必要が無いため、高速に動的表現を実現することができる。また、サーバ装置は、通信負荷及び計算負荷を減少させることができる。
【０００３】
スクリプト言語で記述されたソースコードは、コンピュータ環境に依存せずに実行できるよう、ソースコードの状態でクライアント装置に送信される。そして、クライアント装置がインタプリタや実行時コンパイラを用いて当該ソースコードを解析し、実行する。
【０００４】
そのため、スクリプト言語で記述されたソースコードを配信すると、その配信先で容易にソースコードの内容を確認することができてしまうため、ソースコードの製作者のノウハウが流出してしまうという問題があった。
【０００５】
そこで、従来、ソースコードの難読化技術が開発されている。非特許文献１には、難読化の施されたＪａｖａＳｃｒｉｐｔ（登録商標）を用いたリダイレクションスパムについて記載されている。また、非特許文献２には、オブジェクト指向のスクリプトでの、クラスの融合による難読化について記載されている。また、非特許文献３では、難読化と圧縮のためのツールが公開されている。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Ｋｕｍａｒ  Ｃｈｅｌｌａｐｉｌｌａ、Ａｌｅｘｅｙ  Ｍａｙｋｏｖ、「Ａ  ｔａｘｏｎｏｍｙ  ｏｆ  ＪａｖａＳｃｒｉｐｔ  ｒｅｄｉｒｅｃｔｉｏｎ  ｓｐａｍ」、ＡＩＲＷｅｂ  ‘０７  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ３ｒｄ  ｉｎｔｅｒｎａｔｉｏｎａｌ  ｗｏｒｋｓｈｏｐ  ｏｎ  Ａｄｖｅｒｓａｒｉａｌ  ｉｎｆｏｒｍａｔｉｏｎ  ｒｅｔｒｉｅｖａｌ  ｏｎ  ｔｈｅ  ｗｅｂ、ＡＣＭ、ＵＳＡ、２００７年
【非特許文献２】Ｍｉｋｈａｉｌ  Ｓｏｓｏｎｋｉｎ、Ｇｌｅｂ  Ｎａｕｍｏｖｉｃｈ、Ｎａｓｉｒ  Ｍｅｍｏｎ、「Ｏｂｆｕｓｃａｔｉｏｎ  ｏｆ  ｄｅｓｉｇｎ  ｉｎｔｅｎｔ  ｉｎ  ｏｂｊｅｃｔ−ｏｒｉｅｎｔｅｄ  ａｐｐｌｉｃａｔｉｏｎｓ」、ＤＲＭ  ‘０３  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ３ｒｄ  ＡＣＭ  ｗｏｒｋｓｈｏｐ  ｏｎ  Ｄｉｇｉｔａｌ  ｒｉｇｈｔｓ  ｍａｎａｇｅｍｅｎｔ、ＡＣＭ、ＵＳＡ、２００３年
【非特許文献３】“／ｐａｃｋｅｒ／”、［ｏｎｌｉｎｅ］、Ｄｅａｎ  Ｅｄｗａｒｄｓ、［２０１２年０２月２８日検索］、インターネット〈ＵＲＬ：ｈｔｔｐ：／／ｄｅａｎ．ｅｄｗａｒｄｓ．ｎａｍｅ／ｐａｃｋｅｒ／〉
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、非特許文献１〜３の何れの難読化方法も、変数名の置換などによって難読化を施しているため、ソースコードの制御構造は変わらない。そのため、依然として解読が容易であるという問題がある。
本発明は、上記問題を解決するために、入力されたソースコードと制御構造及び変数名の構造的関係等が異なるが同一の動作を行うソースコードを生成する難読化装置、難読化方法、及び難読化プログラム、並びに当該難読化方法によって難読化されたソースコードを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は上記の課題を解決するためになされたものであり、高水準言語で記述されたソースコードの難読化を図る難読化装置であって、高水準言語で記述されたソースコードの入力を受け付ける入力部と、前記入力部が受け付けたソースコードを中間表現に変換する意味解析部と、前記意味解析部が変換した中間表現に対してコンパイラ最適化処理を行う最適化部と、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する生成部とを備えることを特徴とする。
【０００９】
また、本発明においては、前記生成部は、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、スクリプト言語で記述されたソースコードを生成することが好ましい。
【００１０】
また、本発明においては、前記生成部は、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、前記入力部が入力を受け付けたソースコードを記述する高水準言語と同じ高水準言語で記述されたソースコードを生成することが好ましい。
【００１１】
また、本発明においては、前記意味解析部は、前記入力部が受け付けたソースコードを抽象構文木に変換し、前記最適化部は、前記抽象構文木を静的単一代入形式に変換することでコンパイラ最適化処理を行うことが好ましい。
【００１２】
また、本発明は、高水準言語で記述されたソースコードをコンピュータを用いて難読化する難読化方法であって、前記コンピュータの入力部は、高水準言語で記述されたソースコードの入力を受け付け、前記コンピュータの意味解析部は、前記入力部が受け付けたソースコードを中間表現に変換し、前記コンピュータの最適化部は、前記意味解析部が変換した中間表現に対してコンパイラ最適化処理を行い、前記コンピュータの生成部は、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成することを特徴とする。
【００１３】
また、本発明は、高水準言語で記述されたソースコードの難読化を図る難読化装置を、高水準言語で記述されたソースコードの入力を受け付ける入力部、前記入力部が受け付けたソースコードを中間表現に変換する意味解析部、前記意味解析部が変換した中間表現に対してコンパイラ最適化処理を行う最適化部、前記最適化部によってコンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する生成部として機能させるための難読化プログラムである。
【００１４】
また、本発明は、高水準言語で記述されたソースコードを中間表現に変換する工程、前記中間表現に対してコンパイラ最適化処理を行う工程、前記コンパイラ最適化処理がなされた中間表現に基づいて、高水準言語で記述されたソースコードを生成する工程からなる工程により得られる難読化されたソースコードである。
【発明の効果】
【００１５】
本発明によれば、難読化装置は、入力されたソースコードの中間表現に対してコンパイラ最適化処理を行った後に、当該中間表現に基づいて高水準言語で記述されたソースコードを生成する。これにより、難読化装置は、入力されたソースコードと制御構造及び変数名の構造的関係等が異なるが同一の動作を行う、難読化されたソースコードを生成することができる。
【図面の簡単な説明】
【００１６】
【図１】本発明の一実施形態による難読化装置の構成を示す概略ブロック図である。
【図２】難読化装置の動作を示すフローチャートである。
【図３】難読化装置に入力されたソースコードと難読化装置が出力したソースコードの例を示す図である。
【発明を実施するための形態】
【００１７】
以下、図面を参照しながら本発明の実施形態について詳しく説明する。
図１は、本発明の一実施形態による難読化装置１０の構成を示す概略ブロック図である。本発明による難読化装置１０は、所定のスクリプト言語（例えば、ＪａｖａＳｃｒｉｐｔ（登録商標））で記述されたソースコードを難読化するものである。
【００１８】
難読化装置１０は、入力部１１、意味解析部１２、最適化部１３、変換辞書記憶部１４、生成部１５を備える。
入力部１１は、所定のスクリプト言語で記述されたソースコードの入力を受け付ける。
【００１９】
意味解析部１２は、入力部１１が受け付けたソースコードの字句解析及び構文解析を行うことで、ソースコードの構造を示すＡＳＴ（Ａｂｓｔｒａｃｔ  Ｓｙｎｔａｘ  Ｔｒｅｅ：抽象構文木）を生成する。なお、ＡＳＴとは、ソースコードの構文解析の結果を木構造で表したソースコードの中間表現の一種である。
【００２０】
最適化部１３は、意味解析部１２が生成したＡＳＴに対して所定のコンパイラ最適化処理を行う。なお、コンパイラ最適化処理とは、ＡＳＴが示す構造から機械語コードを生成した場合に、当該機械語コードの実行時間が短くなり、占有するメモリ容量が少なくなるように制御構造を書き換える処理である。コンパイラ最適化処理のアルゴリズムとしては、冗長性の除去、定数畳み込み、レジスタ割り付けなどが知られている。本実施形態では、ＡＳＴをＳＳＡ（Ｓｔａｔｉｃ  Ｓｉｎｇｌｅ  Ａｓｓｉｇｎｍｅｎｔ：静的単一代入）形式に変換することで、コンパイラ最適化処理を行う。なお、ＳＳＡとは、全ての変数への代入回数が１回になり、かつ全ての命令文がスリーアドレスコードとなる形式の中間表現である。
【００２１】
変換辞書記憶部１４は、ＳＳＡの命令種別と、当該命令種別に対応する所定のスクリプト言語の構文とを関連付けた変換辞書を記憶する。なお、ＳＳＡの命令種別としては、ｇｏｔｏ文、条件文、四則演算、余剰演算、比較演算などが挙げられ、変換辞書には、これらの命令種別それぞれに対してスクリプト言語の構文が関連付けられている。
生成部１５は、変換辞書記憶部１４が記憶する変換辞書に基づいて、最適化部１３によってコンパイラ最適化処理がなされたＡＳＴからソースコードを生成する。
【００２２】
次に、本実施形態による難読化装置１０の動作について説明する。
図２は、難読化装置１０の動作を示すフローチャートである。
利用者が、所定のスクリプト言語で記述されたソースコードを難読化装置１０に入力すると、難読化装置１０の入力部１１は、当該ソースコードの入力を受け付ける（ステップＳ１）。次に、意味解析部１２は、入力部１１が受け付けたソースコードの字句解析を行い、ソースコードをトークン単位に分割する（ステップＳ２）。なお、トークンとは、定数名、変数名、関数名、演算子など、ソースコードを構成する最小単位のことをいう。次に、意味解析部１２は、トークン単位に分割したソースコードの構造解析を行い、各トークンをノードとするＡＳＴを生成する（ステップＳ３）。
【００２３】
次に、最適化部１３は、意味解析部１２が生成したＡＳＴをＳＳＡに変換（コンパイラ最適化）する（ステップＳ４）。このとき、コンパイラ最適化により、最適化部１３が生成するＳＳＡの制御構造は、入力部１１が受け付けたソースコードの制御構造と異なるものとなる。
次に、生成部１５は、最適化部１３が変換したＳＳＡの各命令を、変換辞書記憶部１４が記憶する変換辞書に基づいて所定のスクリプト言語の構文に書き換えることで、スクリプト言語で記述されたソースコードを生成する（ステップＳ５）。
【００２４】
図３は、難読化装置１０に入力されたソースコードと難読化装置１０が出力したソースコードの例を示す図である。
図３（Ａ）に示すソースコードは、難読化装置１０による難読化が施される前のソースコードである。図３（Ａ）は、以下に示す処理を実行させるソースコードである。変数ｉ及びｊの初期値は０である。変数ｊに変数ｉを加算する処理を１回実行するたびに、変数ｉに１が加えられる。当該加算処理が１０回実行されると変数ｉの値は１０になり、条件が成り立たなくなるため、ループを終了し、変数ｊの値を返す。
【００２５】
他方、図３（Ｂ）に示すソースコードは、難読化装置１０によって難読化されたソースコードである。図３（Ｂ）に示すソースコードには、図３（Ａ）で用いられているｆｏｒ文が含まれない。これは、最適化部１３が、ＡＳＴをＳＳＡに変換する際に、ｆｏｒ文をｇｏｔｏ文に置換するためである。なお、図３（Ｂ）に示すソースコードには、ｇｏｔｏ文ではなくｗｈｉｌｅ文及びｓｗｉｔｃｈ文が用いられている。これは、図３に示す例において変換後のスクリプト言語であるＪａｖａＳｃｒｉｐｔ（登録商標）でｇｏｔｏ文が定義されていないため、生成部１５が、ｇｏｔｏ文をｗｈｉｌｅ文とｓｗｉｔｃｈ文の組み合わせに変換したことによる。なお、このようなＳＳＡと変換後のスクリプト言語との対応関係を示す変換辞書は、変換辞書記憶部１４が記憶している。
【００２６】
このように、上述したステップＳ１〜ステップＳ５の工程によって難読化されたソースコードは、ステップＳ１で入力部１１が受け付けたソースコードと異なる制御構造のソースコードになる。また、最適化部１３が実施するコンパイラ最適化処理は、本来、高水準言語で記述されたソースコードを機械語コードにコンパイルするために用いる処理であるため、生成部１５が生成したソースコードは、機械語コードと同程度の複雑さを有するソースコードとなる。つまり、難読化装置１０が生成したソースコードを読み解くのは、コンパイルされたプログラムのリバースエンジニアリングを行うのと同じ程度に困難であるといえる。他方、最適化部１３が実施するコンパイラ最適化処理では、不要な処理（ダミーコード）が追加されることがないため、入力部１１が入力を受け付けたソースコードと比較して著しく処理速度が落ちるというようなことがない。
【００２７】
したがって、難読化装置１０が生成したソースコードを、ＨＴＭＬファイルに埋め込み、または参照させたとしても、当該ソースコードを読み取られ、ノウハウが流出してしまうことを防ぐことができる。
【００２８】
なお、ステップＳ１〜ステップＳ４の処理は、高水準言語で記述されたソースコードを機械語コードにコンパイルするコンパイラにおいて用いられている技術である。他方、トランスレータなどが高水準言語から高水準言語への変換を行う場合、ステップＳ４の処理を行わず、ＡＳＴから直接高水準言語への変換を行っている。これは、コンパイラ最適化が機械語コードへのコンパイルのために用いられている技術であり、トランスレータには不要な処理だからである。つまり、本実施形態による難読化装置１０は、機械語コードへのコンパイルに用いられていたコンパイラ最適化処理を、ソースコードの難読化という効果を得るために、あえて高水準言語への変換に適用したものである。
【００２９】
また、ステップＳ１〜ステップＳ４の処理がコンパイラにおいて用いられている技術であることから、難読化装置１０によって難読化されたソースコードが、難読化装置１０に入力されたソースコードと同じ動作を行うことは、明らかである。
【００３０】
以上、図面を参照してこの発明の一実施形態について詳しく説明してきたが、具体的な構成は上述のものに限られることはなく、この発明の要旨を逸脱しない範囲内において様々な設計変更等をすることが可能である。
例えば、本実施形態では、入力部１１が受け付けるソースコードを記述する高水準言語と、生成部１５が生成するソースコードを記述する高水準言語が同一のスクリプト言語である場合を説明したが、これに限られない。例えば、Ｃ言語などのコンパイラ言語で記述されたソースコードを入力してＪａｖａＳｃｒｉｐｔ（登録商標）などのスクリプト言語のソースコードを得ても良いし、逆にスクリプト言語のソースコードを入力してコンパイラ言語のソースコードを得ても良い。つまり、難読化装置１０をトランスレータとして用いても良い。但し、出力がコンパイラ言語である場合、当該ソースコードは実行時にコンパイルされるため、もともとノウハウの流出のおそれが少なく、本実施形態による難読化方法を用いるメリットは少ない。
【００３１】
また、例えば本実施形態では、最適化部１３は、ＡＳＴをＳＳＡに変換することでコンパイラ最適化を行う場合について説明したが、これに限られない。例えばＣＰＳ（Ｃｏｎｔｉｎｕａｔｉｏｎ  Ｐａｓｓｉｎｇ  Ｓｔｙｌｅ）への変換によってコンパイラ最適化を行っても良いし、スリーアドレスコードへの変換によってコンパイラ最適化を行っても良い。また、ＡＳＴから他の中間表現への変換によってコンパイラ最適化を行う方法に限られず、冗長性の除去、定数畳み込み、レジスタ割り付けなどのアルゴリズムを個々に実行することで行っても良い。
【００３２】
上述の難読化装置１０は内部に、コンピュータシステムを有している。そして、上述した各処理部の動作は、難読化プログラムとしてコンピュータ読み取り可能な記録媒体に記憶されており、この難読化プログラムをコンピュータが読み出して実行することによって、上記処理が行われる。ここでコンピュータ読み取り可能な記録媒体とは、磁気ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、半導体メモリ等をいう。また、この難読化プログラムを通信回線によってコンピュータに配信し、この配信を受けたコンピュータが当該難読化プログラムを実行するようにしても良い。
【００３３】
また、上記難読化プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【符号の説明】
【００３４】
１０…難読化装置  １１…入力部  １２…意味解析部  １３…最適化部  １４…変換辞書記憶部  １５…生成部
【図１】
2013186647.tif 000003
【図２】
2013186647.tif 000004
【図３】
2013186647.tif 000005