(57)【要約】      （修正有）【課題】たとえ一つの難読化プログラム（難読化されたプログラム）に対して難読化の解読に成功したとしても、他の難読化プログラムの難読化を解読するためには同等のコストがかかるようにすることにより、難読化プログラムに対する不正行為の防止を図る。【解決手段】乱数を生成する乱数生成部１３と、該生成された乱数に基づいて、入力プログラムを変形するカスタム難読化処理部１４とを備え、入力プログラムのプログラムサイズに応じて調整される冗長的な処理が入力プログラムに追加される。難読化はプログラム配布毎に行われ、難読化されたプログラムは通信回線より送信される。【選択図】図１
2005266887.tif 000002
【特許請求の範囲】
【請求項１】
乱数を生成する乱数生成手段と、
前記生成された乱数に基づいて、入力プログラムを変形するカスタム難読化処理手段と、
を備えたことを特徴とするプログラム難読化装置。
【請求項２】
前記カスタム難読化処理手段は、入力プログラムに冗長的な処理を追加することを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記追加される処理量は、入力プログラムのプログラムサイズに応じて調節されることを特徴とする請求項２に記載のプログラム難読化装置。
【請求項４】
請求項１から３のいずれかの項に記載のプログラム難読化装置と、
前記プログラム難読化装置によって難読化されたプログラムを通信回線を介して送信する送信手段と、
プログラム配布毎に、前記プログラム難読化装置によってオリジナルプログラムを難読化する配布制御手段と、
を備えたことを特徴とするプログラム配布システム。
【請求項５】
乱数を生成する機能と、
前記生成された乱数に基づいて、入力プログラムを変形する機能と、
をコンピュータに実現させることを特徴とするコンピュータプログラム。
【請求項６】
前記入力プログラムの変形は、入力プログラムに冗長的な処理を追加することを特徴とする請求項５に記載のコンピュータプログラム。
【請求項７】
前記追加される処理量は、入力プログラムのプログラムサイズに応じて調節されることを特徴とする請求項６に記載のコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの難読化装置、プログラム配布システム、コンピュータプログラムに関する。
【背景技術】
【０００２】
近年、コンピュータを利用した様々なサービスが提供されている。このサービス提供システムにおいて、サービス提供者はユーザに対して当該サービスを利用するためのプログラムを提供する。そして、ユーザは受け取ったプログラムをコンピュータ上で実行することにより、当該サービスを受けることができる。また、そのサービス提供者からユーザに提供されるプログラムに対して、何らかの秘密情報（例えば暗号化用の鍵）を隠蔽することが考えられる。このような場合、プログラムを変形することによって、攻撃者が当該プログラムを理解しにくいようにすることが行われている。この技術は一般に難読化技術と称されている。そして、その難読化技術は、プログラムの解析を困難にする用途にも使用される。
【０００３】
従来の難読化技術としては、プログラム内で使用される変数名を、人が解釈し辛い名称に変更するものが知られている。或いは、プログラムに対して、プログラム内で呼び出される関数へのポインタ変数を新たに複数個設けるとともに、該関数ポインタ変数のいずれかに関数のアドレスを代入する命令文を複数個挿入し、関数ポインタ変数の値に応じて関数を呼び出すように変換するものが知られている（例えば、特許文献１参照）。
【特許文献１】特開２００３−３３７６２９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかし、上述した従来の難読化技術では、プログラムの解析により一旦その難読化の仕方が判明してしまうと、当該難読化を解除する解除プログラムが作成される可能性がある。例えば、有効期限付きのプログラムに対してプログラム内に配置された有効期限日情報が難読化により隠蔽されていたとしても、この難読化手法の解析により作成された解除プログラムによって有効期限日情報が特定されることにより、有効期限が改竄されてプログラムの不正使用が可能となる。さらに、その解除プログラムによれば、同じ難読化手法により難読化されたプログラムに対して一律に適用することができ、甚大な被害がもたらされる虞がある。
【０００５】
本発明は、このような事情を考慮してなされたもので、その目的は、たとえ一つの難読化プログラム（難読化されたプログラム）に対して難読化の解読に成功したとしても、他の難読化プログラムの難読化を解読するためには同等のコストがかかるようにすることにより、難読化プログラムに対する不正行為の防止効果を得ることができるプログラム難読化装置を提供することにある。
【０００６】
また、本発明の他の目的は、本発明のプログラム難読化装置を備えたプログラム配布システムを提供することにある。
【０００７】
また、本発明の他の目的は、本発明のプログラム難読化装置をコンピュータを利用して実現するためのコンピュータプログラムを提供することにある。
【課題を解決するための手段】
【０００８】
上記の課題を解決するために、本発明に係るプログラム難読化装置は、乱数を生成する乱数生成手段と、前記生成された乱数に基づいて、入力プログラムを変形するカスタム難読化処理手段とを備えたことを特徴としている。
【０００９】
本発明に係るプログラム難読化装置においては、前記カスタム難読化処理手段は、入力プログラムに冗長的な処理を追加することを特徴とする。
【００１０】
本発明に係るプログラム難読化装置においては、前記追加される処理量は、入力プログラムのプログラムサイズに応じて調節されることを特徴とする。
【００１１】
本発明に係るプログラム配布システムは、請求項１から３のいずれかの項に記載のプログラム難読化装置と、前記プログラム難読化装置によって難読化されたプログラムを通信回線を介して送信する送信手段と、プログラム配布毎に、前記プログラム難読化装置によってオリジナルプログラムを難読化する配布制御手段とを備えたことを特徴としている。
【００１２】
本発明に係るコンピュータプログラムは、乱数を生成する機能と、前記生成された乱数に基づいて、入力プログラムを変形する機能とをコンピュータに実現させることを特徴としている。
【００１３】
本発明に係るコンピュータプログラムにおいては、前記入力プログラムの変形は、入力プログラムに冗長的な処理を追加することを特徴とする。
【００１４】
本発明に係るコンピュータプログラムにおいては、前記追加される処理量は、入力プログラムのプログラムサイズに応じて調節されることを特徴とする。
これにより、前述のプログラム難読化装置がコンピュータを利用して実現できるようになる。
【発明の効果】
【００１５】
本発明によれば、乱数に基づいた難読化が入力プログラムに対して行われるので、たとえ一つの難読化プログラム（難読化されたプログラム）に対して難読化の解読に成功したとしても、他の難読化プログラムの難読化を解読するためには同等のコストがかかる。これにより、難読化プログラムに対する不正行為の防止効果を得ることができる。
【発明を実施するための最良の形態】
【００１６】
以下、図面を参照し、本発明の一実施形態について説明する。
図１は、本発明の一実施形態に係るプログラム難読化装置１の構成を示すブロック図である。図１において、プログラム１００は、難読化前のオリジナルプログラムである。このプログラム１００が難読化対象のプログラムとしてプログラム難読化装置１に入力される。
【００１７】
プログラム難読化装置１において、インターフェース１１は、ＧＵＩ（Graphical User Interface）等によりプログラム１００を入力する。基本難読化処理部１２は、プログラム１００内の変数名の変更等の一般的な難読化処理を行う。乱数生成部１３は、乱数生成関数１３ａとハッシュ関数１３ｂを有し、乱数を生成する。カスタム難読化処理部１４は、プログラム解析モジュール１４ａと難読化処理関数ライブラリ１４ｂを有する。カスタム難読化処理部１４は、乱数生成部１３により生成された乱数を使用してカスタム難読化処理を行う。プログラム１００は、上記基本難読化処理部１２による基本難読化処理とカスタム難読化処理部１４によるカスタム難読化処理とが施されて、難読化プログラム２００（難読化されたプログラム）として出力される。
【００１８】
次に、上記図１のプログラム難読化装置１におけるカスタム難読化に係る動作を説明する。
先ず、プログラム１００が入力されると、基本難読化処理部１２が、該入力プログラム１００に対して変数名の変更等の基本難読化を行う。この基本難読化後のプログラム１１０はカスタム難読化処理部１４に入力される。また、乱数生成部１３が、乱数生成関数１３ａを使用して、今回のカスタム難読化処理用の乱数を発生する。そして、この乱数をハッシュ関数１３ｂに入力してハッシュ関数１３ｂのＮビットの出力値（以下、Ｎビットの乱数初期値と称する）を得る。
【００１９】
次いで、乱数生成部１３は、そのＮビットの乱数初期値のビット列をカスタム難読化手法の個数分に分割する。次いで、その分割した個々のビット列がそれぞれ２Ｎビットになるまで、乱数生成関数１３ａにより更に別の乱数を発生させて各ビット列と結合する。次いで、これらカスタム難読化手法の個数分の２Ｎビットのビット列を、それぞれハッシュ関数１３ｂに入力してハッシュ関数１３ｂのＮビットの出力値を得る。これにより、Ｎビットのハッシュ関数出力値がカスタム難読化手法の個数分だけ得られる。これらスタム難読化手法の個数分の「Ｎビットのハッシュ関数出力値（以下、Ｎビットの乱数データと称する）」はカスタム難読化処理部１４に入力される。なお、上記カスタム難読化手法の個数は、難読化処理関数ライブラリ１４ｂに格納されている難読化処理関数の個数に対応している。
【００２０】
次いで、カスタム難読化処理部１４は、乱数生成部１３からのＮビットの乱数データを使用して、難読化処理関数ライブラリ１４ｂ内の難読化処理関数によるカスタム難読化を基本難読化後のプログラム１１０に対して行う。このカスタム難読化の際には、難読化処理関数毎に異なるＮビットの乱数データを使用する。次いで、カスタム難読化処理部１４は、基本難読化後のプログラム１１０に対してカスタム難読化処理を行った難読化プログラム２００を出力する。
【００２１】
上記した難読化処理関数には各種あるが、以下、この難読化処理関数の例を挙げてカスタム難読化処理を説明する。
【００２２】
［冗長度の導入例１］
この例は、冗長度の導入関数１を使用するカスタム難読化処理である。冗長度の導入関数１は、Ｎビットの乱数データを、「Ｎ＝ｎ＋ｌ＋ｍ」を満足する３つの乱数ビット列（ｎビット、ｌビット及びｍビットの各ビット列）に分割する。そして、ｎビットの変数名（ダミーの変数名）を新たに生成し、このダミー変数名を宣言する宣言文を、基本難読化後プログラム１１０内の値ｍで指定される位置にｌ行追加する。
基本難読化後プログラム１１０内の例えば値ｍで指定される位置は、プログラム解析モジュール１４ａが基本難読化後プログラム１１０内を検索する。これは以下の例でも同様である。
【００２３】
［冗長度の導入例２］
この例は、冗長度の導入関数２を使用するカスタム難読化処理である。冗長度の導入関数２は、Ｎビットの乱数データを、「Ｎ＝ｎ＋ｌ＋ｍ＋ｐ」を満足する４つの乱数ビット列（ｎビット、ｌビット、ｍビット及びｐビットの各乱数ビット列）に分割する。そして、ｎビットの変数名（ダミーの変数名）を新たに生成し、このダミー変数名を宣言する宣言文を、基本難読化後プログラム１１０内の値ｍで指定される部分にｌ行追加する。また、ｐビットの乱数ビット列を使用して、上記宣言したｎビットの変数名のダミー変数を用いたダミー処理を新たに生成し、基本難読化後プログラム１１０内に追加する。このダミー処理の生成方法は、後述する処理手順の変更例と同様である。
【００２４】
［冗長度の導入例３］
この例は、冗長度の導入関数３を使用するカスタム難読化処理である。冗長度の導入関数３は、Ｎビットの乱数データを、「Ｎ＝ａ＋ｂ」を満足する２つの乱数ビット列（ａビット及びｂビットの各乱数ビット列）に分割する。そして、事前に作成されているａ個のダミーコードサンプルを有するサンプルテーブルから、値ａに基づいてダミーコードサンプルを選択する。そして、この選択したダミーコードサンプルを、基本難読化後プログラム１１０内の値ｂで指定される位置に追加する。
【００２５】
［処理手順の変更例１］
この例は、処理手順の変更関数１を使用するカスタム難読化処理である。処理手順の変更関数１は、Ｎビットの乱数データを、「Ｎ＝ｓ＋ｔ＋ｕ＋ｖ」を満足する４つの乱数ビット列（ｓビット、ｔビット、ｕビット及びｖビットの各乱数ビット列）に分割する。そして、擬似的な処理を基本難読化後プログラム１１０内の値ｖで指定される位置に追加する。処理手順の変更関数１はその擬似的な処理を次に示す方法で新たに作成する。
【００２６】
先ず、基本難読化後プログラム１１０内で使用されている変数の中から値ｓで指定される変数を選択する。そして、この値ｓで指定された変数と値ｕを入力として、基本難読化後プログラム１１０内の値ｔで指定される演算を行う処理を作成する。さらに、この演算処理の逆演算を行う処理を作成する。そして、これら演算処理及びこの逆演算処理を擬似的な処理とする。この擬似的な処理は、例えば変数に対して所定の値を加算して減算する等のプログラムが実現する機能を変更しないものである。
基本難読化後プログラム１１０内の例えば値ｓで指定される変数は、プログラム解析モジュール１４ａが基本難読化後プログラム１１０内を検索する。また、例えば値ｔで指定される演算は、プログラム解析モジュール１４ａが基本難読化後プログラム１１０内を検索する。これらは以下の例でも同様である。
【００２７】
［処理手順の変更例２］
この例は、処理手順の変更関数２を使用するカスタム難読化処理である。処理手順の変更関数２は、Ｎビットの乱数データを、「Ｎ＝ｅ＋ｆ＋ｇ＋ｈ＋ｉ」を満足する５つの乱数ビット列（ｅビット、ｆビット、ｇビット、ｈビット及びｉビットの各乱数ビット列）に分割する。そして、擬似的な処理を基本難読化後プログラム１１０内の値ｉで指定される位置に追加する。処理手順の変更関数２はその擬似的な処理を次に示す方法で新たに作成する。
【００２８】
先ず、基本難読化後プログラム１１０内で使用されている変数の中から値ｅで指定される変数を選択する。そして、この値ｅで指定された変数と値ｇを入力として、基本難読化後プログラム１１０内の値ｆで指定される演算を行う処理を作成する。さらに、この演算処理をｈ回繰り返して行うループ処理を作成する。さらに、この演算ループ処理についての逆演算を行う処理を作成する。そして、これら演算ループ処理及びこの逆演算処理を擬似的な処理とする。この擬似的な処理も、プログラムが実現する機能を変更しないものである。
【００２９】
なお、カスタム難読化処理部１４は、上記した各種の難読化処理関数を単独で使用してカスタム難読化を行ってもよく、或いは複数の難読化処理関数を使用してカスタム難読化を行ってもよい。また、難読化対象であるプログラム１００のセキュリティレベルが設定された場合、この設定されたセキュリティレベルに応じて難読化処理関数の使用種類、使用回数を決定するようにしてもよい。
【００３０】
また、オリジナルのプログラム１００のプログラムサイズに応じて、難読化で追加するダミーデータ量を調節することが望ましい。これにより、難読化後のプログラムの難読化度合いを適正なものにすることができる。例えば、難読化後のプログラムサイズがオリジナルプログラムの略２倍になるように調節する。
【００３１】
なお、本実施形態に係るプログラム難読化装置は、専用のハードウェアにより実現されるものであってもよく、あるいはパーソナルコンピュータ等のコンピュータシステムにより構成され、図１に示される装置の各機能を実現するためのプログラムを実行することによりその機能を実現させるものであってもよい。
【００３２】
また、そのプログラム難読化装置には、周辺機器として入力装置、表示装置等（いずれも図示せず）が接続されるものとする。ここで、入力装置とはキーボード、マウス等の入力デバイスのことをいう。表示装置とはＣＲＴ（Cathode Ray Tube）や液晶表示装置等のことをいう。
また、上記周辺機器については、プログラム難読化装置に直接接続するものであってもよく、あるいは通信回線を介して接続するようにしてもよい。
【００３３】
また、図１に示すプログラム難読化装置の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することによりプログラム難読化処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものであってもよい。
また、「コンピュータシステム」は、ＷＷＷシステムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、フラッシュメモリ等の書き込み可能な不揮発性メモリ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。
【００３４】
さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ（例えばＤＲＡＭ（Dynamic Random Access Memory））のように、一定時間プログラムを保持しているものも含むものとする。
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【実施例】
【００３５】
図２は、本発明に係るプログラム難読化装置を備えたプログラム配布システムの一実施例である。
図２において、プログラム提供サイト１ａは、インターネット等の通信ネットワークに接続された例えばウェブサーバであり、クライアント端末（ＰＣ；パーソナルコンピュータ）３０からアクセス可能となっている。プログラム提供サイト１ａは、カスタム難読化処理プログラム２０を有しており、上記図１のプログラム難読化装置１が有する機能のうち、少なくとも上記図１の乱数生成部１３に係る機能と、カスタム難読化処理部１４に係る機能とを実現する。
【００３６】
次に、図２のプログラム配布システムの動作を説明する。ここでは、有効期限付きのコンテンツプログラムを有償で配布する場合を例に挙げて説明する。
先ず、ユーザは、クライアントＰＣ３０を使用してプログラム提供サイト１ａにアクセスし、コンテンツプログラム取得の対価を支払うと共にコンテンツプログラムのダウンロードを要求する。この要求により、プログラム提供サイト１ａは、オリジナルプログラム１００を入力として、カスタム難読化処理プログラム２０を起動し、少なくともカスタム難読化処理を実行する。このカスタム難読化処理では、オリジナルプログラム１００内の少なくとも有効期限日情報を難読化対象とする。これにより、有効期限日情報が難読化された当該ユーザ向けの難読化プログラム２００（例えば図２の難読化プログラム２００ａ）が得られる。次いで、プログラム提供サイト１ａは、当該ダウンロード要求に対する応答として、その得られた難読化プログラム２００を返信する。ユーザは、この難読化プログラム２００を受信して使用することができる。但し、難読化プログラム２００に付加された有効期限が過ぎると、使用不能となる。
【００３７】
これにより、複数のユーザから同じオリジナルプログラム１００が要求された場合、それぞれの乱数に基づいたカスタム難読化が行われた難読化プログラム２００が各ユーザに配布される。例えば図２に示されるように、３人のユーザから同じオリジナルプログラム１００が要求されたとしても、それぞれの乱数に基づいたカスタム難読化が行われた難読化プログラム２００ａ〜ｃが各ユーザに配布される。従って、たとえ一つの難読化プログラム２００が解読されて有効期限情報が判明したとしても、他の難読化プログラム２００に対しては同じ解読方法を使用しても有効期限情報を判明させることができない。これにより、難読化プログラム２００の個々に対して同等の解読コストがかかることになる。これは、難読化プログラムに対して不正を働く者への抑止力となりうる。この結果、難読化プログラムに対する不正行為を防止する効果を得ることができる。これにより、ユーザに提供するプログラムを保護することが可能となり、より安全なシステム構築を行うことができる。特に、同一のオリジナルプログラムを複数人に配布するサービスにおいて、安全性が向上する。
【００３８】
なお、本発明は、携帯電話機上で動作するプログラムなど、各種のプログラムに適用することができる。また、携帯電話網等の通信ネットワークに接続される機器に対して、通信回線を介して配布するプログラムに対して広く適用可能である。
【００３９】
以上、本発明の実施形態を図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の設計変更等も含まれる。
【図面の簡単な説明】
【００４０】
【図１】本発明の一実施形態に係るプログラム難読化装置１の構成を示すブロック図である。
【図２】本発明に係るプログラム難読化装置を備えたプログラム配布システムの一実施例である。
【符号の説明】
【００４１】
１…プログラム難読化装置、１ａ…プログラム提供サイト、１１…インターフェース、１２…基本難読化処理部、１３…乱数生成部、１３ａ…乱数生成関数、１３ｂ…ハッシュ関数、１４…カスタム難読化処理部、１４ａ…プログラム解析モジュール、１４ｂ…難読化処理関数ライブラリ、２０…カスタム難読化処理プログラム、１００…プログラム（難読化される前のプログラム）、２００…難読化プログラム（難読化されたプログラム）。
【図１】
2005266887.tif 000003
【図２】
2005266887.tif 000004