(57)【要約】【課題】試用版の実行ファイルを生成するために、製品版のソースファイルとは別に、わざわざ試用版のソースファイルを作成する必要のないコンピュータプログラムの編集システムを提供する。【解決手段】ソースファイル１０１から生成されたオブジェクトファイル１０５と、ソースファイル中の編集するべき関数の名称を編集開始位置識別語及び編集終了位置識別語に関連付けた文のリストを含む指定ファイル１０９とを基に、編集するべき関数のコードを編集開始位置識別語及び編集終了位置識別語で挟んだ編集前実行ファイル１１１を生成するリンカと、編集前実行ファイル中の編集開始位置識別語及び編集終了位置識別語で挟まれた編集するべき関数のコードを編集して、編集後実行ファイル１１３を生成する編集部２０５を備える。【選択図】        図１
2004265037.tif 000002
【特許請求の範囲】
【請求項１】
ソースファイルから生成されたオブジェクトファイルと、前記ソースファイル中の編集するべき関数を指定する指定ファイルとを基に、前記編集するべき関数のコードを編集開始位置識別語及び編集終了位置識別語で挟んだ編集前実行ファイルを生成するリンカと、
前記編集前実行ファイル中の前記編集開始位置識別語及び前記編集終了位置識別語で挟まれた前記編集するべき関数のコードを編集して、編集後実行ファイルを生成する編集部と、
を有することを特徴とするコンピュータプログラムの編集システム。
【請求項２】
請求項１に記載のコンピュータプログラムの編集システムにおいて、
前記指定ファイルは、前記ソースファイル中の編集するべき関数の名称を前記編集開始位置識別語及び前記編集終了位置識別語に関連付けた文のリストを含むことを特徴とするコンピュータプログラムの編集システム。
【請求項３】
請求項１に記載のコンピュータプログラムの編集システムにおいて、
前記編集とは、コードを無実行命令にすることであることを特徴とするコンピュータプログラムの編集システム。
【請求項４】
請求項１に記載のコンピュータプログラムの編集システムにおいて、
前記編集とは、前記編集開始位置識別語の直後の部分を関数の終了コードに置換し、前記編集するべき関数のコードのその他の部分を任意のデータで上書きすることであることを特徴とするコンピュータプログラムの編集システム。
【請求項５】
請求項１に記載のコンピュータプログラムの編集システムにおいて、
前記編集とは、コードを暗号化することであることを特徴とするコンピュータプログラムの編集システム。
【請求項６】
請求項５に記載のコンピュータプログラムの編集システムにおいて、
前記編集部は、暗号解除コードを前記編集後実行ファイルに付加することを特徴とするコンピュータプログラムの編集システム。
【請求項７】
請求項５に記載のコンピュータプログラムの編集システムにおいて、
前記編集部は、前記編集開始位置識別子語と前記編集終了位置識別語で挟まれたコードのうちの絶対アドレスを暗号化せずに、前記編集開始位置識別子語と前記編集終了位置識別語で挟まれたコードのうちの前記絶対アドレス以外の部分を暗号化することを特徴とするコンピュータプログラムの編集システム。
【請求項８】
請求項５に記載のコンピュータプログラム編集システムにおいて、
前記編集開始位置識別語と前記編集終了位置識別語の間に暗号化するべき関数のコードに加え、当該関数の使用期間を限定するための情報を入れ、前記編集部は、当該関数及び前記使用期間を限定するための情報を暗号化することを特徴とするコンピュータプログラムの編集システム。
【請求項９】
請求項５に記載のコンピュータプログラムの編集システムにおいて、
前記編集部は、暗号化するべきコードよりパリティ又はハッシュ値を計算し、該パリティ又はハッシュ値を前記編集後実行ファイルに付加することを特徴とするコンピュータプログラムの編集システム。
【請求項１０】
請求項９に記載のコンピュータプログラムの編集システムにおいて、
前記編集部は、暗号化されたコードを実行時に暗号解除し、暗号解除されたコードよりパリティ又はハッシュ値を計算し、該計算されたパリティ又はハッシュ値を前記編集後実行ファイルに付加されている前記パリティ又はハッシュ値と比較し、両者が不一致である場合に、前記編集後実行ファイルの実行を制限するコードを前記編集後実行ファイルに付加することを特徴とするコンピュータプログラムの編集システム。
【請求項１１】
請求項１に記載のコンピュータプログラムの編集システムにおいて、
前記編集部は、前記指定ファイルを参照して前記編集後実行ファイルを生成することを特徴とするコンピュータプログラムの編集システム。
【請求項１２】
請求項１に記載のコンピュータプログラムの編集システムにおいて、
前記リンカは、前記編集開始位置識別語及び前記編集終了位置識別語を含む識別語リストから生成されたオブジェクトファイルも参照して前記編集前実行ファイルを生成することを特徴とするコンピュータプログラムの編集システム。
【請求項１３】
請求項１２に記載のコンピュータプログラムの編集システムにおいて、
前記編集部は、前記識別語リストを参照して前記編集後実行ファイルを生成することを特徴とするコンピュータプログラムの編集システム。
【請求項１４】
ソースファイルから生成されたオブジェクトファイルと、前記ソースファイル中の編集するべき関数を指定する指定ファイルとを基に、前記編集するべき関数のコードを編集開始位置識別語及び編集終了位置識別語で挟んだ編集前実行ファイルを生成するリンクステップと、
前記編集前実行ファイル中の前記編集開始位置識別語及び前記編集終了位置識別語で挟まれた前記編集するべき関数のコードを編集して、編集後実行ファイルを生成する編集ステップと、
を有することを特徴とするコンピュータプログラムの編集方法。
【請求項１５】
請求１４に記載のコンピュータプログラムの編集方法において、
前記指定ファイルは、前記ソースファイル中の編集するべき関数の名称を前記編集開始位置識別語及び前記編集終了位置識別語に関連付けた文のリストを含むことを特徴とするコンピュータプログラムの編集方法。
【請求項１６】
請求項１４に記載のコンピュータプログラムの編集方法において、
前記編集とは、コードを無実行命令にすることであることを特徴とするコンピュータプログラムの編集方法。
【請求項１７】
請求項１４に記載のコンピュータプログラムの編集方法において、
前記編集とは、前記編集開始位置識別語の直後の部分を関数の終了コードに置換し、前記編集するべき関数のコードのその他の部分を任意のデータで上書きすることであることを特徴とするコンピュータプログラムの編集方法。
【請求項１８】
請求項１４に記載のコンピュータプログラムの編集方法において、
前記編集とは、コードを暗号化することであることを特徴とするコンピュータプログラムの編集方法。
【請求項１９】
請求項１８に記載のコンピュータプログラムの編集方法において、
前記編集ステップで、暗号解除コードを前記編集後実行ファイルに付加することを特徴とするコンピュータプログラムの編集方法。
【請求項２０】
請求項１８に記載のコンピュータプログラムの編集方法において、
前記編集ステップで、前記編集開始位置識別子語と前記編集終了位置識別語で挟まれたコードのうちの絶対アドレスを暗号化せずに、前記編集開始位置識別子語と前記編集終了位置識別語で挟まれたコードのうちの前記絶対アドレス以外の部分を暗号化することを特徴とするコンピュータプログラムの編集方法。
【請求項２１】
請求項１８に記載のコンピュータプログラム編集方法において、
前記編集開始位置識別語と前記編集終了位置識別語の間に暗号化するべき関数のコードに加え、当該関数の使用期間を限定するための情報を入れ、前記編集ステップで、当該関数及び前記使用期間を限定するための情報を暗号化することを特徴とするコンピュータプログラムの編集方法。
【請求項２２】
請求項１８に記載のコンピュータプログラムの編集方法において、
前記編集ステップで、暗号化するべきコードよりパリティ又はハッシュ値を計算し、該パリティ又はハッシュ値を前記編集後実行ファイルに付加することを特徴とするコンピュータプログラムの編集方法。
【請求項２３】
請求項２２に記載のコンピュータプログラムの編集方法において、
前記編集ステップで、暗号化されたコードを実行時に暗号解除し、暗号解除されたコードよりパリティ又はハッシュ値を計算し、該計算されたパリティ又はハッシュ値を前記編集後実行ファイルに付加されている前記パリティ又はハッシュ値と比較し、両者が不一致である場合に、前記編集後実行ファイルの実行を制限するコードを前記編集後実行ファイルに付加することを特徴とするコンピュータプログラムの編集システム。
【請求項２４】
請求項１４に記載のコンピュータプログラムの編集方法において、
前記編集ステップで、前記指定ファイルを参照して前記編集後実行ファイルを生成することを特徴とするコンピュータプログラムの編集方法。
【請求項２５】
請求項１４に記載のコンピュータプログラムの編集方法において、
前記リンカは、前記編集開始位置識別語及び前記編集終了位置識別語を含む識別語リストから生成されたオブジェクトファイルも参照して前記編集前実行ファイルを生成することを特徴とするコンピュータプログラムの編集方法。
【請求項２６】
請求項２５に記載のコンピュータプログラムの編集方法において、
前記編集ステップで、前記識別語リストを参照して前記編集後実行ファイルを生成することを特徴とするコンピュータプログラムの編集方法。
【請求項２７】
請求項１４乃至２６のいずれか１項に記載のコンピュータプログラムの編集方法をコンピュータに実行させるためのプログラム。
【請求項２８】
絶対アドレスが暗号化されず、他の部分が暗号化されている関数を含む実行プログラム。
【請求項２９】
絶対アドレスが暗号化されず、他の部分が暗号化されている関数を含む実行プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータプログラムを編集するための編集システム及びその方法に関し、特に、コンピュータプログラムの一部を無効化又は暗号化するための編集システム及びその方法に関する。
【０００２】
【従来の技術】
通常、コンピュータプログラムは製品版の仕様で販売されるが、販売促進のために試用版の仕様で無料で頒布される場合がある。試用版のコンピュータプログラムは、試用期間が制限されていたり、機能が制限されていたりする。
【０００３】
また、コンピュータプログラムの解析や改竄を防止するために、コンピュータプログラムを暗号化し、暗号化されたコンピュータプログラムをハードディスクドライブに記録し、実行時にコンピュータプログラムの暗号解除を行うシステムもある。
【０００４】
なお、本願発明に関連する先行技術文献としては以下のものがある。
【０００５】
【特許文献１】
特開２００１−１７５４６６公報
【特許文献２】
特開２０００−７６０７５公報
【０００６】
【発明が解決しようとする課題】
ある種の試用版のコンピュータプログラムは、製品版のコンピュータプログラムと比較し、一部の機能が制限されている。この種の試用版のコンピュータプログラムは、製品版のコンピュータプログラムを基に作成されることとなるが、製品版のソースファイルを基に試用版のソースファイルを作成することとなると、その作成の過程でソースファイルを誤って書き換えてしまったりする危険がある。また、数種類の試用版を作成する場合に、種類毎にソースファイルを作るのは煩わしい。従って、試用版の実行ファイルを生成するためにわざわざ試用版のソースファイルを作成する必要のない方法が望まれている。コンピュータプログラムのグレードを複数用意する場合も同様である。
【０００７】
また、試用版のコンピュータプログラムを試用してみたユーザが製品版のコンピュータプログラムを使用したいと希望した場合、そのユーザは試用版のコンピュータプログラムとは別に新たに製品版のコンピュータプログラムを購入しなければならず、ユーザにとっては煩わしい。従って、試用版のコンピュータプログラムを使用したユーザが製品版のコンピュータプログラムを使用したいと希望した場合、そのユーザがわざわざ製品版のコンピュータプログラムを購入したくても済むような方法が望まれている。
【０００８】
更に、ある種の試用版のコンピュータプログラムは、製品版のコンピュータプログラムと同一の機能を有するが、試用期間が制限されている。この種の試用版のコンピュータプログラムは、使用期間を制限するために何らかの方法で日付の管理を行っているが、その管理方法がユーザに見破られると、試用期間を過ぎても不法に使い続けられることとなり、販売者の利益が害される。従って、試用期間の管理情報が不正に改竄されることのない方法が望まれている。
【０００９】
このような使用期間制限の管理方法の解析や使用期間の管理情報の改竄を防ぐためプログラムコードやデータを暗号化することは広く行われている。
【００１０】
ところで、暗号化された関数（プログラミング言語でいうところの「関数」であり、一種のサブルーチンである。）を含む実行ファイルを一旦メモリにロードしてから、暗号化された関数を実行直前に暗号解除し、それから暗号解除された関数を実行するためには、暗号解除された関数をメモリに再書込みしなければならない。一方、実行ファイルの通常のロード先はメモリのコード領域であり、このコード領域は通常は書換え不能である。従って、暗号化された関数を含む実行ファイルを一旦コード領域にロードしてから、暗号化された関数を実行直前に暗号解除して、それから暗号解除された関数を実行することは通常は不可能である。
【００１１】
従って、実行ファイルのうちの暗号化された関数のみを書換可能であるデータ領域にロードして、暗号化されていない関数をコード領域にロードするようにして上記の問題点を解決する方法がある。
【００１２】
しかし、このような方法を採用した場合、元々実行ファイル全体がコード領域にロードされることを前提として設定された相対アドレスが、誤ったものとなってしまう。すなわち、データ領域にロードされた関数が、コード領域にあるデータ又は命令を相対アドレスで参照する命令を含んでいるとすると、この相対アドレスは誤ったものとなってしまう。
【００１３】
特許文献１に記載の発明は、データ領域にロードされた暗号化されている関数に含まれている相対アドレス指定の命令の参照先がコード領域にある場合に、暗号解除後の相対アドレスが誤ったものとなってしまうという問題を解決するものであり、実行ファイル中に暗号化された関数の再配置情報を埋め込んでおいて、この再配置情報を用いて正しい相対アドレスを復元するものである。
【００１４】
しかし、特許文献１には、実行ファイルの一部を関数単位で暗号化し、それを暗号解除する技術が記載されているが、コンパイル又はリンク時に暗号化対象の関数を特定する方法については記載されていない（段落［００５９］参照）。特許文献２にも同様にコンパイル又はリンク時に暗号化対象の関数を特定する方法については記載されていない。（段落［００５５］参照）。
【００１５】
ソースコード中に暗号化対象の関数を特定するためのディレクティブを埋め込み、コンパイラがそのディレクティブを解釈して、必要な関数のみを暗号化する方法も考えられるが、このような方法を用いると、柔軟性に欠けることとなる。すなわち、例えば、仕様上の全機能を有する実行ファイルを生成するためのソースファイルに含まれている関数のうち特定の機能を実現するための関数のみ無効とすることにより、機能制限をすることとした場合、無効とする機能の数に応じて複数種類のソースファイルを作成しなければならず、管理しづらくなる。また、このような方法を用いると、ソースファイルを直接書換えることとなるので、人為的ミスが生じやすい。
【００１６】
一方、実行ファイルをメモリにロードする際に、そのときのメモリの使用状況に応じて、実行ファイルのロードアドレスをダイナミックに変えるオペレーティングシステムは、実行ファイルに含まれている絶対アドレス指定を含む命令の絶対アドレスを実行ファイルのロード先のアドレスに応じてダイナミックに書き換える。
【００１７】
このような絶対アドレスのダイナミックな書換えを行うためには、書換え前のディフォルトの絶対アドレスに関する情報を実行ファイルが保有していなければならない。従って、暗号化された関数に絶対アドレスに関する情報が隠されていると、オペレーティングシステムはプログラムをメモリにロードする際に絶対アドレスの書換えをすることができなくなってしまう。
【００１８】
特許文献１には、プログラムをメモリにロードする際に絶対アドレスの書換えを行うことも相対アドレスの書換えを行うことも記載されておらず、関数実行直前に再配置情報を用いて相対アドレスを復元するのみが記載されている。従って、特許文献１では、絶対アドレスの扱い方が不明である。
【００１９】
特許文献２には、絶対アドレスの扱い方についての発明が記載されている。この発明によれば、実行プログラムを起動して全体の再配置を行うときには、符号化対象コードに対する再配置は行わず、符号化されていないコード部分しか再配置しない。そして、プログラムの実行が進み、符号化対象コードを実行すべき段階になったところで、まず符号化対象コードの復号化を行い、次いで、再配置が必要ならば当該コード部分の再配置を行う。この発明の絶対アドレスの扱い方は、本発明によるものと異なる。また、特許文献２では、再配置前の絶対アドレス等を不正に改竄することでプログラムコードの正常動作を妨げ符号化対象コードを取得するといった攻撃の余地がある。
【００２０】
そこで、本発明は、試用版の実行ファイルを生成するために、製品版のソースファイルとは別に、わざわざ試用版のソースファイルを作成する必要のないコンピュータプログラムの編集システム及びその方法を提供することを目的とする。
【００２１】
また、本発明は、試用版のコンピュータプログラムを使用したユーザが製品版のコンピュータプログラムを使用したいと希望した場合、そのユーザがわざわざ製品版のコンピュータプログラムを購入したくても済むようにするコンピュータプログラムの編集システム及びその方法を提供することを目的とする。
【００２２】
更に、本発明は、試用期間の管理情報が不正に改竄されることのないコンピュータプログラムの編集システム及びその方法を提供することを目的とする。
【００２３】
更に、本発明は、無効化又は暗号化する関数を柔軟に特定することができるコンピュータプログラムの暗号化システム及びその方法を提供することを目的とする。
【００２４】
更に、本発明は、実行ファイルが暗号化された関数を含んでいる場合であっても、オペレーティングシステムが実行ファイル中の絶対アドレスの書換えを行うことを可能としユーザーが絶対アドレス等を不正に改竄することを防止するコンピュータプログラムの暗号化システム及びその方法を提供することを目的とする。
【００２５】
【課題を解決するための手段】
本発明によれば、ソースファイルから生成されたオブジェクトファイルと、前記ソースファイル中の編集するべき関数を指定する指定ファイルとを基に、前記編集するべき関数のコードを編集開始位置識別語及び編集終了位置識別語で挟んだ編集前実行ファイルを生成するリンカと、前記編集前実行ファイル中の前記編集開始位置識別語及び前記編集終了位置識別語で挟まれた前記編集するべき関数のコードを編集して、編集後実行ファイルを生成する編集部と、を有することを特徴とするコンピュータプログラムの編集システムが提供される。
【００２６】
上記のコンピュータプログラムの編集システムにおいて、前記指定ファイルは、前記ソースファイル中の編集するべき関数の名称を前記編集開始位置識別語及び前記編集終了位置識別語に関連付けた文のリストを含んでいてもよい。
【００２７】
上記のコンピュータプログラムの編集システムにおいて、前記編集とは、コードを無実行命令にすることであってもよい。
【００２８】
上記のコンピュータプログラムの編集システムにおいて、前記編集とは、前記編集開始位置識別語の直後の部分を関数の終了コードに置換し、前記編集するべき関数のコードのその他の部分を任意のデータで上書きすることであってもよい。
【００２９】
上記のコンピュータプログラムの編集システムにおいて、前記編集とは、コードを暗号化することであってもよい。
【００３０】
上記のコンピュータプログラムの編集システムにおいて、前記編集部は、暗号解除コードを前記編集後実行ファイルに付加してもよい。
【００３１】
上記のコンピュータプログラムの編集システムにおいて、前記編集部は、前記編集開始位置識別子語と前記編集終了位置識別語で挟まれたコードのうちの絶対アドレスを暗号化しなくてもよく、前記編集開始位置識別子語と前記編集終了位置識別語で挟まれたコードのうちの前記絶対アドレス以外の部分を暗号化してもよい。
【００３２】
上記のコンピュータプログラム編集システムにおいて、前記編集開始位置識別語と前記編集終了位置識別語の間に暗号化するべき関数のコードに加え、当該関数の使用期間を限定するための情報を入れ、前記編集部は、当該関数及び前記使用期間を限定するための情報を暗号化してもよい。
【００３３】
上記のコンピュータプログラムの編集システムにおいて、前記編集部は、暗号化するべきコードよりパリティ又はハッシュ値を計算し、該パリティ又はハッシュ値を前記編集後実行ファイルに付加してもよい。
【００３４】
上記のコンピュータプログラムの編集システムは、暗号化されたコードを実行時に暗号解除し、暗号解除されたコードよりパリティ又はハッシュ値を計算し、該計算されたパリティ又はハッシュ値を前記編集後実行ファイルに付加されている前記パリティ又はハッシュ値と比較し、両者が不一致である場合に、前記編集後実行ファイルの実行を制限する手段を更に備えることを特徴とするコンピュータプログラムの編集システム。
【００３５】
上記のコンピュータプログラムの編集システムにおいて、前記編集部は、前記指定ファイルを参照して前記編集後実行ファイルを生成してもよい。
【００３６】
上記のコンピュータプログラムの編集システムにおいて、前記リンカは、前記編集開始位置識別語及び前記編集終了位置識別語を含む識別語リストから生成されたオブジェクトファイルも参照して前記編集前実行ファイルを生成してもよい。
【００３７】
上記のコンピュータプログラムの編集システムにおいて、前記編集部は、前記識別語リストを参照して前記編集後実行ファイルを生成してもよい。
【００３８】
本発明によれば、絶対アドレスが暗号化されず、他の部分が暗号化されている関数を含む実行プログラムが提供される。
【００３９】
【発明の実施の形態】
以下、図面を参照して本発明の実施形態について詳細に説明する。
【００４０】
［実施形態１］
図１は、実施形態１によるプログラム編集システムの構成を示すブロック図である。図１を参照すると、実施形態１によるプログラム編集システムは、コンパイラ２０１、リンカ２０３、編集部２０５を有する。
【００４１】
コンパイラ２０１はソースファイル１０１をコンパイルしてオブジェクトファイル１０５を生成する。ソースファイル１０１は、図２（ａ）に示すようなものであり、例えば、６つの関数ｆｕｎｃｔｉｏｎ０００（），  ｆｕｎｃｔｉｏｎ  ００１，・・・，ｆｕｎｃｔｉｏｎ００５を含んでいる。
【００４２】
また、コンパイラ２０１は、識別語リスト１０３をコンパイルしてオブジェクトファイル１０７を生成する。識別語ファイル１０３は、図２（ｂ）に示すようなものであり、例えば、３対の識別語（ｆｕｎｃｓｔａｒｔ０００，  ｆｕｎｃｅｎｄ０００），  （ｆｕｎｃｓｔａｒｔ００１，  ｆｕｎｃｅｎｄ００１），  （ｆｕｎｃｓｔａｒｔ００２，  ｆｕｎｃｅｎｄ００２）を含んでいる。なお、１対の識別語は、編集開始識別語及び編集終了識別語より成る。
【００４３】
リンカ２０３は、オブジェクトファイル１０５とオブジェクトファイル１０７をリンクして編集前実行ファイル１１１を生成する。なお、ソースファイル１０１及びオブジェクトファイル１０５は複数あってもよい。リンカ２０３はリンクをする際に、指定ファイル１０９を読み込む。指定ファイル１０９は、図２（ｃ）に示す様なものであり、編集開始識別語、無効化したい関数の名称及び編集終了識別語の組を無効化したい関数の数だけ含む。なお、識別語リスト１０３は、少なくとも指定ファイル１０９に含まれる無効化したい関数の数の識別語対を含んでいればよい。図２（ｃ）の例では、無効化したい関数は、ｆｕｎｃｔｉｏｎ００２，  ｆｕｎｃｔｉｏｎ００５の２つである。
【００４４】
なお、リンカ２０３は、編集開始識別語及び編集終了識別語を予約語として認識しないために、識別語リスト１０３よりコンパイラ２０１により生成されるオブジェクトファイル１０７をリンカ２０３が必要とするが、リンカ２０３が、編集開始識別語及び編集終了識別語を編集開始位置及び編集終了位置を示す予約語として認識するならば、オブジェクトファイル１０７は不要であり、従って、識別語リスト１０３も不要である。
【００４５】
図２（ａ）に示すソースファイル１０１、図２（ｂ）に示す識別語リスト１０３及び図２（ｃ）に示す指定ファイル１０９を基に生成された編集前実行ファイル１１１は、図３（ａ）に示すようなものとなる。図３（ａ）を参照すると、編集前実行ファイル１１１において、無効化したい関数ｆｕｎｃｔｉｏｎ００２の前に編集開始識別語ｆｕｎｃｓｔａｒｔ０００が置かれ、その関数ｆｕｎｉｃｔｉｏｎ００２の後に編集終了識別語ｆｕｎｃｅｎｄ０００が置かれる。同様に、無効化したい関数ｆｕｎｃｔｉｏｎ００５の前に編集開始識別子ｆｕｎｃｔｉｏｎ００２が置かれ、その関数ｆｕｎｃｔｉｏｎ００５の後に編集終了識別語ｆｕｎｃｅｎｄ００２が置かれる。
【００４６】
編集部２０５は、編集前実行ファイル１１１から識別語リスト１０３又は指定ファイル１０９に含まれている編集開始識別語及び編集終了識別語を検索し、その間にあるコードを無実行命令（ＮＯＰ命令）に置き換え、置き換え後のファイルを編集後実行ファイル１１３として出力する。なお、編集開始識別語及び編集終了識別語が特定のパターンを含むようにしておけば、編集部２０５は、識別語リスト１０３又は指定ファイル１０９を参照しなくても、編集開始識別語及び編集終了識別語を検索することが可能である。
【００４７】
なお、編集後実行ファイル１１１の編集開始識別語の直後の部分に無実行命令の代わりに関数の終了コードを書き込み関数コードのその他の部分を任意のデータで上書きしてもよい。また、編集前実行ファイル１１１に書かれていた編集開始識別語及び編集終了識別語を他の値に書き換えても良い。更に、無効化したい関数を呼び出す命令の呼出し先を編集開始識別語の位置から編集終了識別語の位置の間のいずれかの位置として、その位置に関数の終了コードを書き込むようにしてもよい。
【００４８】
このようにして得られた編集後実行ファイル１１３は、無効化した関数が実行できないものとなっている。
【００４９】
次に、実施形態１におけるコンパイラ２０１、リンカ２０３及び編集部２０５が行うコンピュータプログラムの編集方法について説明する。
【００５０】
この編集方法の全体を示す図４を参照すると、まず、コンパイラ２０１は、ソースファイル１０１を含む全てのソースファイルをコンパイルして、オブジェクトファイル１０５を含むオブジェクトファイルを生成する（ステップＳ３０１、Ｓ３０３）。次に、コンパイラ２０１は、識別語リスト１０３をコンパイルして、オブジェクトファイル１０７を生成する（ステップＳ３０５）。次に、リンカ２０３は、ステップＳ３０１〜Ｓ３０５で生成した全てのオブジェクトファイルをリンクして、編集前実行ファイル１１１を生成する（ステップＳ３０７）。最後に、編集部２０５は、編集前実行ファイル１１１より編集後実行ファイル１１３を生成する（ステップＳ３０９）。
【００５１】
次に、図５を参照して、実施形態１におけるステップＳ３０７の詳細について説明する。オブジェクトファイル１０７を除く全てのオブジェクトファイルに含まれている全ての関数について（ステップＳ３１１）、その関数は指定ファイル１０９において編集開始位置識別語と編集終了識別語の間に挟まれているか否かを判断する（ステップＳ３１３）。この判断の際に、オブジェクトファイル１０７を参照して、編集開始位置識別語と編集終了位置識別語を認識してもよいし、予め定めた予約語として編集開始位置識別語と編集終了位置識別語を認識してもよい。ステップＳ３１３の判断結果が肯定的であれば、その関数を編集開始識別語と編集終了識別語で挟んで、これらをリンクし（ステップＳ３１５）、ステップＳ３１３の判断結果が否定的であれば、その関数を通常通りリンクする（ステップＳ３１７）。
【００５２】
次に、図６を参照して、実施形態１におけるステップＳ３０９の詳細について説明する。編集前実行ファイル１１１の全てのコードについてステップＳ３２３〜Ｓ３２９を繰り返す（ステップＳ３２１）。ステップＳ３２３では、編集前実行ファイル１１１よりコードを読み込む。次に、ステップＳ３２３で読み込んだコードは編集開始識別語であるか否かを判断する（ステップＳ３２５）。ステップＳ３２５の判断結果が肯定的であれば、書換えフラグをセットし（ステップＳ３２７）、ステップＳ３２９に進む。ステップＳ３２５の判断結果が否定的であれば、ステップＳ３２３で読み込んだコードは編集終了識別語であるか否かを判断する（ステップＳ３３１）。ステップＳ３３１の判断結果が肯定的であれば、書換えフラグをリセットし（ステップＳ３３３）。ステップＳ３２９に進む。ステップＳ３３１の判断結果が否定的であれば、書換えフラグがセットされているか否かを判断する（ステップＳ３３５）。ステップＳ３３５の判断結果が肯定的であれば、ステップＳ３２３で読み込んだコードを無実行命令に書き換え（ステップＳ３３７）、ステップＳ３２９に進む。ステップＳ３３５の判断結果が否定的であれば、直接ステップＳ３２９に進む。ステップＳ３２９では、編集後実行ファイルに現在のコードを書き込む。
【００５３】
［実施形態２］
実施形態１は、無効化したい関数のコードを無実行命令とするものである。実施形態１によれば、無効化した関数を解析されることはないが、無効化した関数を復元することができない。
【００５４】
実施形態２は、無効化したい関数を暗号化して、後に暗号解除することにより無効化した関数を復元できるようにするものである。こうすることにより、例えば、販売者が暗号化により無効化した関数を含む実行ファイルを試用版として提供し、後に、暗号鍵を提供することにより、購入者が暗号解除して、その実行ファイルを正規版にアップグレードすることが可能となる。
【００５５】
図７は、実施形態２によるプログラム編集システムの構成を示すブロック図である。図１と図７を比較すると明らかなように、実施形態１と実施形態２の相違点は、編集部２０５が編集部２０７に変更された点と、編集後実行ファイル１１３が編集後実行ファイル１１５に変更された点のみである。従って、コンパイラ２０１、リンカ２０３、ソースファイル１０１、識別語リスト１０３、オブジェクトファイル１０５、１０７、指定ファイル１０９及び編集前実行ファイル１１１の説明は省略する。
【００５６】
編集部２０７は、編集前実行ファイル１１１から識別語リスト１０３又は指定ファイル１０９に含まれている編集開始識別語及び編集終了識別語を検索し、その間にあるコードを暗号化し、暗号化後のファイルを編集後実行ファイル１１５として出力する。又は、編集開始識別語及び編集終了識別語が特定のパターンを含むようにしておけば、編集部２０７は、識別語リスト１０３又は指定ファイル１０９を参照しなくても、編集開始識別語及び編集終了識別語を検索することが可能である。
【００５７】
なお、編集開始識別語の直後の部分に関数の終了コードを書き込み、この関数の終了コードを暗号化しないようにしてもよい。
【００５８】
暗号キーを用いて暗号解除をするために、編集後実行ファイル１１３には、暗号解除コード１１６を追加する。暗号解除コード１１６に編集開始識別語及び編集終了識別語を含ませておき、暗号化した関数の前後の編集開始識別語及び編集終了識別語をそのままとしておけば、暗号解除コード１１６は、パターンマッチにより、暗号解除するべき関数の位置を特定することが可能となる。また、暗号化した関数の前後の編集開始識別語及び編集終了識別語を他の値に書き換えたり暗号化した場合であっても、暗号解除コード１１６に暗号化した関数の位置を特定する情報を含ませておけば、暗号解除コード１１６は、暗号解除するべき関数の位置を特定することが可能となる。
【００５９】
このようにして生成された編集後実行ファイル１１５の構成を図８に示す。
【００６０】
暗号解除コード１１６を、編集後実行ファイル１１５から分離させてもよい。
【００６１】
試用版から製品版へのアップグレードのための支払いをして暗号解除のための暗号キーを入手したユーザは、暗号解除コード１１６を起動し、これに暗号キーを入力する。すると、暗号解除コードは暗号化されている関数の暗号解除を行い、編集後実行ファイル１１５の暗号化されている関数を暗号解除された関数に書き換える。
【００６２】
次に、実施形態２におけるコンパイラ２０１、リンカ２０３及び編集部２０７が行うコンピュータプログラムの編集方法について説明する。
【００６３】
実施形態２による編集方法の全体は、実施形態１によるものと同様に、図４に示すとおりであり、ステップＳ３０７の詳細も、実施形態２によるものと同様に、図５に示すとおりであるので、これらの説明は省略する。ステップＳ３０９の詳細は、図９に示すとおりである。図６と図９を比較すると明らかなように、実施形態２は、実施形態１と比較し、コードを無実行命令に書き換えるステップＳ３３７が、コードを暗号化するステップＳ３３９に置き換わっている点及び暗号解除コードを編集後実行ファイル１１５に書き込むステップＳ３４１が追加されている点のみが異なる。従って、ステップＳ３２１〜Ｓ３３５の説明は省略する。
【００６４】
［実施形態３］
実施形態２で生成した編集後実行ファイルの暗号化により無効化した関数は、初期においては実行できず、暗号解除して編集後実行ファイルを書換えた後においては実行できる。実施形態３は、編集後実行ファイルに暗号化した関数を含める点においては実施形態２と同様である。しかし、実施形態３では、編集後実行ファイルを書換えるようなことはしない。また、実施形態３では、暗号化した関数を含んだ編集後実行ファイルをメモリにロードした後に、暗号化した関数を実行する直前に暗号解除して実行するようにする。但し、暗号化した関数内又はその隣に試用期間に関する暗号化情報を埋め込んでおく。暗号解除してから実行する前に試用期間に関する情報を参照して、試用期間が経過していなければ実行をして、試用期間が経過していれば実行を中止する。実施形態３は、実施形態２とは逆であり、試用期間に仕様上の全ての機能を使えるようにして、試用期間が経過したならば一部の機能を使えなくする。こうすることにより、試用版で全ての機能を試用してみたユーザが試用期間経過後に製品版のコンピュータプログラムを購入することを促進する。実施形態３では、暗号化した関数内又はその隣に試用期間に関する暗号化情報を埋め込むので、試用期間に関する情報が不正に解析されたり、改竄されたりすることを防止でき、従って、本来試用期間のみに試用できることとしていた機能が試用期間が経過しても不正に使われるという事態を防止することができる。
【００６５】
なお、実施形態３では、実行ファイルがコード領域にロードされるものとするが、コード領域であっても再書込みを可能とする命令を用いたり、コード領域のうちの実行ファイルをロードした領域の属性を書込み許可とすることにより、コード領域にロードされた実行ファイルは再書込み可能となり、従って、暗号解除された関数を再書込みすることが可能となる。
【００６６】
前述したように、実行ファイルをメモリにロードする際に、実行ファイル中の絶対アドレス指定の命令に含まれている絶対アドレスを、その命令にオペランドとして含まれているディフォルトの絶対アドレス及び実行ファイルをロードするアドレスを基に、ダイナミックに書換えるオペレーティングシステムがある。実施形態２では、暗号化されている関数を実行することがないので、暗号化されている関数に絶対アドレス指定の命令が含まれていても問題は生じない。ところが、このようなオペレーティングシステムを用いた場合において、暗号化された関数を暗号化されたままメモリにロードし、実行直前において暗号解除することとなると、暗号化された関数に含まれている絶対アドレス指定の命令の絶対アドレスを実行ファイルがロードされたアドレスに応じてダイナミックに書換えることが不可能となってしまう。そこで、実施形態３においては、暗号化しようとする関数中の絶対アドレス指定命令中の絶対アドレスを暗号化せず、残りの部分のみを暗号化する。実行ファイル中の絶対アドレスが記述されている部分は実行ファイルの特定の場所に記述されているので、オペレーティングシステムは、実行ファイルをメモリにロードする際に、その特定の場所を参照して、ディフォルトの絶対アドレスが記述されている部分を特定し、ディフォルトの絶対アドレスを、ディフォルトの絶対アドレスと実行ファイルをロードしようとするアドレスを基に算出した絶対アドレスに書換える。
【００６７】
図１０は、実施形態３によるプログラム編集システムの構成を示すブロック図である。図１と図１０を比較すると明らかなように、実施形態１と実施形態３の相違点は、リンカ２０３がリンカ２０９に変更された点と、編集部２０５が編集部２１１に変更された点と、指定ファイル１０９が指定ファイル１１７に変更された点と、編集前実行ファイル１１１が編集前実行ファイル１１９に変更された点と、編集後実行ファイル１１３が編集後実行ファイル１２１に変更された点のみである。従って、コンパイラ２０１、ソースファイル１０１、識別語リスト１０３、オブジェクトファイル１０５、１０７の説明は省略する。
【００６８】
指定ファイル１１７は、図１１に示すようなものである。編集開始識別語と編集終了識別語の間には、無効化したい関数の名称に加え、その関数を無効化したい日付又は実行ファイルをコンピュータにインストールしてからその関数を無効化するまでの日数が記述されている。図１１の例では、編集開始識別語ｆｕｎｃｓｔａｒｔ０００と編集終了識別語ｆｕｎｃｅｎｄ０００の間には、無効化したい関数の名称ｆｕｎｃｔｉｏｎ００２と関数ｆｕｎｃｔｉｏｎ００２を無効化したい日付２００３／０３／３１が記述され、編集開始識別語ｆｕｎｃｔｉｏｎ００２と編集終了識別語ｆｕｎｃｅｎｄ００２の間には、無効化したい関数の名称ｆｕｎｃｔｉｏｎ００５と実行ファイルをコンピュータにインストールしてからその関数ｆｕｎｃｔｉｏｎ００５を無効化するまでの日数６０ｄａｙｓが記述されている。
【００６９】
リンカ２０９は、オブジェクトファイル１０５、１０７及び指定ファイル１１７を基に編集前実行ファイル１１９を生成する。例えば、図２（ａ）に示すソースファイル１０１から生成したオブジェクトファイル１０５、図２（ｂ）に示す識別語リスト１０３から生成したオブジェクトファイル１０７及び図１１に示す指定ファイル１１７を基にリンカ２０９が生成した編集前実行ファイル１１９は、図１２（ａ）に示す様なものとなる。
【００７０】
図１２を参照すると、編集前実行ファイル１１９は、関数ｆｕｎｃｔｉｏｎ００２のコード中に含まれる絶対アドレスの位置及び関数ｆｕｎｃｔｉｏｎ００５のコード中に含まれる絶対アドレスの位置を記述した絶対アドレスリスト１２３を有している。また、編集開始識別語ｆｕｎｃｓｔａｒｔ０００と編集終了識別語ｆｕｎｃｅｎｄ０００の間には、関数ｆｕｎｃｔｉｏｎ００２のコード及び関数ｆｕｎｃｔｉｏｎ００２を無効化したい日付２００３／０３／３１が挟まれている。更に、編集開始識別語ｆｕｎｃｓｔａｒｔ００２と編集終了識別語ｆｕｎｃｅｎｄ００２の間には、関数ｆｕｎｃｔｉｏｎ００５のコードと実行ファイルをコンピュータにインストールしてからその関数ｆｕｎｃｔｉｏｎ００５を無効化するまでの日付６０ｄａｙｓが挟まれている。
【００７１】
編集部２１１は、編集前実行ファイル１１９の編集開始識別語と編集終了識別語の間に挟まれている関数及び日付又は日数を暗号化し、更に、暗号解除コード１１６を付加して、編集後実行ファイル１２１を生成する。但し、編集部２１１は、絶対アドレスリスト１２３を参照して、編集開始識別語と編集終了識別語の間に挟まれている関数に含まれている絶対アドレスを暗号化しない。このようにして得られた編集後実行ファイル１２１中の暗号化されたｆｕｎｃｔｉｏｎ００２（符号１２５）のコードの模式図を図１３に示す。斜線で示す部分は暗号化されており、白抜きの部分は絶対アドレスであり暗号化されていない。
【００７２】
編集部２１１は、図１４（ａ）に示すように暗号化する部分のパリティ１２６を編集後実行ファイル１２１に付加しても良い。ここでいう「暗号化する部分」とは、編集開始識別語と編集終了識別語の間に挟まれている関数及び日付又は日数の部分である。この場合、暗号解除コード１１６は、実行時に暗号解除した部分のパリティを計算し、計算されたパリティをパリティ１２６と比較し、両者が一致していないときには、日付や日数等が改竄されたと判断してプログラム実行の強制終了、プログラムの一部の機能の無効化等のプログラム実行の制限を行う。同様に、編集部２１１は、図１４（ｂ）に示すように暗号化する部分のハッシュ値１２７を編集後実行ファイル１２１に付加しても良い。ここでいう「暗号化する部分」とは、編集開始識別語と編集終了識別語の間に挟まれている関数及び日付又は日数の部分である。この場合、暗号解除コード１１６は、実行時に暗号解除した部分のハッシュ値を計算し、計算されたハッシュ値をハッシュ値１２７と比較し、両者が一致していないときには、日付や日数等が改竄されたと判断してプログラム実行の強制終了、プログラムの一部の機能の無効化等のプログラム実行の制限を行う。更にハッシュ値を公開鍵暗号で暗号化して格納しておき、実行時には電子署名改竄検査を行っても良い。
【００７３】
試用期間の日数制限をしている場合において、編集後実行ファイル１２１を起動した時には、暗号解除コード１１６が、その時がコンピュータに編集後実行ファイル１２１をコンピュータにインストールしてから無効化するまでの日数を経過した時であるのか否かを判断する必要がある。このために、編集後実行ファイル１２１をコンピュータにインストールするインストールプログラムは、インストールが行われた日付をコンピュータの所定の場所に記録する。また、インストールプログラムは、その日付を編集後実行ファイル１２１に書き込んでもよい。暗号解除コード１１６は、その日付を参照する。
【００７４】
次に、実施形態３におけるコンパイラ２０１、リンカ２０９及び編集部２１１が行うコンピュータプログラムの編集方法について説明する。
【００７５】
実施形態３による編集方法の全体は、実施形態１によるものと同様に、図４に示すとおりである。
【００７６】
ステップＳ３０９の詳細は、図１５に示すとおりである、図５と図１５を比較すると明らかな様に、実施形態３は、実施形態１と比較し、ステップＳ３１５がステップＳ３４３に置き換わっている点が異なる。ステップＳ３４３では、指定ファイル１１７に記述されている関数及び日付又は日数を編集開始識別語と編集終了識別語の間に挟んで、これらをリンクする。他のステップＳ３１１、Ｓ３１３、Ｓ３１７の説明は省略する。
【００７７】
ステップＳ３０９の詳細は、図１６に示すとおりである。図９と図１６を比較すると明らかなように、実施形態２は、実施形態２と比較し、ステップＳ３４５、Ｓ３４７、Ｓ３４９が追加されている点が異なる。ステップＳ３３５の判断結果が肯定的であるときに実行されるステップＳ３４５では、コードが絶対アドレスであるかを判断する。ステップＳ３４５の判断結果が肯定的であれば、ステップＳ３２９に進む。ステップＳ３４５の判断結果が否定的であれば、パリティ又はハッシュ値の中間値を計算し（ステップＳ３４１）、コードを暗号化し（ステップＳ３３９）、ステップＳ３２９に進む。ステップＳ３４１の後のステップＳ３４９では、編集後実行ファイル１２１にパリティ又はハッシュ値を書き込む。ステップＳ３２１、Ｓ３２３、Ｓ３２５、Ｓ３２７、Ｓ３２９、Ｓ３３１、Ｓ３３３、Ｓ３３５の説明は省略する。
【００７８】
なお、上記の実施形態で説明した編集前実行ファイル及び編集後実行ファイルは、通常は、機械語コードで記述されたファイルであるが、ＢＡＳＩＣ言語、ＪＡＶＡ（登録商標）言語、「．ＮＥＴ」等の中間言語コードで記述されたファイルであってもよい。
【００７９】
【発明の効果】
以上説明したように、本発明によれば、一部のコードを無効化又は暗号化した実行ファイルを作成するために、ソースファイルに変更を加える必要がないので、無効化又は暗号化する関数の相違に応じて複数のソースファイルを作成する必要がなくなり、保守性が向上する。
【００８０】
また、本発明によれば、一部のコードを暗号化して、後に暗号解除してそのコードを利用できるようにしているので、ユーザは試用版の実行ファイルとは別に製品版を購入する必要がなくなり、購入に伴う労力を省くことができる。また、販売費、流通費等を削減できる。
【００８１】
更に、本発明によれば、関数を暗号化する場合であっても、その関数に含まれている絶対アドレスを暗号化しないので、実行ファイルのメモリへのロード時に実行ファイル中の絶対アドレスの書き換えをするオペレーティングシステムに対応することが可能となる。
【００８２】
更に、本発明によれば、使用期間を限定するための情報を暗号化するので、使用期間が改竄される可能性が低くなり、使用期間を過ぎた実行ファイルの不正な使用を防止することができる。
【００８３】
更に、本発明によれば、暗号化された部分のパリティ又はハッシュ値を実行ファイルに書き込んでおいて、実行時に計算されたパリティ又はハッシュ値と実行ファイルに書き込まれているパリティ又はハッシュ値を比較し、両者が不一致であった場合に、実行ファイルの実行を制限するので、例え、暗号化された部分が改竄されたとしても、不正な使用を防止することができる。特に、使用期間を限定するための情報も暗号化している場合には、使用期間経過後の不正な使用を防止することができる。
【図面の簡単な説明】
【図１】本発明の実施形態１によるコンピュータプログラムの編集システムの構成を示すブロック図である。
【図２】本発明の実施形態１によるソースファイル、識別語ファイル及び指定ファイルの内容の例を示す図である。
【図３】本発明の実施形態１による編集前実行ファイル及び編集後実行ファイルの内容の例を示す図である。
【図４】本発明の実施形態１によるコンピュータプログラムの編集方法を示すフローチャトである。
【図５】本発明の実施形態１による「全てのオブジェクトをリンクして、編集前実行ファイルを生成する」ステップの詳細を示すフローチャートである。
【図６】本発明の実施形態１による「編集前実行ファイルよび編集後実行ファイルを生成する」ステップの詳細を示すフローチャートである。
【図７】本発明の実施形態２によるコンピュータプログラムの編集システムの構成を示すブロック図である。
【図８】本発明の実施形態２による編集後実行ファイルの内容の例を示す図である。
【図９】本発明の実施形態２による「編集前実行ファイルよび編集後実行ファイルを生成する」ステップの詳細を示すフローチャートである。
【図１０】本発明の実施形態３によるコンピュータプログラムの編集システムの構成を示すブロック図である。
【図１１】本発明の実施形態３による指定ファイルの内容の例を示す図である。
【図１２】本発明の実施形態３による編集前実行ファイル及び編集後実行ファイルの内容の例を示す図である。
【図１３】本発明の実施形態３による編集後実行ファイル中の関数の暗号化の状態を示す図である。
【図１４】本発明の実施形態３による編集後実行ファイルの内容の他の例を示す図である。
【図１５】本発明の実施形態３による「全てのオブジェクトをリンクして、編集前実行ファイルを生成する」ステップの詳細を示すフローチャートである。
【図１６】本発明の実施形態３による「編集前実行ファイルよび編集後実行ファイルを生成する」ステップの詳細を示すフローチャートである。
【符号の説明】
１０１  ソースファイル
１０３  識別語リスト
１０５、１０７  オブジェクトファイル
１０９、１１７  指定ファイル
１１１、１１９  編集前実行ファイル
１１３、１１５、１２１  編集後実行ファイル
２０１  コンパイラ
２０３、２０９  リンカ
２０５、２０７、２１１  編集部
【図１】
2004265037.tif 000003
【図２】
2004265037.tif 000004
【図３】
2004265037.tif 000005
【図４】
2004265037.tif 000006
【図５】
2004265037.tif 000007
【図６】
2004265037.tif 000008
【図７】
2004265037.tif 000009
【図８】
2004265037.tif 000010
【図９】
2004265037.tif 000011
【図１０】
2004265037.tif 000012
【図１１】
2004265037.tif 000013
【図１２】
2004265037.tif 000014
【図１３】
2004265037.tif 000015
【図１４】
2004265037.tif 000016
【図１５】
2004265037.tif 000017
【図１６】
2004265037.tif 000018