エントリ書換装置及びエントリ書換プログラム
【課題】情報システム内のOSカーネル、プログラム群を改変せずに、エラー模擬やトレース情報取得の可能な装置を提供する。
【解決手段】対象計算機101は、指定された共有ライブラリAPIの属する所属共有ライブラリをプロセス空間にマップし、所属共有ライブラリの先頭アドレスを保持し、マップされた所属共有ライブラリに属する指定に係る共有ライブラリAPIに対応するジャンプ命令を記録し、記録したジャンプ命令をカーネル飛び込み用システムコールに使用するリブートシステムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部12と、カーネル飛び込み用システムコールに設定されているリブートシステムコールのエントリのジャンプ命令のジャンプ先アドレスを記録し、記録したジャンプ先アドレスをもつジャンプ命令を、任意コード実行部32−1へのジャンプ命令に書き換えるシステムコールエントリ書換部11とを備えた。
【解決手段】対象計算機101は、指定された共有ライブラリAPIの属する所属共有ライブラリをプロセス空間にマップし、所属共有ライブラリの先頭アドレスを保持し、マップされた所属共有ライブラリに属する指定に係る共有ライブラリAPIに対応するジャンプ命令を記録し、記録したジャンプ命令をカーネル飛び込み用システムコールに使用するリブートシステムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部12と、カーネル飛び込み用システムコールに設定されているリブートシステムコールのエントリのジャンプ命令のジャンプ先アドレスを記録し、記録したジャンプ先アドレスをもつジャンプ命令を、任意コード実行部32−1へのジャンプ命令に書き換えるシステムコールエントリ書換部11とを備えた。
【発明の詳細な説明】
【技術分野】
【0001】
この発明は、共有ライブラリAPIのエントリと、カーネル飛び込み用システムコールのエントリとを書き換えるエントリ書換装置及びエントリ書換プログラムに関する。
【背景技術】
【0002】
情報システムの検証・試験においては、情報システムを構成するプログラム群が、「各種ライブラリ群、及びOS、ハードウェア」のエラーを含む各種動作に対して、設計通りに正しく動作するかを実際に動作させて検証し、正しく処理が行われているかを各種トレース情報を取得して検証する必要がある。しかし、検証を行う為に、「各種ライブラリ群、OS、ハードウェア」のエラーを模擬したり、トレース情報を取得したりするのは、一般に困難である。従来では、特許文献1、特許文献2に示すように、OSやハードウェアのエラーを模擬する為に、特定のドライバインターフェース、もしくは、OSのシステムコールをフックして、OSやハードウェアのエラー情報を注入して模擬する手法がある(トレース情報の取得も同様の手法で可能)。
【0003】
しかし、各種ライブラリ群のエラーを模擬したり、トレース情報を取得する為には、この手法は利用できない。これは、従来技術では、カーネル内(システムコール、ドライバインターフェース)に入ってからフックするので可能だったが、各種ライブラリはカーネル内ではなく、ユーザ空間にあるので、ユーザプログラムの改変なしには同様の手法が利用できないからでる。
【0004】
また、特許文献3に示すように、各種ライブラリインターフェース群のエラーを模擬する為に、ライブラリのラッパ関数を用いて、エラー情報を注入して模擬する手法がある(トレース情報の取得も同様の手法で可能)。しかし、ラッパ関数を用いる為には、対象プログラムにラッパ関数のリンクを作成する必要、即ち、対象プログラムの改変が必要であり、情報システム内の全てのプログラムを改変する必要がある。この点で、第三者提供のプログラムにはこのような改変は適用できない。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2009−104490号公報、図2等
【特許文献2】特開2000−259446号公報、図2等
【特許文献3】特開2007−133590号公報、図6等
【発明の概要】
【発明が解決しようとする課題】
【0006】
従来のシステムコールをフックしてOSやハードウェアのエラーを模擬する手法や、ライブラリのラッパ関数を用意して各種ライブラリ群のエラーを模擬する手法には、以下のような課題があった。
(1)各種ライブラリAPI(Application Programming Interface)群のエラーを模擬するには、対象プログラムを改変する必要があり、組合せ試験、システム試験での利用が困難であるし、改変が行えない第三者プログラムには適用できない。
(2)システムコールをフックする手法は、エラー注入などの任意のコードを実行する論理空間がカーネル空間30に限られ、一方、各種ライブラリ群が動作する論理空間はプロセス空間(ユーザ空間)である。よって、各種ライブラリAPIを同様にフックする手法が利用できない。敢えてフックしようとすると、予め任意コード実行用のコードを対象プログラムに埋め込む必要があり、これは、ラッパ関数を用いる場合と同様に対象プログラムを改変する必要がある。又は、カーネル空間30で実行しようとすると、カーネル空間30に飛び込む為に、フックしたい共有ライブラリAPIの1つ1つに個別に対応する疑似システムコールをOSカーネル内に用意する必要があり、OSカーネルの改変が必要になる。
【0007】
本発明は、各種ライブラリAPIをフックして任意のコードをカーネル空間内で実行できるような仕掛けをすることにより、対象となる情報システム内のOSカーネル及びプログラム群を改変せずに、エラー模擬やトレース情報の取得を可能とすることを目的とする。
【課題を解決するための手段】
【0008】
この発明のエントリ書換装置は、
指定された共有ライブラリAPI(Application Programming Interface)の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリAPIに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部と、
前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部と
を備えたことを特徴とする。
【発明の効果】
【0009】
本発明により、対象となる情報システム内のOSカーネル及びプログラム群を改変せずに、エラー模擬やトレース情報の取得が可能となる。
【図面の簡単な説明】
【0010】
【図1】実施の形態1の対象計算機101のブロック図。
【図2】実施の形態1の対象計算機101の事前準備段階の動作フロー。
【図3】実施の形態1の対象計算機101の各要素のアクセス先を示す図。
【図4】実施の形態1の共有ライブラリシンボルテーブル32−4を示す図。
【図5】実施の形態1の実行条件テーブル32−3を示す図。
【図6】実施の形態1の共有ライブラリAPIエントリ、rebootシステムコールエントリを示す図。
【図7】実施の形態1のエントリ保存テーブルを示す図。
【図8】実施の形態1の任意コード実行部32−1の動作を示すフロー。
【図9】実施の形態1の対象計算機101の各要素のアクセス先を示す図。
【図10】実施の形態1のCPUレジスタを示す図。
【図11】実施の形態1のプロセス空間の内訳を示す図。
【図12】実施の形態2の対象計算機102のブロック図。
【図13】実施の形態2のバックトレース実行部32−5の動作概念を示す図。
【図14】実施の形態2の共有ライブラリの呼ばれた経路を示す概念図。
【図15】実施の形態2の共有ライブラリの呼ばれた経路を示す概念図。
【図16】実施の形態2のバックトレース実行部32−5の動作フロー。
【図17】実施の形態2の個別プロセスシンボルテーブル32−6を示す図。
【図18】実施の形態2の実行条件テーブルを示す図。
【図19】実施の形態3の対象計算機の外観の一例を示す図。
【図20】実施の形態3の対象計算機のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【0011】
実施の形態1.
図1は、対象計算機101(エントリ書換装置、任意コード実行方式)の動作原理を示す構成図である。図1において、対象計算機101は、試験・検証の対象となる情報システムを構成するプログラム群が動作する計算機である。
(1)条件設定コマンド部10は、対象計算機101を利用する為のマン・マシン・インターフェース手段を提供する。
(2)システムコールエントリ書換部11は、カーネル飛び込み用システムコールエントリ31−1にあるカーネル飛び込み用システムコール実体31−2へのジャンプ命令を任意コード実行部32−1へジャンプ命令へ書き換える。
(3)ライブラリAPIエントリ書換部12は、エラー注入やトレース情報取得などの任意のコードを実行したい任意の共有ライブラリAPIエントリ22−1にある共有ライブラリAPI実体22−2へのジャンプ命令を、カーネル飛び込み用システムコールエントリ31−1へとジャンプする為の割込命令に書き換える。
(4)条件設定部13は、任意コードを実行する為の条件、例えば、呼出プロセスが指定のプログラムであった時のみ実行するなど、を実行条件テーブル32−3に設定する。
(5)シンボルテーブル生成部14は、フックしたい共有ライブラリAPIが属する共有ライブラリの共有ライブラリシンボルテーブル32−4を生成し、共有ライブラリシンボルテーブル32−4に保存する。
(6)任意コード実行部32−1は、実行条件テーブル32−3の条件に合致する場合に任意のコードを実行する。
【0012】
(動作の説明)
次に動作について説明する。
なお、実施の形態1では、任意のコードとしてエラー模擬を行うコードを実行する場合を例に説明するが、トレース情報を取得する場合や、他の任意のコードを実行する場合も同様である。
【0013】
図2は、対象計算機101の基本動作の内、事前準備段階の動作フローである。
図3は、各構成要素がどこにアクセスしているかを示す図である。
【0014】
(シンボルテーブル生成部14)
まず、シンボルテーブル生成部14は、図4に示すような共有ライブラリシンボルテーブル32−4に、操作者(ユーザ)によって指定された共有ライブラリAPIに関する情報を登録し、既に登録済みの場合はなにも行わない(S11)。図4では、共有ライブラリ名、APIシンボル名及びAPIエントリアドレスが登録されている。
【0015】
(条件設定部13)
次に,条件設定部13は、図5に示すような実行条件テーブル32−3に、操作者(ユーザ)による指定に従って、対象となる共有ライブラリAPIシンボル名、返値設定条件、呼出プログラム名などの情報を実行条件として登録する(S12)。なお、実行条件としては、操作者は、他にプロセスID、呼出元プログラム内の関数名などを指定可能である。
【0016】
(ライブラリAPIエントリ書換部12)
次に、ライブラリAPIエントリ書換部12は、操作者によって指定された共有ライブラリAPIが属する共有ライブラリを、条件設定コマンド部10が動作しているAppプロセス空間20にマップし、マップした先頭アドレスを保持する(S13)。この先頭アドレスを「0xVWXY」とする。この先頭アドレスは、後述する図8のS28の処理で使用される。
次に、ライブラリAPIエントリ書換部12は、図6の(a)に示すような、マップされた共有ライブラリの一部である共有ライブラリAPIエントリ22−1のうち、対象となる共有ライブラリAPIに対応するエントリのジャンプ命令(例えば図6の(a)のBL0x2A00)を読み取る。そして、ライブラリAPIエントリ書換部12は、この読み取った共有ライブラリAPI実体への本来のジャンプ先であるアドレス(BL0x2A00)を、図7(図7のAPIエントリの部分)に示すようなエントリ保存テーブル32−2(fwriteのBL0x2A00)に記録し(S14)、さらに、図6の(a)の対象ライブラリAPIエントリにあるジャンプ命令(BL0x2A00)を、カーネル飛び込み用システムコールに使用するrebootシステムコールへジャンプする割込命令(INT 0x〜)に書き換える(S15)。
なお、この例では、カーネル飛び込み用システムコールとしてrebootシステムコールを使用する場合を説明したが一例であり、rebootシステムコールを必ず使用する必要があるということではない。「実際にシステムコールが呼ばれたのか、書き換えられたエントリから飛び込んできたのか、が簡易に判別できるシステムコール」であれば良く、この条件に合致するシステムコールの一例として、rebootシステムコール
を使用する場合を説明した。
【0017】
(システムコールエントリ書換部11)
次に、システムコールエントリ書換部11は、カーネル飛び込み用システムコールに設定したrebootシステムコールのエントリ(図6の(b))にあるカーネル飛び込み用システムコール実体31−2へのジャンプ命令のジャンプ先アドレス(図6の(b)の「0xABCD」)を、エントリ保存テーブル32−2に記録(図7の上側に示すrebootの範囲)し(S16)、カーネル飛び込み用システムコールのエントリにあるジャンプ命令(図6の(b)のBL 0xABCD)を任意コード実行部32−1へのジャンプ命令に書き換える。以上が事前準備段階の動作フローである。
【0018】
図8は、対象計算機101の基本動作のうち、実際に対象となる情報システムを動作させて、検証・試験する際の動作フローである。
図9は、対象となったプログラムの実行フローの概略図である。
【0019】
(ロードモジュール共有ライブラリAPI呼出21)
まず、ロードモジュール21内において共有ライブラリAPI(例えばfwriteとする)が呼び出される時には、ロードモジュール共有ライブラリAPI呼出21内から、図6(a)の共有ライブラリAPIエントリ22−1にジャンプし(S21)、事前に書き換えている割込命令(INT 0x〜:カーネル飛び込み用システムコールへジャンプする割込命令)により、OSカーネル31内にジャンプする(S22)。事前に書き換えられたrebootシステムコールエントリ(任意コード実行部32−1へのジャンプ命令に書き換え済み)のジャンプ命令により、ドライバ32内の任意コード実行部32−1にジャンプする(S23)。
【0020】
(任意コード実行部32−1)
次に、任意コード実行部32−1は、まず、図10に示すような、CPUが持つ割込履歴レジスタを読み出して、どの共有ライブラリAPIエントリ22−1で割込をかけてジャンプしてきのか確認し、共有ライブラリAPIエントリアドレスを取得する(S24)。
【0021】
次に、任意コード実行部32−1は、呼出の第1、第2引数がrebootシステムコールのマジックコードであるか、第3引数が正しいrebootシステムコールのコマンドコードであるかを確認する(S25)。任意コード実行部32−1は、正しい引数であれば、エントリ保存テーブル32−2に記録してあるrebootシステムコールの実体アドレスにジャンプしてシステムコールの処理を行う(S26)。
【0022】
正しい引数でなければ(検証対象プロセスの可能性がある)、以下の処理になる。共有ライブラリAPIエントリのアドレスは、図11に示すように、プロセスごとに共有ライブラリのマップされるアドレスが異なる。よって、任意コード実行部32−1は、自プロセス内のメモリマップテーブルを参照して、S24で取得した共有ライブラリAPIエントリアドレスが、どの共有ライブラリに属するのかを確認する(S27)。なお、この段階では、シンボル名までは特定できない。アドレスのみ判っているので、任意コード実行部32−1は、共有ライブラリのマップされたアドレスから、どの共有ライブラリがマップされたアドレス領域かを判断出来る。属する共有ライブラリ(S27で特定した共有ライブラリ)が、特定した共有ライブラリのマップされた先頭アドレスと、共有ライブラリAPIのエントリアドレス(S24で取得)から、割り込みに係る共有ライブラリの、先頭から共有ライブラリAPIのエントリアドレスまでのアドレス差を算出(Δアドレスとおく)(S28)する。
【0023】
そして、任意コード実行部32−1は、共有ライブラリシンボルテーブル33−4内を検索して、対象の共有ライブラリAPIであるかをチェックする。この際、任意コード実行部32−1は、事前準備段階のS13で保持した先頭アドレス(「0xVWXY」)に、S28で算出した「Δアドレス」を加えて加算アドレス値を得る。そして、任意コード実行部32−1は、この加算アドレス値に相当するアドレスを共有ライブラリシンボルテーブル32−4から見つけ、かつ、その行に割り込み係る共有ライブラリの名があるかどうかでチェックを行う。対象の共有ライブラリAPIでなければ、正規に呼ばれたrebootシステムコールであると判断し、エントリ保存テーブル32−2にあるrebootシステムコールの実体にジャンプする(S29)。なおS29でNOの場合とは、前記チェックによって特定された行のシンボル名が、図5の実行条件テーブル32−3に登録されたAPIシンボル名ではない場合である。rebootシステムコールのマジックコードに該当せずにこちらに分岐(S25でNO)したのに、実行条件テーブル32−3にシンボルがないということは、任意コード実行部32−1は、ロードモジュール共有ライブラリAPI呼出21がrebootシステムコールを誤った引数で呼んでいると判断する。
【0024】
対象の共有ライブラリAPIの場合、実行条件テーブル32−3を参照し、呼出元プログラム、返値条件などが合致するかを判定する(S30)。合致しない場合は、任意コード実行部32−1は、エントリ保存テーブル32−2にある共有ライブラリAPIの正規の飛び先アドレスにジャンプする(S33)。
条件に合致した場合は、任意コード実行部32−1は、返値設定を行い(S31)、カーネルスタック内に保存されたRP(リターンポインタ)が示すAppプロセス空間20のロードモジュール共有ライブラリAPI呼出21内の共有ライブラリAPI呼出の直後にジャンプする(S32)。
【0025】
これにより、各種ライブラリAPIをフックして任意のコードをカーネル空間30内で実行できるようにすることにより、対象となる情報システム内のOSカーネル31、及び、プログラム群を改変せずに、エラー模擬やトレース情報の取得が可能となる。
【0026】
実施の形態2.
次に、図12〜図18を参照して実施の形態2の対象計算機102を説明する。対象計算機102は、実施の形態1の対象計算機101に対して、さらに、バックトレース実行部32−5と、個別プロセスシンボルテーブル32−6(図17)とを備えた構成である。
【0027】
図12は、対象計算機102のブロック図である。
図13は、バックトレース実行部32−5の動作概念を示している。
図14は、共有ライブラリの呼ばれた経路を示す概念図である。
図15は、共有ライブラリの呼ばれた経路を示す概念図である。
図16は、バックトレース実行部32−5の動作フローである。
図17は、個別プロセスシンボルテーブル32−6を示す図である。
図18は、実施の形態2における実行条件テーブルを示す図である。
【0028】
実施の形態2の対象計算機102は、実施の形態1で説明した内容に加えて、共有ライブラリAPIの呼出元経路を条件指定可能とする。対象計算機102は、図12において、実施の形態1での構成(図1)に加えて、バックトレース実行部32−5と個別プロセスシンボルテーブル32−6(図12では、個別Procシンボルテーブルと表記した)を持つ。
【0029】
(動作の説明)
次に動作について説明する。
図13は、バックトレース実行部32−5の動作概念を示している。バックトレース実行部32−5は、図8の返値設定条件に合致するかの判断時(図8のS30)に呼ばれる。バックトレース実行部32−5は、指定された経路、例えば、図14において、共有ライブラリAPIslib_2が、sub_02、sub_13を経由して呼ばれた時に合致するかを判断する為にバックトレースを行う。
【0030】
図16は動作フローを示す。まず、図18の実行条件テーブルに示すように、呼び出されたAPI(slib_2)に対して、返値設定条件として、呼出元条件が設定されていた場合、図16のフローで条件確認が行われる。図16のフローにおいては、まず、共有ライブラリAPI slib_2が呼び出された時、即ち、システムコールに書き換えられているので割込が発生した時に行われるレジスタ退避領域(図13の(1))より、割込発生時のプログラムカウンタ(PC)の値、及び、スタックポインタ(SP)の値を取得する(S41)。
【0031】
次にプログラムカウンタ値が指すアドレスが、個別プロセスシンボルテーブル(図17)上のどのシンボルに該当するアドレスか確認して、そのシンボル名を保持する(S44)。例えば、PCが0x00400550を指していたとすれば、シンボル名sub_12のアドレス領域に該当する。
【0032】
次に保持されたシンボル名がmainかどうかを確認し(S45)、Yesであれば、最後までバックトレースが完了したとして条件に合致しないとしてフローを終了する(S46)。Noであれば、保持したシンボル名が条件にあっているか確認し(S47)、Yesの場合、更に条件を全て満たしたかを確認する(S48)。Yesであれば、条件に合致したとしてフローを終了する(S49)。Noであれば、スタックポインタが指すアドレス(スタック領域の先頭を指す)よりリターンポインタ(RP)値と次のスタックポインタ(SP)値を取得する(S50)。
【0033】
次にリターンポインタ値が指すアドレスが、個別プロセスシンボルテーブル(図17)上のどのシンボルに該当するアドレスか確認して、そのシンボル名を保持する(S51)。
【0034】
以降、(S45)〜(S51)をフローに従って終了条件を満たすまで繰り返す。なお、図16のS42の個別プロセスシンボルテーブル(図17)の生成の手段としては、ロードモジュールのシンボルテーブル、及び、そのプロセスにマップされた共有ライブラリのシンボルテーブルのアドレスを演算したアドレス(共有ライブラリのマップされた先頭アドレスにシンボルテーブルに記録されたアドレスを足す)をアドレスでソートすることによりなされる。これにより、例えば、図15のように複数の関数から呼ばれ得る共有ライブラリAPIをフックしてエラーを注入したりする場合に、特定のエラー処理を試験しようとしても特定できないという課題を解決でき、網羅的な試験を可能とする効果がある。
【0035】
実施の形態3.
図19、図20を参照して実施の形態3を説明する。実施の形態3は、コンピュータである対象計算機101、102のハードウェア構成を説明する。
図19は、コンピュータである対象計算機101あるいは対象計算機102の外観の一例を示す図である。
図20は、対象計算機101あるいは対象計算機102のハードウェア資源の一例を示す図である。以下の説明は対象計算機101とする。対象計算機102についても対象計算機101の説明がそのまま当てはまる。
【0036】
外観を示す図19において、対象計算機101は、システムユニット830、CRT(Cathode・Ray・Tube)やLCD(液晶)の表示画面を有する表示装置813、キーボード814(Key・Board:K/B)、マウス815、コンパクトディスク装置818(CDD:Compact Disk Drive)などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。システムユニット830はネットワークに接続している。
【0037】
またハードウェア資源を示す図20において、対象計算機101は、プログラムを実行するCPU810(Central Processing Unit)を備えている。CPU810は、バス825を介してROM(Read Only Memory)811、RAM(Random Access Memory)812、表示装置813、キーボード814、マウス815、通信ボード816、CDD818、磁気ディスク装置820と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置820の代わりに、光ディスク装置、フラッシュメモリなどの記憶装置でもよい。
【0038】
RAM812は、揮発性メモリの一例である。ROM811、CDD818、磁気ディスク装置820等の記憶媒体は、不揮発性メモリの一例である。これらは、「記憶装置」あるいは記憶部、格納部、バッファの一例である。通信ボード816、キーボード814などは、入力部、入力装置の一例である。また、通信ボード816、表示装置813などは、出力部、出力装置の一例である。通信ボード816は、ネットワークに接続されている。
【0039】
磁気ディスク装置820には、オペレーティングシステム821(OS)、ウィンドウシステム822、プログラム群823、ファイル群824が記憶されている。プログラム群823のプログラムは、CPU810、オペレーティングシステム821、ウィンドウシステム822により実行される。
【0040】
上記プログラム群823には、以上の実施の形態の説明において「〜部」として説明した機能を実行するプログラムが記憶されている。プログラムは、CPU810により読み出され実行される。
【0041】
ファイル群824には、以上の実施の形態の説明において、「〜の判定結果」、「〜の算出結果」、「〜の抽出結果」、「〜の生成結果」、「〜の処理結果」として説明した情報や、データや信号値や変数値やパラメータなどが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU810によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのCPUの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【0042】
また、以上に述べた実施の形態の説明において、データや信号値は、RAM812のメモリ、CDD818のコンパクトディスク、磁気ディスク装置820の磁気ディスク、その他光ディスク、ミニディスク、DVD(Digital・Versatile・Disk)等の記録媒体に記録される。また、データや信号は、バス825や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【0043】
また、以上の実施の形態の説明において、「〜部」として説明したものは、「〜手段」、であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明したものは、ソフトウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、DVD等の記録媒体に記憶される。プログラムはCPU810により読み出され、CPU810により実行される。すなわち、プログラムは、以上に述べた「〜部」としてコンピュータを機能させるものである。あるいは、以上に述べた「〜部」の手順や方法をコンピュータに実行させるものである。
【0044】
以上の実施の形態では、装置としての対象計算機101(エントリ書換装置)を説明したが、対象計算機101の動作をエントリ書換プログラムとしても把握できることは以上の説明から明らかである。
【0045】
以上の実施の形態では、以下の手段、要素を備え、アプリケーションプログラムを改変せずに任意のコードをカーネル空間で実行可能とする任意コード実行方式を説明した。
(a)試験実施者と対話的に任意コード実行条件の入力を受け付けて、条件設定部に対して実行条件テーブルへの書き込みを指示すると共に、ライブラリAPIエントリ書換部に対して任意コード実行のトリガーとなるライブラリAPIエントリの書換を指示すると共に、システムコールエントリ書換部に対してカーネル飛び込み用システムコールに指定したシステムコールのエントリの書換を指示すると共に、シンボルテーブル生成部に対して対象となる共有ライブラリのシンボルテーブルの生成を指示する手段(条件設定コマンド);
(b)対象プログラムが動的にリンクする共有ライブラリ内の対象となる共有ライブラリAPIエントリの飛び先をカーネル飛び込み用システムコールエントリのアドレスに書き換え、元のアドレスをエントリ保存テーブルに保持する手段(ライブラリAPIエントリ書換部);
(c)カーネル内のシステムコールエントリの飛び先を任意コード実行部へと書き換える手段(システムコールエントリ書換部);
(d)任意コードを実行する条件として、対象共有ライブラリAPI、指定プログラム、プロセスIDなどの組合わされた条件を実行条件テーブルに書き込む手段(条件設定部);
(e)対象となる共有ライブラリAPIが属する共有ライブラリを検索し、その共有ライブラリのシンボルテーブルを相対アドレス値でソートした状態で共有ライブラリシンボルテーブルに保存する手段(シンボルテーブル生成部);
(f)呼び出されると、どの共有ライブラリAPIから呼び出されたのかを判別した上で実行条件テーブルをチェックし、条件に合致した場合、指定されたコードを実行する手段(任意コード実行部);
【0046】
以上の実施の形態では、さらに以下の手段、要素を備え、呼出元の関数が呼ばれた経路の条件指定を可能とする任意コード実行方式を説明した。
(a)共有ライブラリAPIがロードモジュール内のどの関数を経由して呼び出されたかを検索する手段(バックトレース実行部);
(b)バックトレースを実行する為に必要な各アプリケーションプロセスの個別のシンボルテーブルを保持する要素(個別プロセスシンボルテーブル);
【符号の説明】
【0047】
101,102 対象計算機、10 条件設定コマンド部、11 システムコールエントリ書換部、12 ライブラリAPIエントリ書換部、13 条件設定部、14 シンボルテーブル生成部、20 Appプロセス空間、21 ロードモジュール共有ライブラリAPI呼出、22 共有ライブラリ群、22−1 共有ライブラリAPIエントリ、22−2 共有ライブラリAPI実体、30 カーネル空間、31 OSカーネル、31−1 カーネル飛び込み用システムコールエントリ、31−2 カーネル飛び込み用システムコール実体、32 ドライバ、32−1 任意コード実行部、32−2 エントリ保存テーブル、32−3 実行条件テーブル、32−4 共有ライブラリシンボルテーブル、32−5 バックトレース実行部、32−6 個別プロセスシンボルテーブル。
【技術分野】
【0001】
この発明は、共有ライブラリAPIのエントリと、カーネル飛び込み用システムコールのエントリとを書き換えるエントリ書換装置及びエントリ書換プログラムに関する。
【背景技術】
【0002】
情報システムの検証・試験においては、情報システムを構成するプログラム群が、「各種ライブラリ群、及びOS、ハードウェア」のエラーを含む各種動作に対して、設計通りに正しく動作するかを実際に動作させて検証し、正しく処理が行われているかを各種トレース情報を取得して検証する必要がある。しかし、検証を行う為に、「各種ライブラリ群、OS、ハードウェア」のエラーを模擬したり、トレース情報を取得したりするのは、一般に困難である。従来では、特許文献1、特許文献2に示すように、OSやハードウェアのエラーを模擬する為に、特定のドライバインターフェース、もしくは、OSのシステムコールをフックして、OSやハードウェアのエラー情報を注入して模擬する手法がある(トレース情報の取得も同様の手法で可能)。
【0003】
しかし、各種ライブラリ群のエラーを模擬したり、トレース情報を取得する為には、この手法は利用できない。これは、従来技術では、カーネル内(システムコール、ドライバインターフェース)に入ってからフックするので可能だったが、各種ライブラリはカーネル内ではなく、ユーザ空間にあるので、ユーザプログラムの改変なしには同様の手法が利用できないからでる。
【0004】
また、特許文献3に示すように、各種ライブラリインターフェース群のエラーを模擬する為に、ライブラリのラッパ関数を用いて、エラー情報を注入して模擬する手法がある(トレース情報の取得も同様の手法で可能)。しかし、ラッパ関数を用いる為には、対象プログラムにラッパ関数のリンクを作成する必要、即ち、対象プログラムの改変が必要であり、情報システム内の全てのプログラムを改変する必要がある。この点で、第三者提供のプログラムにはこのような改変は適用できない。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2009−104490号公報、図2等
【特許文献2】特開2000−259446号公報、図2等
【特許文献3】特開2007−133590号公報、図6等
【発明の概要】
【発明が解決しようとする課題】
【0006】
従来のシステムコールをフックしてOSやハードウェアのエラーを模擬する手法や、ライブラリのラッパ関数を用意して各種ライブラリ群のエラーを模擬する手法には、以下のような課題があった。
(1)各種ライブラリAPI(Application Programming Interface)群のエラーを模擬するには、対象プログラムを改変する必要があり、組合せ試験、システム試験での利用が困難であるし、改変が行えない第三者プログラムには適用できない。
(2)システムコールをフックする手法は、エラー注入などの任意のコードを実行する論理空間がカーネル空間30に限られ、一方、各種ライブラリ群が動作する論理空間はプロセス空間(ユーザ空間)である。よって、各種ライブラリAPIを同様にフックする手法が利用できない。敢えてフックしようとすると、予め任意コード実行用のコードを対象プログラムに埋め込む必要があり、これは、ラッパ関数を用いる場合と同様に対象プログラムを改変する必要がある。又は、カーネル空間30で実行しようとすると、カーネル空間30に飛び込む為に、フックしたい共有ライブラリAPIの1つ1つに個別に対応する疑似システムコールをOSカーネル内に用意する必要があり、OSカーネルの改変が必要になる。
【0007】
本発明は、各種ライブラリAPIをフックして任意のコードをカーネル空間内で実行できるような仕掛けをすることにより、対象となる情報システム内のOSカーネル及びプログラム群を改変せずに、エラー模擬やトレース情報の取得を可能とすることを目的とする。
【課題を解決するための手段】
【0008】
この発明のエントリ書換装置は、
指定された共有ライブラリAPI(Application Programming Interface)の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリAPIに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部と、
前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部と
を備えたことを特徴とする。
【発明の効果】
【0009】
本発明により、対象となる情報システム内のOSカーネル及びプログラム群を改変せずに、エラー模擬やトレース情報の取得が可能となる。
【図面の簡単な説明】
【0010】
【図1】実施の形態1の対象計算機101のブロック図。
【図2】実施の形態1の対象計算機101の事前準備段階の動作フロー。
【図3】実施の形態1の対象計算機101の各要素のアクセス先を示す図。
【図4】実施の形態1の共有ライブラリシンボルテーブル32−4を示す図。
【図5】実施の形態1の実行条件テーブル32−3を示す図。
【図6】実施の形態1の共有ライブラリAPIエントリ、rebootシステムコールエントリを示す図。
【図7】実施の形態1のエントリ保存テーブルを示す図。
【図8】実施の形態1の任意コード実行部32−1の動作を示すフロー。
【図9】実施の形態1の対象計算機101の各要素のアクセス先を示す図。
【図10】実施の形態1のCPUレジスタを示す図。
【図11】実施の形態1のプロセス空間の内訳を示す図。
【図12】実施の形態2の対象計算機102のブロック図。
【図13】実施の形態2のバックトレース実行部32−5の動作概念を示す図。
【図14】実施の形態2の共有ライブラリの呼ばれた経路を示す概念図。
【図15】実施の形態2の共有ライブラリの呼ばれた経路を示す概念図。
【図16】実施の形態2のバックトレース実行部32−5の動作フロー。
【図17】実施の形態2の個別プロセスシンボルテーブル32−6を示す図。
【図18】実施の形態2の実行条件テーブルを示す図。
【図19】実施の形態3の対象計算機の外観の一例を示す図。
【図20】実施の形態3の対象計算機のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【0011】
実施の形態1.
図1は、対象計算機101(エントリ書換装置、任意コード実行方式)の動作原理を示す構成図である。図1において、対象計算機101は、試験・検証の対象となる情報システムを構成するプログラム群が動作する計算機である。
(1)条件設定コマンド部10は、対象計算機101を利用する為のマン・マシン・インターフェース手段を提供する。
(2)システムコールエントリ書換部11は、カーネル飛び込み用システムコールエントリ31−1にあるカーネル飛び込み用システムコール実体31−2へのジャンプ命令を任意コード実行部32−1へジャンプ命令へ書き換える。
(3)ライブラリAPIエントリ書換部12は、エラー注入やトレース情報取得などの任意のコードを実行したい任意の共有ライブラリAPIエントリ22−1にある共有ライブラリAPI実体22−2へのジャンプ命令を、カーネル飛び込み用システムコールエントリ31−1へとジャンプする為の割込命令に書き換える。
(4)条件設定部13は、任意コードを実行する為の条件、例えば、呼出プロセスが指定のプログラムであった時のみ実行するなど、を実行条件テーブル32−3に設定する。
(5)シンボルテーブル生成部14は、フックしたい共有ライブラリAPIが属する共有ライブラリの共有ライブラリシンボルテーブル32−4を生成し、共有ライブラリシンボルテーブル32−4に保存する。
(6)任意コード実行部32−1は、実行条件テーブル32−3の条件に合致する場合に任意のコードを実行する。
【0012】
(動作の説明)
次に動作について説明する。
なお、実施の形態1では、任意のコードとしてエラー模擬を行うコードを実行する場合を例に説明するが、トレース情報を取得する場合や、他の任意のコードを実行する場合も同様である。
【0013】
図2は、対象計算機101の基本動作の内、事前準備段階の動作フローである。
図3は、各構成要素がどこにアクセスしているかを示す図である。
【0014】
(シンボルテーブル生成部14)
まず、シンボルテーブル生成部14は、図4に示すような共有ライブラリシンボルテーブル32−4に、操作者(ユーザ)によって指定された共有ライブラリAPIに関する情報を登録し、既に登録済みの場合はなにも行わない(S11)。図4では、共有ライブラリ名、APIシンボル名及びAPIエントリアドレスが登録されている。
【0015】
(条件設定部13)
次に,条件設定部13は、図5に示すような実行条件テーブル32−3に、操作者(ユーザ)による指定に従って、対象となる共有ライブラリAPIシンボル名、返値設定条件、呼出プログラム名などの情報を実行条件として登録する(S12)。なお、実行条件としては、操作者は、他にプロセスID、呼出元プログラム内の関数名などを指定可能である。
【0016】
(ライブラリAPIエントリ書換部12)
次に、ライブラリAPIエントリ書換部12は、操作者によって指定された共有ライブラリAPIが属する共有ライブラリを、条件設定コマンド部10が動作しているAppプロセス空間20にマップし、マップした先頭アドレスを保持する(S13)。この先頭アドレスを「0xVWXY」とする。この先頭アドレスは、後述する図8のS28の処理で使用される。
次に、ライブラリAPIエントリ書換部12は、図6の(a)に示すような、マップされた共有ライブラリの一部である共有ライブラリAPIエントリ22−1のうち、対象となる共有ライブラリAPIに対応するエントリのジャンプ命令(例えば図6の(a)のBL0x2A00)を読み取る。そして、ライブラリAPIエントリ書換部12は、この読み取った共有ライブラリAPI実体への本来のジャンプ先であるアドレス(BL0x2A00)を、図7(図7のAPIエントリの部分)に示すようなエントリ保存テーブル32−2(fwriteのBL0x2A00)に記録し(S14)、さらに、図6の(a)の対象ライブラリAPIエントリにあるジャンプ命令(BL0x2A00)を、カーネル飛び込み用システムコールに使用するrebootシステムコールへジャンプする割込命令(INT 0x〜)に書き換える(S15)。
なお、この例では、カーネル飛び込み用システムコールとしてrebootシステムコールを使用する場合を説明したが一例であり、rebootシステムコールを必ず使用する必要があるということではない。「実際にシステムコールが呼ばれたのか、書き換えられたエントリから飛び込んできたのか、が簡易に判別できるシステムコール」であれば良く、この条件に合致するシステムコールの一例として、rebootシステムコール
を使用する場合を説明した。
【0017】
(システムコールエントリ書換部11)
次に、システムコールエントリ書換部11は、カーネル飛び込み用システムコールに設定したrebootシステムコールのエントリ(図6の(b))にあるカーネル飛び込み用システムコール実体31−2へのジャンプ命令のジャンプ先アドレス(図6の(b)の「0xABCD」)を、エントリ保存テーブル32−2に記録(図7の上側に示すrebootの範囲)し(S16)、カーネル飛び込み用システムコールのエントリにあるジャンプ命令(図6の(b)のBL 0xABCD)を任意コード実行部32−1へのジャンプ命令に書き換える。以上が事前準備段階の動作フローである。
【0018】
図8は、対象計算機101の基本動作のうち、実際に対象となる情報システムを動作させて、検証・試験する際の動作フローである。
図9は、対象となったプログラムの実行フローの概略図である。
【0019】
(ロードモジュール共有ライブラリAPI呼出21)
まず、ロードモジュール21内において共有ライブラリAPI(例えばfwriteとする)が呼び出される時には、ロードモジュール共有ライブラリAPI呼出21内から、図6(a)の共有ライブラリAPIエントリ22−1にジャンプし(S21)、事前に書き換えている割込命令(INT 0x〜:カーネル飛び込み用システムコールへジャンプする割込命令)により、OSカーネル31内にジャンプする(S22)。事前に書き換えられたrebootシステムコールエントリ(任意コード実行部32−1へのジャンプ命令に書き換え済み)のジャンプ命令により、ドライバ32内の任意コード実行部32−1にジャンプする(S23)。
【0020】
(任意コード実行部32−1)
次に、任意コード実行部32−1は、まず、図10に示すような、CPUが持つ割込履歴レジスタを読み出して、どの共有ライブラリAPIエントリ22−1で割込をかけてジャンプしてきのか確認し、共有ライブラリAPIエントリアドレスを取得する(S24)。
【0021】
次に、任意コード実行部32−1は、呼出の第1、第2引数がrebootシステムコールのマジックコードであるか、第3引数が正しいrebootシステムコールのコマンドコードであるかを確認する(S25)。任意コード実行部32−1は、正しい引数であれば、エントリ保存テーブル32−2に記録してあるrebootシステムコールの実体アドレスにジャンプしてシステムコールの処理を行う(S26)。
【0022】
正しい引数でなければ(検証対象プロセスの可能性がある)、以下の処理になる。共有ライブラリAPIエントリのアドレスは、図11に示すように、プロセスごとに共有ライブラリのマップされるアドレスが異なる。よって、任意コード実行部32−1は、自プロセス内のメモリマップテーブルを参照して、S24で取得した共有ライブラリAPIエントリアドレスが、どの共有ライブラリに属するのかを確認する(S27)。なお、この段階では、シンボル名までは特定できない。アドレスのみ判っているので、任意コード実行部32−1は、共有ライブラリのマップされたアドレスから、どの共有ライブラリがマップされたアドレス領域かを判断出来る。属する共有ライブラリ(S27で特定した共有ライブラリ)が、特定した共有ライブラリのマップされた先頭アドレスと、共有ライブラリAPIのエントリアドレス(S24で取得)から、割り込みに係る共有ライブラリの、先頭から共有ライブラリAPIのエントリアドレスまでのアドレス差を算出(Δアドレスとおく)(S28)する。
【0023】
そして、任意コード実行部32−1は、共有ライブラリシンボルテーブル33−4内を検索して、対象の共有ライブラリAPIであるかをチェックする。この際、任意コード実行部32−1は、事前準備段階のS13で保持した先頭アドレス(「0xVWXY」)に、S28で算出した「Δアドレス」を加えて加算アドレス値を得る。そして、任意コード実行部32−1は、この加算アドレス値に相当するアドレスを共有ライブラリシンボルテーブル32−4から見つけ、かつ、その行に割り込み係る共有ライブラリの名があるかどうかでチェックを行う。対象の共有ライブラリAPIでなければ、正規に呼ばれたrebootシステムコールであると判断し、エントリ保存テーブル32−2にあるrebootシステムコールの実体にジャンプする(S29)。なおS29でNOの場合とは、前記チェックによって特定された行のシンボル名が、図5の実行条件テーブル32−3に登録されたAPIシンボル名ではない場合である。rebootシステムコールのマジックコードに該当せずにこちらに分岐(S25でNO)したのに、実行条件テーブル32−3にシンボルがないということは、任意コード実行部32−1は、ロードモジュール共有ライブラリAPI呼出21がrebootシステムコールを誤った引数で呼んでいると判断する。
【0024】
対象の共有ライブラリAPIの場合、実行条件テーブル32−3を参照し、呼出元プログラム、返値条件などが合致するかを判定する(S30)。合致しない場合は、任意コード実行部32−1は、エントリ保存テーブル32−2にある共有ライブラリAPIの正規の飛び先アドレスにジャンプする(S33)。
条件に合致した場合は、任意コード実行部32−1は、返値設定を行い(S31)、カーネルスタック内に保存されたRP(リターンポインタ)が示すAppプロセス空間20のロードモジュール共有ライブラリAPI呼出21内の共有ライブラリAPI呼出の直後にジャンプする(S32)。
【0025】
これにより、各種ライブラリAPIをフックして任意のコードをカーネル空間30内で実行できるようにすることにより、対象となる情報システム内のOSカーネル31、及び、プログラム群を改変せずに、エラー模擬やトレース情報の取得が可能となる。
【0026】
実施の形態2.
次に、図12〜図18を参照して実施の形態2の対象計算機102を説明する。対象計算機102は、実施の形態1の対象計算機101に対して、さらに、バックトレース実行部32−5と、個別プロセスシンボルテーブル32−6(図17)とを備えた構成である。
【0027】
図12は、対象計算機102のブロック図である。
図13は、バックトレース実行部32−5の動作概念を示している。
図14は、共有ライブラリの呼ばれた経路を示す概念図である。
図15は、共有ライブラリの呼ばれた経路を示す概念図である。
図16は、バックトレース実行部32−5の動作フローである。
図17は、個別プロセスシンボルテーブル32−6を示す図である。
図18は、実施の形態2における実行条件テーブルを示す図である。
【0028】
実施の形態2の対象計算機102は、実施の形態1で説明した内容に加えて、共有ライブラリAPIの呼出元経路を条件指定可能とする。対象計算機102は、図12において、実施の形態1での構成(図1)に加えて、バックトレース実行部32−5と個別プロセスシンボルテーブル32−6(図12では、個別Procシンボルテーブルと表記した)を持つ。
【0029】
(動作の説明)
次に動作について説明する。
図13は、バックトレース実行部32−5の動作概念を示している。バックトレース実行部32−5は、図8の返値設定条件に合致するかの判断時(図8のS30)に呼ばれる。バックトレース実行部32−5は、指定された経路、例えば、図14において、共有ライブラリAPIslib_2が、sub_02、sub_13を経由して呼ばれた時に合致するかを判断する為にバックトレースを行う。
【0030】
図16は動作フローを示す。まず、図18の実行条件テーブルに示すように、呼び出されたAPI(slib_2)に対して、返値設定条件として、呼出元条件が設定されていた場合、図16のフローで条件確認が行われる。図16のフローにおいては、まず、共有ライブラリAPI slib_2が呼び出された時、即ち、システムコールに書き換えられているので割込が発生した時に行われるレジスタ退避領域(図13の(1))より、割込発生時のプログラムカウンタ(PC)の値、及び、スタックポインタ(SP)の値を取得する(S41)。
【0031】
次にプログラムカウンタ値が指すアドレスが、個別プロセスシンボルテーブル(図17)上のどのシンボルに該当するアドレスか確認して、そのシンボル名を保持する(S44)。例えば、PCが0x00400550を指していたとすれば、シンボル名sub_12のアドレス領域に該当する。
【0032】
次に保持されたシンボル名がmainかどうかを確認し(S45)、Yesであれば、最後までバックトレースが完了したとして条件に合致しないとしてフローを終了する(S46)。Noであれば、保持したシンボル名が条件にあっているか確認し(S47)、Yesの場合、更に条件を全て満たしたかを確認する(S48)。Yesであれば、条件に合致したとしてフローを終了する(S49)。Noであれば、スタックポインタが指すアドレス(スタック領域の先頭を指す)よりリターンポインタ(RP)値と次のスタックポインタ(SP)値を取得する(S50)。
【0033】
次にリターンポインタ値が指すアドレスが、個別プロセスシンボルテーブル(図17)上のどのシンボルに該当するアドレスか確認して、そのシンボル名を保持する(S51)。
【0034】
以降、(S45)〜(S51)をフローに従って終了条件を満たすまで繰り返す。なお、図16のS42の個別プロセスシンボルテーブル(図17)の生成の手段としては、ロードモジュールのシンボルテーブル、及び、そのプロセスにマップされた共有ライブラリのシンボルテーブルのアドレスを演算したアドレス(共有ライブラリのマップされた先頭アドレスにシンボルテーブルに記録されたアドレスを足す)をアドレスでソートすることによりなされる。これにより、例えば、図15のように複数の関数から呼ばれ得る共有ライブラリAPIをフックしてエラーを注入したりする場合に、特定のエラー処理を試験しようとしても特定できないという課題を解決でき、網羅的な試験を可能とする効果がある。
【0035】
実施の形態3.
図19、図20を参照して実施の形態3を説明する。実施の形態3は、コンピュータである対象計算機101、102のハードウェア構成を説明する。
図19は、コンピュータである対象計算機101あるいは対象計算機102の外観の一例を示す図である。
図20は、対象計算機101あるいは対象計算機102のハードウェア資源の一例を示す図である。以下の説明は対象計算機101とする。対象計算機102についても対象計算機101の説明がそのまま当てはまる。
【0036】
外観を示す図19において、対象計算機101は、システムユニット830、CRT(Cathode・Ray・Tube)やLCD(液晶)の表示画面を有する表示装置813、キーボード814(Key・Board:K/B)、マウス815、コンパクトディスク装置818(CDD:Compact Disk Drive)などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。システムユニット830はネットワークに接続している。
【0037】
またハードウェア資源を示す図20において、対象計算機101は、プログラムを実行するCPU810(Central Processing Unit)を備えている。CPU810は、バス825を介してROM(Read Only Memory)811、RAM(Random Access Memory)812、表示装置813、キーボード814、マウス815、通信ボード816、CDD818、磁気ディスク装置820と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置820の代わりに、光ディスク装置、フラッシュメモリなどの記憶装置でもよい。
【0038】
RAM812は、揮発性メモリの一例である。ROM811、CDD818、磁気ディスク装置820等の記憶媒体は、不揮発性メモリの一例である。これらは、「記憶装置」あるいは記憶部、格納部、バッファの一例である。通信ボード816、キーボード814などは、入力部、入力装置の一例である。また、通信ボード816、表示装置813などは、出力部、出力装置の一例である。通信ボード816は、ネットワークに接続されている。
【0039】
磁気ディスク装置820には、オペレーティングシステム821(OS)、ウィンドウシステム822、プログラム群823、ファイル群824が記憶されている。プログラム群823のプログラムは、CPU810、オペレーティングシステム821、ウィンドウシステム822により実行される。
【0040】
上記プログラム群823には、以上の実施の形態の説明において「〜部」として説明した機能を実行するプログラムが記憶されている。プログラムは、CPU810により読み出され実行される。
【0041】
ファイル群824には、以上の実施の形態の説明において、「〜の判定結果」、「〜の算出結果」、「〜の抽出結果」、「〜の生成結果」、「〜の処理結果」として説明した情報や、データや信号値や変数値やパラメータなどが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU810によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのCPUの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【0042】
また、以上に述べた実施の形態の説明において、データや信号値は、RAM812のメモリ、CDD818のコンパクトディスク、磁気ディスク装置820の磁気ディスク、その他光ディスク、ミニディスク、DVD(Digital・Versatile・Disk)等の記録媒体に記録される。また、データや信号は、バス825や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【0043】
また、以上の実施の形態の説明において、「〜部」として説明したものは、「〜手段」、であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明したものは、ソフトウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、DVD等の記録媒体に記憶される。プログラムはCPU810により読み出され、CPU810により実行される。すなわち、プログラムは、以上に述べた「〜部」としてコンピュータを機能させるものである。あるいは、以上に述べた「〜部」の手順や方法をコンピュータに実行させるものである。
【0044】
以上の実施の形態では、装置としての対象計算機101(エントリ書換装置)を説明したが、対象計算機101の動作をエントリ書換プログラムとしても把握できることは以上の説明から明らかである。
【0045】
以上の実施の形態では、以下の手段、要素を備え、アプリケーションプログラムを改変せずに任意のコードをカーネル空間で実行可能とする任意コード実行方式を説明した。
(a)試験実施者と対話的に任意コード実行条件の入力を受け付けて、条件設定部に対して実行条件テーブルへの書き込みを指示すると共に、ライブラリAPIエントリ書換部に対して任意コード実行のトリガーとなるライブラリAPIエントリの書換を指示すると共に、システムコールエントリ書換部に対してカーネル飛び込み用システムコールに指定したシステムコールのエントリの書換を指示すると共に、シンボルテーブル生成部に対して対象となる共有ライブラリのシンボルテーブルの生成を指示する手段(条件設定コマンド);
(b)対象プログラムが動的にリンクする共有ライブラリ内の対象となる共有ライブラリAPIエントリの飛び先をカーネル飛び込み用システムコールエントリのアドレスに書き換え、元のアドレスをエントリ保存テーブルに保持する手段(ライブラリAPIエントリ書換部);
(c)カーネル内のシステムコールエントリの飛び先を任意コード実行部へと書き換える手段(システムコールエントリ書換部);
(d)任意コードを実行する条件として、対象共有ライブラリAPI、指定プログラム、プロセスIDなどの組合わされた条件を実行条件テーブルに書き込む手段(条件設定部);
(e)対象となる共有ライブラリAPIが属する共有ライブラリを検索し、その共有ライブラリのシンボルテーブルを相対アドレス値でソートした状態で共有ライブラリシンボルテーブルに保存する手段(シンボルテーブル生成部);
(f)呼び出されると、どの共有ライブラリAPIから呼び出されたのかを判別した上で実行条件テーブルをチェックし、条件に合致した場合、指定されたコードを実行する手段(任意コード実行部);
【0046】
以上の実施の形態では、さらに以下の手段、要素を備え、呼出元の関数が呼ばれた経路の条件指定を可能とする任意コード実行方式を説明した。
(a)共有ライブラリAPIがロードモジュール内のどの関数を経由して呼び出されたかを検索する手段(バックトレース実行部);
(b)バックトレースを実行する為に必要な各アプリケーションプロセスの個別のシンボルテーブルを保持する要素(個別プロセスシンボルテーブル);
【符号の説明】
【0047】
101,102 対象計算機、10 条件設定コマンド部、11 システムコールエントリ書換部、12 ライブラリAPIエントリ書換部、13 条件設定部、14 シンボルテーブル生成部、20 Appプロセス空間、21 ロードモジュール共有ライブラリAPI呼出、22 共有ライブラリ群、22−1 共有ライブラリAPIエントリ、22−2 共有ライブラリAPI実体、30 カーネル空間、31 OSカーネル、31−1 カーネル飛び込み用システムコールエントリ、31−2 カーネル飛び込み用システムコール実体、32 ドライバ、32−1 任意コード実行部、32−2 エントリ保存テーブル、32−3 実行条件テーブル、32−4 共有ライブラリシンボルテーブル、32−5 バックトレース実行部、32−6 個別プロセスシンボルテーブル。
【特許請求の範囲】
【請求項1】
指定された共有ライブラリAPI(Application Programming Interface)の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリAPIに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部と、
前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部と
を備えたことを特徴とするエントリ書換装置。
【請求項2】
前記エントリ書換装置は、さらに、
共有ライブラリAPIに対する所定の実行条件を記憶する実行条件記憶部と、
前記任意コード実行部であって、前記所定のジャンプ命令によって呼ばれることで、前記実行条件記憶部が記憶する前記実行条件に基づいて、前記所定の処理を実行する任意コード実行部と
を備えたことを特徴とする請求項1記載のエントリ書換装置。
【請求項3】
前記エントリ書換装置は、さらに、
所定の共有ライブラリAPIに関する情報を記憶するシンボルテーブル記憶部を備え、
前記任意コード実行部は、
前記所定のジャンプ命令によって呼ばれた場合に、前記シンボルテーブル記憶部に記憶された情報を参照することによりどの前記共有ライブラリAPIから呼び出されたのかを判別し、判別した前記共有ライブラリAPIに対応する実行条件を前記実行条件記憶部から抽出し、抽出した前記共有ライブラリAPIに対応する前記実行条件に基づいて、前記所定の処理を実行することを特徴とする請求項2記載のエントリ書換装置。
【請求項4】
前記任意コード実行部は、
判別した前記共有ライブラリAPIに対応する実行条件を前記実行条件記憶部から抽出した場合に、抽出した前記共有ライブラリAPIに対応する前記実行条件が呼び出された前記共有ライブラリAPIの状態に合致するかどうかを判別し、合致すると判別した場合に、抽出した前記共有ライブラリAPIに対応する前記実行条件に基づいて前記所定の処理を実行することを特徴とする請求項3記載のエントリ書換装置。
【請求項5】
前記エントリ書換装置は、さらに、
アプリケーションプロセスごとにシンボル名と前記シンボルの開始アドレスとが記載され、バックトレースの実行に使用される個別シンボルテーブルを記憶する個別シンボルテーブル記憶部と、
前記個別シンボルテーブル記憶部が記憶する前記個別シンボルテーブルを用いることにより、前記共有ライブラリAPIがどの関数を経由して呼び出されたかを特定する処理を示すバックトレースを実行するバックトレース実行部と
を備えたことを特徴とする請求項4記載のエントリ書換装置。
【請求項6】
コンピュータを、
指定された共有ライブラリAPI(Application Programming Interface)の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリAPIに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部、
前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部、
として機能させるためのエントリ書換プログラム。
【請求項1】
指定された共有ライブラリAPI(Application Programming Interface)の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリAPIに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部と、
前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部と
を備えたことを特徴とするエントリ書換装置。
【請求項2】
前記エントリ書換装置は、さらに、
共有ライブラリAPIに対する所定の実行条件を記憶する実行条件記憶部と、
前記任意コード実行部であって、前記所定のジャンプ命令によって呼ばれることで、前記実行条件記憶部が記憶する前記実行条件に基づいて、前記所定の処理を実行する任意コード実行部と
を備えたことを特徴とする請求項1記載のエントリ書換装置。
【請求項3】
前記エントリ書換装置は、さらに、
所定の共有ライブラリAPIに関する情報を記憶するシンボルテーブル記憶部を備え、
前記任意コード実行部は、
前記所定のジャンプ命令によって呼ばれた場合に、前記シンボルテーブル記憶部に記憶された情報を参照することによりどの前記共有ライブラリAPIから呼び出されたのかを判別し、判別した前記共有ライブラリAPIに対応する実行条件を前記実行条件記憶部から抽出し、抽出した前記共有ライブラリAPIに対応する前記実行条件に基づいて、前記所定の処理を実行することを特徴とする請求項2記載のエントリ書換装置。
【請求項4】
前記任意コード実行部は、
判別した前記共有ライブラリAPIに対応する実行条件を前記実行条件記憶部から抽出した場合に、抽出した前記共有ライブラリAPIに対応する前記実行条件が呼び出された前記共有ライブラリAPIの状態に合致するかどうかを判別し、合致すると判別した場合に、抽出した前記共有ライブラリAPIに対応する前記実行条件に基づいて前記所定の処理を実行することを特徴とする請求項3記載のエントリ書換装置。
【請求項5】
前記エントリ書換装置は、さらに、
アプリケーションプロセスごとにシンボル名と前記シンボルの開始アドレスとが記載され、バックトレースの実行に使用される個別シンボルテーブルを記憶する個別シンボルテーブル記憶部と、
前記個別シンボルテーブル記憶部が記憶する前記個別シンボルテーブルを用いることにより、前記共有ライブラリAPIがどの関数を経由して呼び出されたかを特定する処理を示すバックトレースを実行するバックトレース実行部と
を備えたことを特徴とする請求項4記載のエントリ書換装置。
【請求項6】
コンピュータを、
指定された共有ライブラリAPI(Application Programming Interface)の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリAPIに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリAPIエントリ書換部、
前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリAPIエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部、
として機能させるためのエントリ書換プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【公開番号】特開2012−164098(P2012−164098A)
【公開日】平成24年8月30日(2012.8.30)
【国際特許分類】
【出願番号】特願2011−23430(P2011−23430)
【出願日】平成23年2月6日(2011.2.6)
【出願人】(000006013)三菱電機株式会社 (33,312)
【Fターム(参考)】
【公開日】平成24年8月30日(2012.8.30)
【国際特許分類】
【出願日】平成23年2月6日(2011.2.6)
【出願人】(000006013)三菱電機株式会社 (33,312)
【Fターム(参考)】
[ Back to top ]