(57)【要約】【課題】メモリに展開された実行可能なプログラムに対する、解析・改竄・なりすましなどの不正行為を防止すること。【解決手段】ＰＣの汎用バスに、ＰＣＩカードなどの形態で専用の保護装置１００を接続する。この保護装置１００の分割部３０１は、プログラムをランダムな大きさのブロックに分割する。このブロックは再構成部３０２により、１．順序を入れ替えられたり、２．機能的に等価なコード列で置き換えられたり、あるいは３．複数のブロックにより多重化されたりした後、アドレスを解決されてＤＭＡ部３０３によりメインメモリ１０２にロードされる。このように、保護されたプログラムはその実行の都度「見た目」が複雑に変化する。また、ロード時点でのプログラムのメモリイメージを保存しておき、これを現在のメモリイメージと不定期に照合することで、プログラムの改竄の有無をチェックする。【選択図】        図３
2005085188.tif 000002
【特許請求の範囲】
【請求項１】
メモリにロードされた実行可能なプログラムの保護方法において、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックの順序を入れ替える入れ替え工程と、
前記入れ替え工程で任意のブロックの順序を入れ替えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
を含んだことを特徴とするプログラム保護方法。
【請求項２】
メモリにロードされた実行可能なプログラムの保護方法において、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックのコード列を同等の機能を有する別のコード列に置き換える置き換え工程と、
前記置き換え工程で任意のブロックのコード列を置き換えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
を含んだことを特徴とするプログラム保護方法。
【請求項３】
メモリにロードされた実行可能なプログラムの保護方法において、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックを同等の機能を有する複数のブロックおよび当該複数のブロックのいずれか１つを指定するブロックにより多重化する多重化工程と、
前記多重化工程で任意のブロックを多重化されたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
を含んだことを特徴とするプログラム保護方法。
【請求項４】
メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する保護プログラムにおいて、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックの順序を入れ替える入れ替え工程と、
前記入れ替え工程で任意のブロックの順序を入れ替えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
をプロセッサに実行させることを特徴とするプログラム保護プログラム。
【請求項５】
メモリにロードされた実行可能なプログラムの保護装置において、
前記メモリにロードするプログラムを複数のブロックに分割する分割手段と、
前記分割手段により分割された任意のブロックの順序を入れ替える入れ替え手段と、
前記入れ替え手段により任意のブロックの順序を入れ替えられたプログラムのアドレスを解決するアドレス解決手段と、
前記アドレス解決手段によりアドレスを解決されたプログラムを前記メモリにロードするロード手段と、
を備えたことを特徴とするプログラム保護装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、メモリにロードされた実行可能なプログラムの保護方法、プログラム保護プログラムおよびプログラム保護装置に関する。
【背景技術】
【０００２】
計算機により実行されるプログラムは、暗号化された状態でファイルシステムに保管されている限り、解析や改竄といった不正行為に対して安全であると考えられる。
【０００３】
もっとも計算機のＣＰＵは、暗号化されたプログラムをそのままの状態で実行することはできないので、メモリへの展開時あるいは実行中にこの暗号を復号する必要がある。したがって、どれほど強固な暗号化を施したとしても実行時には必ず復号されているので、実行中にメモリ上のデータを解析することで、復号後のプログラムや鍵などの重要な情報を比較的容易に取得できる。復号時に復号プログラムの正当性をチェックするようにしても（たとえば、特許文献１参照。）、復号後のデータの安全性が確保されなければ意味がないものになってしまう。ＰＣ（パーソナル・コンピュータ）のように、内部の仕様が公開されている計算機ではこうした問題が特に顕著である。
【０００４】
正規の購入者以外によるプログラムの使用を禁止するための技術は従来から存在するが（たとえば、特許文献２参照。）、解析や改竄などは正規の購入者によりなされることも多い。またＰＣに限らず、プロセッサがメモリにアクセスするときのアドレスを監視し、不正な覗き見や改竄を検出する手法（たとえば、特許文献３参照。）、あるいはメモリには命令語のビット列を入れ替えたプログラムを置いておき、プロセッサに入力する直前に元の順序に戻す手法（たとえば、特許文献４参照。）などがある。
【０００５】
【特許文献１】特開平１１−３９１５６号公報
【特許文献２】特開平１１−８５４９８号公報
【特許文献３】特開平５−３２４４８３号公報
【特許文献４】特開２０００−５６９６３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記従来技術に開示された技術は、いずれも汎用性や拡張性に乏しく、一般的な計算機システムやアプリケーション・プログラムには容易に適用できなかった。また、重要なプログラムコードの改竄をメモリの内容を監視することで調べる手法もあるが、監視しているプログラムがＣＰＵによって実行されているプログラムとは別に用意されたものであっても（いわゆる「なりすまし」）、それらを区別することはできなかった。
【０００７】
このように従来技術においては、メモリに展開されたプログラムに対する不正行為を防止するための一般的で効果的な手だてがないという問題があった。
【０００８】
この発明は、上述した従来技術による問題点を解消するため、メモリ上のプログラムに対する不正行為を簡易な処理で、しかも強力に防止することが可能なプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決し、目的を達成するため、この発明にかかるプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置は、メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する際に、前記メモリにロードするプログラムを複数のブロックに分割し、分割された任意のブロックの順序を入れ替え、任意のブロックの順序を入れ替えられたプログラムのアドレスを解決し、アドレスを解決されたプログラムを前記メモリにロードすることを特徴とする。
【００１０】
この発明によれば、保護されたプログラムはその実行の都度、コード列の順序を入れ替えられたうえでメモリ上にロードされる。
【００１１】
また、この発明にかかるプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置は、メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する際に、前記メモリにロードするプログラムを複数のブロックに分割し、分割された任意のブロックのコード列を同等の機能を有する別のコード列に置き換え、任意のブロックのコード列を置き換えられたプログラムのアドレスを解決し、アドレスを解決されたプログラムを前記メモリにロードすることを特徴とする。
【００１２】
この発明によれば、保護されたプログラムはその実行の都度、コード列の一部を機能的に等価な別のコード列に置き換えられたうえでメモリ上にロードされる。
【００１３】
また、この発明にかかるプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置は、メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する際に、前記メモリにロードするプログラムを複数のブロックに分割し、分割された任意のブロックを同等の機能を有する複数のブロックおよび当該複数のブロックのいずれか１つを指定するブロックにより多重化し、任意のブロックを多重化されたプログラムのアドレスを解決し、アドレスを解決されたプログラムを前記メモリにロードすることを特徴とする。
【００１４】
この発明によれば、保護されたプログラムはその実行の都度、コード列の一部を選択的に実行される複数のコード群で多重化されたうえでメモリ上にロードされる。
【発明の効果】
【００１５】
本発明にかかるプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置によれば、メモリ上に存在するプログラムの「見た目」は起動ごとに複雑に変化し、しかも実質的に意味のないコードや実行されないコードなどが多数挿入されるので、メモリ上のプログラムに対する不正行為を非常に困難にすることができるという効果を奏する。
【発明を実施するための最良の形態】
【００１６】
以下に添付図面を参照して、この発明にかかるプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置の好適な実施の形態を詳細に説明する。
【００１７】
（実施の形態１）
図１は、この発明の実施の形態１にかかるプログラム保護装置のハードウエア構成の一例を示す説明図である。図示する装置は一般的なＰＣ（パーソナル・コンピュータ）であり、ＰＣが通常備えるハードウエア（同図ではそのうち、本発明の説明に必要な最低限のものしか示していない）に加え、プログラムの不正な改竄・解析などを阻止するための専用の保護装置１００を備えたことが特徴となっている。
【００１８】
図示するように上記ＰＣの内部バスには、装置全体の制御を司るＣＰＵ１０１や、ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）によるデータ転送が可能なメインメモリ１０２などが接続され、これらがＩ／Ｏブリッジ１０３を介して、汎用バス（ここではＰＣＩバス）に接続されている。この汎用バスには、ＣＰＵ１０１により実行されるプログラムや各種データなどを保持するＨＤＤ（ハードディスクドライブ）１０４のほか、上述の保護装置１００がＰＣＩカードもしくはＰＣＩボードの形態で接続されている。
【００１９】
また、図２はこの発明の実施の形態１にかかるプログラム保護装置のハードウエア構成の他の一例を示す説明図である。図示する例は汎用バスでなく、内部バスに保護装置１００を接続したものである。このように保護装置１００は、ＣＰＵ１０１やメインメモリ１０２、ＨＤＤ１０４と直接通信できる限り、ＰＣの内外を問わず物理的にどこにあっても、どのように接続されているのでもよい。
【００２０】
また、図３はこの発明の実施の形態１にかかるプログラム保護装置の機能的構成を示す説明図である。ただし、図３には本発明を説明するのに必要な最低限の機能部、具体的には保護装置１００により実現される機能部しか示していない。したがって、図示は省略するが、他の機能部を備えていてもよい。
【００２１】
リロケータブルコード生成部３００は、保護装置１００による保護の対象となるプログラムについて、当該プログラムを後述する分割・再構成後も再配置可能とする（リロケータブル化する）ための「リロケート情報」を生成する機能部である。具体的には上記プログラムの解析により、プログラム内の絶対アドレス参照部分と相対アドレス参照部分とをすべて抽出して、各部分にラベリングしたうえでリロケート情報としてテーブル化する。
【００２２】
また、分割部３０１は、保護装置１００による保護の対象となるプログラムをＨＤＤ１０４から読み出して、複数のブロック（領域）に分割するとともに、各ブロックの間に分岐命令（ジャンプ命令）を挿入する機能部である。
【００２３】
このブロックのサイズは一定でなく、たとえばｘバイトのブロックを切り出した後はｙバイトのブロックを切り出すというように、分割時にランダムに変更してゆく。１つのブロックには少なくともこの命令が１つ含まれなければならない、などの論理的な制限はない。細かく分割すればするほど保護の強度は上がるが、プログラムの実行速度が落ちるので、このトレード・オフを勘案して適度な細かさで分割する必要がある。
【００２４】
なお、分割された各ブロックの継ぎ目には、直後のブロックへの分岐命令が挿入される。この分岐命令は、後述する再構成部３０２によりブロックの順序が入れ替えられても、ブロックの実行順序は変化しないような形で（すなわち、プログラムがブロックレベルでリロケータブルとなるように）記述される。図４は、分割部３０１による分割および分岐命令挿入後のプログラムを模式的に示す説明図である。このプログラムは分割部３０１により暗号化され、ＨＤＤ１０４に保存される。
【００２５】
また、再構成部３０２は、分割部３０１によりＨＤＤ１０４に保存されたプログラム（暗号化されリロケータブル化されたプログラム）を読み出して、ブロックの並べ替えなどにより当該プログラムを表面的・実質的に複雑化した後、アドレス解決された実行可能な１つのプログラムとして出力する機能部である。この再構成部３０２により行われるプログラムの複雑化には、具体的には（１）ブロックの並べ替え（２）ブロックの置き換え（３）ブロックの多重化、の３種類がある。以下順次説明する。
【００２６】
（１）ブロックの並べ替え
図５は、図４に示したプログラムを構成する各ブロックが、再構成部３０２により並べ替えられた後の状態を模式的に示す説明図である。ブロックの順序が入れ替わることでプログラムの外観（メインメモリ１０２への展開時の状態）は変化しても、分割部３０１により挿入されている分岐命令があるので、ＣＰＵ１０１による実行順序そのものは変化しない。すなわち、図４および図５に示したプログラムは、いずれもブロック１→２→３→４の順序で実行される。
【００２７】
（２）ブロックの置き換え
図６は、図４に示したプログラムのブロック２が、再構成部３０２によりブロック２’に置き換えられた後の状態を模式的に示す説明図である。このブロック２’は、元のブロック２と機能的には等価であるが、「見た目」すなわちコード列は異なっている。コンパイラによる最適化と似ているが、違うのはコードの実行効率は問わない点である。すなわち、ブロック２よりブロック２’のほうが実行速度が遅くても置換してしまう。このブロック２’は、ブロック２についてたとえば以下のような処理を行うことで生成される。
【００２８】
（２−１）命令コードの並べ替え
実行順序に前後関係のない命令の順序を入れ替える。実行順序に前後関係がある命令は、並べ替えの後に分岐命令を追加することで、命令の位置が入れ替わっても実行順序そのものは変化しないようにする。
【００２９】
（２−２）１つの命令コードを複数に分割、あるいは複数の命令コードを１つに統合
前者の例はたとえば、「Ａ＋１」という命令を「Ａ＋２」と「Ａ−１」とに分割したり、複合的な命令を複数の単純な命令で代替したりするようなものである。後者の例はたとえば、「Ａ＋１」と「Ａ＋２」とを「Ａ＋３」に統合するようなものである。
【００３０】
（２−３）ブロック本来の機能に影響しない命令コードの挿入
たとえばｎｏｐ命令や、レジスタに１を加算する命令と１を減算する命令との組み合わせなど、ブロック本来の機能（以下では「主機能」と呼ぶ）に影響しない冗長な命令を追加する。あるいは、主機能とは無関係な機能（以下では「追加機能」と呼ぶ）を実現するための一群の命令（この命令群はあらかじめ再構成部３０２に保持されている）を追加する。なお、この追加機能は単にプログラムの外観を変化させるだけでなく、プログラムの「なりすまし」の検出にも利用することができるが、この点については実施の形態２において後述する。
【００３１】
（３）ブロックの多重化
図７は、図４に示したプログラムのブロック２が、再構成部３０２により複数のブロック「２−ａ」「２−ｂ」「２−ｃ」「２−ｄ」に多重化された後の状態を模式的に示す説明図である。これらのブロックはいずれも、図４に示したブロック２と機能的に等価であるが、コード列はそれぞれ異なっている。
【００３２】
また、ブロック「２−ｅｎｔｒｙ」は多重化されたブロックの切り替えスイッチとしてのみ機能するブロックである。具体的にはブロック２のうち、他のブロックから参照される部分（アドレス被参照部分）が「２−ａ」〜「２−ｄ」のいずれか１つへの分岐命令に置き換えられ、それ以外の部分には無効な値が詰められるか（この場合「２−ｅｎｔｒｙ」のサイズはブロック２のサイズと等しい）、あるいは削除されて間を詰められている。ブロック２を参照する他のブロックから「２−ｅｎｔｒｙ」に入ってきた制御は、すぐに「２−ｅｎｔｒｙ」を通過して、上記命令で特定される「２−ａ」「２−ｂ」「２−ｃ」あるいは「２−ｄ」のいずれか１つへ分岐する。
【００３３】
なお、「２−ａ」〜「２−ｄ」いずれのブロックが実行される場合でも、上述のようにこれらは機能的に等価であるので、他のブロック中の参照する場所（アドレス参照部分）も同一である。そこで、多重化された各ブロックへの入口だけでなく、各ブロックからの出口も「２−ｅｎｔｒｙ」に集約するようにしてもよい。すなわち図８に模式的に示すように、ブロック「２−ａ」〜「２−ｄ」に共通する、他のブロックの同一の場所を参照する部分にはいずれも「２−ｅｎｔｒｙ」中の同一の場所を参照させ、そこから間接的に他ブロック中の目的の場所を参照させるようにする。
【００３４】
分割部３０１によるブロック分割後のプログラムは、上記（１）〜（３）の各手法により複雑化された後、さらに再構成部３０２により未解決のアドレスを解決される。このアドレス解決には、リロケータブルコード生成部３００により生成された上述のリロケート情報、すなわちプログラム中の絶対アドレス参照部分と相対アドレス参照部分とのリストが使用される。
【００３５】
つぎに、図３におけるＤＭＡ部３０３は、再構成部３０２から出力されたプログラムをＤＭＡによりメインメモリ１０２に転送するとともに、後述するスイッチ書き換え部３０４あるいはブロック書き換え部３０５からの指示により、メインメモリ１０２に展開されたプログラムの一部をＤＭＡで書き換える機能部である。
【００３６】
また、スイッチ書き換え部３０４はプログラムの実行中に、つぎのスイッチ切り替えまでの時間をランダムに決定するとともに、当該時間が経過した時点で、スイッチすなわちたとえば上述の「２−ｅｎｔｒｙ」中にある分岐命令の飛び先を、現在のブロックから他のブロックへと書き換える機能部である。すなわち、メインメモリ１０２上での上記命令の展開位置を特定し、当該位置と書き換え後の飛び先とをＤＭＡ部３０３に通知して、リアルタイムにスイッチを書き換えさせる。
【００３７】
また、ブロック書き換え部３０５はプログラムの実行中に、実行中でないことが確実なブロックを他のブロックで置き換える機能部である。たとえば「２−ｅｎｔｒｙ」のスイッチが「２−ａ」を指している間に、ＤＭＡ部３０３に指示して、メインメモリ１０２上の「２−ｂ」を「２−ｂ’」で上書きさせるか、あるいは「２−ｂ」を削除して別の領域に「２−ｂ’」を書き込ませる。「２−ｂ」のコード列よりも「２−ｂ’」のコード列のほうが長いときは必然的に後者となるが、そうでなくとも後者のようにする（コード内容だけでなくその展開位置も変える）ことで、プログラムの解析がより困難となる。なおこの「２−ｂ’」は、元の「２−ｂ」に上述の（２−１）〜（２−３）を適用するなどして作成する。
【００３８】
なお、メインメモリ１０２の内容を書き換えるとＣＰＵ１０１に読み込まれているキャッシュも同時に破棄されるので、通常問題は発生しないが、何らかの原因で稀にＣＰＵ１０１が書き換え前のキャッシュを実行し続けることがある。この場合、スイッチ書き換え部３０４がたとえばメインメモリ１０２上のスイッチを「２−ｂ」から「２−ａ」に書き換えた後でも、キャッシュのために「２−ｂ」が依然実行されていることもあり、この実行中の「２−ｂ」をブロック書き換え部３０５で「２−ｂ’」に置き換えようとすると何らかの不整合が発生する。
【００３９】
そこで、ＣＰＵ１０１により現在実行されているのがどのブロックであるかを特定するために、たとえば多重化された個々のブロックごとにカウンタを設け、再構成部３０２で各ブロックの先頭にカウントアップ命令、末尾にカウントダウン命令を追加しておく。これにより、たとえば「２−ｂ」用のカウンタは「２−ｂ」の実行開始直後に１、実行終了直後に０となる。したがって、「２−ｂ」が実行中でないことが確実なとき、具体的にはスイッチを「２−ａ」に書き換えた後「２−ｂ」のカウンタが０となるのを待って、「２−ｂ’」をメインメモリ１０２に書き込めば、実行中のブロックを誤って差し替えてしまうことがない。その後、スイッチが「２−ａ」から「２−ｂ’」に切り替わった時点で、差し替え後のブロックが実行されるようになる。
【００４０】
つぎに、図９はこの発明の実施の形態１にかかるプログラム保護装置における、プログラムのインストール処理の手順を示すフローチャートである。
【００４１】
本発明により保護されるプログラムのインストーラ（正確には当該インストーラを実行するＣＰＵ１０１）は、ＣＤ−ＲＯＭなどに格納された当該プログラムを読み出して、保護装置１００の分割部３０１に引き渡す。これを受けた分割部３０１は、まずその暗号を復号するとともに（ステップＳ９０１）、リロケータブルコード生成部３００に指示して上述のリロケート情報を生成させる（ステップＳ９０２）。
【００４２】
つぎに分割部３０１は、復号後のプログラムをランダムなサイズの複数のブロックに分割するとともに（ステップＳ９０３）、ブロック間の継ぎ目に分岐命令を挿入する（ステップＳ９０４）。そして、上記処理後のプログラムとリロケータブルコード生成部３００から受け取ったリロケート情報とを暗号化の上（ステップＳ９０５）、ＨＤＤ１０４に保存する（ステップＳ９０６）。なお、保護装置１００による上記処理と平行して、ＣＰＵ１０１はレジストリの設定など、インストール時に通常行う処理を行う。
【００４３】
つぎに、図１０はこの発明の実施の形態１にかかるプログラム保護装置における、プログラムの実行処理の手順を示すフローチャートである。
【００４４】
画面上のアイコンのダブルクリックなどにより、図９の手順でインストールされたプログラムの起動が指示されると（ステップＳ１００１：Ｙｅｓ）、当該プログラムのローダ（正確には当該ローダを実行するＣＰＵ１０１）はメインメモリ１０２上に当該プログラムの展開領域を確保するとともに、保護装置１００の再構成部３０２を起動する。
【００４５】
これを受けた再構成部３０２は、ＨＤＤ１０４から当該プログラムとそのリロケート情報を読み出して、暗号を復号するとともに（ステップＳ１００２）、上述の（１）〜（３）をプログラム内の任意のブロックに適用することで、当該プログラムを再構成する（ステップＳ１００３）。さらに、再構成後のプログラム内のアドレスを、リロケート情報を参照して解決する（ステップＳ１００４）。
【００４６】
そして、上記処理後のプログラムを再構成部３０２から受け取ったＤＭＡ部３０３は、ローダがメインメモリ１０２上に確保した領域へ当該プログラムをロードする（ステップＳ１００５）。この後プログラムの終了指示があるまでの間（ステップＳ１００６：Ｎｏ）、メインメモリ１０２上に展開されたプログラムがＣＰＵ１０１により順次実行されるが、スイッチの切り替え時期が到来、すなわちスイッチ書き換え部３０４によりランダムに決定された所定時間が経過すると（ステップＳ１００７：Ｙｅｓ）、スイッチ書き換え部３０４からの指示を受けたＤＭＡ部３０３により、メインメモリ１０２上のスイッチ部分（分岐命令の飛び先）が書き換えられる（ステップＳ１００８）。なお、スイッチ書き換え部３０４によりランダムに決定された所定時間が経過するまでは（ステップＳ１００７：Ｎｏ）、ステップＳ１００６に戻る処理を繰り返す。
【００４７】
そして、書き換え前のスイッチで選択されていたブロックが実行中でなくなったとき、すなわち当該ブロックのカウンタが０になった時点で（ステップＳ１００９：Ｙｅｓ）、ブロック書き換え部３０５により当該ブロックのコード列が別のコード列で置き換えられる（ステップＳ１０１０）。この後ステップＳ１００６に戻る。
【００４８】
また、プログラムの終了指示があったときは（ステップＳ１００６：Ｙｅｓ）、その時点で本フローチャートによる処理を終了する。
【００４９】
以上説明した実施の形態１によれば、保護対象のプログラムはその実行の都度、再構成部３０２によりコード列を組み替えられたり冗長なコード列を挿入されたりするので、メインメモリ１０２上に展開された復号後のプログラムの、どの部分がどの機能に対応するのかを容易に特定できない。これにより、解析や改竄などの不正行為を阻止、あるいは事実上無力化・無効化することができる。
【００５０】
なお、上述した実施の形態１ではプログラムのリロケート情報を、本装置へのインストール時に生成するようにしたが、プログラム中のアドレス参照部分は固定的であるので、あらかじめ配布元で生成したものをプログラムとともに暗号化して配布するようにしてもよい。この場合上述のリロケータブルコード生成部３００は不要であり、再構成部３０２はプログラムに元々添付されていたリロケート情報を用いて、再構成後のプログラムのアドレスを解決する。
【００５１】
また、上述した実施の形態１ではプログラムの分割を、本装置へのインストール時に行うようにしたが、この分割も再構成と同様、プログラムの実行の都度行うようにしてもよい。この場合、並び替えなどの対象となるブロックも実行ごとに異なる形で切り出されるので、保護はより強固となる。
【００５２】
（実施の形態２）
さて、上述した実施の形態１はプログラムの「見た目」を複雑化することで、解析や改竄などを困難とする例であったが、以下で説明する実施の形態２のように、万一こうした行為の結果不正なプログラムが実行されることがあっても、保護装置１００でその事実を検知できるようにしてもよい。
【００５３】
実施の形態２にかかるプログラム保護装置のハードウエア構成は、図１あるいは図２に示した実施の形態１のそれと同一であるので説明を省略する。図１１は、この発明の実施の形態２にかかるプログラム保護装置の機能的構成を示す説明図である。図中、リロケータブルコード生成部１１００、分割部１１０１、スイッチ書き換え部１１０４およびブロック書き換え部１１０５は、図３に示した同名の各機能部と同一であるので説明を省略する。
【００５４】
実施の形態１において、再構成部３０２／１１０２による複雑化の手法の（２−３）として、ブロックの主機能に影響しない追加機能の挿入を挙げたが、実施の形態２ではたとえばメインメモリ１０２の所定位置に所定の値を書き込んだり、デバイスドライバを経由して、その制御下にあるデバイスから保護装置１００へ所定の信号を返させたりするような追加機能を挿入する。そして実施の形態２の再構成部１１０２は、どのブロックにどのような機能を追加したか（再構成情報）を後述する不正検出部１１０７に通知する。
【００５５】
ＤＭＡ部１１０３は実施の形態１のＤＭＡ部３０３と同様、再構成後のプログラムをメインメモリ１０２にロードしたり、ロードしたプログラムの一部を書き換えたりするほか、後述する要約部１１０６からの指示により、メインメモリ１０２の内容（メモリイメージ）をＤＭＡで読み出して、要約部１１０６に出力する。
【００５６】
要約部１１０６は、再構成部１１０２から入力したプログラム（メインメモリ１０２にロードされる直前のメモリイメージ）、およびＤＭＡ部１１０３から入力したプログラム（メインメモリ１０２上での現在のメモリイメージ）を所定の要約関数などにより要約する機能部である。なお、この要約は個々のブロック単位で行うのが理想的であるが、所定サイズ、たとえばページ単位である４ＫＢごとに分割して要約することも可能である。
【００５７】
不正検出部１１０７は、プログラムの改竄やなりすましといった不正行為を、プログラムの実行中にリアルタイムに検出する機能部である。
【００５８】
すなわち不正検出部１１０７は、再構成部１１０２から通知された再構成情報に対応する所定の作用／反応、たとえばメインメモリ１０２の所定位置に所定値が書き込まれていたり、所定のデバイスから所定の信号が返ってきたりというように、主機能とは無関係な追加機能により実現されるアクションが実際にあるかどうかを監視する。ＣＰＵ１０１により実行されているのが真正のプログラムでない場合、これらの作用／反応がないことをもってその事実を検知できる。
【００５９】
また、不正検出部１１０７はプログラム実行中に、不定期に要約部１１０６に指示して、今現在のプログラムのメモリイメージの要約を作成させる。そしてこれを、あらかじめ保持しているロード時点でのメモリイメージの要約と照合する。プログラムの実行中にメモリイメージは変化しないことを前提とすると、メインメモリ１０２上のプログラムが改竄された場合、両者が一致しないことをもってその事実を検知できる。
【００６０】
実施の形態２にかかるプログラム保護装置における、プログラムのインストール処理の手順は、図９に示した実施の形態１のそれと同一であるので説明を省略する。図１２はこの発明の実施の形態２にかかるプログラム保護装置における、プログラムの実行処理の手順を示すフローチャートである。
【００６１】
画面上のアイコンのダブルクリックなどにより、図９の手順でインストールされたプログラムの起動が指示されると（ステップＳ１２０１：Ｙｅｓ）、当該プログラムのローダ（正確には当該ローダを実行するＣＰＵ１０１）はメインメモリ１０２上に当該プログラムの展開領域を確保するとともに、保護装置１００の再構成部１１０２を起動する。
【００６２】
これを受けた再構成部１１０２は、ＨＤＤ１０４から当該プログラムとそのリロケート情報を読み出して、暗号を復号するとともに（ステップＳ１２０２）、上述の（１）〜（３）をプログラム内の任意のブロックに適用することで、当該プログラムを再構成する（ステップＳ１２０３）。なお、このとき任意のブロックに、たとえばメインメモリ１０２の特定のアドレスに特定の値（マジックナンバー）を書き込ませるような追加機能を挿入する。さらに、再構成部１１０２でアドレス解決された（ステップＳ１２０４）プログラムは、要約部１１０６およびＤＭＡ部１１０３にそれぞれ出力される。
【００６３】
要約部１１０６は、再構成部１１０２から入力したプログラムをブロックごとに要約する（ステップＳ１２０５）。当該処理の結果物、すなわちロード時点における上記プログラムのメモリイメージの要約は、要約部１１０６から不正検出部１１０７に引き渡される。
【００６４】
一方ＤＭＡ部１１０３は、再構成部１１０２から入力したプログラムを、ローダがメインメモリ１０２上に確保した領域へロードする（ステップＳ１２０６）。この後プログラムの終了指示があるまでの間（ステップＳ１２０７：Ｎｏ）、メインメモリ１０２上に展開されたプログラムがＣＰＵ１０１により順次実行されるが、スイッチの切り替え時期が到来、すなわちスイッチ書き換え部１１０４によりランダムに決定された所定時間が経過すると（ステップＳ１２０８：Ｙｅｓ）、スイッチ書き換え部１１０４からの指示を受けたＤＭＡ部１１０３により、メインメモリ１０２上のスイッチ部分（分岐命令の飛び先）が書き換えられる（ステップＳ１２０９）。
【００６５】
そして、書き換え前のスイッチで選択されていたブロックが実行中でなくなったとき、すなわち当該ブロックのカウンタが０になった時点で（ステップＳ１２１０：Ｙｅｓ）、ブロック書き換え部１１０５により当該ブロックのコード列が別のコード列で置き換えられる（ステップＳ１２１１）。この後ステップＳ１２０７に戻る。
【００６６】
また、プログラムの実行中にメモリイメージの照合時期が到来、すなわち不正検出部１１０７によりランダムに決定された所定時間が経過すると（ステップＳ１２０８：Ｎｏ、ステップＳ１２１２：Ｙｅｓ）、不正検出部１１０７からの指示を受けた要約部１１０６、さらに要約部１１０６からの指示を受けたＤＭＡ部１１０３により、メインメモリ１０２の現在の内容がＤＭＡで読み出され、要約部１１０６によりブロックごとに要約される（ステップＳ１２１３）。
【００６７】
そして、この現在のメモリイメージの要約を要約部１１０６から受け取った不正検出部１１０７は、これをステップＳ１２０５であらかじめ受け取っているロード時点のメモリイメージの要約と照合し、両者が一致する場合（ステップＳ１２１４：Ｙｅｓ）はそのままステップＳ１２０７へ戻るが、一致しない場合には（ステップＳ１２１４：Ｎｏ）ＣＰＵ１０１に指示して、実行中のプログラムを強制終了させる（ステップＳ１２１５）。
【００６８】
また、プログラムの実行中にマジックナンバーの検査時期が到来、すなわち不正検出部１１０７によりランダムに決定された所定時間が経過すると（ステップＳ１２１６：Ｙｅｓ）、不正検出部１１０７からの指示を受けたＤＭＡ部１１０３により、メインメモリ１０２から上記マジックナンバーが書き込まれるべきアドレスの内容が読み出される（ステップＳ１２１７）。そして、この値がマジックナンバーと一致する場合（ステップＳ１２１８：Ｙｅｓ）はそのままステップＳ１２０７へ戻るが、一致しない場合には（ステップＳ１２１８：Ｎｏ）ＣＰＵ１０１に指示して、実行中のプログラムを強制終了させる（ステップＳ１２１５）。
【００６９】
なお、操作者からプログラムの終了指示があったときは（ステップＳ１２０７：Ｙｅｓ）、その時点で本フローチャートによる処理を終了する。
【００７０】
以上説明した実施の形態２によれば、ＣＰＵ１０１により実際に実行されているのが、保護装置１００によりメインメモリ１０２にロードされた（ままの）プログラムであるかどうかを、実行の都度変更される追加機能やメモリイメージを手がかりに監視しているので、プログラムのなりすましや改竄といった不正行為を防止できる。
【００７１】
なお、上述した実施の形態２ではこれらの不正を検知した場合に、保護装置１００からＣＰＵ１０１に割り込んでプログラムを強制終了させるようにしたが、このほかメインメモリ１０２上のプログラムコードを破壊する、次回から起動しない、あるいは製造元へ報告するなどの対応を取ることも可能である。
【００７２】
また、上述した実施の形態２ではロード時点でのメモリイメージの要約を保護装置１００内に保持するようにしたが、あるいはメインメモリ１０２に暗号化して置いておき、照合時のみＤＭＡで読み出して復号するようにしてもよい。なお、暗号化／復号化のための鍵は保護装置１００内に保持され、外部には取り出せないので安全である。
【００７３】
図１３は、メモリイメージを保護装置１００でなく、メインメモリ１０２で保持する場合のプログラム保護装置の機能的構成を示す説明図である。リロケータブルコード生成部１３００〜不正検出部１３０７は図３や図１１に示した同名の機能部と同一であるが、要約部１３０６から出力された要約を暗号部１３０８で暗号化のうえ、ＤＭＡ部１３０３によりメインメモリ１０２に転送し、照合時にはＤＭＡ部１３０３に指示して読み出させた上記要約を復号部１３０９で復号のうえ、不正検出部１３０７で現在のメモリイメージの要約と照合する点のみが異なっている。
【００７４】
なお、実施の形態２でメモリイメージを要約するのは、保護装置１００には通常十分な記憶容量が確保できないためであるが、一般にメインメモリ１０２の容量は潤沢であるので、要約をメインメモリ１０２に置く場合には必ずしも要約は必要ではない。すなわち、再構成部１３０２から出力されたプログラムをそのまま（要約せずに）暗号化して、メインメモリ１０２にＤＭＡ転送し、照合時も単に復号するだけで、メインメモリ１０２の現在のメモリイメージと比較するような構成も可能である。
【００７５】
また、図１４はメモリイメージを保護装置１００でなく、メインメモリ１０２で保持する場合の各種データの流れを模式的に示す説明図である。インストール時に複数のブロックに分割され、リロケート情報とともに暗号化のうえＨＤＤ１０４に保存された（図中（１））プログラムは、ローダを実行するＣＰＵ１０１からの起動指示により保護装置１００へ読み出され、再構成部１３０２による復号・再構成およびアドレス解決を経て、ＤＭＡ部１３０３からメインメモリ１０２に転送される（同（２））。
【００７６】
また、再構成部１３０２から出力されたプログラムは、要約部１３０６による要約と暗号部１３０８による暗号化を経て、同じくＤＭＡ部１３０３によりメインメモリ１０２に転送される（同（３））。
【００７７】
そしてプログラムの実行中、メモリイメージの照合時期が到来すると、ＤＭＡ部１３０３によりメインメモリ１０２上の要約（ロード時点のメモリイメージの要約）が保護装置１００側に読み出され、復号部１３０９で復号されて不正検出部１３０７に供給される（同（４））。一方、現在のメモリイメージもＤＭＡ部１３０３によりメインメモリ１０２から読み出され、要約部１３０６による要約を経て不正検出部１３０７に供給される（同（５））。そして、不正検出部１３０７で両者の照合を行うとともに、追加機能による所定の作用／反応の有無も常時監視する。
【００７８】
なお、上述した実施の形態１および２では起動時にプログラムの全体をメインメモリ１０２へロードするように説明したが、一部のみをロードするようにして、プログラムの全体が同時にメインメモリ１０２上に存在しないようにすることもできる。たとえば、あるブロックは他のブロックから参照された時点で初めてメインメモリ１０２に展開するようにし、しばらく実行されなかったブロックはメインメモリ１０２から削除するような追加機能を任意のブロックに埋め込む。これにより、攻撃者がある瞬間にメインメモリ１０２のスナップショットを取っても、意味のあるプログラムコードが一部しかなく、かつそのうちどれが意味のあるコードなのか容易に識別できない。
【００７９】
なお、図３や図１１あるいは図１３に示した各機能部のうち、ＤＭＡ部３０３／１１０３／１３０３など速度が必要な機能部はハードウエア的に実現してもよいが、それ以外の各部は保護装置１００内のプロセッサが、ＲＯＭなどに格納されたプログラムを実行することにより実現される。このプログラムはＲＯＭのほか、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのプロセッサで読み取り可能な記録媒体に記録され、プロセッサによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な伝送媒体であってもよい。
【００８０】
（付記１）メモリにロードされた実行可能なプログラムの保護方法において、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックの順序を入れ替える入れ替え工程と、
前記入れ替え工程で任意のブロックの順序を入れ替えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
を含んだことを特徴とするプログラム保護方法。
【００８１】
（付記２）メモリにロードされた実行可能なプログラムの保護方法において、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックのコード列を同等の機能を有する別のコード列に置き換える置き換え工程と、
前記置き換え工程で任意のブロックのコード列を置き換えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
を含んだことを特徴とするプログラム保護方法。
【００８２】
（付記３）メモリにロードされた実行可能なプログラムの保護方法において、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックを同等の機能を有する複数のブロックおよび当該複数のブロックのいずれか１つを指定するブロックにより多重化する多重化工程と、
前記多重化工程で任意のブロックを多重化されたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
を含んだことを特徴とするプログラム保護方法。
【００８３】
（付記４）さらに、前記ロード工程で前記メモリにロードされたプログラムの一部を当該プログラムの実行中に書き換える書き換え工程を含んだことを特徴とする前記付記１〜付記３のいずれか一つに記載のプログラム保護方法。
【００８４】
（付記５）さらに、前記ロード工程で前記メモリにロードされたプログラムのメモリイメージもしくは当該メモリイメージの要約と、前記プログラムの実行中のメモリイメージもしくは当該メモリイメージの要約とを照合する照合工程を含んだことを特徴とする前記付記１〜付記４のいずれか一つに記載のプログラム保護方法。
【００８５】
（付記６）前記置き換え工程では前記コード列を当該コード列と同等の機能とともに他の機能も有する別のコード列で置き換えるとともに、
さらに、前記プログラムの実行中に前記他の機能により実現される所定の作用もしくは反応の有無を監視する不正検出工程を含んだことを特徴とする前記付記１〜付記５のいずれか一つに記載のプログラム保護方法。
【００８６】
（付記７）メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する保護プログラムにおいて、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックの順序を入れ替える入れ替え工程と、
前記入れ替え工程で任意のブロックの順序を入れ替えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
をプロセッサに実行させることを特徴とするプログラム保護プログラム。
【００８７】
（付記８）メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する保護プログラムにおいて、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックのコード列を同等の機能を有する別のコード列に置き換える置き換え工程と、
前記置き換え工程で任意のブロックのコード列を置き換えられたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
をプロセッサに実行させることを特徴とするプログラム保護プログラム。
【００８８】
（付記９）メモリにロードされた実行可能なプログラムに対する解析・改竄などを防止する保護プログラムにおいて、
前記メモリにロードするプログラムを複数のブロックに分割する分割工程と、
前記分割工程で分割された任意のブロックを同等の機能を有する複数のブロックおよび当該複数のブロックのいずれか１つを指定するブロックにより多重化する多重化工程と、
前記多重化工程で任意のブロックを多重化されたプログラムのアドレスを解決するアドレス解決工程と、
前記アドレス解決工程でアドレスを解決されたプログラムを前記メモリにロードするロード工程と、
をプロセッサに実行させることを特徴とするプログラム保護プログラム。
【００８９】
（付記１０）メモリにロードされた実行可能なプログラムの保護装置において、
前記メモリにロードするプログラムを複数のブロックに分割する分割手段と、
前記分割手段により分割された任意のブロックの順序を入れ替える入れ替え手段と、
前記入れ替え手段により任意のブロックの順序を入れ替えられたプログラムのアドレスを解決するアドレス解決手段と、
前記アドレス解決手段によりアドレスを解決されたプログラムを前記メモリにロードするロード手段と、
を備えたことを特徴とするプログラム保護装置。
【００９０】
（付記１１）メモリにロードされた実行可能なプログラムの保護装置において、
前記メモリにロードするプログラムを複数のブロックに分割する分割手段と、
前記分割手段により分割された任意のブロックのコード列を同等の機能を有する別のコード列に置き換える置き換え手段と、
前記置き換え手段により任意のブロックのコード列を置き換えられたプログラムのアドレスを解決するアドレス解決手段と、
前記アドレス解決手段によりアドレスを解決されたプログラムを前記メモリにロードするロード手段と、
を備えたことを特徴とするプログラム保護装置。
【００９１】
（付記１２）メモリにロードされた実行可能なプログラムの保護装置において、
前記メモリにロードするプログラムを複数のブロックに分割する分割手段と、
前記分割手段により分割された任意のブロックを同等の機能を有する複数のブロックおよび当該複数のブロックのいずれか１つを指定するブロックにより多重化する多重化手段と、
前記多重化手段により任意のブロックを多重化されたプログラムのアドレスを解決するアドレス解決手段と、
前記アドレス解決手段によりアドレスを解決されたプログラムを前記メモリにロードするロード手段と、
を備えたことを特徴とするプログラム保護装置。
【産業上の利用可能性】
【００９２】
以上のように、本発明にかかるプログラム保護方法、プログラム保護プログラムおよびプログラム保護装置は、実行可能な状態で記憶媒体に保持されているプログラムの保護に有用であり、特にＰＣなど内部の仕様が公開されている計算機システムにおいて、メモリ上に展開されたプログラムへの攻撃を防止するのに適している。
【図面の簡単な説明】
【００９３】
【図１】この発明の実施の形態１にかかるプログラム保護装置のハードウエア構成の一例を示す説明図である。
【図２】この発明の実施の形態１にかかるプログラム保護装置のハードウエア構成の他の一例を示す説明図である。
【図３】この発明の実施の形態１にかかるプログラム保護装置の機能的構成を示す説明図である。
【図４】分割部３０１による分割および分岐命令挿入後のプログラムを模式的に示す説明図である。
【図５】再構成部３０２によるブロックの並べ替えの一例を示す説明図である。
【図６】再構成部３０２によるブロックの置き換えの一例を示す説明図である。
【図７】再構成部３０２によるブロックの多重化の一例を示す説明図である。
【図８】再構成部３０２によるブロックの多重化の他の一例を示す説明図である。
【図９】この発明の実施の形態１にかかるプログラム保護装置における、プログラムのインストール処理の手順を示すフローチャートである。
【図１０】この発明の実施の形態１にかかるプログラム保護装置における、プログラムの実行処理の手順を示すフローチャートである。
【図１１】この発明の実施の形態２にかかるプログラム保護装置の機能的構成を示す説明図である。
【図１２】この発明の実施の形態２にかかるプログラム保護装置における、プログラムの実行処理の手順を示すフローチャートである。
【図１３】メモリイメージを保護装置１００でなく、メインメモリ１０２で保持する場合のプログラム保護装置の機能的構成を示す説明図である。
【図１４】メモリイメージを保護装置１００でなく、メインメモリ１０２で保持する場合の各種データの流れを模式的に示す説明図である。
【符号の説明】
【００９４】
１００  保護装置
１０１  ＣＰＵ
１０２  メインメモリ
１０３  Ｉ／Ｏブリッジ
１０４  ＨＤＤ
３００，１１００，１３００  リロケータブルコード生成部
３０１，１１０１，１３０１  分割部
３０２，１１０２，１３０２  再構成部
３０３，１１０３，１３０３  ＤＭＡ部
３０４，１１０４，１３０４  スイッチ書き換え部
３０５，１１０５，１３０５  ブロック書き換え部
１１０６，１３０６  要約部
１１０７，１３０７  不正検出部
１３０８  暗号部
１３０９  復号部
【図１】
2005085188.tif 000003
【図２】
2005085188.tif 000004
【図３】
2005085188.tif 000005
【図４】
2005085188.tif 000006
【図５】
2005085188.tif 000007
【図６】
2005085188.tif 000008
【図７】
2005085188.tif 000009
【図８】
2005085188.tif 000010
【図９】
2005085188.tif 000011
【図１０】
2005085188.tif 000012
【図１１】
2005085188.tif 000013
【図１２】
2005085188.tif 000014
【図１３】
2005085188.tif 000015
【図１４】
2005085188.tif 000016