TOP > 国内特許検索 > プログラム変換装置、実行支援装置、それらの方法およびそれらのコンピュータ・プログラム > 明細書

明細書 :プログラム変換装置、実行支援装置、それらの方法およびそれらのコンピュータ・プログラム

発行国 日本国特許庁(JP)
公報種別 特許公報(B2)
特許番号 特許第4669934号 (P4669934)
公開番号 特開2006-344160 (P2006-344160A)
登録日 平成23年1月28日(2011.1.28)
発行日 平成23年4月13日(2011.4.13)
公開日 平成18年12月21日(2006.12.21)
発明の名称または考案の名称 プログラム変換装置、実行支援装置、それらの方法およびそれらのコンピュータ・プログラム
国際特許分類 G06F  21/22        (2006.01)
FI G06F 9/06 660L
請求項の数または発明の数 18
全頁数 14
出願番号 特願2005-171372 (P2005-171372)
出願日 平成17年6月10日(2005.6.10)
審査請求日 平成20年5月28日(2008.5.28)
特許権者または実用新案権者 【識別番号】504143441
【氏名又は名称】国立大学法人 奈良先端科学技術大学院大学
発明者または考案者 【氏名】玉田 春昭
【氏名】門田 暁人
【氏名】中村 匡秀
【氏名】松本 健一
個別代理人の代理人 【識別番号】100064746、【弁理士】、【氏名又は名称】深見 久郎
【識別番号】100085132、【弁理士】、【氏名又は名称】森田 俊雄
【識別番号】100083703、【弁理士】、【氏名又は名称】仲村 義平
【識別番号】100096781、【弁理士】、【氏名又は名称】堀井 豊
【識別番号】100098316、【弁理士】、【氏名又は名称】野田 久登
【識別番号】100109162、【弁理士】、【氏名又は名称】酒井 將行
審査官 【審査官】深沢 正志
参考文献・文献 特開2003-380755(JP,A)
福島 和英,櫻井幸一,メソッド分散によるJava言語の難読化手法の提案,コンピュータセキュリティシンポジウム2002論文集,日本,社団法人情報処理学会,2002年10月30日,p.191-196
調査した分野 G06F 21/20 - 21/24
特許請求の範囲 【請求項1】
本体プログラムを難読化するプログラム変換装置であって、
前記本体プログラムのメソッドの呼出しの記述を動的呼出しの記述に変更するための呼出変更手段と、
前記呼出変更手段によって変更された後の動的呼出しを指定する文字列を暗号化して前記本体プログラムを変更するための暗号化手段とを含む、プログラム変換装置。
【請求項2】
前記プログラム変換装置が、フィールドを参照する記述またはフィールドに値を代入する記述を、それぞれフィールドを動的に参照する記述またはフィールドに値を動的に代入する記述に変更するためのフィールド変更手段と、
前記フィールド変更手段によって変更された後の記述に含まれるフィールドの名称を暗号化して前記本体プログラムを変更するための暗号化手段とを含む、請求項1記載のプログラム変換装置。
【請求項3】
前記呼出変更手段は、前記動的呼出しの記述を別のクラスのメソッドを経由して呼出すように変更し、
前記フィールド変更手段は、フィールドを動的に参照する記述またはフィールドに値を動的に代入する記述を前記別のクラスのメソッドを経由して行なうように変更する、請求項2記載のプログラム変換装置。
【請求項4】
前記プログラム変換装置はさらに、前記本体プログラムに含まれる変数の型を変更するための変数型変更手段を含む、請求項1~3のいずれかに記載のプログラム変換装置。
【請求項5】
難読化された本体プログラムの実行を支援する実行支援装置であって、
前記難読化された本体プログラムからのメソッドの動的呼出しに応じて、暗号化後の値から文字列を復号するための復号手段と、
前記復号手段によって復号された文字列を用いてメソッドを実行するための実行手段とを含む、実行支援装置。
【請求項6】
前記実行支援装置が、前記難読化された本体プログラムからのフィールドの動的参照またはフィールドへの動的代入の要求に応じて、前記フィールドの名称を復号するための復号手段と、
前記復号手段によって復号された名称を用いてフィールドの動的参照またはフィールドの動的代入を行なうためのフィールドアクセス手段とを含む、請求項5記載の実行支援装置。
【請求項7】
コンピュータに本体プログラムを難読化させるプログラム変換方法であって、
前記本体プログラムのメソッドの呼出しの記述を動的呼出しの記述に変更するステップと、
前記変更された後の動的呼出しを指定する文字列を暗号化して前記本体プログラムを変更するステップとを含む、プログラム変換方法。
【請求項8】
前記プログラム変換方法が、フィールドを参照する記述またはフィールドに値を代入する記述を、それぞれフィールドを動的に参照する記述またはフィールドに値を動的に代入する記述に変更するステップと、
前記変更された後の記述に含まれるフィールドの名称を暗号化して前記本体プログラムを変更するステップとを含む、請求項7記載のプログラム変換方法。
【請求項9】
前記プログラム変換方法が、動的呼出しの記述を別のクラスのメソッドを経由して呼出すように変更するステップと、
フィールドを動的に参照する記述またはフィールドに値を動的に代入する記述を前記別のクラスのメソッドを経由して行なうように変更するステップとを含む、請求項8記載のプログラム変換方法。
【請求項10】
前記プログラム変換方法はさらに、前記本体プログラムに含まれる変数の型を変更するステップを含む、請求項7~9のいずれかに記載のプログラム変換方法。
【請求項11】
コンピュータに難読化された本体プログラムの実行を支援させる実行支援方法であって、
前記難読化された本体プログラムからのメソッドの動的呼出しに応じて、前記呼出しに含まれる暗号化後の値から文字列を復号するステップと、
前記復号された文字列を用いてメソッドを実行するステップとを含む、実行支援方法。
【請求項12】
前記実行支援方法が、前記難読化された本体プログラムからのフィールドの動的参照またはフィールドへの動的代入の要求に応じて、前記フィールドの名称を復号するステップと、
前記復号された名称を用いてフィールドの動的参照またはフィールドの動的代入を行なうステップとを含む、請求項11記載の実行支援方法。
【請求項13】
本体プログラムを難読化するプログラム変換方法をコンピュータに実行させるためのコンピュータ・プログラムであって、
前記プログラム変換方法は、前記本体プログラムのメソッドの呼出しの記述を動的呼出しの記述に変更するステップと、
前記変更された後の動的呼出しを指定する文字列を暗号化して前記本体プログラムを変更するステップとを含む、コンピュータ・プログラム。
【請求項14】
前記コンピュータ・プログラムが、フィールドを参照する記述またはフィールドに値を代入する記述を、それぞれフィールドを動的に参照する記述またはフィールドに値を動的に代入する記述に変更するステップと、
前記変更された後の記述に含まれるフィールドの名称を暗号化して前記本体プログラムを変更するステップとを含む、請求項13記載のコンピュータ・プログラム。
【請求項15】
前記コンピュータ・プログラムが、前記動的呼出しの記述を別のクラスのメソッドを経由して呼出すように変更するステップと、
フィールドを動的に参照する記述またはフィールドに値を動的に代入する記述を前記別のクラスのメソッドを経由して行なうように変更するステップとを含む、請求項14記載のコンピュータ・プログラム。
【請求項16】
前記プログラム変換方法はさらに、前記本体プログラムに含まれる変数の型を変更するステップを含む、請求項13~15のいずれかに記載のコンピュータ・プログラム。
【請求項17】
難読化された本体プログラムの実行を支援する実行支援方法をコンピュータに実行させるためのコンピュータ・プログラムであって、
前記実行支援方法は、前記難読化された本体プログラムからのメソッドの動的呼出しに応じて、前記呼出しに含まれる暗号化後の値から文字列を復号するステップと、
前記復号された文字列を用いてメソッドを実行するステップとを含む、コンピュータ・プログラム。
【請求項18】
前記コンピュータ・プログラムが、前記難読化された本体プログラムからのフィールドの動的参照またはフィールドへの動的代入の要求に応じて、前記フィールドの名称を復号するステップと、
前記復号された名称を用いてフィールドの動的参照またはフィールドの動的代入を行なうステップとを含む、請求項17記載のコンピュータ・プログラム。
発明の詳細な説明 【技術分野】
【0001】
本発明は、ソフトウェアプロテクション技術に関し、特に、与えられたプログラムをより解析の困難なプログラムに変換するプログラム変換装置、変換されたプログラムの実行を支援する実行支援装置、それらの方法およびそれらのコンピュータ・プログラムに関する。
【背景技術】
【0002】
近年、ソフトウェアプロテクションに関する研究が盛んに行なわれている。このソフトウェアプロテクションとは、ソフトウェアの改ざん、解析、コピー、再利用(盗用)などの攻撃からソフトウェアシステムを保護する技術の総称であり、難読化、暗号化、多様化、電子透かし、バースマークなどの要素技術がある。
【0003】
これらのソフトウェアプロテクション技術の中で、攻撃のしにくさという観点から、追加のプロテクション機構を持たず、プログラム自身を解析しにくくする方式であるプログラムの難読化が特に注目されている。
【0004】
難読化とは、与えられたプログラムをより複雑なプログラムに変換する技術であり、レイアウト難読化、データ難読化、制御フロー難読化などがある。難読化されたプログラムは、難読化前のプログラムと同一の機能を持つが、理解や解析がより困難となっている。これに関連する技術として、以下に示すような特許文献1~3と、非特許文献1~2とがある。

【特許文献1】特開2005-49925号公報
【特許文献2】特開2004-192068号公報
【特許文献3】米国特許第6,102,966号
【非特許文献1】Toshio Ogiso and Yusuke Sakabe and Masakazu Soushi and Mitsuko Miyaji, "Software obfuscation on a theoretical basis and its implementation," IEICE Transactions on Fundamentals, Vol.E86-A, No.1, pp 176-186 Jan 2003.
【非特許文献2】Yusuke Sakabe and Masakazu Soshi and Atsuko Miyaji, "Java(登録商標) Obfuscation with a Theoretical Basis for Building Secure Mobile Agents," Lecture Notes in Computer Science, Vol. 2828, pp. 89-103, 2003.
【発明の開示】
【発明が解決しようとする課題】
【0005】
近年作成されるプログラムは、関数やプロシージャ、メソッドといった単位に処理内容が分けられることが多い。特に、オブジェクト指向言語で書かれたプログラムは、メソッドとフィールドとを持つクラスという単位にプログラムが分割され、多くのクラスがまとまり、協調することで一つのアプリケーションが構成される。
【0006】
このようなオブジェクト指向言語で書かれたプログラムを理解するには各クラスの役割、各クラス間の関係を把握することが必要となる。その理解のためには、クラスの各メソッドでどのような処理が行なわれているのかを知る必要がある。オブジェクト指向言語で書かれたプログラムではライブラリメソッドを含む様々なクラスのメソッドを呼出すことで処理が進むため、呼出されるメソッドをわからなくすることで、クラスの役割や各クラス間の関係の理解を妨げることが可能である。
【0007】
非特許文献1は、メソッドの呼出し処理を隠蔽する技術であるが、呼出される可能性のあるメソッド群の名前を隠蔽することができない。非特許文献2は、クラスのメソッドにオーバロードの関係を持たせることにより、呼出されるメソッドを隠蔽する技術であるが、ライブラリメソッドの呼出しに対してはこの処理を行なうことができない。また、いずれも呼出されるメソッドの引数の型および返り値の型も隠蔽することができない。当該引数等の型に関する情報から、呼出そうとするメソッドを類推することが可能であるため、これら型を隠蔽しないと、難読化の程度を高めることができない。しかし、単に型を変更するのみでは、難読化後のプログラムの実行に支障をきたすため、型の変更または削除は困難であった。
【0008】
したがって、上述した特許文献1~3または非特許文献1~2の技術を用いたとしても、メソッドの呼出しの隠蔽、モジュールの名前の隠蔽および、呼出されるモジュールの引数の型および返り値の型の隠蔽のすべてを同時に行なうことはできず、プログラムの難読化の程度を一定以上に高めることは不可能であった。
【0009】
本発明は、上記問題点を解決するためになされたものであり、第1の目的は、メソッド呼出し処理を隠蔽して、プログラムを解析困難なプログラムに変換するプログラム変換装置、その方法およびそのコンピュータ・プログラムを提供することである。
【0010】
第2の目的は、プログラム変換装置などによって解析困難に変換された後の本体プログラムの実行を支援することが可能な実行支援装置、その方法およびそのコンピュータ・プログラムを提供することである。
【課題を解決するための手段】
【0011】
本発明のある局面に従えば、本体プログラムを難読化するプログラム変換装置であって、本体プログラムのメソッドの呼出しの記述を動的呼出しの記述に変更するための呼出変更手段と、呼出変更手段によって変更された後の動的呼出しを指定する文字列を暗号化して本体プログラムを変更するための暗号化手段とを含む。
【0012】
好ましくは、プログラム変換装置はさらに、フィールドを参照する記述またはフィールドに値を代入する記述を、それぞれフィールドを動的に参照する記述またはフィールドに値を動的に代入する記述に変更するためのフィールド変更手段と、フィールド変更手段によって変更された後の記述に含まれるフィールドの名称を暗号化して本体プログラムを変更するための暗号化手段とを含む。
【0013】
さらに好ましくは、呼出変更手段は、動的呼出しの記述を別のクラスのメソッドを経由して呼出すように変更し、フィールド変更手段は、フィールドを動的に参照する記述またはフィールドに値を動的に代入する記述を別のクラスのメソッドを経由して行なうように変更する。
【0014】
さらに好ましくは、プログラム変換装置は、本体プログラムに含まれる変数の型を削除するための変数型変更手段を含む。
【0015】
さらに好ましくは、プログラム変換装置はさらに、暗号化手段によって暗号化される前の文字列を別のクラスに保存するための文字列保存手段を含む。
【0016】
本発明の別の局面に従えば、難読化された本体プログラムの実行を支援する実行支援装置であって、難読化された本体プログラムからのメソッドの動的呼出しに応じて、呼出しに含まれる暗号化後の値から文字列を復号するための復号手段と、復号手段によって復号された文字列を用いてメソッドを実行するための実行手段とを含む。
【0017】
好ましくは、実行支援装置はさらに、難読化された本体プログラムからのフィールドの動的参照またはフィールドへの動的代入の要求に応じて、フィールドの名称を復号するための復号手段と、復号手段によって復号された名称を用いてフィールドの参照またはフィールドへの代入を行なうためのフィールドアクセス手段とを含む。
【0018】
本発明のさらに別の局面に従えば、コンピュータに本体プログラムを難読化させるプログラム変換方法であって、本体プログラムに記述されたメソッドの呼出しを動的呼出しに変更するステップと、変更された後の動的呼出しを指定する文字列を暗号化して本体プログラムを変更するステップとを含む。
【0019】
本発明のさらに別の局面に従えば、コンピュータに難読化された本体プログラムの実行を支援させる実行支援方法であって、難読化された本体プログラムからのメソッドの動的呼出しに応じて、呼出しに含まれる暗号化後の値から文字列を復号するステップと、復号された文字列を用いてメソッドを実行するステップとを含む。
【0020】
本発明のさらに別の局面に従えば、本体プログラムを難読化するプログラム変換方法をコンピュータに実行させるためのコンピュータ・プログラムであって、プログラム変換方法は、本体プログラムに記述されたメソッドの呼出しを動的呼出しに変更するステップと、変更された後の動的呼出しを指定する文字列を暗号化して本体プログラムを変更するステップとを含む。
【0021】
本発明のさらに別の局面に従えば、難読化された本体プログラムの実行を支援する実行支援方法をコンピュータに実行させるためのコンピュータ・プログラムであって、実行支援方法は、難読化された本体プログラムからのメソッドの呼出しに応じて、呼出しに含まれる暗号化後の値から文字列を復号するステップと、復号された文字列を用いてメソッドを実行するステップとを含む。
【発明の効果】
【0022】
本発明のある局面によれば、本体プログラム中のメソッド呼出しを動的に行なうように変更した後、動的呼出しで指定されるメソッドの名前を暗号化するため、どのメソッドの呼出しであるのかを隠蔽することができ、プログラムの理解を困難にすることが可能となる。
【0023】
また、本体プログラム中のフィールドの参照/代入の記述を別のクラスのメソッド経由で行なうように変更した後、フィールドの名称を暗号化して扱うため、どのフィールドの参照または代入であるのかを隠蔽することができ、プログラムの理解を困難にすることが可能となる。
【0024】
また、変数型変更手段が、本体プログラムに含まれる変数の型を変更するので、引数や返り値の型などのプログラム中に現れる全ての変数の型情報を隠蔽することができ、プログラムの理解をさらに困難にすることが可能となる。
【0025】
また、呼出し変更手段およびフィールド変更手段が、動的に行なうように変更された呼出し、またはフィールドの参照もしくはフィールドへの代入の記述を別のクラスのメソッドを経由して実行するように変更するので、この別のクラスに、難読化された本体プログラムの実行を支援させることが可能となる。
【0026】
本発明の別の局面によれば、復号手段が、難読化された本体プログラムからのメソッドの呼出しに応じて、呼出しに含まれる暗号化後の値から文字列を復号し、実行手段が復号された文字列を用いてメソッドを実行するので、プログラム変換装置などによって難読化された後の本体プログラムの実行を支援することが可能となる。
【0027】
また、復号手段が、難読化された本体プログラムからのフィールドの参照またはフィールドへの代入の要求に応じて、フィールドの名称を復号し、フィールドアクセス手段が復号された名称を用いてフィールドの参照またはフィールドの代入を行なうので、プログラム変換装置などによって変換された後の本体プログラムの実行の際の支援がさらに容易となる。
【発明を実施するための最良の形態】
【0028】
本発明の実施の形態におけるプログラム変換装置は、Java(登録商標)などのオブジェクト指向言語で記述されたプログラムのメソッドの呼出しおよびフィールドの参照/代入の隠蔽、変数の型を変更するように、元のプログラムを動的呼び出しを利用したプログラムに変換する。そして、実行支援装置がこの変換されたプログラムの呼出しなどを解釈し、メソッドの実行などを行なう。なお、この実行支援装置は、動的呼出しなど、本体プログラムの実行を支援するクラスとして提供され、以下DynamicCallerクラスとも呼ぶ。さらに、プログラム変換装置中で、呼出しなどが経由するように変更される別のクラスのメソッドが実行支援装置の役割を果たす実施形態も可能である。
【0029】
図1は、本発明の実施の形態におけるプログラム変換装置および実行支援装置の構成例を示すブロック図である。プログラム変換装置および実行支援装置は、コンピュータ本体1、ディスプレイ装置2、FD(Flexible Disk)4が装着されるFDドライブ3、キーボード5、マウス6、CD-ROM(Compact Disc-Read Only Memory)8が装着されるCD-ROM装置7、およびネットワークに接続されるネットワーク通信装置9を含む。プログラム変換プログラムおよび実行支援プログラムは、FD4またはCD-ROM8等の記録媒体によって供給される。プログラム変換プログラムおよび実行支援プログラムがコンピュータ本体1によって実行されることによって、プログラム変換装置および実行支援装置全体の制御が行なわれる。また、プログラム変換プログラムおよび実行支援プログラムは他のコンピュータより通信回線を経由し、コンピュータ本体1に供給されてもよい。
【0030】
図1に示すコンピュータ本体1は、CPU(Central Processing Unit)10と、ROM(Read Only Memory)11と、RAM(Random Access Memory)12と、ハードディスク13とを含む。CPU10は、ディスプレイ装置2、FDドライブ3、キーボード5、マウス6、CD-ROM装置7、ネットワーク通信装置9、ROM11、RAM12またはハードディスク13との間でデータを入出力しながら処理を行う。FD4またはCD-ROM8に記録されたプログラム変換プログラムおよび実行支援プログラムは、CPU10によりFDドライブ3またはCD-ROM装置7を介してハードディスク13に格納される。CPU10は、ハードディスク13から適宜プログラム変換プログラムおよび実行支援プログラムをRAM12にロードして実行することによって、プログラム変換装置および実行支援装置全体の制御が行なわれる。
【0031】
図2は、本発明の実施の形態におけるプログラム変換装置の機能的構成を示すブロック図である。このプログラム変換装置21は、本体プログラム23に記述されたアクセス制限を変更するアクセス制限変更部31と、本体プログラム23中に存在するメソッドをDynamicCallerクラス22経由で呼出すように変更するメソッド呼出変更部32と、本体プログラム23中に存在するフィールドの値を参照/代入する記述(get/set)をDynamicCallerクラス22経由で行なうように変更するフィールド参照/代入変更部33と、本体プログラム23中に存在するフィールド、ローカル変数の型をObjectクラスに変更する変数型変更部34と、クラス名、メソッド名およびフィールド名などの文字列を暗号化し、暗号化後の名称に変更する暗号化部35とを含む。
【0032】
オブジェクト指向言語のクラスのメンバ(フィールド、メソッド)には、アクセス修飾子が存在する。このアクセス修飾子は、フィールドやメソッドに対して、どのような範囲からアクセス可能であるかを定義するものであり、public、protected、privateが存在する。アクセス制限変更部31は、クラスのメンバのアクセス修飾子を全てpublicにする。これにより、メソッドが全てDynamicCallerクラス経由で呼出されるようになるため、DynamicCallerクラスはどのようなクラスのメンバにもアクセスできるようになる。
【0033】
一般に、オブジェクト指向言語で記述されたプログラムにおいては、クラスをインスタンス化してオブジェクトを作成し、そのオブジェクトに対してメッセージを送ることで動作する。クラスの定義は、メタクラスを用いることによってプログラムの実行中に動的に変更することが可能である。本発明の実施の形態においては、このような動的呼出しを利用する。
【0034】
たとえば、Java(登録商標)言語であれば、java(登録商標).lang.Classクラスがメタクラスに相当し、ClassクラスのインスタンスはClassクラスのforName staticメソッドにクラス名を示す文字列を与えることで取得することができる。そして、得られたClassクラスのインスタンスに対してnewInstanceメソッドを実行することによって、対応するクラスのオブジェクトを生成することができる。さらに、Classクラスのインスタンスからjava(登録商標).lang.reflect.Methodオブジェクトを得ることにより、実行するメソッドを与えられた文字列から決定することができる。これにより、メソッドの動的呼出しが実現される。
【0035】
メソッド呼出し部32は、このようなメタクラスを用いることにより、オブジェクトの生成からメソッドの実行までを文字列を与えることで行なうように本体プログラム23を変更する。
【0036】
また、本発明の実施の形態においては、オブジェクト指向の重要な特徴の1つである多態性を用いてプログラムの解析をより困難にする。多態性とは、同じメッセージに対して、異なるクラスのオブジェクトは異なる動作をすることをいう。すなわち、同じ型の変数に異なるクラスのオブジェクトが入っている場合でも、変数に入っているオブジェクトによって動作が変わり、実行結果が異なる場合がある。
【0037】
本実施の形態においては、オブジェクトからメタクラスを取得し、そのメタクラスからメソッドやフィールドの定義を得て、それらに対して処理を行なう。したがって、型情報が隠蔽されていても、その変数に入っているオブジェクトがプログラム変換前(難読化前)と同じであれば、本体プログラムの動作に影響を与えない。そこで、変数型変更部34が、クラスのメンバの型をクラス階層のルートクラスに変更することにより、本体プログラムの型情報が削除され、プログラムの解析をより困難にさせることができる。
【0038】
暗号化部35は、メソッド呼出変更部32およびフィールド参照/代入変更部33によって変更されたクラス名、メソッド名などの文字列を暗号化し、暗号化後の名称に変更する。なお、暗号化部35はメソッド呼出変更部32によって変更されたメソッド名を暗号化する第1暗号化部と、フィールド参照/代入変更部33によって変更されたフィールド名称を暗号化する第2暗号化部とに分けてもよい。なお、本実施の形態においては、暗号化の方法として共通鍵暗号を用いているが、対称鍵暗号、またはハッシュ関数を用いても実現可能である。共通鍵方式および対称鍵方式を用いた場合には、プログラム変換装置または実行支援装置に復号鍵を保存することが必要である。ハッシュ関数を用いた場合には、ハッシュ化前の文字列を保持するテーブルを実行支援装置22に保存することにより、ハッシュ化前の文字列の復号を可能とせしめる必要がある。
【0039】
図3は、本発明の実施の形態におけるプログラム変換装置21の処理手順を説明するためのフローチャートである。プログラム変換装置21の処理手順を、図3に示すフローチャートおよび図4~図7に示すプログラム変換例を参照しながら説明する。
【0040】
まず、アクセス制限変更部31は、本体プログラム23を取得し(S11)、全てのメソッド、フィールドのアクセス制限をpublicに変更する(S12)。なお、図4~図7に示す変換前の本体プログラム100は、アクセス制限がpublicに変更された後のプログラムを示している。
【0041】
次に、メソッド呼出変更部32は、全てのメソッド呼出しをDynamicCallerクラス22経由の呼出しに変更する(S13)。なお、本発明の実施の形態においては、動的呼出しを別のクラスのメソッド、つまりDynamicCallerクラスを経由せずに実行することもできる。その場合、DynamicCallerが行なう処理機能を本体プログラムに持たせる必要がある。
【0042】
図4は、変換前の本体プログラム100とメソッド呼出しを変更した後の本体プログラム200とを示す図である。このプログラムはHelloWorldクラスを定義して実行するものであり、メソッド呼出変更部32によって変換前の本体プログラム100の記述101および102のそれぞれが、変更後の本体プログラム200の記述201および202に変更されている。記述201に示すように、新たなオブジェクトとして“Hello World”が変数oa1に代入され、DynamicCallerクラス経由でjava(登録商標).io.PrintStreamクラスのprintlnメソッドが呼出されるように変更される。このjava(登録商標).io.PrintStreamは、上述したメタクラスを用いてメソッドの実行を行うときに指定される文字列である。この文字列を用いて動的呼出しが行なわれる。
【0043】
また、記述202に示すように、DynamicCallerクラス22経由でnewInstanceメソッドを実行することにより、HelloWorldクラスのインスタンスが生成され、生成されたインスタンスが変数o1に代入される。そして、DynamicCallerクラス22経由でHelloWorldクラスのhelloメソッドが呼出される。このとき、メソッドを呼出すためのインスタンスが変数o1である。
【0044】
次に、フィールド参照/代入変更部33は、本体プログラム23中に存在するフィールドの値の参照/代入(get/set)を全てDynamicCaller22経由で行なうように変更する(S14)。
【0045】
図5は、変換前のプログラム100とフィールドの値の参照/代入を変更した後の本体プログラム300とを示す図である。フィールド参照/代入変更部33によって、図4に示す記述201の最後の行が、図5に示す記述301および302に変更されている。図5の記述302に示すように、図4の記述201の最後の行のSystem.outが変数o1に置換される。また、図5の記述301が追加され、DynamicCallerクラス22経由でjava(登録商標).lang.Systemクラスのoutフィールドの値が参照されて変数o1に代入される。
【0046】
次に、変数型変更部34は、全てのフィールド、ローカル変数の型をクラス階層のルートクラスであるObjectクラスに変更する(S15)。
【0047】
図6は、変換前の本体プログラム100と変数の型がObjectクラスに変更された後の本体プログラム400とを示す図である。変数型変更部34によって、図5に示す記述301と図4に示す記述202の最初の行とが、それぞれ図6に示す記述401および402に変更されている。図6の記述401に示すように、変数の型がPrintStreamである変数o1の型が、Objectクラスに変更されている。また、図6の記述402に示すように、変数の型がHelloWorldである変数o1の型が、Objectクラスに変更されている。
【0048】
次に、暗号化部35は、クラス名、メソッド名などを暗号化し、本体プログラム23内の名称を暗号化後の名称に変更する(S16)。
【0049】
図7は、変換前の本体プログラム100と暗号化された名称に変更された後の本体プログラム500とを示す図である。図7に示すように、暗号化部35によってクラス名、フィールド名およびメソッド名が暗号化されて、記述501~503のように変更される。図7の記述501はクラス名java(登録商標).lang.Systemおよびフィールド名outが変更されたものであり、記述502はクラス名java(登録商標).io.PrintStreamおよびメソッド名printlnが変更されたものであり、記述503はクラス名HelloWorldおよびメソッド名helloが変更されたものである。
【0050】
次に、暗号部35は、図7に示すような変換後の本体プログラム24を出力して(S17)、処理を終了する。
【0051】
図8は、本発明の実施の形態における実行支援装置22の機能的構成を示すブロック図である。この実行支援装置22は、プログラム変換装置21によって変換された後の本体プログラム24が実行されるときに、変換後本体プログラム24からの呼出しに応じて動作するものであり、インスタンス生成部41と、メソッド実行部42と、フィールド参照部43と、フィールド代入部44と、復号部45とを含む。なお、インスタンス生成部41、メソッド実行部42、フィールド参照部43およびフィールド代入部44は、それぞれメソッドとして提供される。復号部には、あらかじめ、暗号化部で用いた暗号鍵に対応する復号鍵を格納する。なお、ハッシュ関数を用いて暗号化した場合には、プログラム変換装置における暗号化時に復号部にハッシュ前の名称(文字列)を保存する必要がある。実行支援装置のインスタンス生成部41、メソッド実行部42、フィールド参照部43およびフィールド代入部44はいずれもDynamicCallerクラス22内に包含することができる。
【0052】
インスタンス生成部41は、変換後本体プログラム24からの要求に応じて、メタクラスから対象クラスのインスタンスを生成する。すなわち、インスタンス生成部41は、変換後本体プログラム24からの要求に含まれる暗号化された値を抽出し、復号部45は当該値を復号して暗号化前の名称を得る。そして、インスタンス生成部41は、暗号化前の名称に基づいてインスタンスを生成し、生成したインスタンスを変換後本体プログラム24に返す。
【0053】
メソッド実行部42は、変換後本体プログラム24からの呼出しに応じて、メタクラスを参照し、対象クラスの指定されたメソッドを実行する。すなわち、メソッド実行部42は、変換後本体プログラム24からの呼出しに含まれる暗号化された値を抽出し、復号部45により復号して暗号化前の名称を得る。そして、メソッド実行部42は、暗号化前の名称に基づいてメソッドを実行し、実行されたメソッドの返り値を変換後本体プログラム24に返す。
【0054】
フィールド参照部43は、変換後本体プログラム24からの要求に応じて、メタクラスを参照し、対象クラスの指定されたフィールドを参照する。すなわち、フィールド参照部43は、変換後本体プログラム24からの要求に含まれる暗号化された値を抽出し、復号部45により復号して暗号化前の名称を得る。そして、フィールド参照部43は、暗号化前の名称に基づいて標準ライブラリに格納されるフィールドの値を参照し、このフィールドの値を変換後本体プログラム24に返す。
【0055】
フィールド代入部44は、変換後本体プログラム24からの要求に応じて、メタクラスを参照し、対象クラスの指定されたフィールドに値を代入する。すなわち、フィールド代入部44は、変換後本体プログラム24からの要求に含まれる暗号化された値を抽出し、復号部45により復号して暗号化前の名称を得る。そして、フィールド代入部44は、暗号化前の名称に基づいて標準ライブラリなどに格納されるフィールドに値を代入する。なお、このフィールド代入部44は、変換後本体プログラム24に何も返さない。
【0056】
以上説明したように、本実施の形態におけるプログラム変換装置によれば、全てのクラスのメソッド呼出しを動的呼出しに変換し、動的呼出しに用いる文字列を暗号化するようにしたので、本体プログラム内部に存在するメソッド呼出しを隠蔽することができ、プログラムの理解を困難にすることが可能となった。
【0057】
また、フィールドの値を参照/代入する際に用いるフィールド名を暗号化するようにしたので、フィールドへのアクセスを隠蔽することができ、プログラムの理解をより困難にすることが可能となった。
【0058】
また、変数の型(引数の型、返り値の型)を全てクラス階層のルートクラスに変更するようにしたので、変数の型を隠蔽することができ、プログラムの理解をより困難にすることが可能となった。
【0059】
本実施の形態における実行支援装置によれば、復号部45によって暗号化された名称の元の名称を得て、得られた元の名称を用いてインスタンスの生成、メソッドの実行、フィールドの参照およびフィールドの代入を行なうようにしたので、プログラム変換装置によって変換された後の本体プログラム24の実行を支援することが可能となった。
【0060】
今回開示された実施の形態は、すべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【図面の簡単な説明】
【0061】
【図1】本発明の実施の形態におけるプログラム変換装置および実行支援装置の構成例を示すブロック図である。
【図2】本発明の実施の形態におけるプログラム変換装置の機能的構成を示すブロック図である。
【図3】本発明の実施の形態におけるプログラム変換装置21の処理手順を説明するためのフローチャートである。
【図4】変換前の本体プログラム100とメソッド呼出しを変更した後の本体プログラム200とを示す図である。
【図5】変換前のプログラム100とフィールドの値の参照/代入を変更した後の本体プログラム300とを示す図である。
【図6】変換前の本体プログラム100と変数の型がobjectクラスに変更された後の本体プログラム400とを示す図である。
【図7】変換前の本体プログラム100と暗号化された名称に変更された後の本体プログラム500とを示す図である。
【図8】本発明の実施の形態における実行支援装置22の機能的構成を示すブロック図である。
【符号の説明】
【0062】
1 コンピュータ本体、2 ディスプレイ装置、3 FDドライブ、4 FD、5 キーボード、6 マウス、7 CD-ROM装置、8 CD-ROM、9 ネットワーク通信装置、10 CPU、11 ROM、12 RAM、13 ハードディスク、21 プログラム変換装置、22 実行支援装置、23 本体プログラム、24 変換後本体プログラム、31 アクセス制限変更部、32 メソッド呼出変更部、33 フィールド参照/代入変更部、34 変数型変更部、35 暗号化部、36 文字列保存部、41 インスタンス生成部、42 メソッド実行部、43 フィールド参照部、44 フィールド代入部、45 復号部。
図面
【図1】
0
【図2】
1
【図3】
2
【図4】
3
【図5】
4
【図6】
5
【図7】
6
【図8】
7