(57)【要約】【課題】プログラムの不正利用をさらに強力に阻止する技術を提供する。【解決手段】まず、対象プログラムの実行コードのメモリページ属性を調べる（Ｓ２０１）。次に、ディスクリプタテーブルまたはページ属性情報を参照して、対象プログラムの実行コードのメモリ状態が書き込み可能か否かを判断する（Ｓ２０２）。メモリ状態が書き込み不可である場合には、実行コードを通常処理する（Ｓ２０３）。一方、メモリ状態が書き込み可能である場合には、実行コードの不正利用を阻止するための不正利用阻止処理を実行する（Ｓ２０４）。つまり、メモリ状態が書き込み可能な場合には、デバッガによる実行コードの書き換えが行われ得る状態であると判断し、それを阻止する不正利用阻止処理を実行する。【選択図】図２
2006259802.tif 000002
【特許請求の範囲】
【請求項１】
メモリ内におけるプログラムデータの格納領域が書き込み可能状態かどうかを判断する機能、
プログラムデータの格納領域が書き込み可能状態である場合に、当該格納領域に格納されたプログラムデータの不正利用を阻止する不正利用阻止処理を実行する機能、
をコンピュータに実現させる、
ことを特徴とするプログラム。
【請求項２】
請求項１に記載のプログラムにおいて、
コンピュータによって管理されるメモリ状態テーブルに基づいて前記格納領域が書き込み可能状態かどうかを判断する、
ことを特徴とするプログラム。
【請求項３】
請求項１に記載のプログラムにおいて、
前記格納領域へデータの書き込み処理を実行し、その結果、アクセス違反の例外が発生するか否かに基づいて、当該格納領域が書き込み可能状態であるかどうかを判断する、
ことを特徴とするプログラム。
【請求項４】
請求項１に記載のプログラムにおいて、
前記格納領域へデータの書き込み処理を実行し、当該格納領域に格納されたデータを含むデータ列のハッシュ値が前記データの書き込み処理の前後において同じ値に維持されるか否かに基づいて、当該格納領域が書き込み可能状態であるかどうかを判断する、
ことを特徴とするプログラム。
【請求項５】
請求項１から４のいずれか１項に記載のプログラムにおいて、
前記不正利用阻止処理は、メモリに格納されたプログラムデータの正常実行を停止させる処理である、
ことを特徴とするプログラム。
【請求項６】
請求項１から４のいずれか１項に記載のプログラムにおいて、
前記不正利用阻止処理は、メモリに格納されたプログラムデータのうちの重要データをガードする処理である、
ことを特徴とするプログラム。
【請求項７】
請求項１から４のいずれか１項に記載のプログラムにおいて、
前記不正利用阻止処理は、メモリに格納されたプログラムデータの不正利用を伝えるメッセージを送信する処理である、
ことを特徴とするプログラム。
【請求項８】
メモリ内におけるプログラムデータの格納領域へ破壊データの書き込み処理を実行する機能、
プログラムデータの格納領域が書き込み可能状態である場合に前記破壊データが書き込まれた破壊状態のプログラムデータを実行する一方、プログラムデータの格納領域が書き込み不可能状態である場合に前記破壊データが書き込まれていない正常状態のプログラムデータを実行する機能、
をコンピュータに実現させる、
ことを特徴とするプログラム。
【請求項９】
メモリ内におけるプログラムデータの格納領域が書き込み不可能状態かどうかを判断する機能、
プログラムデータの格納領域が書き込み不可能状態である場合に、当該プログラムデータに含まれる書き換え対象データの格納領域を書き込み可能状態に変更してから書き換え対象データを書き換える機能、
前記書き換え対象データが書き換えられたプログラムデータを実行する機能、
をコンピュータに実現させる、
ことを特徴とするプログラム。
【請求項１０】
メモリ内におけるプログラムデータの格納領域へデータの書き込み処理を行う機能、
当該格納領域に格納されたデータを含むデータ列のハッシュ値を計算する機能、
前記プログラムデータに含まれる書き換え対象データを前記計算されたハッシュ値を利用して書き換える機能、
前記書き換えられたプログラムデータを実行する機能、
をコンピュータに実現させる、
ことを特徴とするプログラム。
【請求項１１】
対象プログラムに組み込まれることによって当該対象プログラムのプログラムデータの不正利用を阻止するツールプログラムであって、
メモリ内における対象プログラムのプログラムデータの格納領域が書き込み可能状態かどうかを判断する機能、
対象プログラムのプログラムデータの格納領域が書き込み可能状態である場合に、当該格納領域に格納された対象プログラムのプログラムデータの不正利用を阻止する不正利用阻止処理を実行する機能、
をコンピュータに実現させる、
ことを特徴とするツールプログラム。
【請求項１２】
コンピュータに不正利用阻止機能を実現させる不正阻止プログラムへ対象プログラムを変換する変換プログラムであって、
前記不正利用阻止機能として、前記不正阻止プログラムのプログラムデータの格納領域が書き込み可能状態である場合に、当該格納領域に格納されたプログラムデータの不正利用を阻止する不正利用阻止処理を実行する機能、を実現させる不正阻止プログラムを得るために、
前記対象プログラムを前記不正利用阻止プログラムへ変換する機能をコンピュータに実現させる、
ことを特徴とする変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの不正利用を阻止する技術に関する。
【背景技術】
【０００２】
コンピュータを動作させるプログラム内には、しばしば、不正な目的での利用を阻止すべきデータが含まれる。例えば、課金を伴う画像データなどがプログラム内に含まれる場合、所定の料金を支払わないユーザによってプログラム内からその画像データが取り出されることは好ましくない。また、料金の支払いの有無を問わずユーザには知られたくない機密情報がプログラム内に含まれることも考えられる。
【０００３】
一方において、プログラムの開発を支援するソフト（デバッガ）が知られている。例えば、プログラムの開発者は、デバッガを用いてデバッグの対象プログラムを段階的に実行させ、必要に応じて、開発中のプログラムの状態を把握してプログラム内の問題を解決して、所望の動作を行うためのプログラムを開発する。
【０００４】
こうした事情において懸念されるのは、不正利用を企むユーザが、例えばデバッガを用いてプログラム内のデータを利用するケースである。このため、デバッガなどを介してプログラム内のデータが不正に利用されることを防ぐ技術が望まれていた。
【０００５】
特許文献１には、プロセッサが有する記憶位置（デバックレジスタを含む）を参照してデバッグモードか否かを判断し、デバッグモードであればプログラムの実行を阻止する技術が示されている。
【０００６】
【特許文献１】特開平１１−１７５３３６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
特許文献１に記載の技術では、プロセッサが有する記憶位置が参照される。ところが、プロセッサが記憶位置（デバックレジスタなど）を有するか否かは、プロセッサのアーキテクチャに依存しており、デバックレジスタを備えていないプロセッサでは、特許文献１に記載の技術が利用できない。
【０００８】
また、特許文献１に記載の技術では、プロセッサが有する記憶位置の内容に影響を与えないデバッグ方法には対応できない。
【０００９】
そこで本発明は、プログラムの不正利用をさらに強力に阻止する技術を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記目的を達成するために、本発明の好適な態様であるプログラムは、メモリ内におけるプログラムデータの格納領域が書き込み可能状態かどうかを判断する機能、プログラムデータの格納領域が書き込み可能状態である場合に、当該格納領域に格納されたプログラムデータの不正利用を阻止する不正利用阻止処理を実行する機能、をコンピュータに実現させることを特徴とする。
【００１１】
上記構成において、メモリ内におけるプログラムデータとは、プログラムがコンピュータに読み込まれてメモリ上に展開された状態であり、プログラムデータには、例えば、実行コードなどが含まれる。また、プログラムデータは、プログラムの実行の際に参照される参照データであってもよい。メモリの代表例は、コンピュータ内におけるＣＰＵの主記憶装置である。上記構成では、プログラムデータの格納領域が書き込み可能状態である場合に、例えばデバッガが利用されている可能性があるため、不正利用阻止処理が実行される。このため、デバッガなどによるプログラムデータの改ざんや不正閲覧などを阻止することができる。
【００１２】
望ましくは、コンピュータによって管理されるメモリ状態テーブルに基づいて前記格納領域が書き込み可能状態かどうかを判断する、ことを特徴とする。メモリ状態テーブルとしては、ＣＰＵが管理するディスクリプタテーブルや、ＯＳが管理するページ属性情報などを挙げることができる。
【００１３】
望ましくは、前記格納領域へデータの書き込み処理を実行し、その結果、アクセス違反の例外が発生するか否かに基づいて、当該格納領域が書き込み可能状態であるかどうかを判断する、ことを特徴とする。望ましくは、前記格納領域へデータの書き込み処理を実行し、当該格納領域に格納されたデータを含むデータ列のハッシュ値が前記データの書き込み処理の前後において同じ値に維持されるか否かに基づいて、当該格納領域が書き込み可能状態であるかどうかを判断する、ことを特徴とする。
【００１４】
望ましくは、前記不正利用阻止処理は、メモリに格納されたプログラムデータの正常実行を停止させる処理である、ことを特徴とする。望ましくは、前記不正利用阻止処理は、メモリに格納されたプログラムデータのうちの重要データをガードする処理である、ことを特徴とする。重要データをガードする処理としては、例えば、重要データが閲覧できないようにする処理や、重要データを破壊してしまう処理などが挙げられる。望ましくは、前記不正利用阻止処理は、メモリに格納されたプログラムデータの不正利用を伝えるメッセージを送信する処理である、ことを特徴とする。
【００１５】
また、上記目的を達成するために、本発明の好適な態様であるプログラムは、メモリ内におけるプログラムデータの格納領域へ破壊データの書き込み処理を実行する機能、プログラムデータの格納領域が書き込み可能状態である場合に前記破壊データが書き込まれた破壊状態のプログラムデータを実行する一方、プログラムデータの格納領域が書き込み不可能状態である場合に前記破壊データが書き込まれていない正常状態のプログラムデータを実行する機能、をコンピュータに実現させる、ことを特徴とする。
【００１６】
また、上記目的を達成するために、本発明の好適な態様であるプログラムは、メモリ内におけるプログラムデータの格納領域が書き込み不可能状態かどうかを判断する機能、プログラムデータの格納領域が書き込み不可能状態である場合に、当該プログラムデータに含まれる書き換え対象データの格納領域を書き込み可能状態に変更してから書き換え対象データを書き換える機能、前記書き換え対象データが書き換えられたプログラムデータを実行する機能、をコンピュータに実現させる、ことを特徴とする。
【００１７】
また、上記目的を達成するために、本発明の好適な態様であるプログラムは、メモリ内におけるプログラムデータの格納領域へデータの書き込み処理を行う機能、当該格納領域に格納されたデータを含むデータ列のハッシュ値を計算する機能、前記プログラムデータに含まれる書き換え対象データを前記計算されたハッシュ値を利用して書き換える機能、前記書き換えられたプログラムデータを実行する機能、をコンピュータに実現させる、ことを特徴とする。
【００１８】
また、上記目的を達成するために、本発明の好適な態様であるプログラムは、対象プログラムに組み込まれることによって当該対象プログラムのプログラムデータの不正利用を阻止するツールプログラムであって、メモリ内における対象プログラムのプログラムデータの格納領域が書き込み可能状態かどうかを判断する機能、対象プログラムのプログラムデータの格納領域が書き込み可能状態である場合に、当該格納領域に格納された対象プログラムのプログラムデータの不正利用を阻止する不正利用阻止処理を実行する機能、をコンピュータに実現させることを特徴とする。
【００１９】
また、上記目的を達成するために、本発明の好適な態様である変換プログラムは、コンピュータに不正利用阻止機能を実現させる不正阻止プログラムへ対象プログラムを変換する変換プログラムであって、前記不正利用阻止機能として、前記不正阻止プログラムのプログラムデータの格納領域が書き込み可能状態である場合に、当該格納領域に格納されたプログラムデータの不正利用を阻止する不正利用阻止処理を実行する機能、を実現させる不正阻止プログラムを得るために、前記対象プログラムを前記不正利用阻止プログラムへ変換する機能をコンピュータに実現させる、ことを特徴とする。
【発明の効果】
【００２０】
本発明により、プログラムの不正利用を強力に阻止することが可能になる。例えば、プロセッサのアーキテクチャに依存せずに、デバッガなどによるプログラムデータの改ざんや不正閲覧などを阻止することができる。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の好適な実施形態を図面に基づいて説明する。
【００２２】
図１は、本発明の好適な実施形態を説明するための図であり、図１には、本発明に係るプログラムによって動作するコンピュータのＣＰＵ周辺の模式図が示されている。
【００２３】
ＣＰＵ（Central Processing Unit）１０は、プログラムに記載された命令を解釈してその命令に従って動作することによりデータの演算や加工などを行う。また、プログラムに記載された命令に従ってコンピュータ内の各部を制御する。ＣＰＵ１０によって利用されるプログラムは、メモリ２０に格納されている。
【００２４】
メモリ２０は、例えば、ＤＲＡＭ（Dynamic Random Access Memory）などによって形成され、ＣＰＵ１０の主記憶装置として機能する。つまり、図示しないハードディスクなどに収められたプログラムは、一旦、メモリ２０に展開（格納）され、ＣＰＵ１０はメモリ２０に展開されたプログラムを利用する。なお、メモリ２０とＣＰＵ１０との間にキャッシュメモリなどを配置する構成でもよい。
【００２５】
メモリ２０内には、コンピュータを適切に動作させるための各種プログラムが格納される。その一つがオペレーティングシステム（ＯＳ）のプログラムであり、メモリ２０内のＯＳ格納領域３０に格納される。メモリ２０内には、ＯＳの他、様々なアプリケーションプログラムも格納される。そのうちの一つが、プログラム（アプリケーションプログラム）格納領域４０に格納される。
【００２６】
ＯＳは、コンピュータ内のハードウェア資源（ＣＰＵ１０、メモリ２０の他、図示しないキーボード、マウス、ディスプレイなど）を制御するとともに、必要に応じてＡＰＩ（Application Program Interface）を提供することにより、ハードウェア資源とアプリケーションプログラムとの間を仲介する役割を担っている。また、コンピュータ内において複数のアプリケーションプログラムが併用される場合、ＯＳは、各アプリケーションプログラムに対してハードウェア資源を効率よく振り分けるなどの機能を備えている。この意味において、アプリケーションプログラムはＯＳの管理下で実行されているといえる。
【００２７】
メモリ２０内には、複数のアプリケーションプログラムの各々に対してプログラム格納領域４０が確保される。図１には、そのうちの一つのプログラム格納領域４０のみが示されており、さらに、プログラム格納領域４０内の格納状態が示されている。プログラムは、コンピュータに一連の処理を実行させるためのデータ列によって構成される。図１において、メモリ２０内に展開されるプログラムのデータ列（プログラムデータ）は、機能に応じて区分けされている。つまり、データセクション４２、コードセクション４４、セクションテーブル４６およびヘッダ４８に区分けされている。
【００２８】
データセクション４２には、例えば、本プログラムの実行に当たって参照されるデータなどが含まれている。コードセクション４４には、本プログラムの実行手順を示した実行コードが含まれている。セクションテーブル４６には、本プログラムのデータ列をメモリ２０内のどのアドレスに展開するのかを示す情報が含まれている。プログラムは、例えば、光ディスクメディアなどを介してコンピュータ内のハードディスクに取り込まれる。コンピュータは、ハードディスクに取り込まれたプログラム（データ列）を利用する際、プログラムのデータ列（プログラムデータ）をメモリ２０に展開（格納）する。セクションテーブル４６には、データセクション４２、コードセクション４４、セクションテーブル４６自身、および、ヘッダ４８をメモリ２０内のどのアドレスに格納すべきかを示す情報が含まれており、コンピュータ（ＯＳ）は、その情報に基づいてメモリ２０内へ各データを格納する。
【００２９】
本実施形態では、メモリ２０上に展開されたプログラムのデータ列（プログラムデータ）の不正利用を阻止することができる。プログラムデータの不正利用は、例えば、デバッガを介して行われる。つまり、不正利用を企むユーザがデバッガを利用してメモリ２０上に展開されたプログラムデータを書き換えて課金設定などを操作したり、適切な課金操作を回避する様にプログラムの動作を変更改竄することや、プログラムデータ内の機密情報を取得してしまうことなどが考えられる。
【００３０】
メモリ２０上に展開されたプログラムの実行コード（コードセクション４４内）は、メモリ２０上において書き込み可能か否かに設定されている。実行コードが書き込み可能か否かについては、そのプログラムの実行コードファイル内（例えば、セクションテーブル４６内）に設定されており、ＯＳは、プログラムの実行コードをメモリ２０上に展開する際に実行コードファイルに従って書き込み可能か否かの設定を行う。
【００３１】
書き込み不可に設定されたメモリ２０の実行コードの領域（コードセクション４４）へ書き込み指令を行うとＣＰＵ１０がアクセス違反の例外を起こす。このため、デバッガは、メモリ２０上のデバッグ対象プログラムの実行コードを書き換える場合に、ＯＳが提供する機能（ＡＰＩ）を利用して対象となる実行コードの領域を書き込み可能に設定してからデバッグ処理を行う。
【００３２】
本実施形態では、メモリ２０内におけるプログラムデータの格納領域が書き込み可能状態であるか否かに着目してプログラムデータの不正利用を阻止する。以下、その手順について説明する。なお、以下の説明において、図１に示した部分には図１の符号を用いる。
【００３３】
図２は、プログラムデータの不正利用を阻止するための手順１を示すフローチャートである。この手順は、不正利用を阻止すべき対象となるプログラム（以下、対象プログラム）の実行開始時や実行中に実施される。各ステップごとに処理内容を説明する。
【００３４】
（Ｓ２０１）本手順が開始されると、まず、対象プログラムの実行コードのメモリページ属性を調べる。つまり、メモリ２０上に展開された対象プログラムの実行コード（コードセクション４４内に格納）について、その実行コードが収められたメモリ２０の領域（ページ）のメモリ状態を調べる。ＣＰＵ１０が管理するディスクリプタテーブル１２には、メモリ２０内の各領域が書き込み可能状態であるか否かを示すデータが含まれている。また、ＯＳが管理するページ属性情報３２にも、メモリ２０内の各領域（ページ）が書き込み可能状態であるか否かを示すデータが含まれている。
【００３５】
（Ｓ２０２）次に、ディスクリプタテーブル１２またはページ属性情報３２を参照して、対象プログラムの実行コードのメモリ状態が書き込み可能か否かを判断する。
【００３６】
（Ｓ２０３）Ｓ２０２で判断した結果、メモリ状態が書き込み不可である場合には、実行コードを通常実行する。つまり、メモリ状態が書き込み不可の場合には、デバッガなどによって実行コードが書き換えられる状態ではないと判断し、対象プログラムを通常どおり実行させ、本手順が終了する。
【００３７】
（Ｓ２０４）一方、Ｓ２０２で判断した結果、メモリ状態が書き込み可能である場合には、実行コードの不正利用を阻止するための不正利用阻止処理を実行する。つまり、メモリ状態が書き込み可能な場合には、デバッガによる実行コードの書き換えが行われ得る状態であると判断し、それを阻止する不正利用阻止処理を実行し、本手順を終了する。
【００３８】
不正利用阻止処理としては、例えば、対象プログラムの実行を停止させる処理が挙げられる。つまり、対象プログラムを停止させて不正ユーザが利用できないようにしてしまう。このため、デバッグもできなくなる。実行を停止させるために対象プログラムを破壊してもよい。また、不正利用阻止処理として、対象プログラムの重要データにガードをかけてもよい。例えば、画像データや機密情報などの重要データを読み出せないようにする。あるいは、重要データを破壊して読み出せないようにしてもよい。さらに、不正利用阻止処理として、対象プログラムの提供者へ不正利用を伝えるメッセージを送信してもよい。
【００３９】
以上のようにして、対象プログラムの不正利用が阻止される。なお、上記手順（開始から終了まで）は、対象プログラムの実行コードが段階的に実行されていく過程において各段階ごとに実行されてもよい。また、対象プログラムの実行開始直後に、全ての実行コードのメモリ状態を一度の手順で確認してもよい。この際、例えば、重要なコードのみのメモリ状態を確認してもよい。
【００４０】
なお、図２に示した手順は、この手順に従ってコンピュータを動作させるプログラム（不正阻止プログラム）によって実現される。例えば、対象プログラム自身が、予め不正阻止プログラムを含んだプログラム構成が考えられる。あるいは、対象プログラムとは別に不正阻止プログラムツールが作成され、この不正阻止プログラムツールが、対象プログラムに図２の手順を組み込む構成でもよい。
【００４１】
図３は、プログラムデータの不正利用を阻止するための手順２を示すフローチャートである。この手順は、対象プログラムの実行開始時や実行中に実施される。各ステップごとに処理内容を説明する。
【００４２】
（Ｓ３０１）本手順が開始されると、まず、対象プログラムの実行コードのアドレスを取得する。つまり、メモリ２０上に展開された対象プログラムの実行コード（コードセクション４４内に格納）について、その実行コードが収められたメモリ２０のアドレスを取得する。例えば、セクションテーブル４６を参照することによって、所望の実行コードのアドレスを知ることができる。このアドレスを参照するように構成しておいてもよいが、前もってプログラム作成者が、そのアドレスをデータとしてコード内に埋め込んでおき、それを参照する様にしてもよい。あるいは、ＣＰＵ１０のプログラムカウンタ（図示せず）を参照することによって、現在実行している実行コードのアドレスを知ることができるため、現在実行している実行コードのアドレスに基づいて所望の実行コードのアドレスを求めてもよい。
【００４３】
（Ｓ３０２）次に、取得したアドレスのデータを退避しておく。例えば、取得したアドレスの実行コードをメモリ２０などに一時的に格納しておく。
【００４４】
（Ｓ３０３）さらに、取得したアドレスへデータを書き込む。書き込むデータは、そのアドレスに格納されていた実行コードそのものでもよく、あるいは、格納されていた実行コードとは異なるデータ（例えば、対象プログラムを破壊するデータ）でもよい。
【００４５】
（Ｓ３０４）そして、書き込みを行った結果、アクセス違反の例外が発生したか否かを確認する。取得したアドレスが書き込み不可の状態であれば、書き込みを行うことによりＣＰＵ１０がアクセス違反の例外を起こす。取得したアドレスが書き込み可能な状態であれば、アクセス違反の例外は発生せずに、Ｓ３０３で書き込んだデータがそのアドレスに格納される。
【００４６】
（Ｓ３０５）Ｓ３０４でアクセス違反の例外が発生しない場合、Ｓ３０３で書き込んだデータを元のデータに書き戻す。つまり、Ｓ３０２で退避しておいた元の実行コードに戻しておく。なお、このＳ３０５の処理を省略してＳ３０４からＳ３０６へ進んでもよい。
【００４７】
（Ｓ３０６）アクセス違反の例外が発生しない場合、つまり、メモリ状態が書き込み可能である場合には、デバッガによる実行コードの書き換えが行われ得る状態であると判断して、それを阻止する不正利用阻止処理を実行し、本手順を終了する。不正利用阻止処理としては、図２のＳ２０４で説明した、対象プログラムの実行を停止させる処理、対象プログラムを破壊する処理、対象プログラムの重要データにガードをかける処理、対象プログラムの提供者へ不正利用を伝えるメッセージを送信する処理などが挙げられる。
【００４８】
（Ｓ３０７）Ｓ３０４でアクセス違反の例外が発生した場合、例外から元の処理へ復帰させる。アクセス違反の例外が発生した場合、つまり、メモリ状態が書き込み不可の状態である場合には、デバッガなどによって実行コードが書き換えられる状態ではないと判断し、対象プログラムを通常どおり実行する。ただし、アクセス違反の例外が発生すると、ＯＳによる処理（例外状態）に移行してしまうため、対象プログラムを通常どおり実行するには例外状態から元の対象プログラムの処理に復帰させる必要がある。このため、Ｓ３０７において例外状態から復帰して、対象プログラムの実行を継続させ、本手順を終了する。
【００４９】
以上のようにして、対象プログラムの不正利用が阻止される。なお、上記手順（開始から終了まで）は、対象プログラムの実行コードが段階的に実行されていく過程において各段階ごとに実行されてもよい。また、対象プログラムの実行開始直後に、全ての実行コードを対象として一度の手順で確認してもよい。この際、例えば、重要なコードのみを確認の対象としてもよい。
【００５０】
さらに、上記手順は、ある実行コードが実行されている時に、その実行コードよりも後に実行される実行コードを対象としてもよい。つまり、Ｓ３０１において後に実行される実行コードのアドレスを取得する。そして、Ｓ３０２の処理を省略してＳ３０３において破壊データを書き込む。この場合、Ｓ３０５およびＳ３０６の処理に換えて、破壊データが書き込まれた状態で対象プログラムを実行させるようにしてもよい。
【００５１】
なお、図３に示した手順は、この手順に従ってコンピュータを動作させるプログラム（不正阻止プログラム）によって実現される。例えば、対象プログラム自身が、予め不正阻止プログラムを含んだプログラム構成が考えられる。あるいは、対象プログラムとは別に不正阻止プログラムツールが作成され、この不正阻止プログラムツールが、対象プログラムに図３の手順を組み込む構成でもよい。
【００５２】
図４は、プログラムデータの不正利用を阻止するための手順３を示すフローチャートである。この手順は、対象プログラム内に書き換え対象コード（書き換え対象データ）が含まれる場合に利用されることが好適である。つまり、対象プログラム内に、例えば、暗号化されたコードが存在し、暗号化されたコードを復号して復号化されたコードに書き換えてから実行するプログラムなどを対象プログラムとする。なお、書き換え対象データは暗号化されたデータに限定されない。例えば、圧縮されたコードが存在し、圧縮されたコードを解凍して解凍されたコードに書き換えてから実行するプログラムを対象プログラムとしてもよい。また、対象プログラムの実行時に、書き換え対象データ部分に実行コードを書き込んでから動作する形態のものでもよい。以下、各ステップごとに処理内容を説明する。
【００５３】
（Ｓ４０１）本手順が開始されると、まず、対象プログラムの実行コードのアドレスを取得する。つまり、メモリ２０上に展開された対象プログラムの実行コード（コードセクション４４内に格納）について、その実行コードが収められたメモリ２０のアドレスを取得する。例えば、セクションテーブル４６を参照することによって、所望の実行コードのアドレスを知ることができる。このアドレスを参照するように構成しておいてもよいが、前もってプログラム作成者が、そのアドレスをデータとしてコード内に埋め込んでおき、それを参照する様にしてもよい。あるいは、ＣＰＵ１０のプログラムカウンタ（図示せず）を参照することによって、現在実行している実行コードのアドレスを知ることができるため、現在実行している実行コードのアドレスに基づいて所望の実行コードのアドレスを求めてもよい。なお、ここで取得される実行コードのアドレスは、書き換え対象データのアドレスでもよいし、それ以外の実行コードのアドレスでもよい。
【００５４】
（Ｓ４０２）次に、取得したアドレスへデータを書き込む。書き込むデータは、そのアドレスに格納されていた実行コードそのものでもよく、あるいは、格納されていた実行コードとは異なるデータ（例えば、対象プログラムを破壊するデータ）でもよい。
【００５５】
（Ｓ４０３）書き込みを行った結果、アクセス違反の例外が発生したか否かを確認する。取得したアドレスが書き込み不可の状態であれば、書き込みを行うことによりＣＰＵ１０がアクセス違反の例外を起こす。取得したアドレスが書き込み可能な状態であれば、アクセス違反の例外は発生せずに、Ｓ４０２で書き込んだデータがそのアドレスに格納される。
【００５６】
（Ｓ４０４）Ｓ４０３でアクセス違反の例外が発生した場合、例外から元の処理へ復帰させる。アクセス違反の例外が発生した場合、つまり、メモリ状態が書き込み不可の状態である場合には、デバッガなどによって実行コードが書き換えられる状態ではないと判断される。ただし、アクセス違反の例外が発生すると、ＯＳによる処理（例外状態）に移行してしまうため、対象プログラムの実行を継続するには例外状態から元の対象プログラムの処理に復帰させる必要がある。このため、Ｓ４０４において例外状態から復帰させる。
【００５７】
（Ｓ４０５）次に、書き換え対象コードのアドレスを取得する。つまり、メモリ２０上に展開された対象プログラムの実行コード（コードセクション４４内に格納）のうちの書き換え対象コードが収められたメモリ２０のアドレスを取得する。
【００５８】
（Ｓ４０６）さらに、書き換え対象コードのメモリ属性を書き込み可能に変更する。つまり、デバッガなどによって実行コードが書き換えられる状態ではない場合、書き換え対象コードのアドレスについても、メモリ状態が書き込み不可となっているため、後の書き換え処理のためにメモリ属性を書き込み可能に変更しておく。
【００５９】
（Ｓ４０７）そして、書き換え対象コードを書き換える。例えば、暗号化された書き換え対象コードを復号して復号化されたコードに書き換える。あるいは、圧縮された書き換え対象コードを解凍して解凍されたコードに書き換える。なお、Ｓ４０７において、書き換え処理を行った後に書き換え対象コードのメモリ属性を書き込み不可に戻してもよい。
【００６０】
（Ｓ４０８）対象プログラムを実行させて、本手順を終了する。Ｓ４０３でアクセス違反の例外が発生した場合、Ｓ４０４からＳ４０７の処理によって書き換え対象コードが正常に書き換えられるため、Ｓ４０８において対象プログラムが正常に実行される。一方、Ｓ４０３でアクセス違反の例外が発生しない場合、書き換え対象コードが書き換えられないまま実行コードが実行される。このため、対象プログラムが正常に実行されない。以上のようにして、対象プログラムの不正利用が阻止される。
【００６１】
なお、上記手順は、次のように変更されてもよい。まず、上記Ｓ４０５からＳ４０７の各処理を順次実行して書き換え対象コードを書き換えてしまう。この際、書き換え処理を行った後に書き換え対象コードのメモリ属性を書き込み不可に戻しておく。そして、上記Ｓ４０１からＳ４０３の処理を順次実行して、アクセス違反の例外が発生したか否かを確認する。こうして、アクセス違反の例外が発生したか否かを確認した後、例えば、図３のＳ３０４より後の処理を実行するようにしてもよい。
【００６２】
図４に示した手順は、この手順に従ってコンピュータを動作させるプログラム（不正阻止プログラム）によって実現される。例えば、書き換え対象コードを含んだ対象プログラム自身が、予め不正阻止プログラムを含んだプログラム構成が好適である。しかし、対象プログラムとは別に不正阻止プログラムツールが作成され、この不正阻止プログラムツールが、対象プログラムに図４の手順を組み込む構成でもよい。
【００６３】
図３および図４に示した手順では、取得したアドレスへデータを書き込んだ結果、アクセス違反の例外が発生したか否かに基づいて、デバッガなどによって実行コードが書き換えられる状態か否かを確認している。このアクセス違反の例外が発生したか否かの確認（Ｓ３０４やＳ４０３）に換えて、ハッシュ値を利用して判断を行う手順も考えられる。つまり、Ｓ３０３やＳ４０２において、取得したアドレスへデータを書き込んだ結果、書き込みの対象となったデータを含むデータ列のハッシュ値が、データの書き込み処理の前後において同じ値に維持されるか否かに基づいて、実行コードが書き換えられる状態か否かを確認してもよい。デバッガなどによって実行コードが書き換えられる状態の場合には、データの書き込み処理によってデータが書き換えられることになり、その結果、書き込み処理の前後においてハッシュ値が異なる値となる。このため、書き込み処理の前後においてハッシュ値が異なる場合には、不正利用阻止処理（Ｓ３０６参照）を実行する。
【００６４】
また、次のような図４の変形例も考えられる。Ｓ４０２において、格納されていた実行コードとは異なるデータを書き込む処理を行い、その後、書き込み処理の対象となったアドレスのデータを含むデータ列のハッシュ値を計算する。そして、Ｓ４０３やＳ４０４を省略して、Ｓ４０５からＳ４０７の処理を実行する。この際、Ｓ４０７の書き換え対象コードの書き換え処理は、計算されたハッシュ値を利用して行われる。例えば、計算されたハッシュ値を利用して暗号化された書き換え対象コードを復号する。これにより、もしＳ４０２において書き込み処理を行った結果、書き込み処理の対象となったアドレスのデータが書き換えられた場合（つまり、デバッガなどによって実行コードが書き換えられる状態の場合）、ハッシュ値が誤って計算されて、Ｓ４０７における書き換え対象コードの書き換え処理が失敗し、対象プログラムの不正利用が阻止される。
【００６５】
以上、本発明の好適な実施形態を説明したが、上述した実施形態は、あらゆる点で単なる例示にすぎず、本発明の範囲を限定するものではない。例えば、本実施形態として説明した図２から図４において、各図に記載されたステップを必要に応じて他の図の手順に取り入れることも可能であろう。あるいは、図２から図４に示した各ステップを必要に応じて省略することや、周知の技術を利用したステップに置き換えることも可能であろう。
【図面の簡単な説明】
【００６６】
【図１】本発明に係るプログラムによって動作するコンピュータのＣＰＵ周辺の模式図である。
【図２】プログラムデータの不正利用を阻止するための手順１を示すフローチャートである。
【図３】プログラムデータの不正利用を阻止するための手順２を示すフローチャートである。
【図４】プログラムデータの不正利用を阻止するための手順３を示すフローチャートである。
【符号の説明】
【００６７】
１０  ＣＰＵ、１２  ディスクリプタテーブル、２０  メモリ、４０  プログラム格納領域。
【図１】
2006259802.tif 000003
【図２】
2006259802.tif 000004
【図３】
2006259802.tif 000005
【図４】
2006259802.tif 000006