|
|
下面是动态链接库中的代码:
HHOOK hhk = NULL;
......
//安装钩子
_declspec(dllexport) VOID SetHook(){
if( !hhk ){
HINSTANCE hInst = LoadLibrary(TEXT("print2.DLL") );
if( hInst )
{
MessageBoxW(NULL,L"ZZZZZZZZZZ!",L"Hook",MB_OK);
return;
}
hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInst,0);
FreeLibrary( hInst );
}
}
//?载钩子
_declspec(dllexport) VOID UnHook(){
if( hhk ){
HINSTANCE hInst = LoadLibrary(TEXT("print2.DLL") );
if( !hInst )
{
MessageBoxW(NULL,L"uuuuuuuuuu!",L"Hook",MB_OK);
return;
}
/* ModifyIAT(
hCurrentProcess,
"USER32.DLL",
(PROC)MyMessageBoxW,
GetProcAddress( GetModuleHandle("USER32.DLL"),"MessageBoxW" )
);*/
UnhookWindowsHookEx( hhk );
FreeLibrary( hInst );
}
}
下面是调用动态链接库的代码
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
//PROC SetHook;
HINSTANCE hInst = LoadLibrary(DLLNAME);
if( !hInst ){
DestroyWindow(hwnd);
MessageBox(hwnd,TEXT("Can not load dll!"),TEXT("HOOKAPI"),MB_ICONHAND);
PostQuitMessage(0);
return 0;
}
typedef void (*SETHOOK)();
SETHOOK
SetHook = (SETHOOK)GetProcAddress(hInst,"SetHook");
if( !SetHook ){
DestroyWindow(hwnd);
MessageBox(hwnd,TEXT("Can not find function-SetHook!"),TEXT("HOOKAPI"),MB_ICONHAND);
PostQuitMessage(0);
return 0;
}
//安装钩子,这样我们的dll就被映射到每一个gui程序的进程空间中
SetHook();
FreeLibrary(hInst);
return 0 ;
}
case WM_DESTROY:
{
PROC UnHook;
HINSTANCE hInst = LoadLibrary(DLLNAME);
if( !hInst ){
MessageBox(hwnd,TEXT("Can not load dll!"),TEXT("HOOKAPI"),MB_ICONHAND);
PostQuitMessage(0);
return 0;
}
UnHook = GetProcAddress(hInst,"UnHook");
if( !UnHook ){
MessageBox(hwnd,TEXT("Can not find UnHook!"),TEXT("HOOKAPI"),MB_ICONHAND);
PostQuitMessage(0);
return 0;
}
//退出之前我们要?载钩子
UnHook();
PostQuitMessage (0) ;
return 0 ;
}
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
调试,弹出下面的BOX,不知何故? |
-
|