(57)【特許請求の範囲】
【請求項１】
コンピュータを用いて構築される実行プログラム生成システムにおいて、実行コードを含む実行コード・セクションを含み、実行コードの少なくとも一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する方法であって、
前記コンピュータが備える復号化実施コード部分付与手段が、符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号化実施コード部分を実行プログラムに付与するステップと、
前記コンピュータが備える再配置実施コード部分付与手段が、符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置処理を行う再配置実施コード部分を実行プログラムに付与するステップと、
前記コンピュータが備える符号化手段が、実行プログラムに含まれる符号化対象コードを符号化するステップと、
を具備することを特徴とする実行プログラムの生成方法。
【請求項２】
コンピュータを用いて構築される実行プログラム生成システムにおいて、実行コードを含む実行コード・セクションと、静的に記憶領域が確保されているデータを記憶するためデータ・セクションを含み、実行コードの少なくとも一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する方法であって、
前記コンピュータが備える復号化実施コード部分付与手段が、符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号化実施コード部分を実行プログラムに付与するステップと、
前記コンピュータが備える再配置情報生成手段が、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置情報を生成して、前記データ・セクション内に予め確保されている再配置情報の記憶領域に格納するステップと、
前記コンピュータが備える再配置実施コード部分付与手段が、前記再配置情報生成手段によって生成された再配置情報と、符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内に含まれる再配置対象の相対アドレス情報についての再配置処理を行う再配置実施コード部分を実行プログラムに付与するステップと、
前記コンピュータが備える符号化手段が、実行プログラムに含まれる符号化対象コードを符号化するステップと、
を具備することを特徴とする実行プログラムの生成方法。
【請求項３】
前記符号化は圧縮処理であり、復号化は圧縮されたデータの伸長処理であることを特徴とする請求項１に記載の実行プログラムの生成方法。
【請求項４】
前記符号化は暗号化処理であり、復号化は暗号化データの復号処理であることを特徴とする請求項１に記載の実行プログラムの生成方法。
【請求項５】
前記符号化は圧縮処理であり、
前記コンピュータが備える符号化手段が実行プログラムに含まれる符号化対象コードを符号化した際に符号化対象コードの圧縮により空きができた領域の分だけ、実行コード・セクション以降のセクションの領域を前につめるステップと、
をさらに備える、
ことを特徴とする請求項１又は２のいずれかに記載の実行プログラムの生成方法。
【請求項６】
前記復号実施コード部分と前記再配置実施コード部分は、実行プログラムをメモリにロードした後符号化対象コードを最初に実行するときに、符号化対象コードに適用される、
ことを特徴とする請求項１に記載の実行プログラムの生成方法。
【請求項７】
実行コードを含む実行コード・セクションを含み、実行コードの少なくとも一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する装置であって、
（ａ）前記実行プログラムのコード中で、符号化すべき範囲を特定するための符号化対象コード検出手段と、
（ｂ）前記符号化対象コード検出手段によって特定された符号化対象範囲のコードを符号化するための符号化処理手段と、
（ｃ）符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号実施コード部分を実行プログラムに付与するための復号処理付与手段と、
（ｄ）符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報を再配置するための再配置実施コード部分を実行プログラムに付与するための再配置処理付与手段と、
を具備することを特徴とする実行プログラムの生成装置。
【請求項８】
実行コードを含む実行コード・セクションと、静的に記憶領域が確保されているデータを記憶するためデータ・セクションを含み、実行コードの少なくとも一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する装置であって、
（ａ）前記実行プログラムのコード中で、符号化すべき範囲を特定するための符号化対象コード検出手段と、
（ｂ）前記符号化対象コード検出手段によって特定された符号化対象範囲のコードを符号化するための符号化処理手段と、
（ｃ）符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号処理実施コード部分を実行プログラムに付与するための復号処理付与手段と、
（ｄ）符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置情報を生成して、前記データ・セクション内に予め確保されている再配置情報の記憶領域に格納する再配置情報生成手段と、
（ｅ）符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報を再配置するための再配置実施コード部分を実行プログラムに付与するための再配置処理付与手段と、
を具備することを特徴とする実行プログラムの生成装置。
【請求項９】
前記符号化は圧縮処理であり、復号化は圧縮されたデータの伸長処理である、
ことを特徴とする請求項７又は８のいずれかに記載の実行プログラムの生成装置。
【請求項１０】
前記符号化は暗号化処理であり、復号化は暗号化データの復号処理である、
ことを特徴とする請求項７又は８のいずれかに記載の実行プログラムの生成装置。
【請求項１１】
前記復号化処理手段と前記再配置処理手段は、実行プログラムをメモリにロードした後符号化対象コードを最初に実行するときに、符号化対象コードに適用される、
ことを特徴とする請求項７又は８のいずれかに記載の実行プログラムの生成装置。
【請求項１２】
実行コードを含む実行コード・セクションを含み、実行コードの少なくとも一部に符号化された符号化対象コードを含むタイプの実行プログラムを実行する方法であって、
（ａ）前記コンピュータが備えるメモリ割り付け手段が、実行プログラムをメモリ空間上に割り付けるステップと、
（ｂ）前記コンピュータが備えるプログラム実行手段が、メモリ・ロードされた実行プログラムを実行するステップと、
（ｃ）前記コンピュータが備える復号化手段が、符号化対象コードを実行する前に、符号化された符号化対象コードを符号化するメモリ空間を確保し、該確保したメモリ空間に符号化された符号化対象コードを復号化するステップと、
（ｄ）前記コンピュータが備える再配置処理手段が、符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置処理を行うステップと、
（ｅ）前記コンピュータが備える符号化対象コード実行手段が、復号化されるとともに再配置処理された符号化対象コードを実行するステップと、
を具備することを特徴とする実行プログラムの実行方法。
【請求項１３】
実行コードを含む実行コード・セクションと、静的に記憶領域が確保されているデータを記憶するためデータ・セクションを含み、実行コードの少なくとも一部に符号化された符号化対象コードを含むタイプの実行プログラムを実行する方法であって、前記プログラム・コードのデータ・セクション内には符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置情報が格納されており、
（ａ）前記コンピュータが備えるメモリ割り付け手段が、実行プログラムをメモリ空間上に割り付けるステップと、
（ｂ）前記コンピュータが備えるプログラム実行手段が、メモリ・ロードされた実行プログラムを実行するステップと、
（ｃ）前記コンピュータが備える復号化手段が、符号化対象コードを実行する前に、符号化された符号化対象コードを符号化するメモリ空間を確保し、該確保したメモリ空間に符号化された符号化対象コードを復号化するステップと、
（ｄ）前記コンピュータが備える再配置処理手段が、前記データ・セクションに格納されている再配置情報と、符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内に含まれる再配置対象の相対アドレス情報についての再配置処理を行うステップと、
（ｅ）前記コンピュータが備える符号化対象コード実行手段が、復号化されるとともに再配置処理された符号化対象コードを実行するステップと、
を具備することを特徴とする実行プログラムの実行方法。
【請求項１４】
復号化された符号化対象コードを実行する前記ステップ（ｅ）の終了後に、さらに、
（ｆ）前記コンピュータが備える手段が、復号化された符号化対象コードを含む予め確保されたメモリ空間を破棄もしくは解放するステップ
を具備することを特徴とする請求項１２又は１３のいずれかに記載の実行プログラムの実行方法。
【請求項１５】
前記符号化は圧縮処理であり、復号化は圧縮されたデータの伸長処理であることを特徴とする請求項１２乃至１４のいずれかに記載の実行プログラムの実行方法。
【請求項１６】
前記符号化は暗号化処理であり、復号化は暗号化データの復号処理であることを特徴とする請求項１２乃至１４のいずれかに記載の実行プログラムの実行方法。
【請求項１７】
実行プログラムは、符号化対象コードをメモリ・ロードした後既に呼び出されたことがあるか否かを示す復号実施フラグを含み、
前記復号実施フラグの設定に応じて前記（ｃ）復号化するステップと前記（ｄ）再配置処理するステップを実行することを特徴とする請求項１２乃至１４のいずれかに記載の実行プログラムの実行方法。
【請求項１８】
コンピュータ上で実行可能な実行プログラムをコンピュータ可読形式で格納したコンピュータ可読プログラム記憶媒体であって、
前記実行プログラムは、実行コードを含む実行コード・セクションを含み、実行コードの少なくとも一部に符号化を予定された符号化対象コードであり、
前記実行コード・セクションには、
前記コンピュータに対し、符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化するための処理を実行させる復号化実施コード部分と、
前記コンピュータに対し、符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置処理を実行させる再配置実施コード部分と、
が付与されていることを特徴とするコンピュータ可読プログラム記憶媒体。
【請求項１９】
コンピュータ上で実行可能な実行プログラムをコンピュータ可読形式で格納したコンピュータ可読プログラム記憶媒体であって、
前記実行プログラムは、実行コードを含む実行コード・セクションと、静的に記憶領域が確保されているデータを記憶するためデータ・セクションを含み、実行コードの少なくとも一部に符号化を予定された符号化対象コードであり、
前記データ・セクション内には、符号化対象コードの範囲内の命令に含まれる符号化対象コード範囲外に対する相対アドレス情報についての再配置情報が格納されており、
前記実行コード・セクションには、
前記コンピュータに対し、符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化するための処理を実行させる復号化実施コード部分と、
前記コンピュータに対し、前記データ・セクションに格納されている再配置情報と、符号化された符号化対象コードを復号化するための前記メモリ領域のアドレス情報に基づいて、符号化対象コードの範囲内に含まれる再配置対象の相対アドレス情報についての再配置処理を実行させる再配置実施コード部分と、
が付与されていることを特徴とするコンピュータ可読プログラム記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータ・システム上で実行されるプログラム・コードをメモリにロードするときにプログラム中のアドレス情報を再配置する再配置技術に係り、特に、一部符号化したコード部分を含み且つ実行時までは復号化しないように構成された実行プログラム・コードを実行時に最適に再配置するための再配置技術に関する。
【０００２】
更に詳しくは、本発明は、符号化したコード部分を含み且つ実行時まで復号化しないように構成されたプログラムを、汎用コンパイラを用いても生成することができる再配置技術に関する。
【０００３】
【従来の技術】
昨今の技術革新に伴い、ワークステーション、汎用パーソナル・コンピュータ（ＰＣ）など各種情報処理機器が開発され市販されている。かかる情報処理機器の基本構造は、プロセッサと主メモリである。すなわち、プロセッサは、主メモリにロードしたプログラム・コードを実行し、その作業データを主メモリの作業領域に書き込むようになっている。プロセッサは、一般に、オペレーティング・システム（ＯＳ）の制御下で各種プログラム・コードを実行する。
【０００４】
プログラム・コードを主メモリ上にロードする場所すなわちメモリ・アドレスを決める方式の１つとして、ハードウェアやプロセスやジョブなどのある単位の中でメモリ・アドレスを一意に決定する「絶対アドレス方式」がある。絶対アドレス方式を利用するプログラムが起動したとき、予定されたアドレスに当該プログラムを割り当てられないという状況が発生すると、プログラム中のアドレス情報を書き換える作業すなわち再配置（リロケーション）が必要となる。また、割り当てるアドレスを予め決めることなく、プログラムを起動する度に再配置を行うことを前提としたオペレーティング・システムもある。
【０００５】
一方、メモリ・アドレスの指定方式として、メモリ・アドレスの指定を現在実行している命令のアドレスに対する差分によって表現する「相対アドレス方式」もある（ＰＣ相対アドレス等とも呼ばれる）。相対アドレス方式を利用することにより、特定のアドレスに実行制御を移行したり、特定のアドレスに格納されたメモリ内容をアクセスしたりするために絶対アドレスを指定する必要が無くなる。したがって、相対アドレス方式によって表現されたプログラム・コードは、どのメモリ・アドレスに割り当てても、再配置処理を行うことなく実行可能となり、原則として再配置処理を不要にすることができる。つまり、起動時の処理を軽減することが可能となる。このため、相対アドレスによってプログラム・コードを表現することを前提としたオペレーティング・システムもある。
【０００６】
ところで、最近では、プログラムの格納に必要な記憶容量を小さくするためにプログラム・コードを圧縮したり、解析や改竄による不正利用を防止するためにプログラム・コードを暗号化したり、あるいはその他の目的のために、プログラム・コードを符号化することが多くなってきた。
【０００７】
プログラム全体をまとめて符号化する場合には、プログラムの実行に際しては、プログラム・コードを一旦復号化した後にオペレーティング・システムのローダに処理を委ねるようにすれば、プログラムの正常な実行を担保することができた。
【０００８】
他方、プログラム全体ではなく一部にのみ符号化を適用する手法もある。例えば、プログラム・サイズが巨大な場合、プログラム全体を圧縮してしまうと、起動時には伸長処理のために長時間を要してしまう。このため、プログラムを部分的にしか圧縮せず、起動後に必要に応じて適宜伸長して実行するようにしている。このようにすれば、プログラム全体を圧縮する方式に比し、プログラムの起動が速くなる。また、圧縮部分を実行する必要がない場合には伸長処理も不要になるので、全体の処理時間も短縮されるという利点がある。あるいは、プログラムを部分的に暗号化し、且つ、実際に実行する必要があるまでは暗号化部分を復号化しないように構成することで、解析や改竄によるプログラムの不正利用を好適に防止することもできる。
【０００９】
しかしながら、オペレーティング・システムのタイプによっては、以下の理由により、実行プログラム・コード部分を実行時に書き換えることをできないようにしたものがある。
【００１０】
１．近年、コンピュータ・ウィルスが大きな社会問題になっている。コンピュータ・ウィルスの種類によっては、プログラムの実行時にプログラム・コードを書き換えることによって感染するものがある。このようなタイプのウィルスの感染を未然に防止するために、プログラム・コードの実行時の書き換えを禁止する。
【００１１】
２．ある単一のプログラムを複数回起動する場合、メモリ等のコンピュータ資源の利用効率の点から考えると、単一のプログラム・コードを個々に起動されたプログラムから共有するように構成した方が望ましい。プログラムが実行時に書き換えられることを前提とすると、例えば、あるプログラムが書き換え処理を実行している最中に他のプログラムが書き換え処理を実行し始めることによってプログラムの不整合が発生するなど、不整合を防止するための機構が非常に複雑になり、結果としてオペレーティング・システムの処理効率を低下させる要因となる。そこで、プログラムの実行時書き換えを禁止すれば、このような不整合に対する対象を行う必要がなくなり、オペレーティング・システムの機構を単純化することが可能となる。
【００１２】
つまり、プログラム・コードの実行時の書き換えを禁止しているタイプのオペレーティング・システム上では、プログラムの一部分を圧縮あるいは暗号化し、実行時に適宜、伸張あるいは復号処理を行うようにプログラムを構成することができないという問題がある。
【００１３】
これに対して、幾つかのオペレーティング・システムには、データ領域上に生成された命令コード列を実行するための、すなわち、メモリ領域の属性（読み取り可能、書きこみ可能、実行可能など）を変更したり、ＣＰＵのキャッシュとの整合性を保つたりするためのシステムコール関数が用意されている。Ｍｉｃｒｏｓｉｆｔ社のオペレーティング・システム”Ｗｉｎｄｏｗｓ”がサポートするＷｉｎ３２  ＡＰＩではＶｉｒｔｕａｌＰｒｏｔｅｃｔ（）やＦｌｕｓｈＩｎｓｔｒｕｃｔｉｏｎＣａｃｈｅ（）、米アップル・コンピュータ社のオペレーティング・システム”ＭａｃＯＳ”ではＭａｋｅＤａｔａＥｘｅｃｕｔａｂｌｅ（）、また、ＵＮＩＸ系のオペレーティング・システム”Ｌｉｎｕｘ”ではｍｐｒｏｔｅｃｔ（）が、システムコール関数である。これらの関数を利用することで、データ領域の命令コード列を実行させることが可能になる。データ領域は実行時に自由に書き換え可能であるので、符号化されたコード領域を復号するための領域として、プログラム・コード領域とは異なるデータ・メモリ領域に確保し、その領域内で復号処理を実行し、復号したコードもその領域内で実行すれば良いと考えられる。
【００１４】
しかしながら、符号化対象のコード領域内に、符号化対象のコード領域外の特定のアドレスに実行制御を移行したり、特定のアドレスに格納されたメモリ内容をアクセスしたりする命令が存在している場合、その命令コードのアドレス情報は、呼び出し先あるいはメモリの参照先との相対値（差分）で表現されるため、符号化対象のコード領域のアドレスが変化すると、当然ながら相対アドレス情報も変化するため、そのままでは正常に実行できないという問題がある。
【００１５】
以上を要言すれば、符号化したコード部分を含み且つ実行の必要があるまで復号化しないように構成された実行プログラムにおいて、符号化対象のコード領域内に、符号化対象のコード領域外の特定のアドレスに実行制御を移行したり、特定のアドレスに格納されたメモリ内容をアクセスしたりする命令が存在している場合、プログラム・コード領域の書き換えを禁止したオペレーティング・システム上で好適に実行する技術は、これまでに開示された例が見当たらない。
【００１６】
さらに、このような機能を持つプログラムを実現できたとしても、従来の汎用コンパイラでは生成することができない。言い換えれば、このようなプログラムを生成するためには、特殊なコンパイラをデザインしなければならず、多大なコストがかかってしまう。
【００１７】
【発明が解決しようとする課題】
本発明の目的は、符号化したコード部分を含み且つ実行の必要があるまで復号化しないように構成された実行プログラムを、プログラム・コード領域の書き換えを禁止したオペレーティング・システム上であっても、好適に実行することができる技術を提供することにある。
【００１８】
本発明の更なる目的は、プログラム・コード領域の書き換えを禁止したオペレーティング・システム上において、プログラムの一部を符号化しておき、プログラムの起動後に符号化コード部分を復号化して正常に実行することができるプログラムを提供することにある。
【００１９】
本発明の更なる目的は、符号化したコード部分を含み且つ実行の必要があるまで復号化しないように構成されたプログラムを、汎用コンパイラを用いても生成することができる技術を提供することにある。
【００２０】
【課題を解決するための手段】
本発明は、上記課題を参酌してなされたものであり、その第１の側面は、プログラム・コードの一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する方法であって、
（ａ）符号化対象コードを符号化するステップと、
（ｂ）符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保した領域に符号化された符号化対象コードを復号化する復号化実施コード部分を実行プログラムに付与するステップ、
（ｃ）復号化された符号化対象コードに対して再配置処理を行う再配置実施コード部分を実行プログラムに付与するステップと、
を具備することを特徴とする実行プログラムの生成方法である。
【００２１】
また、本発明の第２の側面は、プログラム・コードの一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する方法であって、
（ａ）符号化対象コードの再配置情報を生成するステップと、
（ｂ）符号化対象コードを符号化するステップと、
（ｃ）符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保した領域に符号化された符号化対象コードを復号化する復号実施コード部分を実行プログラムに付与するステップ、
（ｄ）復号化された符号化対象コードに対して前記生成された再配置情報を用いて再配置処理を行う再配置実施コード部分を実行プログラムに付与するステップと、
を具備することを特徴とする実行プログラムの生成方法である。
【００２２】
本発明の第１あるいは第２の側面に係る実行プログラムの生成方法において、前記符号化は圧縮処理であり、復号化は圧縮されたデータの伸長処理であってもよい。あるいは、前記符号化は暗号化処理であり、復号化は暗号化データの復号処理であってもよい。
【００２３】
また、本発明の第３の側面は、実行コード・セクションの一部に圧縮処理の適用を予定された符号化対象コードを含むタイプの実行プログラムを生成する方法であって、
（ａ）符号化対象コードを圧縮するステップと、
（ｂ）符号化対象コードの圧縮により空きができた領域の分だけ、実行コード・セクション以降のセクションの領域を前につめるステップと、
（ｃ）圧縮された符号化対象コードを伸張するためのメモリ領域を確保し、該確保した領域に圧縮された符号化対象コードを伸長処理する復号実施コード部分を実行プログラムに付与するステップと、
（ｄ）復号化された符号化対象コードに対して再配置処理を行う再配置実施コード部分を実行コード・セクションに挿入するステップと、
を具備することを特徴とする実行プログラムの生成方法である。
【００２４】
また、本発明の第４の側面は、実行コード・セクションの一部に圧縮処理の適用を予定された符号化対象コードを含むタイプの実行プログラムを生成する方法であって、
（ａ）符号化対象コードの再配置情報を生成するステップと、
（ｂ）符号化対象コードを圧縮するステップと、
（ｃ）符号化対象コードの圧縮により空きができた領域の分だけ、実行コード・セクション以降のセクションの領域を前につめるステップと、
（ｄ）圧縮された符号化対象コードを伸張するためのメモリ領域を確保し、該確保した領域に圧縮された符号化対象コードを伸長処理する復号実施コード部分を実行プログラムに付与するステップと、
（ｅ）復号化された符号化対象コードに対して前記生成された再配置情報を用いて再配置処理を行う再配置実施コード部分を実行コード・セクションに挿入するステップと、
を含むことを特徴とする実行プログラムの生成方法である。
【００２５】
本発明の第１、第２、第３、及び第４の各側面に係る実行プログラムの生成方法において、前記復号実施コード部分と前記再配置実施コード部分は、実行プログラムをメモリにロードした後符号化対象コードを最初に実行するときに、符号化対象コードに適用されるようにしてもよい。
【００２６】
また、本発明の第５の側面は、プログラム・コードの一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する装置であって、
（ａ）コーディングされた高級言語形式のソース・プログラム・コードをオブジェクト・プログラム・コードに変換するためのコンパイラと、
（ｂ）コーディングされたプログラム・コード中で、符号化すべき範囲を特定するための符号化対象コード検出手段と、
（ｃ）前記符号化対象コード検出手段によって特定された符号化対象範囲のコードを符号化するための符号化処理手段と、
（ｄ）符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号処理手段を実行プログラム中に与えるための復号処理付与手段と、
（ｅ）復号化された符号化対象コードに関するアドレス情報を再配置するための再配置処理手段を実行プログラム中に与えるための再配置処理付与手段と、
を具備することを特徴とする実行プログラムの生成装置である。
【００２７】
また、本発明の第６の側面は、プログラム・コードの一部に符号化を予定された符号化対象コードを含むタイプの実行プログラムを生成する装置であって、
（ａ）コーディングされた高級言語形式のソース・プログラム・コードをオブジェクト・プログラム・コードに変換するためのコンパイラと、
（ｂ）コーディングされたプログラム・コード中で、符号化すべき範囲を特定するための符号化対象コード検出手段と、
（ｃ）前記符号化対象コード検出手段によって特定された符号化対象範囲のコードに関するアドレス情報を再配置するために必要な再配置情報を生成する再配置情報生成手段と、
（ｄ）前記符号化対象コード検出手段によって特定された符号化対象範囲のコードを符号化するための符号化処理手段と、
（ｅ）符号化された符号化対象コードを復号化するためのメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号処理手段を実行プログラム中に与えるための復号処理付与手段と、
（ｆ）復号化された符号化対象コードに関するアドレス情報を前記生成された再配置情報に基づいて再配置するための再配置処理手段を実行プログラム中に与えるための再配置処理付与手段と、
を具備することを特徴とする実行プログラムの生成装置である。
【００２８】
本発明の第５及び第６の各側面に係る実行プログラムの生成装置において、前記符号化は圧縮処理であり、復号化は圧縮されたデータの伸長処理であってもよい。あるいは、前記符号化は暗号化処理であり、復号化は暗号化データの復号処理であってもよい。
【００２９】
また、前記復号化処理手段と前記再配置処理手段は、実行プログラムをメモリにロードした後符号化対象コードを最初に実行するときに、符号化対象コードに適用されるようにしてもよい。
【００３０】
また、本発明の第７の側面に係る側面は、プログラム・コードの一部に符号化された符号化対象コードを含むタイプの実行プログラムを実行する方法であって、
（ａ）実行プログラムをメモリ空間上に割り付けるステップと、
（ｂ）メモリ・ロードされた実行プログラムを実行するステップと、
（ｃ）符号化対象コードを実行する前に、符号化された符号化対象コードを符号化するメモリ空間を確保し、該確保したメモリ空間に符号化された符号化対象コードを復号化するステップと、
（ｄ）復号化された符号化対象コードに対して再配置処理を行うステップと、
（ｅ）復号化された符号化対象コードを実行するステップと、
を具備することを特徴とする実行プログラムの実行方法である。
【００３１】
本発明の第７の側面に係る実行プログラムの実行方法において、復号化された符号化対象コードを実行する前記ステップ（ｅ）の終了後に、さらに、
（ｆ）復号化された符号化対象コードを含む予め確保されたメモリ空間を破棄もしくは解放するステップ
を備えていてもよい。
【００３２】
また、前記符号化は圧縮処理であり、復号化は圧縮されたデータの伸長処理であってもよい。あるいは、前記符号化は暗号化処理であり、復号化は暗号化データの復号処理であってもよい。
【００３３】
また、実行プログラムは、符号化対象コードをメモリ・ロードした後既に呼び出されたことがあるか否かを示す復号実施フラグを含み、
前記復号実施フラグの設定に応じて前記（ｃ）復号化するステップと前記（ｄ）再配置処理するステップを実行するようにしてもよい。
【００３４】
また、本発明の第８の側面は、コンピュータ・システム上で実行可能な実行プログラムをコンピュータ可読形式で格納したコンピュータ可読プログラム記憶媒体であって、前記実行プログラムは、
（ａ）一部に符号化された符号化対象コードを含む実行コードと、
（ｂ）符号化された符号化対象コードを復号化するためメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号処理を行うよう記述された、前記コンピュータ・システム上で実行可能なプログラム部分と、
（ｃ）復号化された符号化対象コードに対して再配置処理を行うよう記述された、前記コンピュータ・システム上で実行可能なプログラム部分と、
を具備することを特徴とするコンピュータ可読プログラム記憶媒体である。
【００３５】
また、本発明の第９の側面は、コンピュータ・システム上で実行可能な実行プログラムをコンピュータ可読形式で格納したコンピュータ可読プログラム記憶媒体であって、前記実行プログラムは、
（ａ）一部に符号化された符号化対象コードを含む実行コードと、
（ｂ）符号化対象コードに対する再配置情報と、
（ｃ）符号化された符号化対象コードを復号化するためメモリ領域を確保し、該確保したメモリ領域に符号化された符号化対象コードを復号化する復号処理を行うよう記述された、前記コンピュータ・システム上で実行可能なプログラム部分と、
（ｄ）復号化された符号化対象コードに対して前記再配置情報に基づいて再配置処理を行うよう記述された、前記コンピュータ・システム上で実行可能なプログラム部分と、
を具備することを特徴とするコンピュータ可読プログラム記憶媒体である。
【００３６】
【作用】
本発明を実装した実行プログラムは、符号化した符号化対象コードと、それ以外の符号化されていないコードとで構成される。
【００３７】
実行プログラムは、符号化対象コードを実行する直前に、符号化対象コードを復号化するとともに、符号化対象コードについての再配置を実施するようにデザインされている。これは、符号化対象コードを復号化するための「復号化関数」と、再配置を実施する「再配置実施関数」とを、実行プログラム内に装備することによって実現される。
【００３８】
また、再配置処理を効率的に実行するために、実行プログラムを符号化するときに、予め符号化対象コードに関する再配置情報を生成し、実行プログラムに付与しても良い。
【００３９】
実行プログラムを起動した直後は、符号化対象コードに対する復号処理は行わない。そして、プログラムの実行が進み、符号化対象コードを実行すべき段階になったところで、まず符号化対象コードを復号するための領域をプログラム・コード領域ではなくデータ・メモリ領域内に確保し、次いで、その領域内で符号化対象コードの復号化を行い、当該コード部分の再配置を行う。このような手順を経る結果として、プログラムを正常に実行することができる。
【００４０】
なお、これまでの説明では、プログラム・コード領域の書き換えを禁止しているタイプのオペレーティング・システム上で、符号化されたコード領域を実行時に復号化する前提で説明をしてきたが、当然ながら本発明はプログラム・コード領域の書き換えを許可しているタイプのオペレーティング・システム上でも実現可能である。その場合には、データ領域内でプログラム・コードを復号して実行するので、解析や改竄によるプログラムの不正利用に対してより好適に防止するという効果を奏する。
【００４１】
本発明のさらに他の目的、特徴や利点は、後述する本発明の実施例や添付する図面に基づくより詳細な説明によって明らかになるであろう。
【００４２】
【発明の実施の形態】
本発明を実現したプログラム・コードは、例えば、所定のオペレーティング・システムをインストールした汎用コンピュータ・システム上に実行可能である。汎用コンピュータ・システムは、一般に、プログラム・コードを実行するプロセッサと、プログラム・コードをロードしたり作業データを一時格納するためのメモリと、ディスプレイやキーボード／マウスなどのユーザ入出力装置と、プログラム・ファイルやデータ・ファイルなどを不揮発的に保管するハード・ディスク・ドライブなどの外部記憶装置を含んでいる。但し、コンピュータ・システムの構成自体は本発明の要旨を構成しないので、この明細書ではこれ以上説明しない。
【００４３】
以下、本発明を実現した実行プログラム・コードやコンピュータ・システム上における該プログラム・コードの動作特性などについて、図面を参照しながら詳解する。
【００４４】
《第１の実施例》
実行ファイルを圧縮する場合、通常は、ファイル全体をまとめて圧縮する。しかし、サイズは大きいが少ない頻度でしか実行されないルーチンを含むようなプログラムの場合には、かかるルーチンのみを部分的に圧縮して、実行時にのみ該ルーチン部分を復号化して利用するような方式を採用する。このような方式によれば、ルーチンを実行しないときには復号化作業が必要でなくなるため、無駄な処理を省略することができる。また、データを初めて参照するときに復号化作業を行うようにしておくことで、少ない頻度でしか参照されない膨大な量のデータを持つプログラムについても同様の方式を採用することができる。
【００４５】
ここで述べる第１の実施例は、実行プログラムを部分的に圧縮する場合の例であり、実行プログラムのコンパイル処理のために汎用のコンパイラを利用することができる。
【００４６】
図１には、第１の実施例を適用する実行プログラムのコード・イメージを概念的に示している。
【００４７】
同図に示すように、実行プログラムは、複数のセクションから構成されるが、本発明を実現するためには、少なくとも、実行コードを含む実行コード・セクションを含んでいる。
【００４８】
また、本実施例の実行プログラムは、実行ファイル情報と、データ・セクションも備えている。
【００４９】
実行ファイル情報は、該実行プログラムに関するファイル情報の集まりを格納したセクションであり、プログラムの先頭に配置されている。この実行ファイル情報の中には、実行プログラムの先頭がロードされるべきアドレス（すなわちコンパイル時に前提としたベース・アドレス）が含まれる。図１の例では、ベース・アドレスが１６進数表記で０ｘ４０００に割り当てられている。
【００５０】
また、実行ファイル情報は、このプログラムに含まれる実行コード・セクションやデータ・セクションなどの各セクションに関する、記録されているファイル内の位置、大きさ、メモリに割り付ける時のベース・アドレスからのオフセット、書き込み可能であるか実行可能であるかなどの属性などの情報も保持している。
【００５１】
データ・セクションは、静的に記憶領域が確保されているデータを記憶するための領域である。
【００５２】
実行コード・セクションのコードの中には、実行プログラム内における他の情報の場所を参照するための情報が相対アドレス情報として含まれている。図１の例では、ベース・アドレスからの相対アドレスが０ｘ１４Ｃの命令（すなわち、ベース・アドレスが０ｘ４０００であれば、０ｘ４１４Ｃ番地にロードされる命令）にデータ・セクションの絶対アドレス０ｘ４４Ａ８のデータを読み込む命令が存在しているが、これはロード命令の存在するアドレス０ｘ４１４Ｃと参照先メモリのアドレス０ｘ４４Ａとの差分０ｘ４４Ａ−０ｘ４１４Ｃ＝０ｘ３５Ｃを相対アドレス情報として含んでいる。０ｘ４１４Ｃ番地には、命令の種別であるロードを意味するオペコードが置かれ、０ｘ４１４Ｄ番地以降にこの相対アドレス情報が配置されている。
【００５３】
このように相対アドレス情報で表現されているプログラムは、プログラム全体が異なるアドレスにロードされても、例えば、図１に示すような実行プログラムの場合、ベース・アドレスが０ｘ４０００ではなく０ｘ５０００であっても、参照元と参照先の相対位置は不変なので、そのままプログラムを実行することが可能である。したがって、オペレーティング・システムは、他のプログラムが既に利用しているなど、何らかの都合でベース・アドレス０ｘ４０００が使用できない場合は、他のアドレス領域、例えば０ｘ５０００などを割り当てても、そのままプログラム・コードをロードして実行することができる。
【００５４】
しかし、コードの一部分のみを別のアドレスに割り当てた場合には、そのコード部分に含まれる相対アドレス情報を修正しなければ、コードを正常に実行することができない。例えば、符号化されたコード領域を復号するための領域として、プログラム・コード領域とは異なるデータ・メモリ領域を割り当てた場合などである。
【００５５】
本発明ではこれを解決することで、部分的に符号化されたプログラム・コードを正常に実行する技術を提供することができる。以下、本実施例について詳細に説明する。
【００５６】
図２には、本発明である実行プログラムを作成するための処理手順を、フローチャートの形式で図解している。以下、各ステップについて説明する。
【００５７】
まず、実行コード・セクションに置かれるコードの作成すなわちコーディングを行う（ステップ１００）。実行コード中には、符号化対象コードと、符号化された符号化対象コードを復元するための復号実施コードと、符号化対象コードの再配置を実行するための再配置実施コードが含まれる。再配置実施コードには、再配置情報を記憶するための領域が含まれる。
【００５８】
復号実施コードと再配置実施コードを関数という形で作成してもよい。また、これらの関数を、予め作成しておいたライブラリという形式で提供することも可能である。但し、復号実施コードを提供する関数（仮に「復号関数」と呼ぶ）は、復号を実施する範囲（すなわち符号化対象コードの範囲）に関する情報を関数呼び出しのときに受け取るようにする必要がある。また、再配置実施コードを提供する関数（仮に「再配置関数」と呼ぶ）は、符号化対象コードを復号化した後に再配置を実施するときに、符号化対象コードについての再配置情報を参照する必要がある。このため、再配置情報を、その情報へのポインタを渡すなどの方法で、関数の呼び出し時に指定しておかなければならない。
【００５９】
符号化対象コードは、サイズ削減の目的（前述）により、後に圧縮などの符号化処理を施すことが予定されているコード部分である。本発明を実現する上で、符号化を施すべき符号化対象コードの範囲を決定する方法は特に限定されない。但し、本実施例では、符号化対象コードを実行コード・セクションの最後に置くようにしている。セクションの最後に置く理由は、実行ファイルを小さなサイズにするためである。実行コードをファイル上に記録するときには、圧縮によってコードを小さくした分だけコードをつめて書き込む。圧縮によって空いた空間をセクションの境界に配置することによって、セクション単位でつめることができる。すなわち、セクションの途中でつめる場合に比べて、プログラムの書き替えが最小限に済む。
【００６０】
ソース・ファイル上で行った関数定義の順序関係を実行コード上でも維持するタイプのコンパイラでは、符号化対象コードを持つ関数の定義をソース・ファイルの末尾で行うことで、符号化対象コードを実行コード・セクションの最後に置くことができる。これ以外のタイプのコンパイラに関しては、コードの順序関係を変更するような最適化処理を抑止するように設定しなければならないであろう。
【００６１】
また、実行プログラムをロード後初めて符号化対象コードを実行する前には、復号関数と再配置関数を実行するようにする。この具体的な方法としては、復号が既に実施されたか否かを示す復号実施フラグを実行プログラム中に用意しておくことが挙げられる。符号化対象コードが実行される前に、この復号実施フラグを参照して、未だ復号されていない場合にのみ、復号関数と再配置関数を呼び出すようにする。復号実施フラグの初期状態は、復号されていないことを示す状態にすべきである。
【００６２】
上記のようにしてプログラムが作成できたら（ステップ１００）、次いで、実行可能なコードにコンパイルする（ステップ２００）。コンパイル処理は、汎用のコンパイラをそのまま利用することができる。コンパイル処理は従来技術でよいので、本明細書ではこれ以上説明しない。最後に、再配置情報の生成と符号化処理を行う（ステップ３００）。
【００６３】
図３には、図２のステップ３００において実行される処理手順の詳細をフローチャートの形式で示している。以下、各ステップについて詳解する。
【００６４】
まず、符号化対象コードの範囲を取得する（ステップ３０１）。第１の実施例では、符号化対象コードは実行コード・セクションの末尾になる（上述）。
【００６５】
次に、符号化対象コードの範囲内の命令に対する再配置情報を生成する。この具体的な方法は、符号化対象コードの先頭から命令コードを１つずつ読み出してその種別を判定し（ステップ３０２）、その命令コードが、符号化対象コード範囲外に対する相対アドレス情報を含むかどうかを判定する（ステップ３０３）。そのような相対アドレス情報を含む場合には、その相対アドレス情報についての再配置情報を生成して、予め確保されているデータ・セクション内の再配置情報の記憶領域に格納する（ステップ３０４）。言い換えれば、相対アドレス情報を含むが、その参照先が符号化対象コード範囲内である場合には、再配置情報は生成されない。
【００６６】
再配置情報は、相対アドレス情報を含むアドレス位置の符号化対象コードの先頭からのオフセットで良い。例えば、符号化対象コードが０ｘ４１４０から始まっており、相対アドレス情報が０ｘ４１４Ｄに含まれる場合は、そのオフセットである０ｘ０００Ｄが再配置情報となる。そして、全ての符号化対象コードの命令コードについて上記と同様の処理を繰り返し行う（ステップ３０５）。
【００６７】
全ての符号化対象コードの命令コードについてステップ３０４における再配置情報の生成処理が終了したら、符号化対象コードを圧縮符号化する（ステップ３０６）。
【００６８】
圧縮符号化を完了した時点では、コードが圧縮された分だけ領域に空きができるため、ファイルに記録するときにはサイズが小さくなるように、実行コード・セクション以降のセクションを、空きができた領域の大きさだけ前につめて記録する（ステップ３０７）。
【００６９】
ステップ３０７によって、セクションが保持される場所がずれるため、実行ファイル情報の一部として記録されている実行ファイル内のセクション開始位置を、前につめた新しい値に書き換えて（ステップ３０８）、本処理ルーチン全体を終了する。
【００７０】
図３で示した処理手順に従うことによって、本実施例に係る実行プログラム・・ファイルが好適に作成される。図４には、作成された実行プログラム・ファイルの構成を模式的に図解しているが、該ファイルは、実行コード・セクションと、データ・セクションとを含んでいる。
【００７１】
データ・セクションには、前述の処理によって生成された、符号化対象コードに対する再配置情報が保管されている。
【００７２】
また、実行コード・セクションには、圧縮符号化された符号化対象コードと、復号実施コードを含む復号関数と、再配置実施コードを含む再配置関数とが含まれており、符号化対象コードは当該コード・セクションの末尾に配置されている。実行プログラムは、符号化対象コードを実行する前に復号関数と再配置関数を実行するように構成されている。
【００７３】
また、本実施例のデータ・セクション内には、符号化対象コードが既に復号されているか否かを示す復号実施フラグが用意されている。
【００７４】
本実施例では、ステップ３０２からステップ３０５において、符号化対象コードの命令を逐一解析して、相対アドレスを含むかどうかを判定していた。但し、高級言語からマシン・コードに変換する通常のコンパイラでは、リンカと呼ばれる処理モジュールがこのアドレス情報の解決を行うように構成されており、リンカ・モジュールへ渡される中間ファイルには、この解決すべきアドレス情報を含むのが一般的である。そこで、符号化対象コードの命令を逐一解析する代わりに、この中間ファイルを解析して、再配置情報を生成するように構成しても良い。
【００７５】
さらに、本実施例では、汎用のコンパイラの後処理として、再配置情報の修正と符号化対象コードの圧縮を行う実施例を示した。しかし、コンパイラに同様の機能を組み込み、コンパイル作業と同時に本実施例と同様の構成のプログラムを生成することも可能である。この場合には、コンパイル作業で再配置情報を作成する時に、符号化対象コードに含まれるか判定することで、最終的な再配置情報を直接作成できるので、上記の本実施例に比べて処理効率が向上するという利点を持つ。
【００７６】
次いで、上述のようにして作成された実行プログラムを実行するときの処理手順について説明する。
【００７７】
プログラムのローダは、実行プログラムをロードするとき、実行プログラムをロードすべきメモリ空間を確保し、該空間にプログラムをロードして実行を開始する。
【００７８】
符号化対象コードを実行するときには、その前に、復号実施フラグを参照して、符号化対象コードが既に復号されているかどうかを判定する。未だ復号されていない場合には、復号関数と再配置関数が呼び出されて、符号化対象コードに対して適用される。復号関数では、まず復号する範囲を取得して、復号結果を格納可能なメモリ領域を確保し、該メモリ領域に符号化対象コードを復号する。さらに、復号化された符号化対象コードに対して、再配置関数が再配置情報を参照しながら再配置処理を行う。再配置処理は、具体的には以下のように行われる。
【００７９】
（１）復号結果が格納されたメモリ領域の先頭アドレスと、符号化コードが格納されている領域の先頭アドレスの差分を計算し、その差分を再配置オフセットとする。
【００８０】
（２）すべての再配置情報に対して以下の処理を行う。再配置情報に格納されているオフセットに、復号結果が格納されたメモリ領域の先頭アドレスを足し、そのアドレスに格納されている相対アドレス情報に再配置オフセットを足して、格納しなおす。再配置処理が終わったら、復号化フラグを復号されている状態に変更する。これらの処理後に、復号化された符号化対象コードを実行する。
【００８１】
符号化対象コードが２回目以降に呼び出される場合は、復号されているか示す復号実施フラグを参照することによって、既に復号されていることを容易に判定することができる。このため、復号関数と再配置関数を実行せずに復号化された符号化対象コードをそのまま実行する。これ以降は、通常のプログラムの実行と同様にしてプログラムの実行は進む。
【００８２】
以上の説明で、本実施例に係る実行プログラムの実行を、通常のプログラムの実行メカニズムに従って進めることが可能であることを、充分理解できるであろう。
【００８３】
《第２の実施例》
上述した第１の実施例は実行プログラム・コードの一部を圧縮する場合に本発明を適用したものである。これに対し、第２の実施例は、実行プログラムを暗号化する場合に本発明を適用する実施例である。
【００８４】
本実施例における実行プログラムを作成する処理手順も図２と同様である。すなわち、プログラムの中で暗号化を施すコードを考慮してプログラミングを行う（ステップ１００）。
【００８５】
プログラミング時に行う作業の１つとして、暗号化を施すコードである符号化対象コードを決定する。実行コードの一部を暗号化する目的は、コードに含まれるセキュリティ情報を保護することにある。符号化対象コードの復号を行う復号実行コードと、符号化対象コードの再配置を実行する再配置実行コードを実行コード・セクションに挿入しておくことで、実行プログラム・コードは、符号化対象コードの実行前に、復号化処理及び復号化された部分の再配置処理を行うように構成される。
【００８６】
符号化対象コードに対して再配置処理を施すためには、符号化対象コードに対する再配置情報を参照する必要がある。再配置情報を確保する１つの方法は、第１の実施例で述べたように、データ・セクションに予め領域を確保しておくことである。また、その他の方法は、メモリにロードされる他のセクション（例えば実行コード・セクションや他の目的のセクション）に、再配置情報を確保するようにしても良い。
【００８７】
上記のようにしてプログラムが出来上がったら、通常のコンパイラを用いて実行可能なコード体系にコンパイルする（ステップ２００）。そして、コンパイルされたプログラムに対して、再配置情報生成と符号化の処理を行う（ステップ３００）。
【００８８】
ステップ３００において行われる再配置情報の生成処理は、第１の実施例と同様に、図３で示したフローチャートに従って実現することができる。
【００８９】
まず、符号化対象コードの範囲を取得する（ステップ３０１）。
【００９０】
次に、符号化対象コードの範囲内の命令に対する再配置情報を生成する。この具体的な方法は、符号化対象コードの先頭から命令コードを１つずつ読み出してその種別を判定し（ステップ３０２）、その命令コードが、符号化対象コード範囲外に対する相対アドレス情報を含むかどうか判定して（ステップ３０３）、相対アドレス情報を含む場合には、その相対アドレス情報についての再配置情報を生成して、予め確保されているデータ・セクション内の再配置情報の記憶領域に格納する（ステップ３０４）。
【００９１】
再配置情報は、相対アドレス情報を含むアドレス位置の符号化対象コードの先頭からのオフセットで良い。例えば、符号化対象コードが０ｘ４１４０から始まっており、相対アドレス情報が０ｘ４１４Ｄに含まれる場合は、そのオフセットである０ｘ０００Ｄが再配置情報となる。そして、全ての符号化対象コードの命令コードについて上記と同様の処理を繰り返し行う（ステップ３０５）。
【００９２】
全ての符号化対象コードの命令コードについてステップ３０４における再配置情報の生成処理が終了したら、符号化対象コードを暗号化する（ステップ３０６）。但し、コードを圧縮する第１の実施例とは相違し、暗号化によってコードのサイズは小さくならないので、ステップ３０７及び３０８は実行しない。
【００９３】
図５には、ステップ３００において行われる再配置情報生成処理が異なる処理をした場合に生成された実行プログラムのファイルの構成を模式的に図解している。
【００９４】
この例では、符号化対象コードに対する再配置情報を記述した再配置情報を格納する領域として、データ・セクション内ではなく、専用に設けた再配置情報セクションの中に確保するようになっている例である。したがって、該実行ファイルは、実行ファイル情報と、実行コード・セクションと、データ・セクションと、符号化対象コードに対する再配置情報を記述した再配置情報セクションとで構成されることになる。
【００９５】
実行コード・セクションには、暗号化された符号化対象コード、符号化対象コードを実行する前に復号化するコードを格納するメモリ領域を確保して暗号化コードを復号する復号実施コード、及び、復号された符号化対象コードに対して再配置を行う再配置実施コードが含まれている。また、符号化対象コードに関する再配置情報は、データ・セクション内に確保された領域、若しくは再配置情報セクションに格納される。
【００９６】
次に、本実施例に係る実行プログラムを実行する様子について説明する。
【００９７】
プログラムのローダは、実行プログラムをロードするためのメモリ領域を確保し、該領域にプログラムをロードする。
【００９８】
プログラムがロードされた後に、プログラムは実行に移る。符号化対象コードの部分を実行する前に、復号実行コードを適用することで復号コードを格納するためのメモリ領域を確保し、その領域に符号化対象コードを復号して、さらにその後に、復号した符号化対象コードに関する再配置情報を参照して、復号した符号化対象コードについての再配置処理を行う。
【００９９】
また、復号したコードを実行し、実行後にコードを破棄し、確保したメモリ領域を解放するように構成してもよい。その場合には、実行コード中に復号されたコードが格納されたメモリ領域をクリアして解放するための破棄実行コードを設ける必要がある。復号されたコードを破棄することにより、コードのセキュリティをより強力に保護することができる。
【０１００】
以上の処理手順に従えば、通常のプログラム実行メカニズムの上で、本実施例に係る実行プログラムの実行を進めることが可能である、ということを充分理解できるであろう。
【０１０１】
図６には、第１又は第２の実施例に係る実行プログラムを好適に生成することができる実行プログラム生成装置１００の構成を模式的に示している。
【０１０２】
同図に示すように、実行プログラム生成装置１００は、コンパイラ１１と、符号化対象コード検出手段１２と、符号化処理手段１３と、復号処理付与手段１４と、再配置処理付与手段１５とで構成される。実行プログラム生成装置１００の実体は、同様の機能を実現するソフトウェア・プログラムをインストールした汎用コンピュータ・システムである。
【０１０３】
コンパイラ１１は、コーディングされた高級言語形式のソース・プログラム・コードをオブジェクト・プログラム・コードに変換するためのものである。既に述べたように、コンパイラ１１は現在普及している汎用タイプのコンパイラでもよい。
【０１０４】
符号化対象コード検出手段１２は、コーディングされたプログラム・コード中で、符号化（すなわち圧縮又は暗号化）すべき範囲を指定するための手段である。指定方法は任意である。
【０１０５】
符号化処理手段１３は、符号化対象コード検出手段１２によって指定された符号化対象範囲のコードを符号化するためのものである。本発明を実現する上で、符号化処理手段１３において採用される符号化方式、すなわち圧縮若しくは暗号化する方式自体は問わない。
【０１０６】
復号処理付与手段１４は、符号化された符号化対象コードを、その実行前に復号化するための復号処理手段を実行プログラム中に与えるための手段である。ここで言う復号処理とは、上記実施例の復号実施コードや復号関数のことであり、符号化対象コードの実行時に復号化コードを格納するためのメモリ領域を確保してから、該書く蒸した領域に符号化コードを伸長若しくは復号化する。復号実施コードは、符号化対象コードと同様に、実行コード・セクション内に挿入される。
【０１０７】
再配置処理付与手段１５とは、復号化された符号化対象コードに関する相対アドレス情報を再配置するための再配置処理手段を実行プログラム中に与えるための手段である。ここで言う再配置処理とは、上記実施例の再配置実施コードや再配置関数のことである。再配置処理は、符号化対象コードの実行時において、復号実施コードを適用して復号化した後に、復号化された符号化対象コードに対して適用される。
【０１０８】
本実施例では、汎用のコンパイラの後処理として、再配置情報の修正と符号化対象コードの圧縮又は暗号化を行うようになっている。しかし、コンパイラに同様の機能を組み込み、コンパイル作業と同時に上記の実施例と同様の構成及び作用を持つプログラムを生成することも可能である。この場合には、コンパイル作業でアドレス情報を解決するときに、符号化対象コードに含まれるか否かを判定することで再配置情報を直接作成できるので、上記の実施例よりも更に処理効率が向上するであろう。
【０１０９】
《第３の実施例》
次に第３の実施例について説明する。この実施例は、上述した第１および第２の実施例に係る再配置情報を用いず、実行プログラムの実行時に再配置が必要かどうかを判定し、再配置を実施するものである。第１および第２の実施例に比べると、本実施例では実行プログラムの実行効率は低下するが、実行プログラム生成装置の構成を単純化することが可能となる。ここでは、第２の実施例と同様にプログラム・コードの一部を暗号化する場合を例に挙げて説明する。
【０１１０】
本実施例における実行プログラムを作成する処理手順も図２と同様である。すなわち、プログラムの中で暗号化を施すコードを考慮してプログラミングを行う（ステップ１００）。
【０１１１】
第２の実施例と同様に、プログラミング時の作業として、暗号化を施すコードである符号化対象コードを決定する。さらに、符号化対象コードの復号を行う復号実施コードと、符号化対象コードの再配置を実行する再配置実施コードを実行コード・セクションに挿入しておくことで、実行プログラム・コードは、符号化対象コードを実行する前に、復号化処理及び復号化された部分の再配置処理を行うように構成される。
【０１１２】
ここで、符号化対象コードに対して再配置処理を施す処理が第２の実施例とは異なる。すなわち、第２の実施例では符号化対象コードに対する再配置情報を参照する必要があったが、本実施例では、再配置処理を実施する際に再配置が必要かどうかの判定を行うように構成されている。したがって、再配置情報を格納する領域を予め確保する必要がない。
【０１１３】
上記のようにしてプログラムが出来上がったら、第２の実施例と同様に、通常のコンパイラを用いて実行可能なコード体系にコンパイルする（ステップ２００）。
【０１１４】
その後、コンパイルされたプログラムに対して、再配置情報の生成と符号化の処理を行う（ステップ３００）。但し、本実施例では、ステップ３００では符号化対象コードを暗号化する処理のみを実施する。
【０１１５】
ステップ３００において行われる処理は、図７にフローチャートで示すように非常に単純化される。すなわち、符号化範囲を取得して（ステップ３３１）、符号化対象コードを圧縮すればよい（ステップ３３２）。
【０１１６】
図８には、上述のステップ３００によって生成された実行プログラムのファイルの構成を模式的に図解している。該実行プログラム・ファイルは、実行ファイル情報と、実行コード・セクションと、データ・セクションとで構成される。
【０１１７】
実行コード・セクションには、暗号化された符号化対象コードと、符号化対象コードを実行する前に復号化するコードを格納するメモリ領域を確保して暗号化コードを復号する復号実施コードと、復号された符号化対象コードに対して再配置を行う再配置実施コードとが含まれている。さらに、復号された実行コードを破棄する破棄実行コードも含まれている。
【０１１８】
次に、本実施例に係る実行プログラムを実行する様子について説明する。
【０１１９】
プログラムのローダは、実行プログラムをロードするためのメモリ領域を確保し、該領域にプログラムをロードする。プログラムがロードされた後に、プログラムは実行に移る。
【０１２０】
符号化対象コードでない場合は通常に実行される。そして、符号化対象コードの部分を実行する場合には、実行コード内に含まれた復号実施コード、再配置実施コード、破棄実行コードが実行されることで、符号化対象コードが実行される。その処理手順を図９のフローチャートに従って説明する。
【０１２１】
まず、復号実行コードを適用することで復号コードを格納するためのメモリ領域を確保する（ステップ４０１）。
【０１２２】
次いで、その領域に符号化対象コードを復号する（ステップ４０２）。さらにその後、再配置実行コードによって、復号した符号化対象コード（すなわち復号コード）に関する再配置処理を行う（ステップ４０３〜４０６）。
【０１２３】
まず、復号コードの命令を１つだけ取得し（ステップ４０３）、そのコードが符号化コード外に対する相対アドレス情報を含んでいるかどうかを判定する（ステップ４０４）。符号化コード外の相対アドレス情報を含んでいる場合には、相対アドレス情報の修正（再配置処理）を実施する（ステップ４０５）。この処理をすべての復号されたコードに対して実施する（ステップ４０６）。
【０１２４】
以上の処理が済んだら、復号コードを実行し（ステップ４０７）、実行を終えたら、復号コードおよび復号コードを格納したメモリ領域を破棄（あるいは解放）する（ステップ４０８）。
【０１２５】
なお、ステップ４０５における再配置処理をより詳しく述べると、以下のようになる。
【０１２６】
予め復号結果が格納されたメモリ領域の先頭アドレスと、符号化コードが格納されている領域の先頭アドレスの差分を計算し、その差分を再配置オフセットとして保持しておく（ステップ４０１で実施）。ステップ４０５では、処理している命令の相対アドレス情報に、前記再配置オフセットを足して格納しなおすという処理を実施する。
【０１２７】
以上説明したような処理手順に従えば、通常のプログラム実行メカニズムの上で、本実施例に係る実行プログラムの実行を進めることが可能である、ということを充分理解できるであろう。
【０１２８】
［追補］
以上、特定の実施例を参照しながら、本発明について詳解してきた。しかしながら、本発明の要旨を逸脱しない範囲で当業者が該実施例の修正や代用を成し得ることは自明である。
【０１２９】
本実施例では、プログラム・コード領域の書き換えを禁止しているタイプのオペレーティング・システム上で、符号化されたコード領域を実行時に復号化する前提で説明をしてきたが、当然ながら本発明はプログラム・コード領域の書き換えを許可しているタイプのオペレーティング・システム上でも実現可能である。その場合には、データ領域内でプログラム・コードを復号して実行するので、解析や改竄によるプログラムの不正利用に対してより好適に防止するという効果を奏する。
【０１３０】
要するに、例示という形態で本発明を開示してきたのであり、限定的に解釈されるべきではない。本発明の要旨を判断するためには、冒頭に記載した特許請求の範囲の欄を参酌すべきである。
【０１３１】
【発明の効果】
以上詳記したように、本発明によれば、プログラム・コードの書き換えを許さないタイプのオペレーティング・システム上で、符号化したコード部分を含み且つ実行の必要があるまで復号化しないように構成された実行プログラムを生成することができる、優れた実行プログラム再配置技術を提供することができる。
【０１３２】
また、本発明によれば、符号化したコード部分を含み且つ実行の必要があるまで復号化しないように構成された実行プログラムを、プログラム・コードの書き換えを許さないタイプのオペレーティング・システム上で、プログラムの起動後に符号化コード部を復号して正常に実行することができるプログラムを提供することができる。
【０１３３】
また、本発明によれば、符号化したコード部分を含み且つ実行の必要があるまで復号化しないように構成されたプログラムを、汎用コンパイラを用いても生成することができる、優れた実行プログラム再配置技術を提供することができる。
【図面の簡単な説明】
【図１】実行ファイルのメモリ・イメージを概念的に示した図である。
【図２】実行プログラムを作成するためのフローチャートである。
【図３】第１の実施例における再配置情報生成と符号化のための処理手順を図解したフローチャートである。
【図４】第１の実施例における実行ファイルの構成を模式的に示した図である。
【図５】第２の実施例における実行ファイルの構成を模式的に示した図である。
【図６】本発明を実現可能な実行プログラム生成装置の概念図である。
【図７】第３の実施例における再配置情報生成と符号化のための処理手順を図解したフローチャートである。
【図８】第３の実施例によって生成された実行プログラムのファイルの構成を模式的に示した図である。
【図９】第２の実施例における実行プログラムを実行する処理手順を示したフローチャートである。
【符号の説明】
１１…コンパイラ
１２…符号化対象コード検出手段
１３…符号化処理手段
１４…復号処理付与手段
１５…再配置処理付与手段
１００…実行プログラム生成装置
【図１】
0004042280.tif 000002
【図２】
0004042280.tif 000003
【図３】
0004042280.tif 000004
【図４】
0004042280.tif 000005
【図５】
0004042280.tif 000006
【図６】
0004042280.tif 000007
【図７】
0004042280.tif 000008
【図８】
0004042280.tif 000009
【図９】
0004042280.tif 000010