(57)【特許請求の範囲】
【請求項１】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理をコンピュータに実行させるためのサブプログラムにおいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
コンピュータに実行させるためのサブプログラムであって、
前記判定処理では、前記取得したアクセス先アドレスと正規のメインプログラムにおける本来のアクセス先アドレスとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定すると共に、
前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて、前記取得したアクセス先アドレスを補正し、補正後のアクセス先アドレスに基づいて該呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項２】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理をコンピュータに実行させるためのサブプログラムにおいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
コンピュータに実行させるためのサブプログラムであって、
前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定すると共に、
前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて前記判定対象データを補正し、補正後の判定対象データと前記格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項３】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理を行うサブプログラムをロードして、当該サブプログラムを実行する情報処理装置において、
前記サブプログラムに基づいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したメモリ情報に基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
実行する情報処理装置であって、
前記判定処理では、前記取得したアクセス先アドレスと正規のメインプログラムにおける本来のアクセス先アドレスとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定すると共に、
前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて、前記取得したアクセス先アドレスを補正し、補正後のアクセス先アドレスに基づいて該呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とする情報処理装置。
【請求項４】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理を行うサブプログラムをロードして、当該サブプログラムを実行する情報処理装置において、
前記サブプログラムに基づいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したメモリ情報に基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
実行する情報処理装置であって、
前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定すると共に、
前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて前記判定対象データを補正し、補正後の判定対象データと前記格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムに関する。
【背景技術】
【０００２】
従来から、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すプラグインなどのサブプログラムが知られている。
【０００３】
このようなサブプログラムからメインプログラムへ戻される処理結果の中には、利用制限に関連のあるアクセス権情報や、非公開の情報、復号鍵など不正に利用されると問題が生じるようなデータが含まれている場合がある。
【０００４】
このような機密性の高いデータをサブプログラムからメインプログラムへ渡す際、メインプログラムを偽装するという攻撃が知られている。例えば、メインプログラムそのものを改ざんしたり、あるいは、メインプログラムとサブプログラムの間に入り込んで、その間でやりとりされるデータを盗聴したり改ざんしたりすると言う攻撃が可能となる。
【０００５】
特許文献１には、ＡＰＩ（アプリケーションプログラムインタフェース）の呼び出しをＡＰＩフックエンジンがフックし、ＡＰＩフックエンジンが呼び出されるＡＰＩの対象プロセスや処理種類に応じて、ＡＰＩの処理を続行もしくは中断をするかどうかを判断することで、ＡＰＩに不正アクセスされることを防止する技術が開示されている。
【０００６】
特許文献１に記載のＡＰＩフックエンジンは、呼び出されるＡＰＩの種類に応じて、呼び出し対象のＡＰＩの処理を続行もしくは中断するか否かを判断している。しかし、このＡＰＩフックエンジンは、呼び出されるＡＰＩの種類が許可対象のＡＰＩであれば、ＡＰＩの処理は続行されてしまう。そのため、例えば、偽装したメインプログラムが、許可対象のＡＰＩの呼び出しを行った場合、ＡＰＩフックエンジンはその呼び出しを許可してしまう。よって、特許文献１に記載の技術では、例えば、許可対象のＡＰＩから偽装したメインプログラムへ機密情報などが流出するおそれがある。
【０００７】
【特許文献１】特開２００５−１６６０５１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明は、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムにおいて、処理結果に対するセキュリティの強化を図る。
【課題を解決するための手段】
【０００９】
本発明に係るサブプログラムは、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理をコンピュータに実行させるためのサブプログラムにおいて、呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、判定の結果、前記呼出元プログラムが正規のメインプログラムではないと判断した場合、前記サブ処理の実行を中断する中断処理とを、コンピュータに実行させることを特徴とするサブプログラムであって、前記判定処理では、前記取得したアクセス先アドレスと正規のメインプログラムにおける本来のアクセス先アドレスとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定すると共に、前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて、前記取得したアクセス先アドレスを補正し、補正後のアクセス先アドレスに基づいて該呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とする。
【００１０】
参考例において、前記判定処理では、前記取得したアクセス先アドレスに基づいて前記呼出元プログラムが使用するメモリ領域に関するメモリ情報を取得し、該メモリ情報に基づいて前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【００１１】
また、別の参考例において、前記判定処理では、前記取得したアクセス先アドレスに基づいて前記呼出元プログラムの属性情報を取得して、該属性情報と正規のメインプログラムの属性情報とを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【００１２】
さらに、本発明において、正規のメインプログラムの本来のアクセス先アドレス群が登録されたアドレスリストを参照することで、前記呼出元プログラムが正規のメインプログラムか否かを判定してもよい。
【００１４】
また、本発明に係るサブプログラムの１つの態様は、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理をコンピュータに実行させるためのサブプログラムにおいて、呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、判定の結果、前記呼出元プログラムが正規のメインプログラムではないと判断した場合、前記サブ処理の実行を中断する中断処理とを、コンピュータに実行させることを特徴とするサブプログラムであって、前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定すると共に、前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて前記判定対象データを補正し、補正後の判定対象データと前記格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【００１５】
さらに、別の参考例において、前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、そのデータのハッシュ値を計算し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータから求められるハッシュ値とを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とする。
【００１７】
さらに、別の参考例において、前記アクセス先アドレスは、前記サブプログラムによる一連の処理が終了後に前記サブプログラムがアクセスすべき戻り先アドレスである。
【００１８】
また、別の参考例において、前記アクセス先アドレスは、前記サブプログラムが前記呼出元プログラムから呼び出される際に前記呼出元プログラムから渡される引数に示されるアドレスである。このアドレスは、前記呼出元プログラムからコールバック先として指定されたコールバックアドレスでもよい。
【発明の効果】
【００１９】
本発明によれば、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムにおいて、処理結果に対するセキュリティの強化を図ることができる。
【発明を実施するための最良の形態】
【００２０】
本発明を実施するための最良の形態（以下、実施形態とする）について、以下図面を用いて説明する。
【００２１】
図１は、本実施形態に係る情報処理装置の機能ブロックを示す。図１において、ＣＰＵ１０は、情報処理装置全体の制御を行う中央処理装置である。ハードディスク２０は、情報処理装置上で動作するプログラムを保存する補助記憶装置である。メインメモリ３０は、情報処理装置上でプログラムを実行する場合に一時的にプログラムを保持する主記憶装置である。
【００２２】
このように構成された情報処理装置においてプログラムを実行する場合、まず、ＣＰＵ１０がハードディスク２０から指定されたプログラムを取り出し、メインメモリ３０上にロードする。さらにＣＰＵ１０は、メインメモリ３０からプログラムに記述された処理命令をフェッチして、その命令内容をデコードする。これにより、情報処理装置は、プログラムを実行することができる。
【００２３】
本実施形態において、ハードディスク２０には、図２に示すように、少なくともメインプログラム２２とサブプログラム２４とが格納されている。
【００２４】
メインプログラム２２は、ある特定の処理を情報処理装置上で実行するための主となるソフトウェアであり、例えばアプリケーションプログラムである。アプリケーションプログラムとしては、例えば、ワープロソフトや表計算ソフト、文書閲覧ソフト、画像編集ソフト、データベースソフト、プレゼンテーションソフト、ゲーム、Webブラウザ、電子メールソフトなどがある。また、企業で使われる財務会計ソフトや人事管理ソフト、在庫管理ソフトなどもアプリケーションプログラムの一種である。
【００２５】
一方、サブプログラム２４は、メインプログラム２２とは独立したソフトウェアであり、メインプログラム２２に変更を加えることなく、後からサードパーティなどが独自の機能をメインプログラム２２に追加できる補助プログラムである。サブプログラム２４は、メインプログラム２２から呼び出されて、所定の処理を行い、その処理結果をメインプログラム２２に戻す処理を行う。以下、サブプログラム２４がメインプログラム２２からの呼び出しに応じて行う一連の処理を「サブ処理」と称す。
【００２６】
サブプログラム２４には、例えばプラグインである。さらに、メインプログラム２２が基本ＯＳ（Operating System）の一つであるWindows（登録商標）上で動作する場合、サブプログラム２４はＤＬＬ（Dynamic Link Library）で実現されている場合が多い。
【００２７】
図３は、サブプログラム２４がメインプログラム２２から呼び出される場合におけるメインメモリ３０のアドレス空間を模式的に示した図である。図３に示すように、メインメモリ３０上に構築されるアドレス空間は目的別にいくつかの領域に分けられる。本実施形態では少なくとも、メインプログラム２２のプログラムデータを格納するメインプログラム領域Ｍ１０と、サブプログラム２４のプログラムデータを格納するサブプログラム領域Ｍ１２と、各種変数データを格納するスタック領域Ｍ１４とが構築されている。ここで、スタック領域Ｍ１４には、本実施形態において重要な役割を果たす「戻り先アドレス」などが格納される。戻り先アドレスとは、サブプログラム２４が所定の処理を行った後にメインプログラム２２へ処理を戻す場合に、サブプログラム２４から実行制御を移されるアドレスであり、このアドレスは、メインプログラム領域Ｍ１０に割り当てられたアドレスである。
【００２８】
ところで、サードパーティなどがメインプログラムに対して自由に機能追加を実現できるように、プラグインなどのサブプログラムを開発するための開発ツール（ＳＤＫ（Software Development Kit））は公開されていることが多い。また、プラグインなどのサブプログラムは、対応するメインプログラム以外の他のプログラムからも呼び出すことが可能な場合が多い。そのような場合、メインプログラムとサブプログラムとがやり取りするデータの監視や改変を行うモジュールを作成することも比較的容易に可能である。このように汎用性の高いプラグインのようなサブプログラムは利便性が高い反面、例えばサブプログラムがセキュリティ機能を提供するモジュールの場合、セキュリティ上問題となる場合がある。
【００２９】
例えば、サブプログラムが、正しい権利を有するユーザから呼び出された場合のみ暗号化されたコンテンツを復号して、そのコンテンツを利用できるようにする機能を提供するモジュールであるとする。このようなサブプログラムは、呼出元プログラムからの呼び出しに応じてユーザに対する権利認証処理を行い、認証に成功した場合にコンテンツの復号鍵を呼出元プログラムに渡すという処理を行う場合がある。あるいは、サブプログラム２４が、暗号化されたコンテンツに対する閲覧のみ、編集可、印刷可などの権利情報を呼出元プログラムに渡し、呼出元プログラムが、渡された権利情報に基づいてコンテンツに対するセキュリティ制御を行うという場合もある。
【００３０】
上記のようなセキュリティ機能をサブプログラムによって提供する場合、上記のようなメインプログラムとサブプログラムとがやり取りするデータの監視や改変を行うツールを用いることによって、暗号化されたコンテンツに対する復号鍵を不正に取得したり、コンテンツに対する権利情報を詐称するといった不正アクセスが行われる可能性がある。
【００３１】
このような不正アクセスを防止するために、メインプログラムが呼出先となるサブプログラムをデジタル署名の確認などによって認証して、その認証結果が正しいサブプログラムの場合のみ呼出先のサブプログラムに処理を継続させる認証機能に関する技術が知られている。
【００３２】
しかし、メインプログラムがこのような認証機能を提供していても、サブプログラムがメインプログラムを認証する訳ではないので、メインプログラムとサブプログラムとがやり取りするデータを保護することができない。
【００３３】
そこで、本実施形態では、サブプログラム２４が正しいメインプログラム２２から直接呼び出されているかどうかを確認することで、メインプログラム２２とサブプログラム２４とがやり取りするデータを保護する。
【００３４】
以下、呼出元プログラムからサブプログラム２４が呼び出された場合における本実施形態に係るサブプログラム２４の処理手順について図３に示すフローチャートを用いて説明する。
【００３５】
まず、サブプログラム２４は、呼出元プログラムから呼び出しを受けると、メインメモリ３０のスタック領域Ｍ１４から戻り先アドレスを取得する（Ｓ１００）。
【００３６】
なお、戻り先アドレスが格納される場所を示すメモリアドレスは、メインプログラム２２の実行環境であるＯＳやメインプログラム２２をコンパイルするコンパイラの仕様によって予め定められており、例えば、当該メモリアドレスは、サブプログラム２４が呼び出された時点におけるスタック領域Ｍ１４の先頭アドレスである。なお、戻り先アドレスは、コンピュータアーキテクチャによってはスタック領域Ｍ１４ではなく特定のレジスタに格納される場合もある。
【００３７】
メインプログラム２２がサブプログラム２４を呼び出す際に、戻り先アドレスを示すデータがスタック領域Ｍ１４の先頭アドレスなどに格納される。よって、サブプログラム２４は、予め定められたアドレスにアクセスすることで戻り先アドレスを取得することができる。
【００３８】
戻り先アドレスを取得後、サブプログラム２４は、戻り先アドレスを含むメモリ領域（以下、「呼出元メモリ領域」と称す）に関するメモリ情報を取得する（Ｓ１０２）。メモリ情報には、呼出元メモリ領域の実行可能状態や、呼出元メモリ領域の先頭アドレスの情報がある。例えば、Windows（登録商標）の場合、VirtualQuery関数を用いることで、当該メモリ情報を取得することができる。より具体的には、サブプログラム２４は、VirtualQuery関数に、戻り先アドレス、取得するメモリ情報を格納するバッファ領域の先頭アドレス、およびバッファ領域のデータサイズをパラメータとして示してＯＳにアクセスすることで、ＯＳから戻り先アドレスを含むメモリ領域に関するメモリ情報を取得することができる。
【００３９】
次いで、サブプログラム２４は、取得したメモリ情報を参照することで、呼出元メモリ領域が実行可能状態か否かを判定する（Ｓ１０４）。判定の結果、呼出元メモリ領域が実行可能状態ではない場合（ステップＳ１０４の判定結果が、否定「Ｎ」）、正規のメインプログラムを装った偽のプログラムから呼び出された可能性があると判断して、サブプログラム２４は、サブ処理を中断する（Ｓ１０６）。
【００４０】
一方、呼出元メモリ領域が実行可能状態の場合（ステップＳ１０４の判定結果が、肯定「Ｙ」）、サブプログラム２４は、取得したメモリ情報を参照することで、呼出元メモリ領域の先頭アドレスを取得し（Ｓ１０８）、その先頭アドレスに基づいて呼出元プログラムの属性情報を取得する（Ｓ１１０）。次いで、サブプログラム２４は、取得した属性情報に基づいて、呼出元プログラムが正規のメインプログラム２２かどうかの認証を行う（Ｓ１１２）。認証は、例えば、サブプログラム２４が予め所有している正規のメインプログラム２４に対応する属性情報と、呼出元プログラムから取得した属性情報が一致するかどうかを検証することで行えばよい。
【００４１】
ここで、属性情報は、例えば、呼出元プログラムのファイル名である。このファイル名は、例えば、Windows（登録商標）の場合、GetModuleFileName関数を用いることで、取得することができる。より具体的には、サブプログラム２４は、先頭アドレス等をパラメータとして示してGetModuleFileName関数を呼び出すことで、呼出元プログラムのファイル名を取得することができる。また、GetModuleFileName関数を呼び出すことで、サブプログラム２４は、呼出元プログラムが格納されているファイルパスも取得することができる。よって、サブプログラム２４は、そのファイルパスに基づいてファイルにアクセスして、そのファイルの作成者、作成日時、ファイルサイズなども特定することができる。そのため、サブプログラム２４はこれらの情報も属性情報として用いることができる。ファイル名に基づく認証だけでは、例えば、偽のプログラムが同一パス上に同一のファイル名で正規のメインプログラム２４と置き換えられた場合、正しく認証できない。しかし、上記の通りファイル名以外の属性情報を用いて認証を行えば、そのような不正な置き換えが行われた場合にも正しく認証できる可能性が高まる。
【００４２】
また、メインプログラム２２にデジタル署名が施されている場合、正規のメインプログラム２２であれば、そのデジタル署名が施されているため、サブプログラム２４は、呼出元プログラムに対応するファイルにアクセスし、デジタル署名の有無やデジタル署名の正しさなどを検査することで、呼出元プログラムが正規のメインプログラム２２かどうかを検査することができる。
【００４３】
認証の結果、呼出元プログラムの認証に失敗した場合（ステップＳ１１４の判定結果が、否定「Ｎ」）、サブプログラム２４は、サブ処理を中断する（Ｓ１０６）。
【００４４】
一方、呼出元プログラムの認証に成功した場合（ステップＳ１１４の判定結果が、肯定「Ｙ」）、サブプログラム２４は、サブ処理を継続する（Ｓ１１６）。
【００４５】
以上により、サブプログラム２４は、呼び出しに応じてサブ処理を実行する前に、呼出元プログラムが正規のメインプログラム２２かどうかを認証して、認証に成功した場合のみサブ処理を実行する。
【００４６】
これにより、本実施形態によれば、メインプログラム２２とサブプログラム２４とがやり取りするデータの監視や改変を行うツールを用いることによって、暗号化されたコンテンツに対する復号鍵を不正に取得したり、コンテンツに対する権利情報を詐称するといった不正アクセスを防止することができる。
【００４７】
さらに、本実施形態によれば、正規のメインプログラム２２の代わりに偽のプログラムがサブプログラム２４を呼び出してもサブ処理は続行されないため、サブプログラム２４が不正に呼び出されサブプログラム２４から不正にデータが取得されることを防ぐことができる。
【００４８】
続いて、本実施形態の第１変形例について説明する。
【００４９】
第１変形例では、戻り先アドレスが正規のメインプログラム２２に対応する戻り先アドレスかどうかを検証することで、呼出元プログラムが正規のメインプログラム２２かどうかの認証を行う。
【００５０】
以下、第１変形例において、呼出元プログラムからサブプログラム２４が呼び出された場合におけるサブプログラム２４の処理手順について、図５に示すフローチャートを用いて説明する。なお、図５において、ステップＳ１００〜ステップＳ１０６は、図４と同様な処理のため説明を省略して、ステップＳ１２０から説明する。
【００５１】
呼出元メモリ領域が実行可能状態の場合（ステップＳ１０４の判定結果が、肯定「Ｙ」）、サブプログラム２４は、正規のメインプログラム２２に対応する戻り先アドレスが登録されたアドレスリストを参照して、取得した戻り先アドレスがそのアドレスリストに登録されているかどうかの検証を行う（Ｓ１２０）。
【００５２】
なお、このアドレスリストは、サブプログラムの開発段階で作成すればよい。より具体的には、正規のメインプログラム２２を実行して、サブプログラム２４を呼び出させ、その際にスタック領域Ｍ１４に格納される戻り先アドレスを監視する。これにより、正規のメインプログラム２２が実行される場合にスタック領域Ｍ１４に格納される戻り先アドレスが判明するため、その戻り先アドレスを登録したリストを作成することで、上記のアドレスリストを作成することができる。なお、正規のメインプログラム２２が一連の処理を実行する間に、複数回サブプログラム２４を呼び出す場合もあるため、アドレスリストに登録される戻り先アドレスは１つとは限らない。
【００５３】
アドレスリストの検証の結果、取得した戻り先アドレスがアドレスリストに登録されていなければ（ステップＳ１２２の判定結果が、否定「Ｎ」）、正規のメインプログラム２２から呼び出されていないと判断して、サブプログラム２４は、サブ処理を中断する（Ｓ１０６）。
【００５４】
一方、戻り先アドレスがアドレスリストに登録されていれば（ステップＳ１２２の判定結果が、肯定「Ｙ」）、サブプログラム２４は、正規のメインプログラム２２から呼び出されていると判断して、サブ処理を継続する（Ｓ１２４）。
【００５５】
以上、第１変形例では、呼出元プログラムの戻り先アドレスに基づいて、その呼出元プログラムが正規のメインプログラム２２かどうかを判定した後、正規のメインプログラム２２の場合のみ、サブプログラム２４はサブ処理を続行する。
【００５６】
よって、第１変形例によれば、上記の実施形態と同様に、サブプログラム２４が不正に呼び出されることでサブプログラム２４から不正にデータが取得されることを防ぐことができる。
【００５７】
なお、上記では、メインプログラム２２のプログラムデータがロードされるメインプログラム領域Ｍ１０のアドレスが再割り当て（リロケーション）される場合を考慮していない。しかし、ＯＳの仕様によっては、再割り当てが行われる場合がある。この場合、正規のメインプログラム２２からの呼び出しにも拘わらず、サブプログラム２４が呼出元プログラムを正規のメインプログラム２２と判定しない場合がある。
【００５８】
そこで、サブプログラム２４は、アドレスリストによる検証を行う前に、再割り当てが行われているかどうかを検証してもよい。この場合、サブプログラム２４は、再割り当てが行われている場合には、取得した戻り先アドレスの補正を行う。
【００５９】
ここで、図６に示すフローチャートを用いて、アドレスリストによる検証を行う前に、サブプログラム２４がアドレスの再割り当てが行われているかどうかの検証をする際の処理手順についてさらに説明する。
【００６０】
まず、サブプログラム２４は、呼出元メモリ領域の先頭アドレスを、上記の実施形態と同様な方法で取得する（Ｓ２００）。次いで、サブプログラム２４は、予め記憶してある正規のメインプログラム２２に対する先頭アドレスと、取得した先頭アドレスとを比較し、一致するかどうかを判定する（Ｓ２０２）。
【００６１】
判定の結果、一致する場合には（ステップＳ２０２の判定結果が、肯定「Ｙ」）、サブプログラム２４は、呼出元プログラムのアドレス再割り当てが行われていないと判断して、取得した戻り先アドレスをそのまま用いて、図５に示す処理を行う。
【００６２】
一方、戻り先アドレスが一致しない場合は（ステップＳ２０２での判定結果が、否定「Ｎ」）、サブプログラム２４は、呼出元プログラムのアドレス再割り当てが行われていると判断して、取得した先頭アドレスと登録された先頭アドレスとの差分を算出する（Ｓ２０４）。次いで、サブプログラム２４は、この差分に基づいて取得した戻り先アドレスを補正する（Ｓ２０６）。以降、サブプログラム２４は、補正後の戻り先アドレスを用いて、図５に示す処理を行う。
【００６３】
以上により、メインプログラム領域Ｍ１０のアドレスが再割り当てされる場合にも、サブプログラム２４は、呼出元プログラムが正規のメインプログラム２２かどうかの検証を正しく行うことができる。なお、メインプログラム２４が動作するＯＳによっては、メモリ領域のアドレスが再割り当てされる場合でも、ＯＳ側でアドレス変換等を行い、プログラム側にアドレス変更による影響が生じないようにしている場合がある。このような場合には、サブプログラム２４は、上記のようなアドレスの再割り当てを考慮せずに呼出元プログラムの認証を行えばよい。
【００６４】
続いて、本実施形態の第２変形例について説明する。
【００６５】
第２変形例では、サブプログラム２４は、戻り先アドレスを基準として定められる所定のアドレス範囲に格納されたプログラムデータに基づいて、呼出元プログラムの認証を行う。
【００６６】
以下、第２変形例において、呼出元プログラムからサブプログラム２４が呼び出された場合におけるサブプログラム２４の処理手順について、図７に示すフローチャートを用いて参照する。なお、図７において、ステップＳ１００〜ステップＳ１０６は、図４と同様な処理のため説明を省略して、ステップＳ１３０から説明する。
【００６７】
呼出元メモリ領域が実行可能状態の場合（ステップＳ１０４の判定結果が、肯定「Ｙ」）、サブプログラム２４は、取得した戻り先アドレスを基準として定められる所定のアドレス範囲に格納されたプログラムデータをメインメモリ３０から取得する（Ｓ１３０）。なお、当該所定のアドレス範囲は、例えば、戻り先アドレスを基準アドレスとする相対アドレスにより予め定めておけばよい。
【００６８】
ここで、所定のアドレス範囲には、呼出元プログラムが正規のメインプログラム２２かどうかを検証することが可能なプログラムデータが格納されている範囲を定める必要がある。よって、所定のアドレス範囲は、その他のプログラムとは異なる正規のメインプログラム固有のプログラムデータが格納されるアドレス範囲を指定することが望ましい。
【００６９】
次いで、サブプログラム２４は、取得したプログラムデータに基づいて呼出元プログラムの認証検査を行う（Ｓ１３２）。
【００７０】
この検証は、例えば、次のように行えばよい。サブプログラム２４は、所定のアドレス範囲にロードされるべき正規のメインプログラム２２のプログラムデータを予め保持している。そして、サブプログラム２４は、予め保持しているプログラムデータと、呼出元プログラムがロードされているメモリ領域から取得したプログラムデータとを比較し、呼出元プログラムが正規のメインプログラム２２かどうかを検証する。なお、上記のようにプログラムデータそのものを比較するのではなく、例えば、正規のメインプログラムのプログラムデータに対するハッシュ値等の特徴量を予め計算しておき、特徴量同士を比較することで検証を行ってもよい。
【００７１】
認証の結果、呼出元プログラムの認証に失敗した場合には（ステップＳ１３４の判定結果が、否定「Ｎ」）、正規のメインプログラム２２から呼び出されていないと判断して、サブプログラム２４は、サブ処理を中断する（Ｓ１０６）。
【００７２】
一方、呼出元プログラムの認証に成功した場合には（ステップＳ１３４の判定結果が、肯定「Ｙ」）、サブプログラム２４は、正規のメインプログラム２２から呼び出されていると判断して、サブ処理を継続する（Ｓ１２４）。
【００７３】
以上、第２変形例では、呼出元プログラムの戻り先アドレスを含む所定のアドレス範囲にロードされているプログラムデータが正規のメインプログラム２２のプログラムデータかどうかを検証した後、正規のメインプログラム２２の場合のみ、サブプログラム２４はサブ処理を続行する。
【００７４】
よって、第２変形例によれば、上記の実施形態や第１変形例と同様に、サブプログラム２４が不正に呼び出されることでサブプログラム２４から不正にデータが取得されることを防ぐことができる。
【００７５】
なお、プログラムデータに含まれる処理命令の中には、ＪＵＭＰ命令などのように、データ内にアドレス情報が含まれる場合がある。よって、メインプログラム領域Ｍ１０のアドレスが再割り当てされると、プログラムデータの内容も変更してしまう場合がある。
【００７６】
そこで、第２変形例でも、メインプログラム２２の仕様によっては、アドレスの再割り当てが行われることを考慮すべき場合がある。
【００７７】
この場合、例えば、上記の所定のアドレス範囲の中から、アドレスの再割り当てが行われることでデータ内容が書き替えられる可能性があるアドレス（以下、「データ書き替えアドレス」と称す）を予め除いておく。このようにすれば、検証対象のプログラムデータの中にはアドレスの再割り当てが行われることでデータ内容が変更されるデータが含まれないため、アドレスの再割り当てが行われる場合にもサブプログラム２４は、正しく呼出元プログラムの認証を行うことができる。
【００７８】
なお、データ書き替えアドレスは、例えば、リロケーションテーブルと呼ばれる、アドレスの再割り当てが行われることでデータ内容が書き替えられる可能性があるアドレスが登録されているテーブルを参照することで特定すればよい。なお、メインプログラム２２がリロケーションテーブルを提供していない場合には、予めデータ書き替えアドレスを登録したリストを作成しておき、サブプログラム２４が参照可能なメモリ領域にロードしておけばよい。
【００７９】
また、データ書き替えアドレスを排除するのではなく、データ書き替えアドレスに格納されたプログラムデータを補正することで、呼出元プログラムの認証を行ってもよい。この場合は、例えば、図６に示した方法を用いて、差分を求めて、その差分に基づいて、データ書き替えアドレスに格納されたプログラムデータを補正すればよい。つまり、データ書き替えアドレスにロードされた処理命令に含まれるアドレスを、算出した差分に基づいて補正すればよい。
【００８０】
以上、上記の実施形態及び各変形例では、サブプログラム２４は、呼出元プログラムが使用するメモリ領域に割り当てられたアドレスとして、スタック領域Ｍ１４等から取得できる戻り先アドレスを用いて呼出元プログラムの認証を行う例について説明した。しかし、サブプログラム２４は、呼出元プログラムの認証が行うことができれば、戻り先アドレス以外のアドレスを用いることもできる。
【００８１】
そこで、本実施形態の第３変形例では、戻り先アドレス以外のアドレスとして、メインプログラム２２がサブプログラムを呼び出す際に渡す引数に示されるアドレスを用いて呼出元プログラムの認証を行う場合について説明する。
【００８２】
第３変形例では、引数に示されるアドレスとして、コールバックアドレスを用いる。ここで、コールバックアドレスとは、呼出対象のコールバック関数が格納される場所のアドレスのことをいう。コールバック関数とは、サブプログラム２４が呼出元プログラムからの呼び出しに応じて呼び出す呼出元プログラム中の関数のことをいう。つまり、サブプログラム２４は、呼出元プログラムから渡された引数に示されるコールバックアドレスにアクセスして、コールバック関数を呼び出す。
【００８３】
第３変形例では、サブプログラム２４が、呼出元プログラムから渡される引数に示されるコールバックアドレスを用いる点で、スタック領域Ｍ１４などから取得した戻り先アドレスを用いる上記の実施形態とは異なる。しかし、それ以外の点では処理手順において上記の実施形態と同様でよいため、詳細な説明は省略する。よって、上記の実施形態の説明を、適宜戻り先アドレスからコールバックアドレスに読み替えて参照されたい。
【００８４】
さらに、第１変形例や第２変形例における処理手順でも戻り先アドレスの代わりにコールバックアドレスを用いることができる。よって、この場合にも、第１変形例や第２変形例の説明を、適宜戻り先アドレスからコールバックアドレスに読み替えて参照されたい。
【００８５】
なお、コールバックアドレスを用いる場合にも、メインプログラム２２の格納されるメモリ領域のアドレスの再割り当てを考慮するべき場合がある。この場合には、第１，第２変形例と同様に、サブプログラム２４は、図６に示す手順に基づいて、アドレスの再割り当てが行われたかどうかを判定して、再割り当てが行われている場合には、差分を求める。そして、サブプログラム２４は、その差分に基づいて、取得したコールバックアドレスやコールバックアドレスを基準として定められる所定のアドレス範囲に格納されているプログラムデータの補正を行った後に、呼出元プログラムの認証を行う。
【００８６】
また、上記の実施形態や各変形例において示した呼出元プログラムの認証処理は、サブプログラム２４がサブ処理の結果得られるデータを呼出元プログラムに戻す処理を行う前に実行すればよい。例えば、サブプログラム２４は、呼出命令を受けた直後や、コールバック関数を呼び出す直前、サブ処理の結果得られるデータを呼出元プログラムへ戻す直前などに呼出元プログラムの認証処理を行えばよい。
【００８７】
以上説明してきた各処理はプログラムの形態で配布することもできる。その場合、フロッピー（登録商標）ディスク、ＣＤ−ＲＯＭ、ＤＶＤなどの記録媒体に上記プログラムを記録させて配布したり、或いは、公衆網等で用いられる伝送媒体を介して、そのプログラムやファイルの一部、若しくは全部を配信するようにしたりすることができる。この場合、それを受け取ったユーザは、ＣＤ−ＲＯＭ装置などの読み取り装置（入出力部の一部）を利用してフロッピー（登録商標）ディスクやＣＤ−ＲＯＭやＤＶＤなどの可搬型記録媒体から上記プログラムを外部記録部にコピーしたり、コンピュータの通信部を介してインターネットから上記プログラムを外部記録部にコピーしたりすることができる。そして、ＣＰＵで実行することにより、ユーザのコンピュータ上でも上述した機能を実現できる。
【図面の簡単な説明】
【００８８】
【図１】実施形態や第１乃至第３変形例における情報処理装置の機能ブロックを示す図である。
【図２】情報処理装置が備えるハードディスクの概念図である。
【図３】メインメモリに構築されたアドレス空間の模式図である。
【図４】実施形態において、呼出元プログラムから呼び出された場合におけるサブプログラムの処理手順を示すフローチャートである。
【図５】第１変形例において、呼出元プログラムから呼び出された場合におけるサブプログラムの処理手順を示すフローチャートである。
【図６】再割り当てが行われているかどうかを検証する場合におけるサブプログラムの処理手順を示すフローチャートである。
【図７】第２変形例において、呼出元プログラムから呼び出された場合におけるサブプログラムの処理手順を示すフローチャートである。
【符号の説明】
【００８９】
１０  ＣＰＵ、２０  ハードディスク、２２  メインプログラム、２４  サブプログラム、３０  メインメモリ。
【図１】
0004844102.tif 000002
【図２】
0004844102.tif 000003
【図３】
0004844102.tif 000004
【図４】
0004844102.tif 000005
【図５】
0004844102.tif 000006
【図６】
0004844102.tif 000007
【図７】
0004844102.tif 000008