(57)【特許請求の範囲】
【請求項１】
保護対象プログラムにおいて、書き換え対象となる対象命令を選択する手段と、
前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成する手段と、
前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得する命令取得手段と、
前記対象命令の命令位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成する手段と、
を備えることを特徴とするプログラム難読化装置。
【請求項２】
異なる複数の命令セットから、前記保護対象プログラムの命令セットとは異なる命令セットを一つ選択する選択手段をさらに備え、
前記命令取得手段は、前記選択手段により選択された命令セット用の、前記対象命令と等価な命令を取得する、
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
保護対象プログラム中の一部の命令を偽の命令に書き換える難読化処理が施された偽装プログラムを実行するためのプログラム制御装置であって、
前記書き換えられた命令の位置と、前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記書き換えられた命令と等価な命令とが対応付けられている命令対応情報を記憶する手段と、
前記偽装プログラムの実行位置が、前記命令対応情報が示す各位置に達したときに、当該偽装プログラムの実行が停止されるイベントが発生するように設定する手段と、
前記偽装プログラムが実行されている間、当該偽装プログラムを監視する監視手段と、
前記監視手段がイベントの発生を検知したとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記等価な命令を取得する手段と、
前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を前記異なる命令セットにおいて実行し、実行結果を前記プログラム状態のデータとして設定し、前記偽装プログラムの実行を再開させる実行手段と、
を備えることを特徴とするプログラム制御装置。
【請求項４】
前記プログラム制御装置は、プロセスに対して１つのプロセスのみが監視できるオペレーティングシステムで動作する、
ことを特徴とする請求項３に記載のプログラム制御装置。
【請求項５】
プログラム中の保護対象命令を偽の命令に書き換えた第１のプログラムを実行する手段と、
前記第１のプログラムの実行位置が前記偽の命令の開始位置に達したときに、第２のプログラムに制御を移す手段と、
前記保護対象命令と等価な処理が前記保護対象命令とは異なる命令体系で記述された仮想命令を保持する手段と、
前記第２のプログラムにより前記仮想命令を読み出して実行する手段と、
を備えることを特徴とするプログラム制御装置。
【請求項６】
保護対象プログラムにおいて、書き換え対象となる対象命令を選択するステップと、
前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成するステップと、
前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得するステップと、
前記対象命令の位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成するステップと、
を備えることを特徴とするプログラム難読化方法。
【請求項７】
前記偽装プログラムの実行位置が、前記命令対応情報が示す各位置に達したときに、当該偽装プログラムの実行が停止されるイベントが発生するように設定するステップと、
前記偽装プログラムが実行されている間、当該偽装プログラムを監視する監視ステップと、
前記監視ステップによりイベントの発生が検知されたとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記対象命令と等価な命令を取得するステップと、
前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を前記異なる命令セットにおいて実行し、実行結果を前記偽装プログラムのプログラム状態のデータとして設定し、前記偽装プログラムの実行を再開する実行ステップと、
を備えることを特徴とする請求項６に記載のプログラム難読化方法。
【請求項８】
コンピュータに、
保護対象プログラムにおいて、書き換え対象となる対象命令を選択する処理、
前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成する処理、
前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得する命令取得処理、
前記対象命令の位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成する処理、
を実行させるためのプログラム。
【請求項９】
前記コンピュータに、
異なる複数の命令セットから、前記保護対象プログラムに対応するプロセッサの命令セットとは異なる一つの命令セットを選択する選択処理をさらに実行させ、
前記命令取得処理は、前記選択処理により選択された命令セットにおける、前記対象命令と等価な命令を取得する、
ことを特徴とする請求項８に記載のプログラム。
【請求項１０】
保護対象プログラム中の一部の命令が偽の命令に書き換えられた偽装プログラムを実行するコンピュータに、
前記偽装プログラムにおける偽の命令の位置と、前記保護対象プログラムの命令体系とは異なる命令体系により記述された、前記書き換えられた命令と等価な命令と、が対応付けられている命令対応情報を参照して、前記偽装プログラムの実行位置が前記命令対応情報により示される各位置に達したときに当該偽装プログラムの動作を停止させるイベントが発生するように設定する処理、
前記偽装プログラムが実行されている間、当該偽装プログラムを監視する監視処理、
前記監視処理において前記イベントの発生を検知したとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記等価な命令を取得する処理、
前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を実行し、実行結果を前記偽装プログラムのプログラム状態のデータとして設定する処理、
前記偽装プログラムの実行を再開させる処理、
を実行させるためのプログラム。
【請求項１１】
前記コンピュータは、プロセスに対して１つのプロセスのみが監視できるオペレーティングシステムで動作する、
ことを特徴とする請求項１０に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの解析を困難にするプログラム難読化技術に関する。
【背景技術】
【０００２】
プログラムを不正なリバースエンジニアリングから保護するために、多くのプログラム難読化技術が考案されている。
【０００３】
例えば、特許文献１には、プログラム中の命令コードを偽の命令コードで偽装化したプログラムに、偽の命令コードを正しい命令コードに戻す第１のルーチンと、第１のルーチンにより戻された正しい命令コードを偽の命令コードで再度偽装する第２のルーチンとを追加した自己書き換えプログラムを生成する技術について記載されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第３９４４０６９号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１では、プログラム中の特定の命令コードの偽装を解除するルーチンと、その命令コードについて再度偽装化するルーチンとが、プログラムに含まれた状態であるため、時間をかけてプログラムを追えば解析されてしまうという問題があった。
【０００６】
本発明は、上記問題点に鑑みてなされたもので、プログラムの解析を困難にするプログラム難読化装置、プログラム制御装置、プログラム難読化方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明は、保護対象プログラムにおいて、書き換え対象となる対象命令を選択する手段と、前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成する手段と、前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得する命令取得手段と、前記対象命令の命令位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成する手段とを備えることを特徴とするプログラム難読化装置である。
【０００８】
本発明は、保護対象プログラム中の一部の命令を偽の命令に書き換える難読化処理が施された偽装プログラムを実行するためのプログラム制御装置であって、前記書き換えられた命令の位置と、前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記書き換えられた命令と等価な命令とが対応付けられている命令対応情報を記憶する手段と、前記偽装プログラムの実行位置が、前記命令対応情報が示す各位置に達したときに、当該偽装プログラムの実行が停止されるイベントが発生するように設定する手段と、前記偽装プログラムが実行されている間、当該偽装プログラムを監視する手段と、前記監視手段がイベントの発生を検知したとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記等価な命令を取得する手段と、前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を前記異なる命令セットにおいて実行し、実行結果を前記プログラム状態のデータとして設定し、前記偽装プログラムの実行を再開させる実行手段とを備えることを特徴とするプログラム制御装置である。
【０００９】
本発明は、プログラム中の保護対象命令を偽の命令に書き換えた第１のプログラムを実行する手段と、前記第１のプログラムの実行位置が前記偽の命令の開始位置に達したときに、第２のプログラムに制御を移す手段と、前記保護対象命令と等価な処理が前記保護対象命令とは異なる命令体系で記述された仮想命令を保持する手段と、前記第２のプログラムにより前記仮想命令を読み出して実行する手段とを備えることを特徴とするプログラム制御装置である。
【００１０】
本発明は、保護対象プログラムにおいて、書き換え対象となる対象命令を選択するステップと、前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成するステップと、前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得するステップと、前記対象命令の位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成するステップとを備えることを特徴とするプログラム難読化方法である。
【００１１】
本発明は、コンピュータに、保護対象プログラムにおいて、書き換え対象となる対象命令を選択する処理、前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成する処理、前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得する命令取得処理、前記対象命令の位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成する処理を実行させるためのプログラムである。
【００１２】
本発明は、保護対象プログラム中の一部の命令が偽の命令に書き換えられた偽装プログラムを実行するコンピュータに、前記偽装プログラムにおける偽の命令の位置と、前記保護対象プログラムの命令体系とは異なる命令体系により記述された、前記書き換えられた命令と等価な命令と、が対応付けられている命令対応情報を参照して、前記偽装プログラムの実行位置が前記命令対応情報により示される各位置に達したときに当該偽装プログラムの動作を停止させるイベントが発生するように設定する処理、前記偽装プログラムが実行されている間、当該偽装プログラムを監視する監視処理、前記監視処理において前記イベントの発生を検知したとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記等価な命令を取得する処理、前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を実行し、実行結果を前記偽装プログラムのプログラム状態のデータとして設定する処理、前記偽装プログラムの実行を再開させる処理、を実行させるためのプログラムである。
【発明の効果】
【００１３】
本発明によれば、プログラムの解析を困難にすることができる。
【図面の簡単な説明】
【００１４】
【図１】図１は本発明の実施形態に係るプログラム難読化装置の概要を説明するための図である。
【図２】図２はプログラム難読化装置のハードウェア構成を例示する図である。
【図３】図３はプログラム難読化装置の機能を示すブロック図である。
【図４】図４は保護対象プログラムの対象命令を偽装命令に書き換えて生成された偽装プログラムの一例を示す図である。
【図５】図５はプログラム制御装置により実行される支援プログラムの機能を示すブロック図である。
【図６】図６はプログラム難読化装置の動作を説明するためのフローチャートである。
【図７】図７は偽装プログラムを実行するプログラム制御装置の動作を説明するためのフローチャートである。
【発明を実施するための形態】
【００１５】
以下、本発明の実施形態について図面を参照して説明する。
【００１６】
本発明の実施形態に係るプログラム難読化装置１０の概要を図１を参照して説明する。
【００１７】
プログラム難読化装置１０は、保護対象プログラム３００について、書き換え対象となる対象命令を選択し、その対象命令を偽の命令（偽装命令）に書き換えた偽装プログラム４０１を生成する。
【００１８】
プログラム難読化装置１０は、支援プログラム群２００から一の支援プログラム２０１を選択する。支援プログラム２０１は偽装プログラム４０１を実行するためのものである。各支援プログラム２０１は、対応する命令セット（命令体系）がそれぞれ異なる。プログラム難読化装置１０は、支援プログラム２０１を選ぶ際、偽装プログラム４０１を実行するコンピュータプロセッサの命令セットとは異なる命令セットに対応する支援プログラムを選択する。そして、プログラム難読化装置１０は、選択した支援プログラムの命令セット用の、対象命令と等価な命令（仮想命令）を生成する。本実施形態において、対象命令と等価な命令とは、対象命令と同じ実行結果を得ることができる命令を示す。
【００１９】
プログラム難読化装置１０は、プログラムにおける対象命令の命令位置と、生成した仮想命令とを対応付けた命令情報テーブル（命令対応情報）４０２を生成する。偽装プログラム４０１と、命令情報テーブル４０２と、選択された支援プログラム２０１とが実行プログラムのセットとして、偽装プログラム４０１を実行するプログラム制御装置に提供される。
【００２０】
図２は、本発明の実施形態に係るプログラム難読化装置１０のハードウェア構成を例示する図である。図示されるように、プログラム難読化装置１０は、キーボードやマウス等を含む入力装置１、ＲＯＭ（Read Only Memory）２、ＣＰＵ（Central Processing
Unit）３、ＲＡＭ（Random Access Memory）４、ハードディスク装置を含む外部記憶装置５、液晶ディスプレイを含む表示装置６、ＣＤ-ＲＯＭドライブを含む記録媒体駆動装置７、ＮＩＣ(Network Interface
Card)を含む通信制御部８とを備えるコンピュータ等から構成される。
【００２１】
図３は、本発明の実施形態に係るプログラム難読化装置１０の機能を示すブロック図である。図示されるように、プログラム難読化装置１０は、支援プログラム選択部１０１と、命令決定部１０２と、命令偽造部１０３と、仮想命令導出部１０４と、命令情報生成部１０５とを備える。
【００２２】
支援プログラム選択部１０１は、予め設定された複数の支援プログラム２０１から１つの支援プログラム２０１を選択する。複数の支援プログラムはそれぞれ異なる命令セットに対応するプログラムである。支援プログラム選択部１０１は、偽装プログラム４０１に対応する命令セット（保護対象プログラム３００に対応する命令セット）以外の命令セットに対応する支援プログラム２０１を選択する。命令セットは、プロセッサが実行する命令の集合であり、例えば、オペコードへのコード割り当て、レジスタ番号、アドレスの表現方法（例えば、バイトエンディアン等）、命令のレイアウト（例えば、オペコードやオペランドの長さ、各領域の並び順）等から規定される。
【００２３】
命令決定部１０２は、保護対象プログラム３００を構成する複数の命令のうち、書き換えの対象となる命令（対象命令）を決定する。対象命令はプログラム中の命令からランダムに選択してもよい。
【００２４】
命令偽装部１０３は、対象命令に対応する偽の命令（偽装命令）を決定し、その偽装命令で保護対象プログラム３００における対象命令を書き換える。本実施形態では、書き換え後のプログラムを偽装プログラム４０１と呼ぶ。偽装命令はランダムに決定してもよい。例えば、予め設定された複数の命令や文字列等からランダムに選択したものを偽装命令としてもよく、また、ランダムに生成した文字列を偽装命令としてもよい。
【００２５】
仮想命令導出部１０４は、支援プログラム選択部１０１により選択された支援プログラム２０１の命令セットに基づいて記述された、対象命令と等価な命令である仮想命令を生成する。
【００２６】
命令対応情報生成部１０５は、プログラムにおける対象命令の位置（アドレス）と、対象命令のサイズと、仮想命令とを対応づけた対応情報を生成して命令情報テーブル４０２に記憶する。
【００２７】
プログラム難読化装置１０は、上述のようにして生成された偽装プログラム４０１と、選択された支援プログラム２０１と、生成された命令情報テーブル４０２とのセット（実行プログラムセット）を出力する。出力された実行プログラムセットは、後述する情報処理装置２０に提供される。提供手段は任意であり、ネットワークを介して送信してもよく、記録媒体を介して提供してもよい。
【００２８】
保護対象プログラム３００の対象命令を偽装命令に書き換えて生成された偽装プログラム４０１の一例を図４に示す。図の例では、保護対象プログラムから対象命令として「８３
Ｃ０ ０３」が選択され、その対象命令が偽装命令「Ｃ１ ＥＢ ０２」に書き換えられている。対象命令のアドレス「００４０１０３Ｂ」と、対象命令のサイズ（バイト）「３」と、対象命令について、偽装プログラム４０１の命令セット（保護対象プログラム３００の命令と同一、この例では８０ｘ８６系命令セット）とは異なる命令セット用の機械語で記述された仮想命令「３９
０３ ００ ００」とを対応付けた対応情報が命令情報テーブル４０２に設定される。
【００２９】
プログラム制御装置２０は、プログラム難読化装置１０により難読化された偽装プログラム４０１を実行するためのものであり、プログラム難読化装置１０と同様に（図２参照）、入力装置と、ＲＯＭと、ＣＰＵと、ＲＡＭと、外部記憶装置と、表示装置と、記録媒体駆動装置と、通信制御部とを備えるコンピュータ等から構成される。プログラム制御装置２０のＣＰＵは、外部記憶装置や記録媒体に記憶される実行プログラムセットのデータをＲＡＭ等に読み込んで各プログラムを実行する。
【００３０】
図５は、プログラム制御装置２０により実行される支援プログラム２０１の機能を示すブロック図である。図示されるように、支援プログラム２０１は、監視動作開始処理部２１１と、イベント設定処理部２１２と、命令開始処理部２１３と、イベント検出処理部２１４と、仮想命令取得処理部２１５と、プログラム状態取得処理部２１６と、仮想命令実行処理部２１７と、プログラム状態設定処理部２１８とを含む。
【００３１】
監視動作開始処理部２１１は、偽装プログラム４０１の起動時に、偽装プログラム４０１の動作の監視を開始する。
【００３２】
イベント設定処理部２１２は、偽装プログラム４０１について、命令情報テーブル４０２が示す各命令位置でイベント（ブレークポイント）が発生するように設定する。このイベントの発生により、偽装プログラム４０１の実行は一時停止される。
【００３３】
命令開始処理部２１３は、偽装プログラム４０１の実行を再開させる。
【００３４】
イベント検出処理部２１４は、イベント（ブレークポイント）の発生を検出する。
【００３５】
仮想命令取得処理部２１５は、イベントの検出時における偽装プログラム４０１の実行位置をプログラムカウンタから取得し、この実行位置に対応する仮想命令を命令情報テーブル４０２から取得する。
【００３６】
プログラム状態取得処理部２１６は、イベント発生により実行が停止された偽装プログラム４０１のプログラム状態（レジスタやメモリの内容等）を取得する。
【００３７】
仮想命令実行処理部２１７は、仮想命令取得処理部２１５により取得された仮想命令を、予め設定された命令セットにおいて実行する。
【００３８】
プログラム状態設定処理部２１８は、仮想命令の実行結果を、実行を停止した偽装プログラム４０１のプログラム状態として設定する。
【００３９】
なお、上述した、監視動作開始処理部２１１と、イベント設定処理部２１２と、命令開始処理部２１３と、イベント検出処理部２１４と、仮想命令取得処理部２１５と、プログラム状態取得処理部２１６と、仮想命令実行処理部２１７と、プログラム状態設定処理部２１８の一部を、例えば、Ｗｉｎｄｏｗｓ（登録商標）が標準的に備えるデバッグ用ＡＰＩ（アプリケーション・プログラム・インターフェース）を利用して実現してもよい。
【００４０】
デバッグ用ＡＰＩは、プログラムをデバッグするためのデバッガ用に設けられたＡＰＩである。デバッガは、このＡＰＩを使って、デバッグ対象プログラムのプロセスに対して、デバッガとしての監視動作開始、ブレークポイント等のイベント設定、イベントの発生検出、メモリやレジスタの内容参照及び設定といった各種処理を行うことができる。
【００４１】
デバッグ用ＡＰＩでは、Ｗｉｎｄｏｗｓ（登録商標）等のＯＳ制御により、あるプロセスのデバッガとして振舞うことができるのは、唯一のデバッガプロセスに制限される。これは、複数のプロセスがデバッガとして動作すると、デバッグ対象のプロセスが所有するレジスタやメモリ等の限られた資源を奪い合うことになり、不正動作が起きる可能性が極めて高くなるからである。プログラム制御装置２０が、プロセスに対して１つのプロセスのみが監視できるオペレーティングシステムで動作し、このような制限下において、保護したいプロセスに対してデバッガとして動作するプロセス（支援プログラム２０１）を予め設けることで、不正な解析者のデバッガによる解析を防止することができる。
【００４２】
次に、本実施形態に係るプログラム難読化装置１０の動作について図６を参照して説明する。
【００４３】
プログラム難読化装置１０の支援プログラム選択部１０１は、複数の支援プログラム２０１の中から１つの支援プログラム２０１をランダムに選択する（ステップＳ６０１）。このとき、支援プログラム選択部１０１は、複数の支援プログラム２０１のうち、偽装プログラム４０１の命令セットに対応する支援プログラムを選択対象から外しても良い。
【００４４】
命令決定部１０２は、保護対象プログラム３００を構成する命令の中から、偽装対象とする対象命令ａをランダムに一つ選ぶ（ステップＳ６０２）。
【００４５】
命令偽造部１０３は、偽装命令ｘをランダムに生成し、プログラム中の対象命令ａを偽装命令ｘで書き換える（ステップＳ６０３）。
【００４６】
仮想命令導出部１０４は、ステップＳ６０１で選択された支援プログラム２０１の命令セットに対応する、対象命令ａと等価な仮想命令Ａを生成する（ステップＳ６０４）。
【００４７】
命令対応情報生成部１０５は、プログラムにおける対象命令ａの位置Ｐ（ａ）と、対象命令ａのサイズＳ（ａ）と、仮想命令Ａとの情報を暗号化して命令情報テーブル４０２に書き込む（ステップＳ６０５）。なお、保護対象プログラム３００の命令セットが固定長命令の場合には、サイズＳ（ａ）の情報は省略してもよい。
【００４８】
所定の終了条件を満たすまで（ステップＳ６０６）、ステップＳ６０２〜Ｓ６０５を繰り返し、終了条件を満たす場合には本処理を終了する。これにより、対象命令ａ、ｂ、ｃ、・・・が偽装命令ｘ、ｙ、ｚ、・・・に書き換えられた偽装プログラム４０１と、各対象命令の命令位置Ｐ（ａ）、Ｐ（ｂ）、Ｐ（ｃ）、・・・と、対象命令のサイズＳ（ａ）、Ｓ（ｂ）、Ｓ（ｃ）、・・・と、命令位置に対応する仮想命令Ａ、Ｂ、Ｃ、・・・とが書き込まれた命令情報テーブル４０２とが生成される。終了条件の内容は任意に設定可能であり、例えば、ステップＳ６０２〜Ｓ６０５の処理回数を予め設定し、実行回数が処理回数に達したときに本処理を終了してもよい。
【００４９】
次に、偽装プログラム４０１を実行するプログラム制御装置２０の動作について図７を参照して説明する。
【００５０】
まず、プログラム制御装置２０において支援プログラム２０１を起動する。起動された支援プログラム２０１は、偽装プログラム４０１を起動し、装プログラムのデバッガとして偽装プログラム４０１の動作の監視を開始する（ステップＳ７０１）。
【００５１】
支援プログラム２０１は、偽装プログラム４０１を一時停止させる（ステップＳ７０２）。
【００５２】
支援プログラム２０１は、暗号化された命令情報テーブル４０２を復号化し、復号化した命令情報テーブル４０２から、対象命令の命令位置Ｐ（ａ）、Ｐ（ｂ）、Ｐ（ｃ）、・・・の情報を取得する。そして、各命令位置についてイベントが発生するようにブレークポイントを設定する（ステップＳ７０３）。
【００５３】
次に、支援プログラム２０１は、実行が停止されている偽装プログラム４０１の実行を再開する（ステップＳ７０４）。
【００５４】
支援プログラム２０１は、監視対象の偽装プログラム４０１が終了するまで（ステップＳ７０５）、以下の処理を続ける。
【００５５】
支援プログラム２０１は、ブレークポイントによるイベントの発生を待機する（ステップＳ７０６：ＮＯ）。偽装プログラム４０１の実行位置がブレークポイントに到達すると、偽装プログラム４０１は一時停止され、イベントが発生する。支援プログラム２０１は、このブレークポイントによるイベントを検出すると（ステップＳ７０６：ＹＥＳ）、プログラムカウンタから、偽装プログラム４０１の停止位置を特定し、この停止位置に対応する命令サイズと仮想命令の情報を命令情報テーブル４０２から取り出し、偽装プログラム４０１のプログラムカウンタの値を[停止位置＋対象命令の命令サイズ]に設定する（ステップＳ７０７）。例えば、Ｐ（ａ）の位置で停止した場合で命令サイズがＳ（ａ）であれば、プログラムカウンタの値をＰ（ａ）＋Ｓ（ａ）に設定する。
【００５６】
次に、支援プログラム２０１は、命令情報テーブル４０２から取り出した仮想命令の解釈を行い、仮想命令Ａを実行するのに必要なレジスタやメモリの値（プログラム状態）を取得する（ステップＳ７０８）。例えば、演算命令であれば当該演算に必要なオペランドを取得し、分岐命令であれば分岐の判定に使用するステータスレジスタの値を取得する。
【００５７】
支援プログラム２０１は、仮想命令の処理を実行する（ステップＳ７０９）。例えば、演算命令なら当該演算を実施し、分岐命令なら分岐条件が成立したかどうかの判定を行う。
【００５８】
支援プログラム２０１は、仮想命令の処理結果を、レジスタやメモリに設定する（ステップＳ７１０）。例えば、演算命令なら演算結果を、指定のレジスタやメモリに設定し、分岐命令で分岐条件が成立したときはプログラムカウンタを分岐先の位置に設定する。
【００５９】
フローはステップＳ７０４に戻り、支援プログラム２０１は、偽装プログラム４０１の実行を再開し、上述の処理を繰り返す。そして、偽装プログラム４０１のプロセスが終了したときに（ステップＳ７０５：ＹＥＳ）、本処理を終了する。
【００６０】
このようにして、支援プログラム２０１は、偽装プログラム４０１における偽装命令の位置で、対象命令と等価な処理を、仮想命令で代行して偽装プログラム４０１の動作を継続する。
【００６１】
以上のように、本実施形態に係るプログラム難読化装置によれば、保護の対象である対象プログラムを構成する複数の命令のうち、一部の命令を偽装命令に書き換えて偽装プログラム４０１を生成する。偽装プログラム４０１における偽装命令を元の命令に戻す処理がプログラム中に存在しないため、プログラムを動作させずに解析する静的解析に対して、偽装プログラム４０１全体を解析しても本来の動作を理解できないようにすることができる。また、支援プログラム２０１が偽装プログラム４０１上の偽装命令を元の命令と等価な仮想命令で代行することにより、プログラム実行中に元の命令はメモリ上に出現しないため、実行中のプログラムのメモリ内容を読み取って解析しても本来の動作を理解することは困難となる。
【００６２】
また、支援プログラム２０１が偽装プログラム４０１に対する唯一のデバッガとして動作することにより、プログラムを動作させながら解析する動的解析のうち、他のデバッガを用いて偽装プログラム４０１を解析する行為を防止することができる。さらに、命令体系が異なる複数の支援プログラム２０１を用いることにより、偽装プログラム４０１の解析をより困難にすることができる。さらに、命令情報テーブル４０２を暗号化することにより、命令情報テーブル４０２に設定された対象命令の命令位置と仮想命令の情報が取得され解析範囲が限定されることを防止できる。
【００６３】
上述した本発明の実施形態に係るプログラム難読化装置１０の支援プログラム選択部１０１、命令決定部１０２、命令偽造部１０３、仮想命令導出部１０４、命令情報生成部１０５は、管理サーバ２０のＣＰＵ（Central Processing Unit）が記憶部に格納された動作プログラム等を読み出して実行することにより実現されてもよく、また、ハードウェアで構成されてもよい。上述した実施の形態の一部の機能のみをコンピュータプログラムにより実現することもできる。
【００６４】
以上、好ましい実施の形態をあげて本発明を説明したが、本発明は必ずしも上記実施の形態に限定されるものではなく、その技術的思想の範囲内において様々に変形し実施することが出来る。
【００６５】
例えば、図６を参照して説明したプログラム難読化装置１０の動作について、上記説明では、ステップＳ６０２〜Ｓ６０５を対象命令の１命令毎に繰り返しているが、複数の命令をまとめて各ステップで処理するようにしてもよい。例えば、予め設定された数の対象命令を選択し（ステップＳ６０２）、選択した複数の命令についてそれぞれの偽装命令を生成してプログラム中の各対象命令を各偽装命令で書き換え（ステップＳ６０３）、各対象命令について仮想命令をそれぞれ生成し（ステップＳ６０４）、各対象命令の命令位置と、対象命令のサイズと、各仮想命令とを命令情報テーブル４０２に記録してもよい（ステップＳ６０５）。
【００６６】
また、プログラム難読化装置１０が支援プログラムを選択するとき、まず、複数の命令セットから一の命令セット（偽装プログラムの命令セット以外の命令セット）を選択し、選択された命令セットに対応する支援プログラムを取得するようにしてもよい。
【００６７】
上記実施形態では、支援プログラム２０１が偽装プログラム４０１を起動するようにしているが、これに限定されず、他の任意の方法（例えば、ユーザ操作）により偽装プログラム４０１を起動し、この起動に同期して支援プログラム２０１が監視動作を開始するようにしてもよい。
【００６８】
また、偽装命令の命令長は、対象命令と同じ長さでもよいし、異なる長さでもよい。但し、偽装命令が対象命令よりも長くなる場合には、対象命令の後続の命令も対象命令として選択されたとみなし、命令情報テーブル４０２に後続の命令の位置及びサイズと、後続の命令と等価な仮想命令とがさらに追加されるように処理する必要がある。
【００６９】
上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
【００７０】
（付記１）
保護対象プログラムにおいて、書き換え対象となる対象命令を選択する手段と、
前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成する手段と、
前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得する命令取得手段と、
前記対象命令の命令位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成する手段と、
を備えることを特徴とするプログラム難読化装置。
【００７１】
（付記２）
異なる複数の命令セットから、前記保護対象プログラムの命令セットとは異なる命令セットを一つ選択する選択手段をさらに備え、
前記命令取得手段は、前記選択手段により選択された命令セット用の、前記対象命令と等価な命令を取得する、
ことを特徴とする付記１に記載のプログラム難読化装置。
【００７２】
（付記３）
保護対象プログラム中の一部の命令を偽の命令に書き換える難読化処理が施された偽装プログラムを実行するためのプログラム制御装置であって、
前記書き換えられた命令の位置と、前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令とが対応付けられている命令対応情報を記憶する手段と、
前記偽装プログラムの実行位置が、前記命令対応情報が示す各位置に達したときに、当該偽装プログラムの実行が停止されるイベントが発生するように設定する手段と、
前記偽装プログラムが実行されている間、当該偽装プログラムを監視する手段と、
前記監視手段がイベントの発生を検知したとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記等価な命令を取得する手段と、
前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を前記異なる命令セットにおいて実行し、実行結果を前記プログラム状態のデータとして設定し、前記偽装プログラムの実行を再開させる実行手段と、
を備えることを特徴とするプログラム制御装置。
【００７３】
（付記４）
前記プログラム制御装置は、プロセスに対して１つのプロセスのみが監視できるオペレーティングシステムで動作する、
ことを特徴とする付記３に記載のプログラム制御装置。
【００７４】
（付記５）
プログラム中の保護対象命令を偽の命令に書き換えた第１のプログラムを実行する手段と、
前記第１のプログラムの実行位置が前記偽の命令の開始位置に達したときに、第２のプログラムに制御を移す手段と、
前記保護対象命令と等価な処理が前記保護対象命令とは異なる命令体系で記述された仮想命令を保持する手段と、
前記第２のプログラムにより前記仮想命令を読み出して実行する手段と、
を備えることを特徴とするプログラム制御装置。
【００７５】
（付記６）
保護対象プログラムにおいて、書き換え対象となる対象命令を選択するステップと、
前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成するステップと、
前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得するステップと、
前記対象命令の位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成するステップと、
を備えることを特徴とするプログラム難読化方法。
【００７６】
（付記７）
前記偽装プログラムの実行位置が、前記命令対応情報が示す各位置に達したときに、当該偽装プログラムの実行が停止されるイベントが発生するように設定するステップと、
前記偽装プログラムが実行されている間、当該偽装プログラムを監視するステップと、
前記監視ステップによりイベントの発生が検知されたとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記対象命令と等価な命令を取得するステップと、
前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を前記異なる命令セットにおいて実行し、実行結果を前記偽装プログラムのプログラム状態のデータとして設定し、前記偽装プログラムの実行を再開する実行ステップと、
を備えることを特徴とする付記６に記載のプログラム難読化方法。
【００７７】
（付記８）
コンピュータに、
保護対象プログラムにおいて、書き換え対象となる対象命令を選択する処理、
前記保護対象プログラムについて、前記対象命令を偽の命令に書き換えた偽装プログラムを生成する処理、
前記保護対象プログラムに対応する命令セットとは異なる命令セット用の、前記対象命令と等価な命令を取得する命令取得処理、
前記対象命令の位置と、前記対象命令と等価な命令とを対応付けた命令対応情報を生成する処理、
を実行させるためのプログラム。
【００７８】
（付記９）
前記コンピュータに、
異なる複数の命令セットから、前記保護対象プログラムに対応するプロセッサの命令セットとは異なる一つの命令セットを選択する選択処理をさらに実行させ、
前記命令取得処理は、前記選択処理により選択された命令セットにおける、前記対象命令と等価な命令を取得する、
ことを特徴とする請求項８に記載のプログラム。
【００７９】
（付記１０）
保護対象プログラム中の一部の命令が偽の命令に書き換えられた偽装プログラムを実行するコンピュータに、
前記偽装プログラムにおける偽の命令の位置と、前記保護対象プログラムの命令体系とは異なる命令体系により記述された、前記対象命令と等価な命令と、が対応付けられている命令対応情報を参照して、前記偽装プログラムの実行位置が前記命令対応情報により示される各位置に達したときに当該偽装プログラムの動作を停止させるイベントが発生するように設定する処理、
前記偽装プログラムが実行されている間、当該偽装プログラムを監視する処理、
前記監視処理において前記イベントの発生を検知したとき、前記命令対応情報から、当該偽装プログラムの実行位置に対応する前記等価な命令を取得する処理、
前記偽装プログラムのプログラム状態のデータを取得し、当該プログラム状態のデータを用いて、前記取得された等価な命令を実行し、実行結果を前記偽装プログラムのプログラム状態のデータとして設定する処理、
前記偽装プログラムの実行を再開させる処理、
を実行させるためのプログラム。
【００８０】
（付記１１）
前記コンピュータは、プロセスに対して１つのプロセスのみが監視できるオペレーティングシステムで動作する、
ことを特徴とする請求項１０に記載のプログラム。
【符号の説明】
【００８１】
１    入力装置
２    ＲＯＭ
３    ＣＰＵ
４    ＲＡＭ
５    外部記憶装置
６    表示装置
７    記録媒体駆動装置
８    通信制御部
１０    プログラム難読化装置
２０    プログラム制御装置
１０１    支援プログラム選択部
１０２    命令決定部
１０３    命令偽造部
１０４    仮想命令導出部
１０５    命令情報生成部
２０１    支援プログラム
２１１    監視動作開始処理部
２１２    イベント設定処理部
２１３    命令開始処理部
２１４    イベント検出処理部
２１５    仮想命令取得処理部
２１６    プログラム状態取得処理部
２１７    仮想命令実行処理部
２１８    プログラム状態設定処理部
３００    保護対象プログラム
４０１    偽装プログラム
【図１】
0005549810.tif 000002
【図２】
0005549810.tif 000003
【図３】
0005549810.tif 000004
【図４】
0005549810.tif 000005
【図５】
0005549810.tif 000006
【図６】
0005549810.tif 000007
【図７】
0005549810.tif 000008