1.我們要跨進程使用鉤子,要把hook函數寫在DLL文件中,這是微軟明確規定的。也有其他方法,這裏不多敘述
2.在DLL文件中 設置鉤子.
這裏需要調用線程ID,threadId,我們會在下面調用DLL的調用端中寫入
hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
//參數1:鉤子類型
//參數2:鉤子處理函數
//參數3:鉤子所在的模塊
//參數4:鉤子要攔截的線程ID,如果要設置全局鉤子,這裏給0。
把這個SetWindowsHookEx()函數寫在壹個導出函數中,允許調用dll文件的程序調用
_declspec(dllexport) void SetHook(DWORD threadId)
{
hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
}
SetHook()就是本dll的導出函數
3.在鉤子處理函數中寫入功能,當鉤子截取到WM_NULL消息的時候,註入DLL文件。由於WM_NULL消息,是個沒用的消息,應用程序壹般不會收到這個消息,除非我們自己發送壹個這個消息,所以我們在註入DLL的時候,只要給要註入的應用程序發壹個WM_NULL消息,當鉤子截取到WM_NULL的時候就註入鉤子,就可以了。
LRESULT CALLBACK GetMessageHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MSG* pMsg=(MSG*)lParam;
if(WM_NULL==pMsg->message)
::LoadLibraryW(TEXT("D://MyDLL.dll"));
}
好了,編譯DLL項目,產生DLL文件。
4.編寫調用端,調用鉤子
首先獲取窗口句柄
HWND FindWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
返回窗體句柄。hWnd.
hWnd=FindWindow(0,要註入dll的窗體的名稱(例如:千千靜聽))
利用hWnd,查找窗體線程ID
threadId=GetWindowThreadProcessId(hWnd,0);
好了,我們有了線程ID了,可以調用鉤子了。
SetHook(threadId);
這時鉤子已經加載到目標線程中了。
向目標窗體發送WM_NULL消息
SendMessage(hWnd,WM_NULL,0,0);
鉤子會在目標窗體受到消息前受到WM_NULL消息。由於鉤子處理函數中做了判斷,當受到WM_NULL消息時,加載DLL文件。所以DLL文件就註入到目標線程中了。