SetWindowsHookEx用的是WH_CALLWNDPROC,系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。DWORD dwCurrentPID = 0;
HHOOK hOldHook = NULL;
DWORD pSend = 0;
DWORD pRecv = 0;
GETMESSAGE pGetMessage = NULL; BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2]; HANDLE hDebug = INVALID_HANDLE_value; LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD dwSize;
DWORD dwPIDWatched;
HMODULE hLib; if( dwCurrentPID == 0 )
{
dwCurrentPID = GetCurrentProcessId();
HWND hwndMainHook;
hwndMainHook = ::FindWindow( 0, "MainHook" );
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); if( dwCurrentPID == dwPIDWatched )
{
//替换函数
}
} if( hOldHook != NULL )
{
return CallNextHookEx( hOldHook, nCode, wParam, lParam );
} return 0;
}dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
这两句怎么理解啊?dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 可以理解为MainHook窗口进程 处理消息WM_USER+100的时候,返回一个MainHook窗口的进程号.但::SendMessage又会调用CallWndProc不就循环了么?hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?
HHOOK hOldHook = NULL;
DWORD pSend = 0;
DWORD pRecv = 0;
GETMESSAGE pGetMessage = NULL; BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2]; HANDLE hDebug = INVALID_HANDLE_value; LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD dwSize;
DWORD dwPIDWatched;
HMODULE hLib; if( dwCurrentPID == 0 )
{
dwCurrentPID = GetCurrentProcessId();
HWND hwndMainHook;
hwndMainHook = ::FindWindow( 0, "MainHook" );
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); if( dwCurrentPID == dwPIDWatched )
{
//替换函数
}
} if( hOldHook != NULL )
{
return CallNextHookEx( hOldHook, nCode, wParam, lParam );
} return 0;
}dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
这两句怎么理解啊?dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 可以理解为MainHook窗口进程 处理消息WM_USER+100的时候,返回一个MainHook窗口的进程号.但::SendMessage又会调用CallWndProc不就循环了么?hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?
因为有这句,所以不会循环
单个进程只能进入这个If语句一次/*
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
这两句怎么理解啊?
*/
具体要看窗口处理过程函数
是取得你想要钩住的指定进程IDhOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
是取得 SetWindowsHookEx 的Hook 就是原钩子函数的地址SendMessage又会调用CallWndProc不就循环了么?
这个可以在函数加判断防止死循环
microsoftwin(流星雨点), zzz3265(zzz) 的解答.hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
是取得 SetWindowsHookEx 的Hook 就是原钩子函数的地址
还是没有太弄明白,能解释的更清楚么?thanks
是给你的窗口名称为MainHook的程序发送一个消息,WM_USER+100应该在MainHook的程序中有定义,也就是MainHook窗口的进程号。
::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );返回的东西要看你的程序中(WM_USER+101)是完成什么内容!看来是个句柄之类的东西!
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?
取得一HHOOK的值