(57)【要約】【課題】  コードを復号するプログラムのソースコードを、開示することなしに、符号化しようとするコードを含む関数内に、その復号プログラムの実行コードをインライン展開することができる実行プログラム生成装置を提供する。【解決手段】  挿入手段１０２は、符号化対象コード１２０を一部に含むプログラムコード内に該符号化対象コードの範囲を示す符号化開始マーク１１８及び符号化終了マーク１３１を挿入する。アドレス計算手段１０３は、プログラムコードのコンパイル実行後に、符号化開始マーク１１８及び符号化終了マーク１３１に基づいて符号化対象コードのアドレスを計算する。アドレス表作成手段１０４は、符号化対象コードのアドレスに基づいて、アドレス解決テーブルを挿入コード開始マーク１１２の位置に作成する。符号化手段１０５は、符号化対象コード１２０を符号化する。【選択図】          図２
2006072584.tif 000002
【特許請求の範囲】
【請求項１】
符号化対象コードを一部に含むプログラムコード内に該符号化対象コードの範囲を示すマークを挿入する挿入手段と、
前記プログラムコードのコンパイル実行後に、前記マークに基づいて前記符号化対象コードのアドレスを計算するアドレス計算手段と、
前記符号化対象コードのアドレスに基づいて、前記符号化対象コードのアドレス表を作成するアドレス表作成手段と
を含むことを特徴とする実行プログラム生成装置。
【請求項２】
前記実行プログラム生成装置は更に、前記符号化対象コードを符号化する符号化手段を含むことを特徴とする請求項１記載の実行プログラム生成装置。
【請求項３】
前記アドレス計算手段は、前記マークと所定のマークとの位置の差分に基づいて、前記符号化対象コードのアドレスを計算することを特徴とする請求項１記載の実行プログラム生成装置。
【請求項４】
前記アドレス計算手段は、実行ファイルがメモリ内にロードされるベースアドレスから所定のマークがロードされるアドレスの差分を該ベースアドレスに加えることで、前記符号化対象コードのアドレスを計算することを特徴とする請求項１記載の実行プログラム生成装置。
【請求項５】
前記実行プログラム生成装置は更に、前記プログラムコードのコンパイル前に、所定のマーク、前記符号化対象コードのアドレスを算出するアドレス算出コード及び前記符号化対象コードを復号する復号コードのうちの少なくともいずれか一つを含む挿入コードを前記プログラムコード内に挿入する挿入手段を含むことを特徴とする請求項１から請求項４のいずれか一項に記載の実行プログラム生成装置。
【請求項６】
前記アドレス表作成手段は、所定のマークの位置に前記符号化対象コードのアドレス表を作成することを特徴とする請求項１から請求項５のいずれか一項に記載の実行プログラム生成装置。
【請求項７】
前記挿入手段は、前記符号化対象コード及び前記符号化対象コードの範囲を示すマークを含む第２の符号化対象コードの範囲を示す第２のマークを挿入し、
前記アドレス計算手段は、前記第２のマークに基づいて前記第２の符号化対象コードのアドレスを計算し、
前記アドレス表作成手段は、前記第２の符号化対象コードのアドレスに基づいて前記第２の符号化対象コードのアドレス表を作成し、
前記符号化手段は、前記第２の符号化対象コードを符号化することを特徴とする請求項２記載の実行プログラム生成装置。
【請求項８】
符号化対象コードを一部に含むプログラムコード内に該符号化対象コードの範囲を示すマークを挿入する挿入ステップと、
前記プログラムコードのコンパイル実行後に、前記マークに基づいて前記符号化対象コードのアドレスを計算するアドレス計算ステップと、
前記符号化対象コードのアドレスに基づいて、前記符号化対象コードのアドレス表を作成するアドレス表作成ステップと
を含むことを特徴とする実行プログラム生成方法。
【請求項９】
前記実行プログラム生成方法は更に、前記符号化対象コードを符号化する符号化ステップを含むことを特徴とする請求項８記載の実行プログラム生成方法。
【請求項１０】
前記アドレス計算ステップは、前記マークと所定のマークとの位置の差分に基づいて、前記符号化対象コードのアドレスを計算することを特徴とする請求項８記載の実行プログラム生成方法。
【請求項１１】
前記アドレス計算ステップは、実行ファイルがメモリ内にロードされるベースアドレスから所定のマークがロードされるアドレスの差分を該ベースアドレスに加えることで、前記符号化対象コードのアドレスを計算することを特徴とする請求項８記載の実行プログラム生成方法。
【請求項１２】
前記実行プログラム生成方法は更に、前記プログラムコードのコンパイル前に、所定のマーク、前記符号化対象コードのアドレスを算出するアドレス算出コード及び前記符号化対象コードを復号する復号コードのうちの少なくともいずれか一つを含む挿入コードを前記プログラムコード内に挿入するステップを含むことを特徴とする請求項８から請求項１１のいずれか一項に記載の実行プログラム生成方法。
【請求項１３】
前記実行プログラム生成方法は更に、前記プログラムコードのコンパイル前に、少なくとも所定のマークを含む挿入コードを前記プログラムコード内に挿入する第１挿入ステップと、
前記プログラムコードのコンパイル後に、前記符号化対象コードを復号するためのコンパイル済みの復号コード及び前記符号化対象コードのアドレスを算出するためのコンパイル済みのアドレス算出コードのうちの少なくともいずれか一方を前記第１挿入ステップで挿入したマークの位置に挿入する第２挿入ステップとを含むことを特徴とする請求項８から請求項１１のいずれか一項に記載の実行プログラム生成方法。
【請求項１４】
符号化対象コードを一部に含むプログラムコード内に該符号化対象コードの範囲を示すマークを挿入する挿入ステップ、
前記プログラムコードのコンパイル実行後に、前記マークに基づいて前記符号化対象コードのアドレスを計算するアドレス計算ステップ、
前記符号化対象コードのアドレスに基づいて、前記符号化対象コードのアドレス表を作成するアドレス表作成ステップをコンピュータに実行させるプログラム。
【請求項１５】
前記プログラムは更に、前記符号化対象コードを符号化する符号化ステップを前記コンピュータに実行させる請求項１４記載のプログラム。
【請求項１６】
符号化された符号化対象コードを一部に含むプログラムコード内に挿入され、該符号化対象コードの範囲を示すマークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを算出するアドレス算出手段と、
前記アドレス算出手段が算出した符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号する復号手段と、
前記復号手段が復号した符号化対象コードを符号化する符号化手段と
を含むことを特徴とするプログラム処理装置。
【請求項１７】
符号化された符号化対象コードを一部に含むプログラムコード内に挿入され、該符号化対象コードの範囲を示すマークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを算出するアドレス算出ステップと、
前記符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号する復号ステップと、
前記符号ステップで復号した符号化対象コードを実行する実行ステップと、
前記復号ステップで復号された符号化対象コードを符号化する符号化ステップと
を含むことを特徴とするプログラム処理方法。
【請求項１８】
符号化された符号化対象コードを一部に含むプログラムコード内に挿入され、該符号化対象コードの範囲を示すマークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを算出するアドレス算出ステップ、
前記符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号する復号ステップ、
前記復号ステップで復号された符号化対象コードを符号化する符号化ステップをコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、実行プログラム生成装置、実行プログラム生成方法、プログラム処理装置、プログラム処理方法及びプログラムに関する。
【背景技術】
【０００２】
従来、プログラムコードの一部分を符号化しておいて、実行時に復号する自己復元型プログラムと呼ばれる技術が存在する。このような従来技術として特許文献１記載のものが提案されている。特許文献１記載のプログラムでは、符号化しておいたコードを実行時に復号化するために、復号するコードの位置をアドレスの形で、復号するコードに知らせる必要がある。この様な機能は、アセンブリ言語を用いて、符号化するコードの開始位置および終了位置に対してラベルを埋め込み、復号するコードがそのラベルを参照するように記述することで実現することができる。
【０００３】
さらに、この様な機能は、プログラムを作成する都度実現するのではなく、ライブラリとして前もって作成しておくことで、効率のよい機能提供が可能となる。このようなライブラリを用いる従来技術として特許文献２および特許文献３記載のものが提案されている。コードの復号機能をライブラリで実現する場合には、ライブラリ関数に対して引数などの形で復号するコードのアドレスを渡す必要がある。ここで、復号するコードのアドレスをライブラリ関数に知らせるためには、上述のように、アセンブリ言語のラベル機能を用いて実現することができる。
【０００４】
また、上記復号するコードを符号化されたコードを含む関数内にインライン展開することで、実行効率の向上などの効果が期待できる。このインライン展開のためには、復号するコードのソースコードとともに、符号化されたプログラムをコンパイルおよびリンクすることで、実現することができる。
【０００５】
また、特許文献４記載の装置は、プログラムのアドレス解決方式として外部シンボルアドレス表を利用したもので、オペレーティングシステムのバーションによらずに、プログラムの移行を簡単に行うことができるというものである。
【０００６】
【特許文献１】特開２００３−２８０７５５号公報
【特許文献２】特開２００２−２２２０８１号公報
【特許文献３】特開平６−２５０８２８号公報
【特許文献４】特開昭６３−３７４２６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから復号したコードを実行する場合、復号するモジュールに対して、復号すべきコードの範囲をアドレスによって知らせる必要がある。復号すべきコードが存在するアドレスを復号するモジュールに対して知らせるためには、復号すべきコードが存在するアドレスをアセンブリ言語を用いて表現する必要がある。
【０００８】
プログラムをアセンブリ言語で記述するには、ＣＰＵ（Central Processing Unit）およびマシン語の知識が要求される。このため、アセンブラの知識を持たない一般のプログラマには困難な作業となるため、復号すべきコードが存在するアドレスを高級言語で記述することはできなかった。さらに、プログラムをアセンブリ言語で作成することは、プログラムを高級言語で作成する場合と比較して、プログラム作成および管理の負荷が増大する。
【０００９】
また、一つのプログラム内さらには、関数内で、複数の箇所または多重に符号化する場合、アセンブリ言語のラベル機能を用いて符号化するコードの開始位置および終了位置を取得しようとしたとき、さらにラベル名の唯一性を維持するための管理が必要となり、管理の負荷がより増大してしまう。
【００１０】
また、復号モジュールをコンパイルされたライブラリの形式で提供する場合、復号されるコードを含む関数内にインラインに展開することができなかった。復号モジュールをインライン展開するためには、復号モジュールのソースプログラムを符号化するプログラムのソースコードとともに、コンパイルおよびリンクする必要がある。したがって、符号化を行うプログラムをコンパイルする作業者に対して、復号モジュールのソースプログラムを開示する必要があった。
【００１１】
そこで、本発明は、上記問題点に鑑みてなされたもので、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる実行プログラム生成装置、実行プログラム生成方法、プログラム処理装置、プログラム処理方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するために、本発明は、請求項１に記載のように、符号化対象コードを一部に含むプログラムコード内に該符号化対象コードの範囲を示すマークを挿入する挿入手段と、前記プログラムコードのコンパイル実行後に、前記マークに基づいて前記符号化対象コードのアドレス計算するアドレス計算手段と、前記符号化対象コードのアドレスに基づいて、前記符号化対象コードのアドレス表を作成するアドレス表作成手段とを含むことを特徴とする実行プログラム生成装置である。
【００１３】
本発明によれば、符号化対象コードを一部に含むプログラムコード内に符号化対象コードの範囲を示すマークを挿入し、プログラムコードのコンパイル実行後に、前記マークに基づいて符号化対象コードのアドレス計算し、符号化対象コードのアドレスに基づいて、符号化対象コードのアドレス表を作成しておく。後述するプログラム処理装置により、この符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを算出し、この符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号することで、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる。また、符号化しようとする符号化対象コードをコンパイルする作業者に対して、コードを復号するプログラムのソースコードを開示することなしに、符号化対象コードを含む関数内に、その復号プログラムの実行コードをインライン展開することができる。また、ラベル名の唯一性を維持するための管理が必要ないため、管理の負荷が増大することもない。
【００１４】
本発明の実行プログラム生成装置は、請求項２に記載のように、更に、前記符号化対象コードを符号化する符号化手段を含む。
【００１５】
前記アドレス計算手段は、請求項３に記載のように、前記マークと所定のマークとの位置の差分に基づいて、前記符号化対象コードのアドレスを計算する。本発明によれば、相対アドレスによる符号化対象コードの開始アドレスおよび終了アドレスを算出できる。
【００１６】
前記アドレス計算手段は、請求項４に記載のように、実行ファイルがメモリ内にロードされるベースアドレスから所定のマークがロードされるアドレスの差分を該ベースアドレスに加えることで、前記符号化対象コードのアドレスを計算する。本発明によれば、絶対アドレスによる前記符号化対象コードの開始アドレスおよび終了アドレスを計算できる。
【００１７】
本発明の実行プログラム生成装置は、請求項５に記載のように、更に、前記プログラムコードのコンパイル前に、所定のマーク、前記符号化対象コードのアドレスを算出するアドレス算出コード及び前記符号化対象コードを復号する復号コードのうちの少なくともいずれか一つを含む挿入コードを前記プログラムコード内に挿入する挿入手段を含む。
【００１８】
前記アドレス表作成手段は、請求項６に記載のように、所定のマークの位置に前記符号化対象コードのアドレス表を作成する。本発明によれば、復号コードは所定のマークを検出することでアドレス表の位置を知ることができる。
【００１９】
前記符号化手段は、請求項７に記載のように、前記挿入手段は、前記符号化対象コード及び前記符号化対象コードの範囲を示すマークを含む第２の符号化対象コードの範囲を示す第２のマークを挿入し、前記アドレス計算手段は、前記第２のマークに基づいて前記第２の符号化対象コードのアドレスを計算し、前記アドレス表作成手段は、前記第２の符号化対象コードのアドレスに基づいて前記第２の符号化対象コードのアドレス表を作成し、前記符号化手段は、前記第２の符号化対象コードを符号化する。これにより符号化対象コードの符号化を多重にすることができる。
【００２０】
本発明は、請求項８に記載のように、符号化対象コードを一部に含むプログラムコード内に前記符号化対象コードの範囲を示すマークを挿入する挿入ステップと、前記プログラムコードのコンパイル実行後に、前記マークに基づいて前記符号化対象コードのアドレスを計算するアドレス計算ステップと、前記符号化対象コードのアドレスに基づいて、前記符号化対象コードのアドレス表を作成するアドレス表作成ステップとを含むことを特徴とする実行プログラム生成方法である。本発明によれば、符号化対象コードのアドレス表を作成しておき、後で、この符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを計算し、この符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号することで、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる。
【００２１】
本発明の実行プログラム生成方法は、請求項９に記載のように、更に、前記符号化対象コードを符号化する符号化ステップを含む。
【００２２】
前記アドレス計算ステップは、請求項１０に記載のように、前記マークと所定のマークとの位置の差分に基づいて、前記符号化対象コードのアドレスを計算する。本発明によれば、相対アドレスによる符号化対象コードの開始アドレスおよび終了アドレスを算出できる。
【００２３】
前記アドレス計算ステップは、請求項１１に記載のように、実行ファイルがメモリ内にロードされるベースアドレスから所定のマークがロードされるアドレスの差分を該ベースアドレスに加えることで、前記符号化対象コードのアドレスを計算する。絶対アドレスによる前記符号化対象コードの開始アドレスおよび終了アドレスを計算できる。
【００２４】
本発明の実行プログラム生成方法は、請求項１２に記載のように、更に、前記プログラムコードのコンパイル前に、所定のマーク、前記符号化対象コードのアドレスを計算するコード及び前記符号化対象コードを復号する復号コードのうちの少なくともいずれか一つを含む挿入コードを前記プログラムコード内に挿入するステップを含む。
【００２５】
本発明の実行プログラム生成方法は、請求項１３に記載のように、更に、前記プログラムコードのコンパイル前に、少なくとも所定のマークを含む挿入コードを前記プログラムコード内に挿入する第１挿入ステップと、前記プログラムコードのコンパイル後に、前記符号化対象コードを復号するためのコンパイル済みの復号コード及び前記符号化対象コードのアドレスを算出するためのコンパイル済みのアドレス算出コードのうちの少なくともいずれか一方を前記第１挿入ステップで挿入したマークの位置に挿入する第２挿入ステップとを含む。
【００２６】
本発明は、請求項１４に記載のように、符号化対象コードを一部に含むプログラムコード内に前記符号化対象コードの範囲を示すマークを挿入する挿入ステップ、前記プログラムコードのコンパイル実行後に、前記マークに基づいて前記符号化対象コードのアドレスを計算するアドレス計算ステップ、前記符号化対象コードのアドレスに基づいて、前記符号化対象コードのアドレス表を作成するアドレス表作成ステップをコンピュータに実行させるプログラムである。本発明によれば、符号化対象コードのアドレス表を作成しておき、後で、この符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを計算し、この符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号することで、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる。
【００２７】
前記プログラムは、請求項１５に記載のように、更に、前記符号化対象コードを符号化する符号化ステップを前記コンピュータに実行させる。
【００２８】
本発明は、請求項１６に記載のように、符号化された符号化対象コードを一部に含むプログラムコード内に挿入され、該符号化対象コードの範囲を示すマークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを算出するアドレス算出手段と、前記アドレス算出手段が算出した符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号する復号手段と、前記復号手段が復号した符号化対象コードを符号化する符号化手段とを含むことを特徴とするプログラム処理装置である。
【００２９】
本発明によれば、符号化された符号化対象コードを一部に含むプログラムコード内に挿入された符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを計算し、この符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号し、復号した符号化対象コードを実行し、符号化対象コードを再度符号化することで、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる。また、符号化しようとする符号化対象コードをコンパイルする作業者に対して、コードを復号するプログラムのソースコードを開示することなしに、符号化対象コードを含む関数内に、その復号プログラムの実行コードをインライン展開することができる。また、ラベル名の唯一性を維持するための管理が必要ないため、管理の負荷が増大することもない。
【００３０】
本発明は、請求項１７に記載のように、符号化された符号化対象コードを一部に含むプログラムコード内に挿入され、該符号化対象コードの範囲を示すマークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを算出するアドレス算出ステップと、前記符号化対象コードのアドレスに基づいて、前記符号化対象コードを復号する復号ステップと、前記符号ステップで復号した符号化対象コードを実行する実行ステップと、前記復号ステップで復号された符号化対象コードを符号化する符号化ステップとを含むことを特徴とするプログラム処理方法である。
【００３１】
本発明によれば、符号化された符号化対象コードを一部に含むプログラムコード内に挿入された符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを算出し、この符号化対象コードのアドレスに基づいて、符号化対象コードを復号し、復号した符号化対象コードを実行後、符号化対象コードを再度符号化できる。
【００３２】
本発明は、請求項１８に記載のように、符号化された符号化対象コードを一部に含むプログラムコード内に挿入され、該符号化対象コードの範囲を示すマークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを算出するアドレス算出ステップ、前記復号ステップで復号された符号化対象コードを符号化する符号化ステップをコンピュータに実行させるプログラムである。本発明によれば、符号化された符号化対象コードを一部に含むプログラムコード内に挿入された符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを算出し、この符号化対象コードのアドレスに基づいて、符号化対象コードを復号し、復号した符号化対象コードを実行後、符号化対象コードを再度符号化することができる。
【発明の効果】
【００３３】
本発明によれば、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる実行プログラム生成装置、実行プログラム生成方法、プログラム処理装置、プログラム処理方法及びプログラムを提供できる。
【発明を実施するための最良の形態】
【００３４】
以下、本発明を実施するための最良の形態について実施例を用いて説明する。
【実施例１】
【００３５】
実施例１は、実行プログラムを部分的に符号化する場合に本発明を適用した実施例である。本発明を実現したプログラムコードは、例えば、所定のオペレーティングシステムをインストールした汎用コンピュータ・システム上に実行可能である。汎用コンピュータ・システムは、一般に、プログラムコードを実行するプロセッサと、プログラムコードをロードしたり作業データを一時格納するためのメモリと、ディスプレイやキーボード／マウスなどのユーザ入出力装置と、プログラム・ファイルやデータ・ファイルなどを不揮発的に保管するハード・ディスク・ドライブなどの外部記憶装置を含んでいる。
【００３６】
図１は、実施例１のプログラム生成の全体的な手順である。まず、ステップＳ１００で、プログラム作成者は、実行プログラムのソースコードを作成する。次に、ステップＳ２００で、符号化したい符号化対象コードの直前に開始挿入コードを挿入し、符号化対象コードの直後に終了挿入コードを挿入する。ここで、コードの挿入方法は、直接コードないし、そのコードにコンパイルされるソースコードを挿入しても実現可能であるが、簡便な方法としては、コードをインクルードファイルとして用意しておき、そのファイルをインクルードする方法がある。
【００３７】
また別の簡便な方法としては、コードをプリプロセッサなどが提供するマクロとして定義しておき、そのマクロを挿入する方法も可能である。いずれの方法においても、挿入するコードは最終的なものである必要はない。なお、後で説明するアドレス解決プログラムが、最終的なコードを挿入するための空領域とともに、その領域をアドレス解決プログラムが発見できる様にするためのマークを挿入しておき、アドレス解決プログラムが後でコードを挿入する方法も選択できる。
【００３８】
図２は、開始挿入コードと終了挿入コードを挿入した後の実行プログラムのイメージである。図２の上部が、ファイルの先頭方向で、プログラムの実行は、上から下のコードへと処理が進む。図では、実行コードのイメージであるが、理解しやすくするため、ジャンプ命令やラベルなどを、アセンブラ表現で表現している。図２に示すように、実行プログラムは、開始挿入コード１１０、符号化対象コード１２０および終了挿入コード１３０を含む。開始挿入コード１１０が符号化対象コード１２０の直前に挿入され、終了挿入コード１３０が符号化対象コード１２０の直後に挿入されている。この状態では符号化対象コード１２０はまだ符号化されていない。
【００３９】
開始挿入コード１１０は、ジャンプ命令１１１、挿入コード開始マーク１１２、アドレス解決テーブル領域１１３、ジャンプ命令１１４、開始アドレス算出コード１１５、終了アドレス算出コード１１６、復号コード１１７および符号化開始マーク１１８を含む。開始挿入コード１１０の最初には、アドレス解決プログラムを適用した後に作成されるアドレス解決テーブルが実行されない様にするためのジャンプ命令１１１がある。その次に、アドレス解決プログラムが挿入コードおよびアドレス解決テーブルを作成する位置を特定するための挿入コード開始マーク１１２がある。アドレス解決プログラムの適用後には、挿入コード開始マーク１１２は不要になるので、アドレス解決テーブル領域１１３などと兼ねることも可能である。
【００４０】
その次に、挿入コード開始マーク１１２より大きな場合にのみ必要となるアドレス解決テーブルのための領域がある。このアドレス解決テーブル領域１１３は、アドレス解決プログラムがアドレス解決テーブルを作成するためのデータ領域である。その次に、一回の実行の時は何もせず、二回目以降の実行の時に符号化対象コードにジャンプするジャンプ命令１１４がある。これは、復号処理は一度だけでよく、二度目以降の復号を実行しなくするために必要である。本実施例では、一度復号したコードはそのままにしておくので、同じコードを何度も実行する場合には、二度目以降の実行時に復号処理を重ねて行わないために、二度目以降の実行であるか判定して、二度目以降である場合には、復号処理を回避する様に構成しておく。
【００４１】
その次に、アドレス解決テーブルから符号化対象コード１２０の開始位置へのオフセットを読み出し、これとアドレス解決テーブルの開始アドレスとから符号化対象コード１２０の開始アドレスを算出する開始アドレス算出コード１１５があり、次に同様に符号化対象コード１２０の終了アドレスを算出する終了アドレス算出コード１１６がある。次に、算出された符号化対象コード１２０のアドレスを元に符号化されている符号化対象コード１２０を復号する復号コード１１７がある。
【００４２】
復号コード１１７は、アドレス解決テーブルを参照して、符号化対象コード１２０の位置を取得して復号を行うものである。復号処理は、一般に知られている符号化の復号処理に従って行えばよい。復号コード１１７と、アドレス解決テーブルの相対位置が固定になっていれば、相対アドレス参照により復号コード１１７からアドレス解決テーブルを参照することができる。復号コード１１７と、アドレス解決テーブルの相対位置が変動する場合には、アドレス解決プログラムが、アドレス解決テーブルを参照する命令のオペランドを書きかえるか、または、復号コード１１７内に相対位置を示す情報または、絶対アドレスを埋め込み、アドレス解決テーブルを参照する命令がその相対位置または絶対アドレスを参照することで、アドレス解決テーブルが参照可能になる。
【００４３】
その次に、アドレス解決プログラムが符号化対象コード１２０の開始位置を特定するための符号化開始マーク１１８がある。終了挿入コード１３０には、アドレス解決プログラムが符号化対象コード１２０の終了位置を特定するための符号化終了マーク１３１がある。符号化開始マーク１１８および符号化終了マーク１３１は、符号化を行うコードの位置を特定するためのマークである。
【００４４】
再度図１に戻り、ステップＳ３００で、開始挿入コード１１０と終了挿入コード１３０を挿入した実行プログラムのソースコードをコンパイラ、リンカにかけて、実行形式のプログラムに変換する。ここで、コンパイル処理およびリンク処理は汎用のコンパイラおよびリンカを利用することができる。
【００４５】
ステップＳ４００で、実行形式のプログラムが生成できたら、生成されたプログラムにアドレス解決プログラムを適用する。アドレス解決プログラムの適用と、符号化の処理はまとめて行うようにすると、適用する上で簡便である。ステップＳ４００の詳しい説明は後で行う。なお、リンカをかける前のオブジェクトコードに対して、上記のアドレス解決プログラムを適用することも可能である。この場合には、挿入するコードは位置独立コードになっている必要がある。さらに、符号化の実施は、リンカによってリンクした後に、別のプログラムの形で符号化を実行するのが適当である。
【００４６】
次にアドレス解決プログラム適用後の実行プログラムのイメージについて説明する。図３は、アドレス解決プログラムの適用後の実行プログラムのイメージを示している。アドレス解決後の実行プログラムは、開始挿入コード２１０、符号化対象コード１２０、終了挿入コード２３０を含む。符号化対象コード１２０は、アドレス解決プログラム適用後に符号化されている。開始挿入コード２１０は、ジャンプ命令１１１、アドレス解決テーブル１１９、ジャンプ命令１１４、開始アドレス算出コード１１５、終了アドレス算出コード１１６、復号コード１１７を含む。
【００４７】
図２で示した挿入コード開始マーク１１２およびアドレス解決テーブル領域１１３の箇所には、アドレス解決テーブル１１９が生成される。また、符号化開始マーク１１８および符号化終了マーク１３１の位置には、何もしないという命令ｎｏｐが書き込まれる。
【００４８】
図４は、アドレス解決プログラムの処理の流れ(ステップ400)を示す。ステップＳ４０１で、最初はファイルの先頭から挿入コード開始マーク１１２を探す。マークを探す方法は、ファイルの先頭から順に、マークと比較することで可能である。マークが存在しえない領域を検索範囲から除外することで、検索の時間は短縮できる。また、アライメントなどの条件によりマークが挿入される場所のアドレスに特徴がある場合には、その特徴を利用してさらに検索範囲を限定することができる。
【００４９】
ステップＳ４０２で、挿入コード開始マーク１１２が見つからずにファイルの末尾に到達した時には、それまでに処理をしたファイルを出力してそこで処理を停止する。ステップＳ４０２で、挿入コード開始マーク１１２が見つかった場合には、ステップＳ４０３で、そのマークの次から符号化開始マーク１１８を検索する。挿入コード開始マーク１１２と符号化開始マーク１１８が置かれる距離が定まっていたり、ある一定以上の距離があることが確認されている場合には、符号化開始マーク１１８の検索を省略したり、定まった場所以降を検索することで、処理を省略することが可能になる。
【００５０】
ステップＳ４０３で符号化開始マーク１１８が正しく見つかった場合には、ステップＳ４０４で、挿入コード開始マーク１１２と符号化開始マーク１１８のコード中の距離を計算する。相対的アドレスを用いる方法では、例えば、アドレス解決テーブル１１９を開始マークの位置に設置して、アドレス解決テーブル１１９のエントリとして、開始マークの開始アドレスから符号化開始マーク１１８の開始アドレスの差分を記入する。
【００５１】
絶対アドレスを用いる方法では、メモリ内に対象とする実行ファイルがロードされた時に、ファイルがロードされるベースアドレスから、挿入コード開始マーク１１２がロードされるアドレスの差分を、実行ファイルが置かれると前提としているベースアドレスに加えて計算可能である。実行ファイルが置かれると前提としているベースアドレスは、一般に実行ファイルのへッダーに書かれているので、それを読めばよい。
【００５２】
ステップＳ４０５で、ステップＳ４０４で計算されたデータをアドレス解決テーブル１１９の最初のエントリに書き込む。本実施例では、挿入コード開始マーク１１２があった位置にアドレス解決テーブル１１９を作成するので、挿入コード開始マーク１１２の先頭部分に書き込む。次に、ステップＳ４０６で、符号化開始マーク１１８の次の位置から符号化終了マーク１３１を探す。探す方法は、挿入コード開始マーク１１２および符号化開始マーク１１８と同様である。ステップＳ４０６で正しくマークが見つかった場合には、ステップＳ４０７で、ステップＳ４０４と同様に、符号化終了マーク１３１までの距離を計算する。
【００５３】
次に、ステップＳ４０８で、ステップＳ４０７で計算した値をステップＳ４０５で書き込んだ次のエントリに書き込む。そして、ステップＳ４０９で、符号化開始位置から終了位置までのコードを予め定めておいた符号化方法に従って符号化する。これにより符号化対象コード１２０が符号化される。
【００５４】
さらに、符号化した次の位置から、次の挿入開始マークを検索して(ステップＳ４０１)、一つのファイルに対して複数の符号化を施す場合に対応する。また、挿入コード開始マーク１１２、符号化開始マーク１１８および符号終了マーク１３１の位置関係が正しくなかったり、一部見つからないマークがある場合には、エラー処理を行うことも当然必要となる。
【００５５】
図５は実施例１によるプログラム処理方法を説明する図である。プログラム処理方法では、ステップＳ５００で、符号化された符号化対象コード１２０を一部に含むプログラムコード内に挿入され、符号化対象コードの範囲を示す符号化開始マーク及び符号化終了マークに基づき生成された符号化対象コードのアドレス表を参照して、該符号化対象コードのアドレスを計算し、この符号化対象コードのアドレスを用いて、符号化対象コード１２０を復号する。ステップＳ６００で、復号した符号化対象コード１２０を実行する。ステップＳ７００で、復号された符号化対象コード１２０を再度符号化する。これにより符号化対象コード１２０が符号化されていない時間を最小限に抑えることができる。
【００５６】
実施例１によれば、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる。
【実施例２】
【００５７】
次に実施例２について説明する。実施例２は、符号化の範囲を入れ子の形にして、符号化を多重に適用する例である。図６は、多重の符号化を行う時のマークの並び方を示したイメージである。符号化の範囲を入れ子の形にして、符号化を多重に適用する際には処理の順序が異なる。図６に示すように、実行プログラムは、挿入コード開始マーク１１２Ａ、符号化開始マーク１１８Ａ、符号化終了マーク１３１Ａ、挿入コード開始マーク１１２Ｂ、符号化開始マーク１１８Ｂおよび符号化終了マーク１３１Ｂを含む。
【００５８】
挿入コード開始マーク１１２Ａ、符号化開始マーク１１８Ａおよび符号化終了マーク１３１Ａが二重符号化のためのマークである。挿入コード開始マーク１１２Ｂ、符号化開始マーク１１８Ｂおよび符号化終了マーク１３１Ｂは、一重符号化のためのマークである。図６に示す例では、挿入コード開始マーク１１２Ａ、符号化開始マーク１１８Ａ、挿入コード開始マーク１１２Ｂ、符号化開始マーク１１８Ｂが、見つかった所までスタックが積まれ、符号化終了マーク１３１Ｂが見つかった所で、スタックから挿入コード開始マーク１１２Ｂ、符号化開始マーク１１８Ｂの位置を取り出し、処理を行う。次に、符号化終了マーク１３１Ａが見つかった所で、スタックから挿入コード開始マーク１１２Ａ、符号化開始マーク１１８Ａの位置を取り出し、アドレス解決テーブルの作成および符号化を行う。
【００５９】
図７は、多重化の場合のアドレス解決の処理フローチャートである。ステップＳ４１１で、ファイルの先頭からマークを検索していき、ステップＳ４１２で、マークを発見した場合、ステップＳ４１３に進み、マークを発見できない場合は、ステップＳ４２０で、スタックが空であるかどうかを調べ、スタックが空の場合は処理を終了し、スタックが空でない場合は、ステップ４２１でエラー処理を行う。
【００６０】
ステップＳ４１３で、見つかったマークが挿入コード開始マーク１１２Ｂの場合、ステップＳ４１４で次のマークの検索を行う。ステップＳ４１５で、見つかったマークが符号化開始マーク１１８Ａの場合、ステップＳ４１６に進む。ステップＳ４１６で、挿入コード開始マーク１１２Ｂと符号化開始マーク１１８Ｂの位置情報をスタックへプッシュし、ステップＳ４１７で、次のマークを検索する。ステップＳ４１８で、見つかったマークが符号化終了マーク１３１Ｂの場合、ステップＳ４１９に進む。
【００６１】
ステップＳ４１９で、挿入コード開始マーク１１２Ｂと符号化開始マーク１１８Ｂの位置情報をスタックの先頭からポップし、一組みのマーク位置を元にアドレス解決および符号化を実行する。以下の手順と同様にして、三重以上の多重の符号化や、さらに複雑な入れ子構造の符号化の場合にも適用することが可能である。
【００６２】
実施例２によれば、符号化対象コード１２０を一部に含むプログラムコード内に符号化対象コードの範囲を示す符号化開始マーク１１８Ｂ及び符号化終了マーク１３１Ｂを挿入し、プログラムコードのコンパイル実行後に、符号化開始マーク１１８Ｂ及び符号化終了マーク１３１Ｂに基づいて符号化対象コードのアドレスを計算し、符号化対象コードのアドレスに基づいて、符号化対象コードのアドレス表を作成後、符号化対象コード１２０を符号化する。
【００６３】
その後、符号化対象コード１２０及び符号化対象コードの範囲を示す符号化開始マーク１１８Ｂ及び符号化終了マーク１３１Ｂを含む第２の符号化対象コードの範囲を示す符号化開始マーク１１８Ａ及び符号化終了マーク１３１Ａを挿入し、符号化開始マーク１１８Ａ及び符号化終了マーク１３１Ａに基づいて第２の符号化対象コードのアドレスを計算し、第２の符号化対象コードのアドレスに基づいて第２の符号化対象コードのアドレス表を作成し、第２の符号化対象コードを符号化する。これにより、符号化対象コードを入れ子状態にすることができる。なお、第２の符号化対象コードは、符号化対象コード１２０及び符号化対象コードの範囲を示す符号化開始マーク１１８Ｂ及び符号化終了マーク１３１Ｂを含む。
【実施例３】
【００６４】
次に実施例３について説明する。実施例３は、アドレス解決プログラムによって、コンパイル後に開始挿入コードおよび終了挿入コードを挿入する例である。図８は実施例３の実行プログラム生成の全体的な手順である。実施例１と同一箇所には同一符号を付して説明する。図９は符号化対象コードの前後に開始挿入コードマークと終了挿入コードマークを挿入した後の実行プログラムを示す。まず、ステップＳ１００で、プログラム作成者は、実行プログラムのソースコードを作成する。
【００６５】
次に、ステップＳ２３０で、開始挿入コードを挿入する位置を示すためのマークと、アドレス解決プログラムが開始挿入コードを挿入するための領域を確保するためのコードとを含む開始挿入コードマーク３１０を符号化対象コード１２０の前に挿入する。ステップＳ２３０で、終了挿入コードを挿入する位置を示すためのマークと、アドレス解決プログラムが終了挿入コードを挿入するための領域を確保するためのコードとを含む終了挿入コードマーク３３０を符号化対象コード１２０の後に挿入する。
【００６６】
このように、実施例３では、実施例１と異なり、ステップＳ２３０では、挿入するのは開始終了コードと終了挿入コードそのものではなく、後で開始挿入コードと終了挿入コードを挿入する位置を示すためのマークと、アドレス解決プログラムが後で開始挿入コードと終了挿入コードを挿入するための領域を確保するためのコードとを挿入する。ここで、コードの挿入方法は、直接コードないし、そのコードにコンパイルされるソースコードを挿入してもよいし、コードをインクルードファイルとして用意しておき、そのファイルをインクルードするようにしてもよい。また、コードをプリプロセッサなどが提供するマクロとして定義しておき、そのマクロを挿入してもよい。
【００６７】
図１０は、ステップＳ２３０で挿入する開始挿入コードマーク３１０を説明する図である。オフセット位置０バイト目から８バイト目には所定の情報が記述されている。オフセット位置１２バイト目の１が開始マークであることを示す。オフセット位置１６バイト目の数字が、挿入するコードのための領域の大きさを示す。この例では、開始マークが２５６バイトの領域を確保していることを示す。オフセット位置２０バイト目の０の配列はスペースを示す。
【００６８】
図１１は、ステップＳ２３０で挿入する終了挿入コードマーク３３０を説明する図である。オフセット位置０バイト目から８バイト目には所定の情報が記述されている。オフセット位置１２バイト目の２が、終了マークであることを示す。オフセット位置１６バイト目の数字が、挿入するコードのための領域の大きさを示す。この例では、終了マークが２５６バイトの領域を確保していることを示す。オフセット位置２０バイト目以降は、領域を確保するためのデータであり、その大きさは領域の大きさからマークの大きさである２０バイトを引いただけの大きさである。オフセット位置２０バイト目の０の配列はスペースを示す。
【００６９】
再度図８に戻り、ステップＳ３００で、実行プログラムのソースコードをコンパイラ、リンカにかけて、実行形式のプログラムに変換する。ステップＳ４００で、実行形式のプログラムができたら、生成されたプログラムにアドレス解決プログラムを適用する。
【００７０】
次に、アドレス解決プログラム適用後の実行プログラムのイメージについて説明する。図１２はアドレス解決プログラム適用後の実行プログラムのイメージを示している。図１２に示すように、アドレス解決後の実行プログラムは、開始挿入コード４１０、符号化対象コード１２０および終了挿入コード４３０を含む。次にステップＳ４３０によるアドレス解決プログラムの手順について説明する。図１３は、実施例３におけるアドレス解決プログラムの手順の内で、一箇所の符号化を行う手順を示す。
【００７１】
まず、ステップＳ４３１で、符号化対象コード１２０の前に挿入された開始挿入コードマーク３１０を検索する。そして、ステップＳ４３２で、開始挿入コードマーク３１０にある領域の大きさを取得する。必要であれば、これから埋め込むコードの大きさに十分な領域が存在するか確認し、不足していればエラー処理を行う。
【００７２】
次に、ステップＳ４３３で、終了挿入コードマーク３３０を検索する。そして、ステップＳ４３４で、終了挿入コードマーク３３０にある領域の大きさを取得する。必要であれば、これから埋め込むコードの大きさに十分な領域が存在するか確認し、不足していればエラー処理を行う。次に、ステップＳ４３５で、開始挿入コード４１０の領域の先頭にジャンプ命令４１１を挿入する。また、終了挿入コード４３０の領域の先頭にジャンプ命令４３１を挿入する。
【００７３】
本実施例では、開始挿入コード４１０に二つのエントリを持つアドレス解決テーブルを設置するので、その大きさの８バイト(一エントリ４バイトとする)をまたぐジャンプ命令４１１を埋め込む。同様に、終了挿入コード４３０には、一つのエントリを持つアドレス解決テーブルを設置するので、４バイトをまたぐジャンプ命令４３１を埋め込む。次に、ステップＳ４３６で、開始挿入コード４１０の領域にアドレス解決テーブル４１２を作成する。このアドレス解決テーブル４１２は復号のためのものである。アドレス解決テーブル４１２を作成する場所は、ステップＳ４３５で埋め込んだジャンプ命令４１１の直後である。
【００７４】
埋め込むエントリは、本実施例では二つあり、符号化開始オフセットと符号化終了オフセットである。符号化開始オフセットは、開始挿入コード４１０に対するアドレス解決テーブル４１２の先頭から符号化開始の位置までの差分である。したがって、ステップ４３２で取得した開始挿入コード４１０の領域の大きさから、ジャンプ命令４１１の大きさ(ここでは、４バイトとする)を引いた大きさである。この様に算出されたオフセット値をアドレス解決テーブル４１２の先頭に書き込む。
【００７５】
符号化終了オフセットは、開始挿入コード４１０に対するアドレス解決テーブル４１２の先頭から符号化終了の位置までの差分である。したがって、ステップＳ４３３で見つけた終了挿入コードマーク３３０の位置とステップＳ４３１で見つけた開始挿入コードマーク３１０の位置の差分から、ジャンプ命令４１１の大きさ(ここでは、４バイトとする)を引いた大きさである。この様に算出されたオフセット値をアドレス解決テーブル４１２の次のエントリ(一つのエントリは４バイトである)に書き込む。
【００７６】
次に、ステップＳ４３７で、終了挿入コード４３０に対してアドレス解決テーブル４３２を作成する。このアドレス解決テーブルは再符号化のためのものである。アドレス解決テーブル４３２を作成する場所は、ステップＳ４３５で埋め込んだジャンプ命令４３１の直後である。終了挿入コード４３０の領域に埋め込むエントリは、本実施例では一つあり、開始挿入コード４１０の領域にあるアドレス解決テーブル４１２への終了挿入コード４３０の領域にあるアレドス解決テーブル４３２からのオフセットである。なお、復号用のアドレス解決テーブル４１２と同様の方法で、再暗号化用のアドレス解決テーブル４３２を作成する。
【００７７】
実施例３では、アレドス解決テーブル４１２、４３２はそれぞれの領域の先頭からジャンプ命令を置いた次から始まるので、開始挿入コード４１０の先頭と、終了挿入コード４３０の先頭の差分と等しい。この値を、ステップＳ４３５で埋め込んだジャンプ命令４３１の直後に書き込む。次に、ステップＳ４３８で、開始挿入コード４１０の領域に用意しておいたコードを埋め込む。ここでは、開始挿入コード４１０の領域に、符号化対象コード１２０の開始アドレスおよび終了アドレスを計算するためのコンパイル済みの開始アドレス算出コード４１４および終了アドレス算出コード４１５、符号化対象コード１２０を復号するためのコンパイル済みの復号コード４１６を挿入している。
【００７８】
開始挿入コード４１０は、決まったコードであるので、前もって用意しておき、アドレス解決プログラムに保持させておくか、アドレス解決プログラムが参照できる場所に格納しておき、読み出したコードをそのままアドレス解決テーブル４１２の直後に埋め込めばよい。開始挿入コード４１０の準備は、センブリ言語で作成し、コンパイラで位置独立コードを生成する指定とともにコンパイルして生成することができる。アセンブリ言語だけでなく、高級言語と必要であればインラインアセンブラを組み合せて作成すると、作成およびコードの管理が容易になる。
【００７９】
次に、ステップＳ４３９で、ステップＳ４３８と同様の方法で、終了挿入コード４３０の領域に用意しておいた挿入コードを埋め込む。ここでは、終了挿入コード４３０の領域に、符号化対象コード１２０の開始アドレスおよび終了アドレスを算出するためのコンパイル済みの開始アドレス算出コード４３４および終了アドレス算出コード４３５、符号化対象コード１２０を再度符号化（暗号化）のためのコンパイル済みの再暗号化コード４３６を挿入している。最後に、ステップＳ４３９で、符号化対象コード１２０を符号化して、元のコードの位置に上書きして、アドレス解決プログラムの一箇所の符号化の処理は終了する。
【００８０】
その後、実施例１の図５で説明したように、プログラム処理方法では、符号化された符号化対象コード１２０を一部に含むプログラムコード内に挿入された符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを算出し、符号化対象コードのアドレスに基づいて、符号化対象コード１２０を復号する。復号した符号化対象コード１２０を実行する。復号された符号化対象コード１２０を再度符号化する。
【００８１】
ステップ４３８および４３９において、挿入するコードは、以下のようにアセンブリ言語を用いて作成可能である。例えば、以下のアセンブリ(GNU アセンブラgas、armアーキテクチャ)のコードによって、アドレス解決テーブルから、符号化開始、終了のアドレスを計算することが可能である。
・0: .space 8 /* テーブルのダミー後で削除 */
・adr r1, 0b  /* これ以降が開始挿入コード*/
・ldr r2, [r1]
・ldr r3, [r1, 4]
・add r2, r2, r1
・add r3, r3, r1
・mov r0, r2
・mov r1, r3
【００８２】
また復号コード４１７の実装は、特に新しい技術を必要としないので、すでに知られているものを利用できる。高級言語で実装して、コンパイルしたものを利用するのも容易である。例えば高級言語で実装する場合には、復号機能を関数で実装しておき、前のアドレス取得コードが復号アドレス情報を、スタックまたはレジスタに関数の呼び出し規約にしたがって正しく設定しておけばよい。上のアセンブラのコード例では、最後のmov命令によって、レジスタr0とr1にそれぞれ符号化されたコードの先頭アドレスと終了アドレスが設定されている。復号関数のコンパイル時には、レジスタr0とr1をポインタ型の引数として受けとる様にしておけばよい。
【００８３】
実施例３によれば、コンパイル後に開始挿入コードおよび終了挿入コードを挿入する場合でも、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で復号してから、復号したコードを実行する機能、さらに、実行後に再び暗号化し直す機能を、アセンブラの知識を持たない一般のプログラム作成者に対しても提供できる。
【００８４】
図１４は、実施例１乃至３に係る実行プログラムを好適に生成することができる実行プログラム生成装置の構成を模式的に示したブロック図である。図１４に示すように、実行プログラム生成装置１００は、コンパイラ１０１、挿入手段１０２、アドレス計算手段１０３、アドレス表作成手段１０４、符号化手段１０５及び領域確保手段１０６を含む。実行プログラム生成装置１００の実体は、同様の機能を実現するソフトウェア・プログラムをインストールした汎用コンピュータ・システムである。
【００８５】
コンパイラ１０１は、高級言語形式のソース・プログラム・コードをオブジェクト・プログラム・コードに変換するためのものである。挿入手段１０２は、符号化対象コード１２０を一部に含むプログラムコード内に符号化対象コードの範囲を示す符号化開始マーク及び符号化終了マークを挿入する。アドレス計算手段１０３は、プログラムコードのコンパイル実行後に、符号化開始マーク及び符号化終了マークに基づいて符号化対象コードのアドレスを計算する。
【００８６】
アドレス表作成手段１０４は、符号化対象コードのアドレスに基づいて、符号化対象コードのアドレス表を挿入コード開始マーク１１２の位置に作成する。このとき、アドレス計算手段１０４は、符号化開始マーク１１８及び符号化終了マーク１１８と挿入コード開始マーク１１２との位置の差分に基づいて、符号化対象コードのアドレスを計算してもよく。アドレス計算手段１０４は、実行ファイルがメモリ内にロードされるベースアドレスから挿入コード開始マーク１１２がロードされるアドレスの差分をベースアドレスに加えることで、符号化対象コードのアドレスを計算してもよい。符号化対象コードのアドレス表が上述したアドレス解決テーブルに対応する。
【００８７】
符号化手段１０５は、符号化対象コード１２０を符号化するものである。なお、符号化手段１０５は、符号化対象コード１２０を多重に符号化するようにしてもよい。領域確保手段１０６は、後で挿入できるためのコード領域を確保しておくものである。なお、挿入手段１０２は、実施例１で説明したように、プログラムコードのコンパイル前に、挿入コード開始マーク１１２、符号化対象コードのアドレスを計算する開始アドレス算出コード１１５、終了アドレス算出コード１１６、及び符号化対象コード１２０を復号する復号コード１１７を含む挿入コードをプログラムコード内に挿入してもよい。また、挿入手段１０２は、実施例３で説明したように、プログラムコードのコンパイル前に、開始挿入コードマーク３１０及び終了挿入コードマーク３３０をプログラムコード内に挿入し、プログラムコードのコンパイル後に、符号化対象コード１２０を復号するためのコンパイル済みの復号コード４１７及び符号化対象コードのアドレスを計算するためのコンパイル済みの開始アドレス算出コード４１５、終了アドレス算出コード４１６等を開始挿入コードマーク３１０や終了挿入コードマーク３３０の位置に挿入してもよい。なお、アドレス解決プログラムにより、図１４で示した挿入手段１０２、アドレス計算手段１０３、アドレス表作成手段１０４、符号化手段１０５及び領域確保手段１０６が実現される。
【００８８】
図１５はプログラム処理装置の構成を模式的に示したブロック図である。図１５に示すように、プログラム処理装置２００は、制御手段２０１、アドレス計算（算出）手段２０２、復号手段２０３及び符号化手段２０４を含む。このプログラム処理装置２００は、実行プログラム生成装置１００により生成された実行プログラムを処理するものである。制御手段２０１は、プログラム処理装置２００の全体を制御する。アドレス計算手段２０２は、符号化された符号化対象コード１２０を一部に含むプログラムコード内に挿入された符号化対象コードのアドレス表を参照して、符号化対象コードのアドレスを算出する。復号手段２０３は、アドレス計算手段２０２が算出した符号化対象コードのアドレスに基づいて、符号化対象コード１２０を復号する。符号化手段２０４は、復号手段が復号した符号化対象コード１２０を符号化する。なお、アドレス計算手段２０２は、例えば図２で示した開始アドレス算出コード１１５及び終了アドレス算出コードにより実現され、復号手段２０３は、例えば図２で示した復号コード１１７により実現される。
【００８９】
また、上記各実施例によれば、高級言語で記述されたプログラムをコンパイルした後の実行コードの一部を、符号化しておき、実行時に復号する機能を提供するにあたって、符号化するプログラムコードの範囲を示すための符号化開始マークおよび符号化終了マークを挿入し、コンパイルの実行後に、マークで挟まれたプログラムコードを符号化するとともに、復号手段が復号するコードの範囲のアドレス解決のための表を作成する。
【００９０】
符号化するプログラムの範囲を示すための符号化開始マークおよび符号化終了マークを挿入する手段は、復号手段も同時に挿入するか、後で挿入できるためのコード領域を確保しておく。加えて、復号するコードの範囲を始めとするコードを、復号手段が参照する挿入先のコード箇所の数だけ、アドレス解決に必要となる表の為の領域を確保するように構成しておく。コンパイルの実行後に、プログラムコードを符号化する手段は、前記のマークで挟まれたプログラムコードを、符号化するとともに、符号化開始マークおよび符号化終了マークを参照することによって、復号する手段が復号するコードの範囲のアドレスを取得のために、アドレス解決のための表を作成する。
【００９１】
さらに、符号化開始マークおよび符号化終了マークを挿入する手段が、コードを復号する手段を挿入せずに、コードを復号する手段を挿入するための領域を確保していた場合には、符号化する手段にて、コードを復号する手段のコードを挿入する。そして、コードを復号する手段は、最終的に作成されたプログラムの実行時に、コードを復号する手段が作成した復号するコードが、アドレス解決に必要となる表を参照してアドレス計算を行い、符号化されたコードを参照して、復号するように構成しておく。
【００９２】
以上の構成により、プログラムコードの一部分を符号化しておき、自らのプログラムコード内で、復号してから復号したコードを実行する機能を符号化を行うプログラムをコンパイルする作業者に対して、復号モジュールのソースプログラムを開示することなく、符号化したコードを含む関数内にインライン展開する方法を実現する。さらに、コードを復号する手段から、符号化されたコードのアドレスを取得するようなコードを記述するために、アセンブリ言語のラベルを使用する必要がない。このため、ラベル名の唯一性を維持する必要なしに、一つの関数内で複数箇所または多重に符号化する構成をとることが可能となる。
【００９３】
以上本発明の好ましい実施例について詳述したが、本発明は係る特定の実施例に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形、変更が可能である。
【図面の簡単な説明】
【００９４】
【図１】実施例１のプログラム生成の全体的な手順である。
【図２】開始挿入コードと終了挿入コードを挿入した後の実行プログラムのイメージである。
【図３】アドレス解決プログラムの適用後の実行プログラムのイメージを示している。
【図４】アドレス解決プログラムの処理の流れを示している。
【図５】実施例１によるプログラム処理方法のフローチャートである。
【図６】多重の符号化を行う時のマークの並び方を示したイメージである。
【図７】多重化の場合のアドレス解決の処理フローチャートである。
【図８】実施例３の実行プログラム生成の全体的な手順である。
【図９】符号化対象コードの前後に開始挿入コードマークと終了挿入コードマークを挿入した後の実行プログラムである。
【図１０】開始挿入コードマークを説明する図である。
【図１１】終了挿入コードマークを説明する図である。
【図１２】アドレス解決プログラム適用後の実行プログラムのイメージを示している。
【図１３】実施例３におけるアドレス解決プログラムの手順を示す図である。
【図１４】実行プログラム生成装置の構成を模式的に示したブロック図である。
【図１５】プログラム処理装置の構成を模式的に示したブロック図である。
【符号の説明】
【００９５】
１００  実行プログラム生成装置
１０１  コンパイラ
１０２  挿入手段
１０３  アドレス計算手段
１０４  アドレス表作成手段
１０５  符号化手段
２００  プログラム処理装置
２０１  制御手段
２０２  アドレス計算手段
２０３  復号手段
２０４  符号化手段
【図１】
2006072584.tif 000003
【図２】
2006072584.tif 000004
【図３】
2006072584.tif 000005
【図４】
2006072584.tif 000006
【図５】
2006072584.tif 000007
【図６】
2006072584.tif 000008
【図７】
2006072584.tif 000009
【図８】
2006072584.tif 000010
【図９】
2006072584.tif 000011
【図１０】
2006072584.tif 000012
【図１１】
2006072584.tif 000013
【図１２】
2006072584.tif 000014
【図１３】
2006072584.tif 000015
【図１４】
2006072584.tif 000016
【図１５】
2006072584.tif 000017