TNB Library
公開メンバ関数 | 静的公開メンバ関数 | 全メンバ一覧
CApiHookerT< PFNC > クラステンプレート

APIフック管理 [詳解]

#include <TnbApiHooker.h>

+ CApiHookerT< PFNC > の継承関係図

公開メンバ関数

 CApiHookerT (void)
 コンストラクタ [詳解]
 
bool Hook (LPCSTR lpszDllName, LPCSTR lpszFuncName, PFNC pFnc, HMODULE hModule=NULL)
 [実行] 処理フック [詳解]
 
PFNC operator() (void)
 [取得] フック前の処理アドレス [詳解]
 
bool Unhook (void)
 [実行] 処理アンフック [詳解]
 

静的公開メンバ関数

static PFNC Replace (LPCSTR lpszDllName, LPCSTR lpszFuncName, PFNC pFnc, HMODULE hModule=NULL)
 [実行] 処理変更 [詳解]
 

詳解

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
引数
PFNC関数のアドレス型
必要ファイル
TnbApiHooker.h
日付
06/12/18 新規作成。
09/04/10 DLL下のDLLのテーブルも対象とした。

TnbApiHooker.h79 行目に定義があります。

構築子と解体子

◆ CApiHookerT()

CApiHookerT ( void  )

コンストラクタ

TnbApiHooker.h105 行目に定義があります。

関数詳解

◆ Hook()

bool Hook ( LPCSTR  lpszDllName,
LPCSTR  lpszFuncName,
PFNC  pFnc,
HMODULE  hModule = NULL 
)

[実行] 処理フック

覚え書き
一インスタンスで、フック出来るのは一つだけです。
既にフックしているとアンフックしてからフック処理します。
引数
lpszDllNameロードしている DLL名。NULL を指定するとすべての DLLを処理対象にします。
lpszFuncNameロードしている DLL内の関数名。
pFnc変更する処理の書かれた関数。
hModuleモジュールハンドル(省略するとプロセスのハンドル( GetInstanceHandleByTnb(EI_Process) の戻り値)になります)。
戻り値
trueフック成功。
falseエラー。

TnbApiHooker.h120 行目に定義があります。

◆ operator()()

PFNC operator() ( void  )

[取得] フック前の処理アドレス

戻り値
NULLフックしていない。
NULL以外変更前の処理アドレス。

TnbApiHooker.h172 行目に定義があります。

◆ Replace()

static PFNC Replace ( LPCSTR  lpszDllName,
LPCSTR  lpszFuncName,
PFNC  pFnc,
HMODULE  hModule = NULL 
)
static

[実行] 処理変更

覚え書き
このクラスメソッドで変更すると元に戻せません。
引数
lpszDllNameロードしているDLL名。NULLを指定するとすべてのDLLを処理対象にします。
lpszFuncNameロードしているDLL内の関数名。
pFnc変更する処理の書かれた関数。
hModuleモジュールハンドル(省略するとプロセスのハンドル( GetInstanceHandleByTnb(EI_Process) の戻り値)になります)。
戻り値
NULLエラー。
NULL以外成功。値は、変更前の処理アドレス。

TnbApiHooker.h93 行目に定義があります。

◆ Unhook()

bool Unhook ( void  )

[実行] 処理アンフック

覚え書き
フックしていないと何もしません。
戻り値
trueアンフック成功。
falseエラー。

TnbApiHooker.h149 行目に定義があります。