説明

サブプログラム、そのサブプログラムを実行する情報処理装置、及びそのサブプログラムを実行する情報処理装置におけるプログラム制御方法

【課題】メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムにおいて、処理結果に対するセキュリティの強化を図る。
【解決手段】サブプログラムは、呼出元プログラムからの呼出命令に応じて、該呼出元プログラムが使用するメモリ領域に関するメモリ情報を取得し、取得したメモリ情報に基づいて、呼出元プログラムが正規のメインプログラムか否かを判定し、判定の結果、呼出元プログラムが正規のメインプログラムの場合、サブ処理の実行を許可する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムに関する。
【背景技術】
【0002】
従来から、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すプラグインなどのサブプログラムが知られている。
【0003】
このようなサブプログラムからメインプログラムへ戻される処理結果の中には、利用制限に関連のあるアクセス権情報や、非公開の情報、復号鍵など不正に利用されると問題が生じるようなデータが含まれている場合がある。
【0004】
このような機密性の高いデータをサブプログラムからメインプログラムへ渡す際、メインプログラムを偽装するという攻撃が知られている。例えば、メインプログラムそのものを改ざんしたり、あるいは、メインプログラムとサブプログラムの間に入り込んで、その間でやりとりされるデータを盗聴したり改ざんしたりすると言う攻撃が可能となる。
【0005】
特許文献1には、API(アプリケーションプログラムインタフェース)の呼び出しをAPIフックエンジンがフックし、APIフックエンジンが呼び出されるAPIの対象プロセスや処理種類に応じて、APIの処理を続行もしくは中断をするかどうかを判断することで、APIに不正アクセスされることを防止する技術が開示されている。
【0006】
特許文献1に記載のAPIフックエンジンは、呼び出されるAPIの種類に応じて、呼び出し対象のAPIの処理を続行もしくは中断するか否かを判断している。しかし、このAPIフックエンジンは、呼び出されるAPIの種類が許可対象のAPIであれば、APIの処理は続行されてしまう。そのため、例えば、偽装したメインプログラムが、許可対象のAPIの呼び出しを行った場合、APIフックエンジンはその呼び出しを許可してしまう。よって、特許文献1に記載の技術では、例えば、許可対象のAPIから偽装したメインプログラムへ機密情報などが流出するおそれがある。
【0007】
【特許文献1】特開2005−166051号公報
【発明の開示】
【発明が解決しようとする課題】
【0008】
本発明は、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムにおいて、処理結果に対するセキュリティの強化を図る。
【課題を解決するための手段】
【0009】
本発明に係るサブプログラムは、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理をコンピュータに実行させるためのサブプログラムにおいて、呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、判定の結果、前記呼出元プログラムが正規のメインプログラムではないと判断した場合、前記サブ処理の実行を中断する中断処理とを、コンピュータに実行させることを特徴とする。
【0010】
本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスに基づいて前記呼出元プログラムが使用するメモリ領域に関するメモリ情報を取得し、該メモリ情報に基づいて前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【0011】
また、本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスに基づいて前記呼出元プログラムの属性情報を取得して、該属性情報と正規のメインプログラムの属性情報とを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【0012】
さらに、本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスと正規のメインプログラムにおける本来のアクセス先アドレスとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定する。この場合、正規のメインプログラムの本来のアクセス先アドレス群が登録されたアドレスリストを参照することで、前記呼出元プログラムが正規のメインプログラムか否かを判定してもよい。
【0013】
加えて、本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて、前記取得したアクセス先アドレスを補正し、補正後のアクセス先アドレスに基づいて該呼出元プログラムが正規のメインプログラムか否かを判定する。
【0014】
また、本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【0015】
さらに、本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、そのデータのハッシュ値を計算し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータから求められるハッシュ値とを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とする。
【0016】
加えて、本発明に係るサブプログラムの1つの態様において、前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて前記判定対象データを補正し、補正後の判定対象データと前記格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定する。
【0017】
さらに、本発明に係るサブプログラムの1つの態様において、前記アクセス先アドレスは、前記サブプログラムによる一連の処理が終了後に前記サブプログラムがアクセスすべき戻り先アドレスである。
【0018】
また、本発明に係るサブプログラムの1つの態様において、前記アクセス先アドレスは、前記サブプログラムが前記呼出元プログラムから呼び出される際に前記呼出元プログラムから渡される引数に示されるアドレスである。このアドレスは、前記呼出元プログラムからコールバック先として指定されたコールバックアドレスでもよい。
【発明の効果】
【0019】
本発明によれば、メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果をそのメインプログラムに戻すサブプログラムにおいて、処理結果に対するセキュリティの強化を図ることができる。
【発明を実施するための最良の形態】
【0020】
本発明を実施するための最良の形態(以下、実施形態とする)について、以下図面を用いて説明する。
【0021】
図1は、本実施形態に係る情報処理装置の機能ブロックを示す。図1において、CPU10は、情報処理装置全体の制御を行う中央処理装置である。ハードディスク20は、情報処理装置上で動作するプログラムを保存する補助記憶装置である。メインメモリ30は、情報処理装置上でプログラムを実行する場合に一時的にプログラムを保持する主記憶装置である。
【0022】
このように構成された情報処理装置においてプログラムを実行する場合、まず、CPU10がハードディスク20から指定されたプログラムを取り出し、メインメモリ30上にロードする。さらにCPU10は、メインメモリ30からプログラムに記述された処理命令をフェッチして、その命令内容をデコードする。これにより、情報処理装置は、プログラムを実行することができる。
【0023】
本実施形態において、ハードディスク20には、図2に示すように、少なくともメインプログラム22とサブプログラム24とが格納されている。
【0024】
メインプログラム22は、ある特定の処理を情報処理装置上で実行するための主となるソフトウェアであり、例えばアプリケーションプログラムである。アプリケーションプログラムとしては、例えば、ワープロソフトや表計算ソフト、文書閲覧ソフト、画像編集ソフト、データベースソフト、プレゼンテーションソフト、ゲーム、Webブラウザ、電子メールソフトなどがある。また、企業で使われる財務会計ソフトや人事管理ソフト、在庫管理ソフトなどもアプリケーションプログラムの一種である。
【0025】
一方、サブプログラム24は、メインプログラム22とは独立したソフトウェアであり、メインプログラム22に変更を加えることなく、後からサードパーティなどが独自の機能をメインプログラム22に追加できる補助プログラムである。サブプログラム24は、メインプログラム22から呼び出されて、所定の処理を行い、その処理結果をメインプログラム22に戻す処理を行う。以下、サブプログラム24がメインプログラム22からの呼び出しに応じて行う一連の処理を「サブ処理」と称す。
【0026】
サブプログラム24には、例えばプラグインである。さらに、メインプログラム22が基本OS(Operating System)の一つであるWindows(登録商標)上で動作する場合、サブプログラム24はDLL(Dynamic Link Library)で実現されている場合が多い。
【0027】
図3は、サブプログラム24がメインプログラム22から呼び出される場合におけるメインメモリ30のアドレス空間を模式的に示した図である。図3に示すように、メインメモリ30上に構築されるアドレス空間は目的別にいくつかの領域に分けられる。本実施形態では少なくとも、メインプログラム22のプログラムデータを格納するメインプログラム領域M10と、サブプログラム24のプログラムデータを格納するサブプログラム領域M12と、各種変数データを格納するスタック領域M14とが構築されている。ここで、スタック領域M14には、本実施形態において重要な役割を果たす「戻り先アドレス」などが格納される。戻り先アドレスとは、サブプログラム24が所定の処理を行った後にメインプログラム22へ処理を戻す場合に、サブプログラム24から実行制御を移されるアドレスであり、このアドレスは、メインプログラム領域M10に割り当てられたアドレスである。
【0028】
ところで、サードパーティなどがメインプログラムに対して自由に機能追加を実現できるように、プラグインなどのサブプログラムを開発するための開発ツール(SDK(Software Development Kit))は公開されていることが多い。また、プラグインなどのサブプログラムは、対応するメインプログラム以外の他のプログラムからも呼び出すことが可能な場合が多い。そのような場合、メインプログラムとサブプログラムとがやり取りするデータの監視や改変を行うモジュールを作成することも比較的容易に可能である。このように汎用性の高いプラグインのようなサブプログラムは利便性が高い反面、例えばサブプログラムがセキュリティ機能を提供するモジュールの場合、セキュリティ上問題となる場合がある。
【0029】
例えば、サブプログラムが、正しい権利を有するユーザから呼び出された場合のみ暗号化されたコンテンツを復号して、そのコンテンツを利用できるようにする機能を提供するモジュールであるとする。このようなサブプログラムは、呼出元プログラムからの呼び出しに応じてユーザに対する権利認証処理を行い、認証に成功した場合にコンテンツの復号鍵を呼出元プログラムに渡すという処理を行う場合がある。あるいは、サブプログラム24が、暗号化されたコンテンツに対する閲覧のみ、編集可、印刷可などの権利情報を呼出元プログラムに渡し、呼出元プログラムが、渡された権利情報に基づいてコンテンツに対するセキュリティ制御を行うという場合もある。
【0030】
上記のようなセキュリティ機能をサブプログラムによって提供する場合、上記のようなメインプログラムとサブプログラムとがやり取りするデータの監視や改変を行うツールを用いることによって、暗号化されたコンテンツに対する復号鍵を不正に取得したり、コンテンツに対する権利情報を詐称するといった不正アクセスが行われる可能性がある。
【0031】
このような不正アクセスを防止するために、メインプログラムが呼出先となるサブプログラムをデジタル署名の確認などによって認証して、その認証結果が正しいサブプログラムの場合のみ呼出先のサブプログラムに処理を継続させる認証機能に関する技術が知られている。
【0032】
しかし、メインプログラムがこのような認証機能を提供していても、サブプログラムがメインプログラムを認証する訳ではないので、メインプログラムとサブプログラムとがやり取りするデータを保護することができない。
【0033】
そこで、本実施形態では、サブプログラム24が正しいメインプログラム22から直接呼び出されているかどうかを確認することで、メインプログラム22とサブプログラム24とがやり取りするデータを保護する。
【0034】
以下、呼出元プログラムからサブプログラム24が呼び出された場合における本実施形態に係るサブプログラム24の処理手順について図3に示すフローチャートを用いて説明する。
【0035】
まず、サブプログラム24は、呼出元プログラムから呼び出しを受けると、メインメモリ30のスタック領域M14から戻り先アドレスを取得する(S100)。
【0036】
なお、戻り先アドレスが格納される場所を示すメモリアドレスは、メインプログラム22の実行環境であるOSやメインプログラム22をコンパイルするコンパイラの仕様によって予め定められており、例えば、当該メモリアドレスは、サブプログラム24が呼び出された時点におけるスタック領域M14の先頭アドレスである。なお、戻り先アドレスは、コンピュータアーキテクチャによってはスタック領域M14ではなく特定のレジスタに格納される場合もある。
【0037】
メインプログラム22がサブプログラム24を呼び出す際に、戻り先アドレスを示すデータがスタック領域M14の先頭アドレスなどに格納される。よって、サブプログラム24は、予め定められたアドレスにアクセスすることで戻り先アドレスを取得することができる。
【0038】
戻り先アドレスを取得後、サブプログラム24は、戻り先アドレスを含むメモリ領域(以下、「呼出元メモリ領域」と称す)に関するメモリ情報を取得する(S102)。メモリ情報には、呼出元メモリ領域の実行可能状態や、呼出元メモリ領域の先頭アドレスの情報がある。例えば、Windows(登録商標)の場合、VirtualQuery関数を用いることで、当該メモリ情報を取得することができる。より具体的には、サブプログラム24は、VirtualQuery関数に、戻り先アドレス、取得するメモリ情報を格納するバッファ領域の先頭アドレス、およびバッファ領域のデータサイズをパラメータとして示してOSにアクセスすることで、OSから戻り先アドレスを含むメモリ領域に関するメモリ情報を取得することができる。
【0039】
次いで、サブプログラム24は、取得したメモリ情報を参照することで、呼出元メモリ領域が実行可能状態か否かを判定する(S104)。判定の結果、呼出元メモリ領域が実行可能状態ではない場合(ステップS104の判定結果が、否定「N」)、正規のメインプログラムを装った偽のプログラムから呼び出された可能性があると判断して、サブプログラム24は、サブ処理を中断する(S106)。
【0040】
一方、呼出元メモリ領域が実行可能状態の場合(ステップS104の判定結果が、肯定「Y」)、サブプログラム24は、取得したメモリ情報を参照することで、呼出元メモリ領域の先頭アドレスを取得し(S108)、その先頭アドレスに基づいて呼出元プログラムの属性情報を取得する(S110)。次いで、サブプログラム24は、取得した属性情報に基づいて、呼出元プログラムが正規のメインプログラム22かどうかの認証を行う(S112)。認証は、例えば、サブプログラム24が予め所有している正規のメインプログラム24に対応する属性情報と、呼出元プログラムから取得した属性情報が一致するかどうかを検証することで行えばよい。
【0041】
ここで、属性情報は、例えば、呼出元プログラムのファイル名である。このファイル名は、例えば、Windows(登録商標)の場合、GetModuleFileName関数を用いることで、取得することができる。より具体的には、サブプログラム24は、先頭アドレス等をパラメータとして示してGetModuleFileName関数を呼び出すことで、呼出元プログラムのファイル名を取得することができる。また、GetModuleFileName関数を呼び出すことで、サブプログラム24は、呼出元プログラムが格納されているファイルパスも取得することができる。よって、サブプログラム24は、そのファイルパスに基づいてファイルにアクセスして、そのファイルの作成者、作成日時、ファイルサイズなども特定することができる。そのため、サブプログラム24はこれらの情報も属性情報として用いることができる。ファイル名に基づく認証だけでは、例えば、偽のプログラムが同一パス上に同一のファイル名で正規のメインプログラム24と置き換えられた場合、正しく認証できない。しかし、上記の通りファイル名以外の属性情報を用いて認証を行えば、そのような不正な置き換えが行われた場合にも正しく認証できる可能性が高まる。
【0042】
また、メインプログラム22にデジタル署名が施されている場合、正規のメインプログラム22であれば、そのデジタル署名が施されているため、サブプログラム24は、呼出元プログラムに対応するファイルにアクセスし、デジタル署名の有無やデジタル署名の正しさなどを検査することで、呼出元プログラムが正規のメインプログラム22かどうかを検査することができる。
【0043】
認証の結果、呼出元プログラムの認証に失敗した場合(ステップS114の判定結果が、否定「N」)、サブプログラム24は、サブ処理を中断する(S106)。
【0044】
一方、呼出元プログラムの認証に成功した場合(ステップS114の判定結果が、肯定「Y」)、サブプログラム24は、サブ処理を継続する(S116)。
【0045】
以上により、サブプログラム24は、呼び出しに応じてサブ処理を実行する前に、呼出元プログラムが正規のメインプログラム22かどうかを認証して、認証に成功した場合のみサブ処理を実行する。
【0046】
これにより、本実施形態によれば、メインプログラム22とサブプログラム24とがやり取りするデータの監視や改変を行うツールを用いることによって、暗号化されたコンテンツに対する復号鍵を不正に取得したり、コンテンツに対する権利情報を詐称するといった不正アクセスを防止することができる。
【0047】
さらに、本実施形態によれば、正規のメインプログラム22の代わりに偽のプログラムがサブプログラム24を呼び出してもサブ処理は続行されないため、サブプログラム24が不正に呼び出されサブプログラム24から不正にデータが取得されることを防ぐことができる。
【0048】
続いて、本実施形態の第1変形例について説明する。
【0049】
第1変形例では、戻り先アドレスが正規のメインプログラム22に対応する戻り先アドレスかどうかを検証することで、呼出元プログラムが正規のメインプログラム22かどうかの認証を行う。
【0050】
以下、第1変形例において、呼出元プログラムからサブプログラム24が呼び出された場合におけるサブプログラム24の処理手順について、図5に示すフローチャートを用いて説明する。なお、図5において、ステップS100〜ステップS106は、図4と同様な処理のため説明を省略して、ステップS120から説明する。
【0051】
呼出元メモリ領域が実行可能状態の場合(ステップS104の判定結果が、肯定「Y」)、サブプログラム24は、正規のメインプログラム22に対応する戻り先アドレスが登録されたアドレスリストを参照して、取得した戻り先アドレスがそのアドレスリストに登録されているかどうかの検証を行う(S120)。
【0052】
なお、このアドレスリストは、サブプログラムの開発段階で作成すればよい。より具体的には、正規のメインプログラム22を実行して、サブプログラム24を呼び出させ、その際にスタック領域M14に格納される戻り先アドレスを監視する。これにより、正規のメインプログラム22が実行される場合にスタック領域M14に格納される戻り先アドレスが判明するため、その戻り先アドレスを登録したリストを作成することで、上記のアドレスリストを作成することができる。なお、正規のメインプログラム22が一連の処理を実行する間に、複数回サブプログラム24を呼び出す場合もあるため、アドレスリストに登録される戻り先アドレスは1つとは限らない。
【0053】
アドレスリストの検証の結果、取得した戻り先アドレスがアドレスリストに登録されていなければ(ステップS122の判定結果が、否定「N」)、正規のメインプログラム22から呼び出されていないと判断して、サブプログラム24は、サブ処理を中断する(S106)。
【0054】
一方、戻り先アドレスがアドレスリストに登録されていれば(ステップS122の判定結果が、肯定「Y」)、サブプログラム24は、正規のメインプログラム22から呼び出されていると判断して、サブ処理を継続する(S124)。
【0055】
以上、第1変形例では、呼出元プログラムの戻り先アドレスに基づいて、その呼出元プログラムが正規のメインプログラム22かどうかを判定した後、正規のメインプログラム22の場合のみ、サブプログラム24はサブ処理を続行する。
【0056】
よって、第1変形例によれば、上記の実施形態と同様に、サブプログラム24が不正に呼び出されることでサブプログラム24から不正にデータが取得されることを防ぐことができる。
【0057】
なお、上記では、メインプログラム22のプログラムデータがロードされるメインプログラム領域M10のアドレスが再割り当て(リロケーション)される場合を考慮していない。しかし、OSの仕様によっては、再割り当てが行われる場合がある。この場合、正規のメインプログラム22からの呼び出しにも拘わらず、サブプログラム24が呼出元プログラムを正規のメインプログラム22と判定しない場合がある。
【0058】
そこで、サブプログラム24は、アドレスリストによる検証を行う前に、再割り当てが行われているかどうかを検証してもよい。この場合、サブプログラム24は、再割り当てが行われている場合には、取得した戻り先アドレスの補正を行う。
【0059】
ここで、図6に示すフローチャートを用いて、アドレスリストによる検証を行う前に、サブプログラム24がアドレスの再割り当てが行われているかどうかの検証をする際の処理手順についてさらに説明する。
【0060】
まず、サブプログラム24は、呼出元メモリ領域の先頭アドレスを、上記の実施形態と同様な方法で取得する(S200)。次いで、サブプログラム24は、予め記憶してある正規のメインプログラム22に対する先頭アドレスと、取得した先頭アドレスとを比較し、一致するかどうかを判定する(S202)。
【0061】
判定の結果、一致する場合には(ステップS202の判定結果が、肯定「Y」)、サブプログラム24は、呼出元プログラムのアドレス再割り当てが行われていないと判断して、取得した戻り先アドレスをそのまま用いて、図5に示す処理を行う。
【0062】
一方、戻り先アドレスが一致しない場合は(ステップS202での判定結果が、否定「N」)、サブプログラム24は、呼出元プログラムのアドレス再割り当てが行われていると判断して、取得した先頭アドレスと登録された先頭アドレスとの差分を算出する(S204)。次いで、サブプログラム24は、この差分に基づいて取得した戻り先アドレスを補正する(S206)。以降、サブプログラム24は、補正後の戻り先アドレスを用いて、図5に示す処理を行う。
【0063】
以上により、メインプログラム領域M10のアドレスが再割り当てされる場合にも、サブプログラム24は、呼出元プログラムが正規のメインプログラム22かどうかの検証を正しく行うことができる。なお、メインプログラム24が動作するOSによっては、メモリ領域のアドレスが再割り当てされる場合でも、OS側でアドレス変換等を行い、プログラム側にアドレス変更による影響が生じないようにしている場合がある。このような場合には、サブプログラム24は、上記のようなアドレスの再割り当てを考慮せずに呼出元プログラムの認証を行えばよい。
【0064】
続いて、本実施形態の第2変形例について説明する。
【0065】
第2変形例では、サブプログラム24は、戻り先アドレスを基準として定められる所定のアドレス範囲に格納されたプログラムデータに基づいて、呼出元プログラムの認証を行う。
【0066】
以下、第2変形例において、呼出元プログラムからサブプログラム24が呼び出された場合におけるサブプログラム24の処理手順について、図7に示すフローチャートを用いて参照する。なお、図7において、ステップS100〜ステップS106は、図4と同様な処理のため説明を省略して、ステップS130から説明する。
【0067】
呼出元メモリ領域が実行可能状態の場合(ステップS104の判定結果が、肯定「Y」)、サブプログラム24は、取得した戻り先アドレスを基準として定められる所定のアドレス範囲に格納されたプログラムデータをメインメモリ30から取得する(S130)。なお、当該所定のアドレス範囲は、例えば、戻り先アドレスを基準アドレスとする相対アドレスにより予め定めておけばよい。
【0068】
ここで、所定のアドレス範囲には、呼出元プログラムが正規のメインプログラム22かどうかを検証することが可能なプログラムデータが格納されている範囲を定める必要がある。よって、所定のアドレス範囲は、その他のプログラムとは異なる正規のメインプログラム固有のプログラムデータが格納されるアドレス範囲を指定することが望ましい。
【0069】
次いで、サブプログラム24は、取得したプログラムデータに基づいて呼出元プログラムの認証検査を行う(S132)。
【0070】
この検証は、例えば、次のように行えばよい。サブプログラム24は、所定のアドレス範囲にロードされるべき正規のメインプログラム22のプログラムデータを予め保持している。そして、サブプログラム24は、予め保持しているプログラムデータと、呼出元プログラムがロードされているメモリ領域から取得したプログラムデータとを比較し、呼出元プログラムが正規のメインプログラム22かどうかを検証する。なお、上記のようにプログラムデータそのものを比較するのではなく、例えば、正規のメインプログラムのプログラムデータに対するハッシュ値等の特徴量を予め計算しておき、特徴量同士を比較することで検証を行ってもよい。
【0071】
認証の結果、呼出元プログラムの認証に失敗した場合には(ステップS134の判定結果が、否定「N」)、正規のメインプログラム22から呼び出されていないと判断して、サブプログラム24は、サブ処理を中断する(S106)。
【0072】
一方、呼出元プログラムの認証に成功した場合には(ステップS134の判定結果が、肯定「Y」)、サブプログラム24は、正規のメインプログラム22から呼び出されていると判断して、サブ処理を継続する(S124)。
【0073】
以上、第2変形例では、呼出元プログラムの戻り先アドレスを含む所定のアドレス範囲にロードされているプログラムデータが正規のメインプログラム22のプログラムデータかどうかを検証した後、正規のメインプログラム22の場合のみ、サブプログラム24はサブ処理を続行する。
【0074】
よって、第2変形例によれば、上記の実施形態や第1変形例と同様に、サブプログラム24が不正に呼び出されることでサブプログラム24から不正にデータが取得されることを防ぐことができる。
【0075】
なお、プログラムデータに含まれる処理命令の中には、JUMP命令などのように、データ内にアドレス情報が含まれる場合がある。よって、メインプログラム領域M10のアドレスが再割り当てされると、プログラムデータの内容も変更してしまう場合がある。
【0076】
そこで、第2変形例でも、メインプログラム22の仕様によっては、アドレスの再割り当てが行われることを考慮すべき場合がある。
【0077】
この場合、例えば、上記の所定のアドレス範囲の中から、アドレスの再割り当てが行われることでデータ内容が書き替えられる可能性があるアドレス(以下、「データ書き替えアドレス」と称す)を予め除いておく。このようにすれば、検証対象のプログラムデータの中にはアドレスの再割り当てが行われることでデータ内容が変更されるデータが含まれないため、アドレスの再割り当てが行われる場合にもサブプログラム24は、正しく呼出元プログラムの認証を行うことができる。
【0078】
なお、データ書き替えアドレスは、例えば、リロケーションテーブルと呼ばれる、アドレスの再割り当てが行われることでデータ内容が書き替えられる可能性があるアドレスが登録されているテーブルを参照することで特定すればよい。なお、メインプログラム22がリロケーションテーブルを提供していない場合には、予めデータ書き替えアドレスを登録したリストを作成しておき、サブプログラム24が参照可能なメモリ領域にロードしておけばよい。
【0079】
また、データ書き替えアドレスを排除するのではなく、データ書き替えアドレスに格納されたプログラムデータを補正することで、呼出元プログラムの認証を行ってもよい。この場合は、例えば、図6に示した方法を用いて、差分を求めて、その差分に基づいて、データ書き替えアドレスに格納されたプログラムデータを補正すればよい。つまり、データ書き替えアドレスにロードされた処理命令に含まれるアドレスを、算出した差分に基づいて補正すればよい。
【0080】
以上、上記の実施形態及び各変形例では、サブプログラム24は、呼出元プログラムが使用するメモリ領域に割り当てられたアドレスとして、スタック領域M14等から取得できる戻り先アドレスを用いて呼出元プログラムの認証を行う例について説明した。しかし、サブプログラム24は、呼出元プログラムの認証が行うことができれば、戻り先アドレス以外のアドレスを用いることもできる。
【0081】
そこで、本実施形態の第3変形例では、戻り先アドレス以外のアドレスとして、メインプログラム22がサブプログラムを呼び出す際に渡す引数に示されるアドレスを用いて呼出元プログラムの認証を行う場合について説明する。
【0082】
第3変形例では、引数に示されるアドレスとして、コールバックアドレスを用いる。ここで、コールバックアドレスとは、呼出対象のコールバック関数が格納される場所のアドレスのことをいう。コールバック関数とは、サブプログラム24が呼出元プログラムからの呼び出しに応じて呼び出す呼出元プログラム中の関数のことをいう。つまり、サブプログラム24は、呼出元プログラムから渡された引数に示されるコールバックアドレスにアクセスして、コールバック関数を呼び出す。
【0083】
第3変形例では、サブプログラム24が、呼出元プログラムから渡される引数に示されるコールバックアドレスを用いる点で、スタック領域M14などから取得した戻り先アドレスを用いる上記の実施形態とは異なる。しかし、それ以外の点では処理手順において上記の実施形態と同様でよいため、詳細な説明は省略する。よって、上記の実施形態の説明を、適宜戻り先アドレスからコールバックアドレスに読み替えて参照されたい。
【0084】
さらに、第1変形例や第2変形例における処理手順でも戻り先アドレスの代わりにコールバックアドレスを用いることができる。よって、この場合にも、第1変形例や第2変形例の説明を、適宜戻り先アドレスからコールバックアドレスに読み替えて参照されたい。
【0085】
なお、コールバックアドレスを用いる場合にも、メインプログラム22の格納されるメモリ領域のアドレスの再割り当てを考慮するべき場合がある。この場合には、第1,第2変形例と同様に、サブプログラム24は、図6に示す手順に基づいて、アドレスの再割り当てが行われたかどうかを判定して、再割り当てが行われている場合には、差分を求める。そして、サブプログラム24は、その差分に基づいて、取得したコールバックアドレスやコールバックアドレスを基準として定められる所定のアドレス範囲に格納されているプログラムデータの補正を行った後に、呼出元プログラムの認証を行う。
【0086】
また、上記の実施形態や各変形例において示した呼出元プログラムの認証処理は、サブプログラム24がサブ処理の結果得られるデータを呼出元プログラムに戻す処理を行う前に実行すればよい。例えば、サブプログラム24は、呼出命令を受けた直後や、コールバック関数を呼び出す直前、サブ処理の結果得られるデータを呼出元プログラムへ戻す直前などに呼出元プログラムの認証処理を行えばよい。
【0087】
以上説明してきた各処理はプログラムの形態で配布することもできる。その場合、フロッピー(登録商標)ディスク、CD−ROM、DVDなどの記録媒体に上記プログラムを記録させて配布したり、或いは、公衆網等で用いられる伝送媒体を介して、そのプログラムやファイルの一部、若しくは全部を配信するようにしたりすることができる。この場合、それを受け取ったユーザは、CD−ROM装置などの読み取り装置(入出力部の一部)を利用してフロッピー(登録商標)ディスクやCD−ROMやDVDなどの可搬型記録媒体から上記プログラムを外部記録部にコピーしたり、コンピュータの通信部を介してインターネットから上記プログラムを外部記録部にコピーしたりすることができる。そして、CPUで実行することにより、ユーザのコンピュータ上でも上述した機能を実現できる。
【図面の簡単な説明】
【0088】
【図1】実施形態や第1乃至第3変形例における情報処理装置の機能ブロックを示す図である。
【図2】情報処理装置が備えるハードディスクの概念図である。
【図3】メインメモリに構築されたアドレス空間の模式図である。
【図4】実施形態において、呼出元プログラムから呼び出された場合におけるサブプログラムの処理手順を示すフローチャートである。
【図5】第1変形例において、呼出元プログラムから呼び出された場合におけるサブプログラムの処理手順を示すフローチャートである。
【図6】再割り当てが行われているかどうかを検証する場合におけるサブプログラムの処理手順を示すフローチャートである。
【図7】第2変形例において、呼出元プログラムから呼び出された場合におけるサブプログラムの処理手順を示すフローチャートである。
【符号の説明】
【0089】
10 CPU、20 ハードディスク、22 メインプログラム、24 サブプログラム、30 メインメモリ。

【特許請求の範囲】
【請求項1】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理をコンピュータに実行させるためのサブプログラムにおいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
コンピュータに実行させるためのサブプログラム。
【請求項2】
請求項1に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスに基づいて前記呼出元プログラムが使用するメモリ領域に関するメモリ情報を取得し、該メモリ情報に基づいて前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項3】
請求項1に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスに基づいて前記呼出元プログラムの属性情報を取得して、該属性情報と正規のメインプログラムの属性情報とを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項4】
請求項1に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスと正規のメインプログラムにおける本来のアクセス先アドレスとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項5】
請求項4に記載のサブプログラムにおいて、
前記判定処理では、正規のメインプログラムの本来のアクセス先アドレス群が登録されたアドレスリストを参照することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項6】
請求項4または5に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて、前記取得したアクセス先アドレスを補正し、補正後のアクセス先アドレスに基づいて該呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項7】
請求項1に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項8】
請求項7に記載のサブプログラムにおいて、
前記所定のアドレス範囲には、アドレスの再割り当てによって内容が変更されうるデータを格納するアドレスは含まないことを特徴とするサブプログラム。
【請求項9】
請求項7に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスに基づいて、該呼出元プログラムが格納されるメモリ領域の先頭アドレスを取得し、取得した先頭アドレスと予め登録された正規のメインプログラムの先頭アドレスとを比較して、差分がある場合にはその差分を求め、その差分に基づいて前記判定対象データを補正し、補正後の判定対象データと前記格納されるべきデータとを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項10】
請求項1に記載のサブプログラムにおいて、
前記判定処理では、前記取得したアクセス先アドレスを基準として定められる所定のアドレス範囲に格納された判定対象データをメモリから取得し、そのデータのハッシュ値を計算し、該判定対象データと正規のメインプログラムにおける本来のアクセス先アドレスを基準として定められる該所定のアドレス範囲に格納されるべきデータから求められるハッシュ値とを比較することで、前記呼出元プログラムが正規のメインプログラムか否かを判定することを特徴とするサブプログラム。
【請求項11】
請求項1乃至請求項10のいずれか1つに記載のサブプログラムにおいて、
前記アクセス先アドレスは、前記サブプログラムによる一連の処理が終了後に前記サブプログラムが実行制御を移す戻り先アドレスであることを特徴とするサブプログラム。
【請求項12】
請求項1乃至請求項10のいずれか1つに記載のサブプログラムにおいて、
前記アクセス先アドレスは、前記サブプログラムが前記呼出元プログラムから呼び出される際に前記呼出元プログラムから渡される引数に示されるアドレスであることを特徴とするサブプログラム。
【請求項13】
請求項12に記載のサブプログラムにおいて、
前記アドレスは、前記呼出元プログラムからコールバック先として指定されたコールバックアドレスであることを特徴とするサブプログラム。
【請求項14】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理を行うサブプログラムをロードして、当該サブプログラムを実行する情報処理装置において、
前記サブプログラムに基づいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したメモリ情報に基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
実行する情報処理装置。
【請求項15】
メインプログラムからの呼出命令に応じて所定の処理を行い、処理結果を該メインプログラムに戻すサブ処理を行うサブプログラムを実行する情報処理装置におけるプログラム制御方法において、
前記情報処理装置が前記サブプログラムに基づいて、
呼出元プログラムからの呼出命令に応じて、前記サブプログラムがアクセスするアクセス先アドレスであって該呼出元プログラムのメモリ領域に割り当てられたアクセス先アドレスを取得するアドレス取得処理と、
取得したアクセス先アドレスに基づいて、前記呼出元プログラムが正規のメインプログラムか否かを判定する判定処理と、
判定の結果、前記呼出元プログラムが正規のメインプログラムではない場合、前記サブ処理の実行を中断する中断処理とを、
実行することを特徴とするプログラム制御方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate