(57)【特許請求の範囲】
【請求項１】
動的ＡＰＩフッキング時にフッキングを行うためのコードであるフックの再帰的な実行と定義されるフックの再進入を防止するための装置において、
前記動的ＡＰＩフッキングの開始時点に呼び出されるフック関数の呼び出し如何を示す状態情報フラグを設定または解除する状態情報管理モジュールと、
前記フック関数の呼び出し時に前記状態情報フラグが設定されていれば、前記フック関数の呼び出しが前記フックの実行過程で行われたと判断し、前記フック関数への再進入を防止して値を返還する再進入防止モジュールと、を備えることを特徴とするフック再進入防止装置。
【請求項２】
前記状態情報フラグは、前記フック関数に対応してスレッド別に識別可能な全域データ変数、スレッド地域保存所、静的データ変数またはデータ客体に記録されることを特徴とする請求項１に記載のフック再進入防止装置。
【請求項３】
前記フックの実行過程でスレッドが生成される時点に生成されたスレッドの状態情報を設定するスレッド生成感知モジュールをさらに備え、
前記再進入防止モジュールは、前記スレッド生成感知モジュールによって状態情報が設定されているスレッドによって前記フック関数が呼び出されれば、前記フック関数の呼び出しが前記フックの実行過程で行われると判断することを特徴とする請求項１または２に記載のフック再進入防止装置。
【請求項４】
動的ＡＰＩフッキング時にフッキングを行うためのコードであるフックの再帰的な実行と定義されるフックの再進入を防止するための方法をコンピュータで実行させるためのプログラムを記録したコンピュータで読み取り可能な記録媒体において、
（ａ）原本関数または前記フックの実行過程で行われる下位関数によって、前記動的ＡＰＩフッキングの開始時点に呼び出されるフック関数が呼び出されれば、前記フック関数に対応する関数情報に設定されている状態情報フラグの値を確認する段階と、
（ｂ）前記状態情報フラグの値が設定されていなければ、前記フック関数の呼び出しが前記原本関数により行われると判断して前記状態情報フラグの値を設定し、前記状態情報フラグの値が設定されていれば、前記フック関数の呼び出しが前記フックの実行過程で行われたと判断し、前記フック関数への再進入を防止して値を返還する段階と、をコンピュータで実行させるためのプログラムを記録したコンピュータで読み取り可能な記録媒体。
【請求項５】
前記状態情報フラグは、前記フック関数に対応してスレッド別に識別可能な全域データ変数、スレッド地域保存所、静的データ変数またはデータ客体に記録されることを特徴とする請求項４に記載の記録媒体。
【請求項６】
前記フックの実行過程でスレッドの状態情報を設定する段階をさらに含み、
前記（ｂ）段階で、前記状態情報が設定されているスレッドによって前記フック関数が呼び出されれば、前記フック関数の呼び出しが前記フックの実行過程で行われると判断することを特徴とする請求項４または５に記載の記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フック再進入防止装置及びその方法をコンピュータで実行させるためのプログラムを記録した記録媒体に係り、さらに詳細には、ＡＰＩフッキング時に関数の呼び出し過程におけるフックの再帰的な進入を防止するための装置及びその方法をコンピュータで実行させるためのプログラムを記録した記録媒体に関する。
【背景技術】
【０００２】
ＡＰＩフックは、一般的なＡＰＩ呼び出し過程について、特定の操作により他の位置に関数の呼び出しフローを迂回させる技法を総称する。図１及び図２には、基本的な呼び出し構造及びフックによるＡＰＩフィルタリング過程がそれぞれ示されている。図２に示したように、フック関数Ｂは、原本関数Ａによる目標関数Ｃの呼び出し過程に介入する。このようなフック技法を完成するために導入されるフックレイヤーは、フックの影響を受けてはならない。
【０００３】
図３に示したようなフックレイヤーの理想的な構造は、複数の関数についてフック及び代替／フィルタリング処理を行えるように支援せねばならず、フックレイヤー自体はフックの影響を受けてはならない。このような構造を支援するために、フックレイヤーは、フック対象ＡＰＩを使わないか、または、フック対象ＡＰＩ原本関数を呼び出せるアドレスを明確に分かっていて、必要なときにフックＡＰＩまたは原本ＡＰＩを選択的に呼び出さねばならない。フックレイヤーがフック対象ＡＰＩを使わない場合に、フックレイヤーの内部の動作はＡＰＩフックと関係なくなる。しかし、フックレイヤーがフック対象ＡＰＩを使わないようにすることは容易ではない。すなわち、フックレイヤーがフック対象ＡＰＩを使わないためには、現実的にフック対象ＡＰＩと下位原本関数に対するランタイムバイナリーとの直接的な連関のない場合にのみ可能である。したがって、この機種ＯＳプラットホームにおけるプログラム動作を支援するエミュレータの具現、またはフックＡＰＩをエミュレーションする形態への具現が必要であるため、このような方式はフックレイヤーの具現に適していない。
【０００４】
前述した理由によって、既存にはフックレイヤーがフック対象ＡＰＩ原本関数を呼び出せるアドレスを管理するように具現しており、これに加えて補助的な方法をさらに使ってフックレイヤーがフックの影響を受けないようにしている。この時、フック対象ＡＰＩ原本関数を呼び出せるアドレスを管理する形態でフックレイヤーを具現するプログラミング方式は、ＡＰＩフックの技法によって差がある。先ず、ＩＡＴフックなどのＡＰＩ呼び出し者が呼び出す関数アドレスを修正する場合に、フックレイヤーに属する＊．ｅｘｅ、＊．ｄｌｌなどのランタイムモジュール単位でフック例外を行い、フックレイヤー及び下位レイヤーに属するモジュールについてはフックを行わない方式がある。このような方式において要求される条件は、いかほど正確にフックレイヤーに属するランタイムモジュールを識別できるかどうかである。次いで、フックレイヤーに属するあらゆるランタイムモジュールがフック対象ＡＰＩの原本関数を呼び出せるアドレスを知り、プログラム段階で適宜なアドレスを呼び出すようにしてフックレイヤーを構成する方式がある。この方式では、フックレイヤーに属するあらゆるランタイムモジュールでフックが行われているＡＰＩの正確なリスト及びアドレスを分かっていなければならない。
【０００５】
しかし、現実的に理想的なフックレイヤーを構成するために必要な条件を満たす管理／プログラミングの作成が容易ではないという問題がある。一例として、モジュール別例外処理を行う場合に機能拡張によってフックレイヤーに属するランタイムモジュールが固定的ではない可能性が高い。このような理由で、フックレイヤーの形象管理及びアップデート管理の問題が目立つしかない。またＯＳの形態、主要及び下位バージョン構成による例外モジュールの情報の追加される余地があるので、ＯＳのパッチに対する検証が非常に重要になる。一方、原本ＡＰＩのアドレスを直接呼び出す方式の場合に、フックレイヤー内の第３者モジュールなどのソースの修正の不可能なモジュールに対する支援が困難であるという問題があり、特に、フック対象ＡＰＩの数が多くなるほどプログラムが難解になるという問題がある。
【０００６】
以上のような問題点を解決するために、既存には、開発者の判断によってファイルイメージの経路、ファイルイメージのパターン、電子署名の発給者のパターンなどを用いて例外処理を行っている。この場合、正確なリスト管理についての負担は低減するが、新規モジュールの追加及び第３者モジュール、フックレイヤーの下部レイヤーモジュールに対するリスト管理についての負担は依然として残っている。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明が解決しようとする技術的課題は、動的ＡＰＩフッキング時に下位関数の原本関数の再呼び出しによるフック再進入を防止できる装置を提供するところにある。
【０００８】
本発明が解決しようとする他の技術的課題は、動的ＡＰＩフッキング時に下位関数の原本関数の再呼び出しによるフック再進入を防止するための方法をコンピュータで実行させるためのプログラムを記録したコンピュータで読み取り可能な記録媒体を提供するところにある。
【課題を解決するための手段】
【０００９】
前記技術的課題を解決するための、本発明によるフック再進入防止装置に関する望ましい実施形態は、動的ＡＰＩフッキング時にフッキングを行うためのコードであるフックの再帰的な実行と定義されるフックの再進入を防止するための装置において、前記動的ＡＰＩフッキングの開始時点に呼び出されるフック関数の呼び出し如何を示す状態情報フラグを設定または解除する状態情報管理モジュール；前記フック関数の呼び出し時に前記状態情報フラグが設定されていれば、前記フック関数の呼び出しが前記フックの実行過程で行われたと判断し、元々実行の要請されたプログラムを行わせる再進入防止モジュール；を備える。
【００１０】
前記他の技術的課題を解決するための、本発明による記録媒体は、動的ＡＰＩフッキング時にフッキングを行うためのコードであるフックの再帰的な実行と定義されるフックの再進入を防止するための方法をコンピュータで実行させるためのプログラムを記録したコンピュータで読み取り可能な記録媒体において、（ａ）原本関数または前記フックの実行過程で行われる下位関数によって、前記動的ＡＰＩフッキングの開始時点に呼び出されるフック関数が呼び出されれば、前記フック関数に対応する関数情報に設定されている状態情報フラグの値を確認する段階；（ｂ）前記状態情報フラグ値が設定されていなければ、前記フック関数の呼び出しが前記原本関数により行われると判断して前記状態情報フラグ値を設定し、前記状態情報フラグ値が設定されていれば、前記フック関数の呼び出しが前記フックの実行過程で行われたと判断し、元々実行の要請されたプログラムを行わせる段階；を含むフック再進入防止方法をコンピュータで実行させるためのプログラムを持つ。
【発明の効果】
【００１１】
本発明によるフック再進入防止装置及びその方法をコンピュータで実行させるためのプログラムを記録した記録媒体によれば、フックレイヤーとは独立的な進入／離脱レイヤーとして機能することで、フックレイヤーをフックから安全に隔離させるようになって、動的ＡＰＩフッキング時にフックレイヤー内のフックルチンの実行過程で、下位関数の原本関数の再呼び出しによるフック再進入を防止できる。また応用プログラムからフックレイヤーに進入する開始点でフックの再進入如何を判断する構造を採用することで、プログラム作成時にフック再進入防止のための別途のコードを作成する負担を低減させる。
【図面の簡単な説明】
【００１２】
【図１】基本的な呼び出し構造及びフックによるＡＰＩフィルタリング過程を示す図面である。
【図２】基本的な呼び出し構造及びフックによるＡＰＩフィルタリング過程を示す図面である。
【図３】フックレイヤーの理想的な構造を示す図面である。
【図４】本発明によるフック再進入防止装置に関する望ましい実施形態の構成を示す図面である。
【図５】状態情報フラグの値による再進入防止モジュール４２０によるＡＰＩ呼び出し分岐過程を示す図面である。
【図６】再進入防止モジュール４２０によるフック再進入防止過程を示す図面である。
【図７】フック再進入を考慮しないＡＰＩフッキング技法におけるコールスタックを示す図面である。
【図８】本発明によるコールスタックを示す図面である。
【図９】本発明によるフック再進入防止方法に関する望ましい実施形態の実行過程を示すフローチャートである。
【図１０】本発明によるフック再進入防止装置及び方法で、フックレイヤーの内部で生成されるスレッドが存在しない場合の実行過程を示す図面である。
【図１１】本発明によるフック再進入防止装置及び方法で、フックレイヤーの内部で生成されるスレッドが存在する場合の実行過程を示す図面である。
【図１２】本発明によるフック再進入防止装置及び方法の他の実施形態によるフック再進入防止過程を示す図面である。
【発明を実施するための形態】
【００１３】
以下、添付した図面を参照して、本発明によるフック再進入防止装置及びその方法をコンピュータで実行させるためのプログラムを記録した記録媒体の望ましい実施形態について詳細に説明する。
【００１４】
図４は、本発明によるフック再進入防止装置に関する望ましい実施形態の構成を示す図面である。図４を参照すれば、本発明によるフック再進入防止装置に関する望ましい実施例４００は、状態情報管理モジュール４１０及び再進入防止モジュール４２０を備える。
【００１５】
状態情報管理モジュール４１０は、アプリケーションの原本関数の呼び出しによって駆動されるフック関数の呼び出し時点に、状態情報フラグの値に基づいてフック関数の呼び出し地点を判断する。この時、原本関数の呼び出しがフックレイヤーの内部から行われたか、またはフックレイヤーの外部から行われたかを識別できる最小単位を設定する必要がある。本発明では、識別単位としてスレッド（ｔｈｒｅａｄ）を使い、その理由は次の通りである。あらゆる関数は動作時点に一つのスレッドに属し、任意時点のスレッド上の関数は、フックレイヤーの内部と外部のうち一つに存在し、同時に２つの状態を持つか、または２つの状態にいずれも該当しない場合は発生しない。またフックレイヤーの内部で生成されるスレッドを除外すれば、フックレイヤーに進入した後で行われるあらゆる関数は、スレッド単位でフックレイヤーに進入した関数の下位関数である。このような状態情報フラグの値は、フック関数に対応する関数情報と設定され、メモリ４３０に保存される。この時、状態情報フラグの値はスレッド別に識別可能な全域データ変数、スレッド別に情報管理可能なスレッド地域保存所（Ｔｈｒｅａｄ  Ｌｏｃａｌ  Ｓｔｏｒａｇｅ：ＴＬＳ）、スレッド別に情報管理可能な静的データ変数、スレッド別に情報管理可能なその他のデータ客体（例えば、Ｗｏｒｋｅｒ  ｔｈｒｅａｄ、Ｓｉｎｇｌｅｔｏｎ  ｏｂｅｃｔなど）などに設定される。そして、状態情報管理モジュール４１０は、該当値が保存されているメモリ４３０に状態情報フラグ値を設定または解除し、再進入防止モジュール４２０は、該当値の保存されているメモリ４３０から状態情報フラグ値を読み出す。このために状態情報フラグは、進入／退出情報を識別するために少なくともブーリアン（Ｂｏｏｌｅａｎ）の形態を持たねばならない。
【００１６】
もし、フック関数に対応する関数情報に状態情報フラグの値が設定されていなければ、状態情報管理モジュール４１０は、フック関数がフックレイヤーの外部から呼び出されたと判断し、状態情報フラグの値を設定する。これとは異なってフック関数に対応する関数情報に状態情報フラグの値が設定されていれば、状態情報管理モジュール４１０は、フック関数がフックレイヤーの内部から呼び出されたと判断する。さらに状態情報管理モジュール４１０は、フックルチン上の最後の下位関数の実行による結果値がシステムレイヤーに返還されれば、フック関数に対応する関数情報に設定されている状態情報フラグの値を解除する。
【００１７】
再進入防止モジュール４２０は、フック関数の再呼び出し時にメモリ４３０に記録されているフック関数に対応する状態情報フラグの値に基づいて、フックルチンの実行及びフックレイヤーの離脱を選択的に行う。図５には、状態情報フラグの値による再進入防止モジュール４２０によるＡＰＩ呼び出し分岐過程が図示されている。図５を参照すれば、再進入防止モジュール４２０は、アプリケーション５１０からフックレイヤー５２０に進入する開始点であるフック関数が進入点であり、フックレイヤー５２０で下位レイヤーの原本ＡＰＩを呼び出してシステムレイヤー５３０に出かける位置が離脱点になる。この時、フックレイヤー５２０に対する進入点はフック関数に対する呼び出し点と一致する。離脱点の具現のためにプログラミング段階で明示的に原本関数を呼び出す構造は、前述したようにあらゆるモジュールに対して具現されねばならない問題のため、本発明では進入点で共に処理する。
【００１８】
以上で述べた本発明によるフック再進入防止装置に関する望ましい実施例４００は、実行単位に対応する複数の構成要素を備える。しかし、具現形態によって状態情報管理モジュール４１０及び再進入防止モジュール４２０は一つのモジュールに統合される。この時、本発明によるフック再進入防止装置は、システムレイヤーとフックレイヤーとの間に位置し、状態情報フラグの設定如何によってフックレイヤー上のフックルチンを行わせるか、またはシステムレイヤーに値を返還するフィルタの形態をとる。
【００１９】
図６には、再進入防止モジュール４２０によるフック再進入防止過程が示されている。図６を参照すれば、呼び出し者であるアプリケーション６１０がシステムレイヤー６２０上の原本関数Ｈを呼び出せば、動的ＡＰＩフッキングによってフックレイヤー６３０自体のフックルチン（すなわち、下位関数であるＨ０、Ｈ１、Ｈ２、ＶＣなど）が行われる。この過程で、もし下位関数ＶＣが原本関数Ｈを再び呼び出せば、フック再進入を考慮しないＡＰＩフッキング技法では、図７に示したようなコールスタックから分かるように、Ｈ０、Ｈ１、Ｈ２、ＶＣなどが再び行われるという問題が生じる。これに対して本発明では、状態情報管理モジュール４１０がフッキング関数であるＨ０に対応する関数情報の状態情報フラグ値を設定し、次いで、下位関数ＶＣが原本関数Ｈを再び呼び出すことでフッキング関数Ｈ０が呼び出されれば、再進入防止モジュール４２０は、フッキング関数Ｈ０の状態情報フラグ値を確認した後でシステムレイヤー６２０に値を返還する。そして、システムレイヤー６２０は下位関数ＶＣに値を返還し、したがって、ＶＣが呼び出された以後に計画されているフックルチンによって、次の下位関数であるＨ３が行われる。図８には、このような本発明によるフック再進入防止手続きを行う時のコールスタックが示されている。
【００２０】
図９は、本発明によるフック再進入防止方法に関する望ましい実施形態の実行過程を示すフローチャートである。図９を参照すれば、アプリケーション６１０が原本関数を呼び出すことで駆動されるか、または下位関数による呼び出しによってフック関数が呼び出されれば（Ｓ９００）、フック再進入防止装置４００は、フック関数に対応する関数情報に設定されている状態情報フラグの値を確認する（Ｓ９１０）。もし状態情報フラグ値が設定されていなければ、フック再進入防止装置４００は、フック関数がフックレイヤーの外部から呼び出されたと判断し、状態情報フラグの値を設定する（Ｓ９２０）。この場合には、フックルチンによる下位関数が順次に行われる（Ｓ９３０）。これに対して状態情報フラグ値が設定されていれば、フック再進入防止装置４００は、フック関数がフックレイヤーの内部から呼び出されたと判断し、システムレイヤー６２０に値を返還する（Ｓ９４０）。したがって、この場合にはシステムレイヤー６２０が下位関数ＶＣに値を返還し、次いで、フックルチンによって次下位関数が行われる（Ｓ９３０）。次いで、フック再進入防止装置４００は、フックルチン上の最後の下位関数の実行による結果値が入力されれば（Ｓ９５０）、システムレイヤー６２０に結果値を返還する（Ｓ９６０）。
【００２１】
一方、前述したような本発明によるフック再進入防止装置及び方法についての実施形態は、外部からのフックレイヤーへの最初進入時にフック関数に対応する関数情報の状態情報フラグ値を設定することで、フックルチンの実行によってフックレイヤーの外部からフック関数が再び呼び出される場合に、フック関数に対応する関数情報の状態情報フラグ値に基づいて再進入を防止できる。しかし、前述したような本発明によるフック再進入防止装置及び方法についての実施形態は、フックレイヤーの内部で生成されたスレッドによってフック関数が再び呼び出されれば、再進入防止機能が行われないという問題がある。したがって、フックレイヤーの内部で生成されるスレッドにも再進入防止機能を提供するためには、スレッドの生成を監視し、生成されたスレッドについての識別フラグを設定する構成をさらに備えねばならない。
【００２２】
図１０は、本発明によるフック再進入防止装置及び方法で、フックレイヤーの内部で生成されるスレッドが存在しない場合の実行過程を示す図面である。図１０に示された実施形態は、ファイル入出力を監視して生成されるファイルデータを暗号化するフック関数の実行過程で、フック関数の動作状況をファイルに記録するための付加的なログ関数を含む。
【００２３】
図１０を参照すれば、アプリケーション１０１０がデータ書き込み関数を呼び出すことでフック関数が呼び出されれば（Ｓ１０００）、フック再進入防止装置１０２０は、原本関数であるデータ書き込み関数に対応する状態情報フラグの値（または、フック関数に対応する状態情報フラグの値）を設定する（Ｓ１００５）。次いで、フックレイヤー１０３０内に設定されたフックルチンによってデータの暗号化関数が呼び出され（Ｓ１０１０）、暗号化関数によってデータが暗号化される（Ｓ１０１５）。そして、フック再進入防止装置１０２０は、フックレイヤー１０３０から暗号化されたデータを受信し（Ｓ１０２０）、暗号化されたデータをシステムレイヤー１０４０に伝達する（Ｓ１０２５）。次いで、システムレイヤー１０４０は、メモリにデータを記録する（Ｓ１０３０）。一方、フックレイヤー１０３０内に設定されたフックルチンによって、ログ関数によってデータの書き込み動作についてのログデータが生成され（Ｓ１０３５）、生成されたログデータをメモリに書き込むためのデータ書き込み関数が再び呼び出される（Ｓ１０４０）。このようなデータ書き込み関数の再呼び出しによってフック関数も再び呼び出され、フック再進入防止装置１０２０は、データ書き込み関数に対応する状態情報フラグの値（または、フック関数に対応する状態情報フラグの値）を確認する（Ｓ１０４５）。前記のＳ１００５段階で、データ書き込み関数に対応する状態情報フラグの値（または、フック関数に対応する状態情報フラグの値）が設定されたところ、フック再進入防止装置１０２０は、フックルチンへの進入を遮断してシステムレイヤー１０４０にログデータを伝達する（Ｓ１０５０）。次いで、システムレイヤー１０４０は、メモリにログデータを記録する（Ｓ１０５５）。以上の動作によってログ関数による再進入が防止されることで、ログデータが暗号化されずに平文に保存される。
【００２４】
図１１は、本発明によるフック再進入防止装置及び方法で、フックレイヤーの内部で生成されるスレッドが存在する場合の実行過程を示す図面である。図１１に示された実施形態は、ファイル入出力を監視して生成されるファイルデータを暗号化するフック関数の実行過程で、フック関数の動作状況をファイルに記録するための付加的なログ関数を含み、ログ関数は、内部的にＷｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄにログデータを伝送する。この時Ｗｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄは、フックレイヤーの内部における入出力を引き起こす。
【００２５】
図１１を参照すれば、先ず、フックレイヤー１１３０の内部でＷｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄが生成される（Ｓ１１００）。次いで、アプリケーション１１１０がデータ書き込み関数を呼び出すことでフック関数が呼び出されれば（Ｓ１１０５）、フック再進入防止装置１１２０は、原本関数であるデータ書き込み関数に対応する状態情報フラグの値（または、フック関数に対応する状態情報フラグの値）を設定する（Ｓ１１１０）。次いで、フックレイヤー１１３０内に設定されたフックルチンによってデータの暗号化関数が呼び出され（Ｓ１１１５）、暗号化関数によってデータが暗号化される（Ｓ１１２０）。そして、フックレイヤー１１３０から暗号化されたデータが受信されれば（Ｓ１１２５）、フック再進入防止装置１１２０は、暗号化されたデータをシステムレイヤー１１４０に伝達する（Ｓ１１３０）。次いで、システムレイヤー１１４０はメモリにデータを記録する（Ｓ１１３５）。
【００２６】
一方、フックレイヤー１１３０内に設定されたフックルチンによって呼び出されたログ関数が、データの書き込み動作についてのログデータを生成する（Ｓ１１４０）。そして、ログ関数は、フックレイヤー１１３０内でＷｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄにログデータを伝送する（Ｓ１１４５）。次いで、Ｗｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄは、フックレイヤー１１３０内で生成されたログデータをメモリに書き込むためにデータ書き込み関数を呼び出す（Ｓ１１５０）。このようなデータ書き込み関数の再呼び出しによってフック関数も再び呼び出されるが、フック再進入防止装置１１２０は、データ書き込み関数（または、フック関数）の再呼び出しがフックレイヤー１１３０の外部からの進入ではないため、再進入と認識できなくなる。したがって、フック再進入防止装置１１２０は暗号化関数を呼び出し（Ｓ１１５５）、呼び出された暗号化関数は、ログデータについての暗号化を行う（Ｓ１１６０）。そして、フックレイヤー１１３０から暗号化されたログデータを受信すれば（Ｓ１１６５）、フック再進入防止装置１１２０は、受信された暗号化されたログデータをシステムレイヤー１１４０に伝達する（Ｓ１１７０）。次いで、システムレイヤー１１４０はメモリにデータを記録する（Ｓ１１７５）。
【００２７】
図１０及び図１１を参照して説明したように、本発明によるフック再進入防止装置及び方法についての実施形態は、フックレイヤーの内部で生成されたスレッドによって原本関数（またはフック関数）が再び呼び出される場合にフック再進入を防止できないという問題がある。このような問題を解決するためには、スレッドの生成を感知する構成要素がさらに必要である。
【００２８】
図１２は、本発明によるフック再進入防止装置及び方法の他の実施形態によるフック再進入防止過程を示す図面である。図１２に示されたフック再進入防止過程を行う装置は、図４に示された実施形態の構成要素に加えてスレッド生成感知モジュールを備える。
【００２９】
図１２を参照すれば、先ずフック再進入防止装置１２２０は、フックレイヤーの状態を初期化し（Ｓ１２００）、フックレイヤー１２３０の内部でＷｏｒｋｅｒ  ｔｈｒｅａｄが生成される（Ｓ１２０５）。そして、フック再進入防止装置１２２０は、Ｗｏｒｋｅｒ  ｔｈｒｅａｄを生成するＰａｒｅｎｔ  Ｔｈｒｅａｄを監視し、Ｐａｒｅｎｔ  Ｔｈｒｅａｄの状態がフックレイヤー１２３０の内部かまたは外部かを把握する（Ｓ１２１０）。そして、フック再進入防止装置１２２０は、Ｐａｒｅｎｔ  Ｔｈｒｅａｄの状態がフックレイヤー１２３０の内部である場合に生成されるＣｈｉｌｄ  Ｔｈｒｅａｄのフックレイヤー設定情報に、Ｐａｒｅｎｔ  Ｔｈｒｅａｄの設定情報を相続する（Ｓ１２１５）。このような動作は、スレッド生成感知モジュールによって行われる。この時、スレッド生成感知モジュールは、フックレイヤー１２３０の内部でスレッドが生成される時点にＰａｒｅｎｔ  Ｔｈｒｅａｄの状態情報を“進入”と設定するか、またはスレッドの生成時点にＰａｒｅｎｔ  Ｔｈｒｅａｄのスタック情報を追跡して、特定のスレッドがフックレイヤー１２３０の内部で生成されたか、または外部で生成されたかを感知する。またスレッド生成感知モジュールは、スレッドの生成を把握するためにスレッド生成ＡＰＩ（例えば、Ｗｉｎ３２システムではＣｒｅａｔｅＴｈｒｅａｄ、＿ｂｅｇｉｎｔｈｒｅａｄ、＿ｂｅｇｉｎｔｈｒｅａｄｅｘなど）を監視せねばならず、さらにはあらゆるスレッドの生成如何を監視せねばならない。
【００３０】
次いで、アプリケーション１２１０がデータ書き込み関数を呼び出すことでフック関数が呼び出されれば（Ｓ１２２０）、フック再進入防止装置１２２０は、原本関数であるデータ書き込み関数に対応する状態情報フラグの値（または、フック関数に対応する状態情報フラグの値）を設定する（Ｓ１２２５）。次いで、フックレイヤー１２３０内に設定されたフックルチンによってデータの暗号化関数が呼び出され（Ｓ１２３０）、暗号化関数によってデータが暗号化される（Ｓ１２３５）。そしてフック再進入防止装置１２２０は、フックレイヤー１２３０から暗号化されたデータを受信し（Ｓ１２４０）、暗号化されたデータをシステムレイヤー１２４０に伝達する（Ｓ１２４５）。次いで、システ4ムレイヤー１２４０はメモリにデータを記録する（Ｓ１２５０）。
【００３１】
一方、フックレイヤー１２３０内に設定されたフックルチンによって呼び出されたログ関数が、データの書き込み動作についてのログデータを生成する（Ｓ１２５５）。そして、ログ関数は、フックレイヤー１２３０内でＷｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄにログデータを伝送する（Ｓ１２６０）。次いで、Ｗｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄ関数は、フックレイヤー１２３０内で生成されたログデータをメモリに書き込むためにデータ書き込み関数を呼び出す（Ｓ１２６５）。この時、データ書き込み関数の再呼び出しによってフック関数も再び呼び出され、フック再進入防止装置１２２０は、Ｗｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄ関数のフックレイヤー設定情報を確認する（Ｓ１２７０）。前記のＳ１１１５段階で、Ｗｏｒｋｅｒ  ｔｈｒｅａｄ  Ｌｏｇ  Ｔｈｒｅａｄ関数の設定情報が“進入”と設定されたところ、フック再進入防止装置１２２０は、フックルチンへの進入を遮断してシステムレイヤー１２４０にログデータを伝達する（Ｓ１２７５）。次いで、システムレイヤー１２４０はメモリにログデータを記録する（Ｓ１２８０）。以上の動作によってログ関数による再進入が防止されることで、ログデータが暗号化されずに平文に保存される。
【００３２】
本発明はまた、コンピュータで読み取り可能な記録媒体にコンピュータで読み取り可能なコードとして具現できる。コンピュータで読み取り可能な記録媒体は、コンピュータシステムによって読み取られるデータが保存されるあらゆる記録装置を含む。コンピュータで読み取り可能な記録媒体の例としては、ＲＯＭ、ＲＡＭ、ＣＤ−ＲＯＭ、磁気テープ、フロッピー（登録商標）ディスク、光データ保存装置などがあり、またキャリアウエーブ（例えば、インターネットを通じる伝送）の形態で具現されるものも含む。またコンピュータで読み取り可能な記録媒体は、ネットワークに連結されたコンピュータシステムに分散され、分散方式でコンピュータで読み取り可能なコードが保存されて行われる。
【００３３】
以上、本発明の望ましい実施形態について図示して説明したが、本発明は前述した特定の望ましい実施形態に限定されず、特許請求の範囲で請求する本発明の趣旨を逸脱せずに、当業者ならば多様な変形実施が可能であるということはいうまでもなく、かかる変更は、特許請求の範囲に記載の範囲内にある。
【図１】
0005579934.tif 000002
【図２】
0005579934.tif 000003
【図３】
0005579934.tif 000004
【図４】
0005579934.tif 000005
【図５】
0005579934.tif 000006
【図６】
0005579934.tif 000007
【図７】
0005579934.tif 000008
【図８】
0005579934.tif 000009
【図９】
0005579934.tif 000010
【図１０】
0005579934.tif 000011
【図１１】
0005579934.tif 000012
【図１２】
0005579934.tif 000013