(57)【要約】【課題】Ｊａｖａバイトコード等の中間コードを実行する実行環境である仮想マシンを用いてプログラムを実行する場合において、中間コードを暗号化した状態でプログラムの実行を可能にするプログラム実行方法を実現する。【解決手段】本発明のプログラム実行方法は、制御手段が、実行対象の中間コードを取得し、中間コードが暗号化されているか否かを判断するステップと、中間コードが暗号化されていないと判断されたとき、既定の中間コード解釈方式に従って中間コードを解釈実行するステップと、中間コードが暗号化されていると判断されたとき、中間コードの復号化処理をおこなった上で、既定の中間コード解釈方式に従って中間コードを解釈実行するステップと、を備える。【選択図】図６
2007172526.tif 000002
【特許請求の範囲】
【請求項１】
制御手段において所定のプログラム言語で記述されたソースコードを変換した中間コードのプログラムを解釈実行する方法であって、
前記制御手段が、実行対象の中間コードを取得し、前記中間コードが暗号化されているか否かを判断するステップと、
前記制御手段は、前記中間コードが暗号化されていないと判断したとき、既定の中間コード解釈方式に従って中間コードを解釈実行するステップと、
前記制御手段は、前記中間コードが暗号化されていると判断したとき、中間コードの復号化処理をおこなった上で、既定の中間コード解釈方式に従って中間コードを解釈実行するステップと、
を備えるプログラム実行方法。
【請求項２】
前記制御手段は、前記制御手段が直接読み書きする主記憶手段上で、前記復号化処理を行うことを特徴とする請求項１記載のプログラム実行方法。
【請求項３】
前記制御手段は、前記取得した中間コードが暗号化されていることを示すデータが、当該中間コード内に含まれるか否かによって、前記中間コードが暗号化されているか否かを判断することを特徴とする請求項１又は２記載のプログラム実行方法。
【請求項４】
前記制御手段は、前記取得する中間コードの暗号化方式に応じて、前記復号化処理を行う際の復号化方式を切り替えることを特徴とする請求項１乃至３のいずれかに記載のプログラム実行方法。
【請求項５】
所定のプログラム言語で記述されたソースコードを変換した中間コードを取得する取得手段と、
前記取得された中間コード内に、当該中間コードが暗号化されていることを示すデータが含まれるか否かを判断する暗号化判断手段と、
前記暗号化判断手段によって前記中間コードが暗号化されていると判断されたとき、前記中間コードを主記憶装置上で復号化する復号化手段と、
前記中間コード又は前記復号化された中間コードを解釈実行する処理手段と、
を備えるプログラム実行システム。
【請求項６】
前記復号化手段の復号化方式を切り替える切替手段と、
をさらに備える請求項５記載のプログラム実行システム。
【請求項７】
前記切替手段は、復号化方式毎に個別に定められた復号化処理を実行するためのクラスをロードすることによって、前記復号化手段の復号化方式を切り替えることを特徴とする請求項６に記載のプログラム実行システム。
【請求項８】
所定のプログラム言語で記述されたソースコードを変換した中間コードを解釈実行するための仮想マシンを備えるコンピュータに、
前記仮想マシンが取得する中間コードが暗号化されているか否かを検出するステップと、
前記取得した中間コードが暗号化されていないと検出されたとき、前記取得した中間コードを前記仮想マシンに渡すステップと、
前記取得した中間コードが暗号化されていると検出されたとき、前記取得した中間コードを復号化し、当該復号化されたものを前記仮想マシンに渡すステップと、
を実行させるためのプログラム。
【請求項９】
請求項１乃至４のいずれかに記載のプログラム実行方法をコンピュータに実行させるためのプログラム。
【請求項１０】
請求項１乃至４のいずれかに記載のプログラム実行方法をコンピュータに実行させるためのプログラム又は請求項８に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを実行するための情報処理システム及び情報処理方法に関し、特に、中間コードのプログラムを実行する情報処理技術に関する。
【背景技術】
【０００２】
プログラムを実行する形態によって、プログラム言語は大きく以下の２つに分けられる。すなわち、実行するプラットフォーム（ＯＳ、環境、設定等）に対応したネイティブコードの状態で配布・実行する形態の言語と、プラットフォームに依存しない中間コードの状態で配布・実行する形態の言語である。
【０００３】
前者の代表例はＶＢやＣ言語である。ＶＢ等のプログラム言語の場合、ソースコードをコンパイルすると、コンパイラ内部で使用される中間コードを経て、バイナリ形式のネイティブコード（オブジェクトコード）に変換される。最終的な配布物は、１ステップ単位のＣＰＵ命令を羅列したバイナリ（マシン語）であるため、ソースコードに復元することはほぼ不可能であり、ソースコード盗用のおそれは小さい。
【０００４】
後者の代表例はＪａｖａ（登録商標）である。Ｊａｖａで記述されたソースコードは、コンパイル時にＪａｖａバイトコードと呼ばれる中間コードに変換される。ソフトウェアは中間コードの状態で配布される。そして、実行時に、Ｊａｖａ仮想マシンと呼ばれるソフトウェアによって、実行するプラットフォームに対応したネイティブコードに変換され、実行される。プラットフォーム間の違いはＪａｖａ仮想マシンが吸収するため、仮想マシン上で動作するＪａｖａプログラム（中間コード）は、プラットフォームの違いを意識しなくてもよいという特徴がある。
【０００５】
しかし、Ｊａｖａコンパイラで生成した中間コードはバイナリ形式であるが、ＯＳに依存したマシン語のバイナリ（ネイティブコード）には変換されない。最終的な配布物である中間コードは、ソースコードとほぼ一対一のデータ構造であるため、逆コンパイルによって容易にソースコードを復元することができる。そのため、開発資産であるソースコードを盗用されるおそれがある。
【０００６】
そこで、中間コードの逆コンパイルによるソースコードの流出を防止したい場合、ＰｒｏＧｕａｒｄ等の難読化ツールや、ＪＬｉｃｅｎｓｅｒ等の暗号化ツールを使用する手法が知られている（非特許文献１，２）。難読化ツールとは、変数名や関数名をランダムな文字列に置き換えたり、実行されない不正な命令を混入したりすることによって、逆コンパイラをハングアップさせるものである。暗号化ツールとは、中間コードを暗号化した状態で配布することにより、逆コンパイルを不可能とするものである。
【非特許文献１】「ＰｒｏＧｕａｒｄ」、[online]、［平成１７年１２月２６日検索］、インターネット＜ＵＲＬ：http://proguard.sourceforge.net/＞
【非特許文献２】「大金システム設計事務所」、[online]、［平成１７年１２月２６日検索］、インターネット＜ＵＲＬ：http://www.ogane.com/＞
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、難読化ツールは中間コードを読みづらくするものにすぎず、ロジック自体に変更はないため、中間コードを解析することは可能である。また、暗号化ツールを用いて中間コードを暗号化する場合であっても、プログラムの実行に必要な全ての中間コードをプログラム実行前に予め復号化しておく必要があるため、プログラムを実行している最中であれば、復号化された中間コードに対する逆コンパイルが可能であり、逆コンパイルを完全に防止することは困難であった。また、暗号化した中間コードを配布して、実行前に事前に復号化するため、システムの実行には専用の付属ソフトウェアが必要となる。
【０００８】
本発明は、かかる実情に鑑み、Ｊａｖａバイトコード等の中間コードを実行する実行環境である仮想マシンを用いてプログラムを実行する場合において、中間コードを暗号化した状態でプログラムの実行を可能にするプログラム実行方法を実現することを目的とするものである。
【課題を解決するための手段】
【０００９】
上記課題を解決するため、本発明のプログラム実行方法は、制御手段において所定のプログラム言語で記述されたソースコードを変換した中間コードのプログラムを解釈実行するプログラム実行方法であって、制御手段が、実行対象の中間コードを取得し、中間コードが暗号化されているか否かを判断するステップと、中間コードが暗号化されていないと判断したとき、既定の中間コード解釈方式に従って中間コードを解釈実行するステップと、中間コードが暗号化されていると判断したとき、中間コードの復号化処理をおこなった上で、既定の中間コード解釈方式に従って中間コードを解釈実行するステップと、を備える。
【００１０】
このとき、制御手段は、制御手段が直接読み書きする主記憶手段上で、復号化処理を行うものであると好ましい。
【００１１】
また、制御手段は、取得した中間コードが暗号化されていることを示すデータが、当該中間コード内に含まれるか否かによって、中間コードが暗号化されているか否かを判断するものであると好ましい。
【００１２】
さらに好適には、制御手段は、取得する中間コードの暗号化方式に応じて、復号化処理を行う際の復号化方式を切り替える。
【００１３】
また、本発明のプログラム実行システムは、所定のプログラム言語で記述されたソースコードを変換した中間コードを取得する取得手段と、取得された中間コード内に、当該中間コードが暗号化されていることを示すデータが含まれるか否かを判断する暗号化判断手段と、暗号化判断手段によって中間コードが暗号化されていると判断されたとき、中間コードを主記憶装置上で復号化する復号化手段と、中間コード又は復号化された中間コードを解釈実行する処理手段と、を備える。なお、本発明において「システム」とは、実体的な装置及び仮想的な装置を含む。
【００１４】
上記プログラム実行システムは、復号化手段の復号化方式を切り替える切替手段と、をさらに備えるものであると好ましい。好適には、切替手段は、復号化方式毎に個別に定められた復号化処理を実行するためのクラスをロードすることによって、復号化手段の復号化方式を切り替える。
【００１５】
本発明のプログラムは、所定のプログラム言語で記述されたソースコードを変換した中間コードを解釈実行するための仮想マシン（仮想機械）を備えるコンピュータに、仮想マシンが取得する中間コードが暗号化されているか否かを検出するステップと、取得した中間コードが暗号化されていないと検出されたとき、取得した中間コードを仮想マシンに渡すステップと、取得した中間コードが暗号化されていると検出されたとき、取得した中間コードを復号化し、当該復号化されたものを仮想マシンに渡すステップと、を実行させる。
【００１６】
また、本発明のプログラムは、本発明のプログラム実行方法の各ステップをコンピュータに実行させることを特徴とする。本発明のプログラムは、ＣＤ−ＲＯＭ等の光学ディスク、磁気ディスク、半導体メモリなどの各種の記録媒体を通じて、又は通信ネットワークなどを介してダウンロードすることにより、コンピュータにインストール又はロードすることができる。
【００１７】
なお、発明において、「手段」とは、単に物理的手段を意味するものではなく、その手段が有する機能をソフトウェアによって実現する場合も含む。また、１つの手段が有する機能が２つ以上の物理的手段により実現されても、２つ以上の手段の機能が１つの物理的手段により実現されてもよい。
【００１８】
本発明では、特に指示しない限り、「中間コード」とは、特定のプラットフォーム（ＯＳ、環境、設定等）に依存しないバイナリ形式の実行用コードであり、仮想マシンによってネイティブコードに変換されてから実行されるものである。具体的には、例えば、Ｊａｖａのコンパイラが生成する実行用コードであるＪａｖａバイトコードが該当する。
【００１９】
また、本発明において「仮想マシン」とは、中間コードをそのプラットフォームのネイティブコードに変換して実行するソフトウェアである。中間コードは、配布時にはプラットフォームから独立した独自の形式になっており、そのままでは実行することができない。そのため、そのプラットフォーム固有の形式（ネイティブコード）に変換するソフトウェアを用意して、変換しながら実行する。この変換と実行を行うものが仮想マシンである。具体的には、例えば、Ｊａｖａバイトコードをそのプラットフォームのネイティブコードに変換して実行するＪａｖａ仮想マシンが該当する。
【００２０】
「プラットフォーム」とは、アプリケーションソフトを動作させる際の基盤となるＯＳの種類や環境、設定、ハードウェアの種類などのことである。「Ｊａｖａ」とは、プログラミング言語である。
【発明の効果】
【００２１】
本発明によれば、中間コードを暗号化した状態でプログラムを実行可能なプログラム実行方法を実現することができる。中間コードを暗号化した形で配布することができ、かつ、実行前に事前に復号化しなくてもよいので、逆コンパイルによるソースコードの流出を防ぐことができる。また、本発明に係るプログラム実行方法は、中間コードを実行する仮想マシン以外に特別なアプリケーションを必要としないので、従来の暗号化ツールに比べて汎用性が高い。さらに、プログラム実行中に復号化方式を適宜変えることができるので、中間コード毎に任意の暗号化を施すことが可能となる。従来の暗号化ツールでは、復号化に必要なライセンスキーが分かれば全ての中間コードを復号化可能であったが、本発明によれば、中間コード毎に異なる暗号化方式を採用することができるので、中間コードが復号化され、逆コンパイルによりソースコードが流出するリスクを、単一の暗号化方式を利用する場合以上に抑えることができるという効果がある。
【発明を実施するための最良の形態】
【００２２】
以下、本発明の実施の形態について図面を参照して具体的に説明する。
【００２３】
図１は本発明に係るプログラム実行方法を実装する処理装置１０の構成を示す制御ブロック図の一例である。処理装置１０は、プログラムの実行に関して処理装置１０全体の処理及び動作を統括制御する制御手段１２、制御手段１２の作業領域として一時的に情報を記憶する主記憶手段１４、制御手段１２の処理及び動作に必要な各種情報を予め記憶する読出用記憶手段１６、プログラムの実行に関して処理装置１０の外部から各種情報を入出力（通信を含む）する入出力手段１８を備える。主記憶手段１４は、制御手段１２によって直接読み書きされるものである。
【００２４】
処理装置１０の具体例として、専用又は汎用のコンピュータやマイクロコンピュータ等が挙げられる。例えば、汎用のパーソナルコンピュータは、制御手段１２としてのＣＰＵ、主記憶手段１４としてのＲＡＭ等の主記憶装置、読出用記憶手段１６としてのＲＯＭ、入出力手段１８としての入出力（Ｉ／Ｏ）インタフェースを備え、これらがバスにより接続される。
【００２５】
なお、処理装置１０は、単一のコンピュータより構成されるものであっても、ネットワーク上に分散した複数のコンピュータより構成されるものであってもよい。制御手段１２としてのＣＰＵは、ＲＡＭ等の主記憶手段１４に記憶される所定のプログラム、ＲＯＭ等の読出用記憶手段１６に記憶される所定のプログラム、又は入出力手段１８を介して外部（外部記憶装置、ネットワーク上のコンピュータ等）から読み出される所定のプログラムを実行することにより、各種機能実現手段として処理装置１０を機能させる。
【００２６】
図２は制御手段１２及び主記憶手段１４の主な機能構成を示す機能ブロック図の一例である。制御手段１２は、中間コード処理手段２０と、中間コード取得手段２２と、暗号化判断手段２４と、復号化手段２６と、復号化方式切替手段２８とを含んで構成され、仮想マシンとして機能する。主記憶手段１４は、実行中間コード格納領域３０と、復号化作業領域３２とを含んで構成される。なお、中間コード処理手段２０及び中間コード取得手段２２は、仮想マシンが本来備える機能手段である。
【００２７】
中間コード処理手段２０は、中間コードをそのプラットフォームのネイティブコードに変換して実行する機能を備え、主記憶手段１４の実行中間コード格納領域３０に格納された中間コードを解釈し、当該中間コードに記述された所定の処理を実行する。
【００２８】
中間コード取得手段２２は、プログラムを実行する際に、中間コードを取得して主記憶手段１４の実行中間コード格納領域３０に格納する機能を備える。このとき、プログラムの実行に必要な個々の中間コードを、プログラム実行中に必要なものだけを順次読み込む。中間コードはメインプログラムに関するものと、プログラムの実行に必要な個々の機能がファイル単位に分割されたものがある。中間コード取得手段２２は、ＲＯＭ等の読出用記憶手段１６に記憶された中間コードまたは処理装置１０の外部に記憶された中間コードを必要に応じて順次取得する。処理装置１０の外部から中間コードを取得する場合は、外部記憶装置またはネットワーク上のコンピュータ等から入出力手段１８を介して取得する。
【００２９】
暗号化判断手段２４は、中間コード処理手段２０が実行中間コード格納領域３０に格納された中間コードを実行する際に、当該中間コードが暗号化されているか否かを判断する機能を備える。好ましくは、暗号化された中間コードの先頭に、当該中間コードが暗号化されたものであることを示す所定のタグ（識別子）を付与しておき、中間コード処理手段２０が主記憶手段１４の実行中間コード格納領域３０に格納された中間コードを解釈実行する最初の段階で、当該実行しようとする中間コードの先頭に所定のタグが付加されているか否かを確認し、所定のタグが付加されているとき、当該中間コードは暗号化されていると判断し、所定のタグが付加されていないとき、当該中間コードは暗号化されていない通常の中間コードであると判断する。また、中間コード取得手段２２が中間コードを取得した後、中間コード処理手段２０が当該中間コードの解釈実行を始めるまでの間に、当該中間コードが暗号化されているか否かを暗号化判断手段２４が判断するものであってもよい。
【００３０】
復号化手段２６は、暗号化判断手段２４において、実行中間コード格納領域３０に格納された中間コード（解釈実行しようとする中間コード）が暗号化されていると判断されたとき、当該暗号化された中間コード（以下、「暗号化中間コード」という）を、中間コード処理手段２０が処理可能な通常の中間コードに所定の方式で復号化する機能を備える。好ましくは、復号化手段２６は、主記憶手段１４の復号化作業領域３２を用いて中間コードの復号化処理を行い、実行中間コード格納領域３０に格納されている暗号化中間コードを、復号化された通常形式の中間コードに置き換える。また、暗号化中間コードの復号化処理が完了した後、中間コード処理手段２０が復号化作業領域３２に格納された中間コードを解釈実行するように制御されてもよい。
【００３１】
復号化方式切替手段２８は、復号化手段２６の復号化処理の方式を切り替える機能を備える。本発明では、中間コードの暗号化及び復号化を行う方式として、ビット反転方式、ビットシフト方式、公開鍵暗号方式、共通鍵暗号方式、その他任意の方式を適用可能である。そのため、復号化手段２６は、暗号化中間コードの暗号化方式に応じた復号化処理を行う必要がある。そこで、実行しようとする暗号化中間コードの暗号化方式に応じて、復号化方式切替手段２８は、復号化手段２６の復号化方式を事前に切り替えることが好ましい。
【００３２】
例えば、Ｊａｖａの場合、復号化方式の切り替えは、Ｊａｖａが標準的に備えるクラスローダを利用して実現することが好ましい。クラスローダとは、クラスをメモリ（主記憶手段１４）にロード（load）するためのオブジェクトであり、プログラムの実行中に必要なクラス（モジュール）を動的にロード及び／又はリンクすることができる機能である。本発明においては、制御手段１２を暗号化判断手段２４及び復号化手段２６として機能させるためのクラスを、各暗号化方式毎に予め用意しておく。そして、暗号化中間コードを取得する前に、当該暗号化方式に対応するクラスをクラスローダによりロードして、復号化方式（復号化手段２６）を切り替える。
【００３３】
実行中間コード格納領域３０は、中間コード取得手段２２により取得された中間コード及び暗号化中間コードを格納し、中間コード処理手段２０が実行する中間コードを格納するための一時的な記憶領域である。実行中間コード格納領域３０に格納された中間コードは、当該中間コードに基づいた処理の終了後、削除されることが好ましい。なお、実行中間コード格納領域３０は、主記憶手段１４上の物理的又は論理的に固定された特定領域を意味するものではなく、単に中間コード処理手段２０が解釈実行しようとする中間コードが格納されている領域を指す。
【００３４】
復号化作業領域３２は、復号化手段２６が暗号化中間コードの復号化処理を行うときに、処理途中のデータ等を一時的に格納するための作業領域である。なお、復号化作業領域３２も、主記憶手段１４上の物理的又は論理的に固定された特定領域を意味するものではない。
【００３５】
次に、処理装置１０により実現される、本発明に係るプログラム実行処理について説明する。まず、中間コードを暗号化中間コードに変換する処理について説明し、その後、暗号化中間コードによるプログラム実行処理について説明する。
【００３６】
図３は、実行対象の中間コードを暗号化中間コードに変換する処理の手順を示すフローチャートである。具体的には、中間コードを読み込み、任意の暗号化処理を施したうえで暗号化された中間コードであることを表す情報を埋め込んで出力する処理を行う。ここでは、例えば、使用する暗号化手法として中間コードの情報をすべてビット単位で反転するという暗号化手法を用いるものとする。
【００３７】
まず、暗号化すべき入力元の中間コードファイルをオープンし（Ｓ５０）、続いて、暗号化結果となる出力先の中間コードファイルをオープンする（Ｓ５２）。次に、中間コードが暗号化されていることを示す情報（以下、「暗号化タグ」という）を出力ファイルに書き込む（Ｓ５４）。ここで、暗号化タグとは、暗号化中間コードの先頭に付加される情報であり、中間コードの先頭に暗号化タグが付加されている場合には、当該中間コードが暗号化されていることを意味するものである。どのような情報を暗号化タグとして用いるかは、少なくとも暗号化方式毎に予め設定される。
【００３８】
次に、入力元ファイルの最後の中間コードまで処理を終えたかどうかを判定する（Ｓ５６）。ファイルの最後ではないとき、中間コードの入力を行い（Ｓ５８）、入力した中間コードのビットを反転し（Ｓ６０）。出力先ファイルにビット反転した中間コードを書き込む（Ｓ６２）。入力ファイルの最後までＳ５６からＳ６０の処理を繰り返し、ファイルの中間コード全体に対してビット反転を行う。Ｓ５６でファイルの最後であると判定したとき、入力元の中間コードファイルをクローズする（Ｓ６４）。そして、出力先の中間コードファイルをクローズする（Ｓ６６）。こうして、中間コードが暗号化され、かつ、ファイルの先頭に暗号化タグが付与された、暗号化中間コードが生成される。
【００３９】
図４は、暗号化中間コードを復号化し実行する処理の手順を示すフローチャートである。具体的には、入力された中間コードが暗号化中間コードであるかをチェックし、暗号化中間コードであれば復号化処理を実行する。ここでは、例えば、使用する暗号化手法として中間コードの情報をすべてビット単位で反転するという暗号化手法を用いるものとする。
【００４０】
まず、仮想マシンによってメモリ（実行中間コード格納領域３０）に読み込まれた実行対象の中間コードに対し、当該中間コードの先頭に所定の情報、すなわち暗号化タグ、が埋め込まれているかどうかを確認する（Ｓ７０）。暗号化タグが埋め込まれている場合、当該中間コードは暗号化されていることになるので、復号化処理を行う。復号化処理はまず、復号化処理を行うための作業領域（復号化作業領域３２）を初期化し（Ｓ７２）、実行対象の中間コードの読み込み位置を暗号化タグのサイズ分だけ中間コードの最後方向にずらす（Ｓ７４）。
【００４１】
その後、最後の中間コードまで処理を終えたかどうかを判定する（Ｓ７６）。中間コードの最後ではないとき、実行対象の中間コード（暗号化中間コード）の入力を行い（Ｓ７８）、入力した中間コードのビットを反転し（Ｓ８０）、復号化作業領域にビット反転した中間コードを書き込む（Ｓ８２）。このように、入力ファイルの最後までＳ７６〜Ｓ８２の処理を繰り返し、ファイルの中間コード全体に対してビット反転を行なう。
【００４２】
そして、実行対象の中間コードが最後であると判定したとき、メモリに格納された実行対象の中間コード（暗号化中間コード）を、復号化処理によって得られた中間コードと置き換える（Ｓ８４）。仮想マシンによって読み込まれた実行対象の中間コードの先頭に暗号化タグを発見できない場合、当該中間コードは暗号化されていない通常の中間コードであると判断できるので、実行対象の中間コードに変更は加えない。こうして、暗号化されていなければ、そのまま中間コードを実行し、暗号化中間コードであれば復号化された通常の中間コードに変換した上で中間コードを実行する。
【００４３】
ここで、暗号化中間コードの解釈実行をするとき、既定の解釈方式では実行できない暗号化された中間コードであれば復号化処理を施してから解釈実行する仮想マシンが考えられる。しかし、復号化可能な暗号化方式が一定で変更できない場合、ある暗号化中間コードの暗号が解読されると、他の全ての暗号化中間コードをも解読されてしまうおそれがある。そこで、好適には、任意の形式で暗号化された実行対象の中間コードの先頭に暗号化した中間コードであることを表す情報を埋め込み、該プログラムを実行する仮想マシンにおいて、中間コードの先頭を読み出し、暗号化された中間コードの場合は、該プログラム実行中に登録された任意の中間コード復号化方式を用いて暗号化中間コードの復号化を実行し、復号化された中間コードを既定の中間コード解釈方式で実行することが望ましい。
【００４４】
図５及び図６は、仮想マシンがプログラムを実行する処理の手順を示すフローチャートである。
【００４５】
図５は、仮想マシンがメインプログラムとなる中間コードを実行する処理の手順を示すフローチャートである。まず、中間コード取得手段２２が、メインプログラムとなる中間コードをメモリ（実行中間コード格納領域３０）上に読み込む（Ｓ９０）。そして、読み込んだ中間コードを対象として図６の中間コード解釈処理を実行する（Ｓ９２）。メインプログラムとなる中間コードの解釈処理が終了するとともに仮想マシンによるプログラムの実行も終了する。
【００４６】
図６は、仮想マシンが中間コードを解釈し、実行する処理の手順を示すフローチャートである。まず、中間コード処理手段２０は、中間コードの最後まで処理を終えたかどうかを判定する（Ｓ１００）。中間コードの最後ではないとき、解釈中の中間コード命令が中間コード復号化処理の変更命令であるかどうかを判定する（Ｓ１０２）。例えば、所定の復号化方式に対応した復号化処理を行うためのクラスを読み込む必要があるかどうかにより、当該判定処理を実現できる。判定の結果、中間コードの復号化処理変更命令でないとき、解釈中の中間コード命令が外部中間コードの読み込み命令であるかどうかを判定する（Ｓ１０４）。外部中間コードの読み込み命令でないとき、メモリに格納されている中間コードに基づいて、中間コード処理手段２０が既定の中間コード実行処理を行なう（Ｓ１０６）。
【００４７】
Ｓ１０２において、解釈中の中間コード命令が中間コードの復号化処理変更命令であると判定されたとき、復号化方式切替手段２８は、該仮想マシンが使用する中間コードの復号化方式を、当該変更命令により指定される復号化方式に変更する（Ｓ１０８）。例えば、ビット反転方式からビットシフト方式へ復号化方式を切り替える。この切替処理は、例えば、復号化方式毎に個別に定められた復号化処理を実行するためのクラスを予め用意しておき、取得する中間コードの暗号化方式に応じたクラスをロードすることによって、実現できる。
【００４８】
Ｓ１０４において、外部中間コードの読み込み命令であると判定されたとき、当該読み込み命令で指定された中間コードを入出力手段１８を介して外部から取得して、メモリ（実行中間コード格納領域３０）上に読み込む（Ｓ１１０）。その後、当該外部中間コードが暗号化されているかどうか、すなわち暗号化タグが先頭に付加されているかどうかを暗号化判断手段２４が判断する（Ｓ１１２）。暗号化タグが付加されているとき、当該外部中間コードは暗号化されているので、復号化手段２６により復号化処理を実行する（Ｓ１１４）。当該復号化処理は図４に例示した処理を実行すればよい。こうして、仮想マシンは、取得した中間コードに対して、必要に応じて所定の復号化処理を行い、仮想マシンで解釈できる形式にした上で、中間コード処理手段２０は中間コードを解釈し、実行する（Ｓ１１６）。このように、中間コードの最後までＳ１００〜Ｓ１０６の処理を繰り返し、中間コード全体を解釈し、実行する。
【００４９】
以上詳述したように、本発明によれば、暗号化された中間コードを含むプログラムを実行するにあたり、プログラムの実行に必要な全ての暗号化中間コードを事前に復号化することなくプログラム実行することができる。暗号化された中間コードは当該中間コードが読み出され実行されるときのみ復号化される。復号化された中間コードは、当該中間コードの実行時に主記憶手段に展開されるのみであり、実行前又は実行後にはメモリ等に展開されないので、第三者が復号化された中間コードを取得することが極めて困難となる。これにより、中間コードの逆コンパイルを防止することが可能となる。
【００５０】
なお、各ステップは処理内容に矛盾を生じない範囲で任意に順番を変更して又は並列に実行することができる。
【００５１】
なお、本発明は、上記した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲内において、他の様々な形で実施することができる。このため、上記実施形態はあらゆる点で単なる例示にすぎず、限定的に解釈されるものではない。
【００５２】
例えば、本発明に係るプログラム実行方法は、Ｊａｖａに限定されるものではない。本発明に係るプログラム実行方法は、中間コードを仮想マシンで読取実行するタイプのプログラム言語に対して適用可能である。
【図面の簡単な説明】
【００５３】
【図１】本発明に係るプログラム実行方法を実装する処理装置１０の構成を示す制御ブロック図の一例である。
【図２】処理装置１０の主な機能構成を示す機能ブロック図の一例である。
【図３】中間コードを暗号化中間コードに変換する処理の手順を示すフローチャートである。
【図４】暗号化中間コードを復号化し実行する処理の手順を示すフローチャートである
【図５】仮想マシンがメインプログラムとなる中間コードを実行する処理の手順を示すフローチャートである。
【図６】仮想マシンが中間コードを解釈し、実行する処理の手順を示すフローチャートである。
【符号の説明】
【００５４】
１０  処理装置
１２  制御手段
１４  主記憶手段
１６  読出用記憶手段
１８  入出力手段
【図１】
2007172526.tif 000003
【図２】
2007172526.tif 000004
【図３】
2007172526.tif 000005
【図４】
2007172526.tif 000006
【図５】
2007172526.tif 000007
【図６】
2007172526.tif 000008