template<class PFNC>
class TNB::CApiHookerT< PFNC >
APIフック管理
プロセスにロードされている DLLのコール先をフックすることが出来ます。
他のプロセスには影響を与えません。
主にデバグ用に処理を横取りすることを想定しています。
- 覚え書き
- クラスメソッド Replace() を使うとすげ替えます(戻すことはできません)。
- 使用例
typedef int (WINAPI* P_MessageBoxA)(HWND hwnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
P_MessageBoxA g_pApiMsgBox; //旧処理アドレス記憶
//MessageBoxA の代わりに呼ぶ関数
int WINAPI MyMessageBoxA(HWND hwnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return g_pApiMsgBox(hwnd, "フック成功", "--", MB_ICONEXCLAMATION);
}
void foo(void)
{
g_pApiMsgBox = CApiHookerT<P_MessageBoxA>::Replace("USER32.DLL", "MessageBoxA", MyMessageBoxA);
::MessageBoxA(hwnd, "そのまま", "!!", MB_OK | MB_ICONERROR); //「フック成功」というダイアログがでる。
}
|
- 覚え書き
- メンバ Hook() を使うと、 Unhook() で元に戻すことが出来ます。一時的な切り替えに使用できます。
- 使用例
typedef int (WINAPI* P_MessageBoxA)(HWND hwnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
//MessageBoxA の代わりに呼ぶ関数
int WINAPI MyMessageBoxA(HWND hwnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return MessageBoxW(hwnd, L"フック成功", L"--", MB_ICONEXCLAMATION);
}
void foo(void)
{
CApiHookerT<P_MessageBoxA> hooker;
hooker.Hook("USER32.DLL", "MessageBoxA", MyMessageBoxA);
::MessageBoxA(hwnd, "そのまま", "!!", MB_OK | MB_ICONERROR); //「フック成功」というダイアログがでる。
hooker.Unhook();
::MessageBoxA(hwnd, "そのまま", "!!", MB_OK | MB_ICONERROR); //「そのまま」というダイアログがでる。
}
|
- 参照
- http://www003.upp.so-net.ne.jp/kish/prog/apihook.html
- 引数
-
- 必要ファイル
- TnbApiHooker.h
- 日付
- 06/12/18 新規作成。
-
09/04/10 DLL下のDLLのテーブルも対象とした。
TnbApiHooker.h の 79 行目に定義があります。