Sfoglia il codice sorgente

消息hook,需要指定wnd窗口。

Jeff 6 anni fa
parent
commit
55a5775adc
2 ha cambiato i file con 106 aggiunte e 22 eliminazioni
  1. 2 2
      source/hook/WeChats/Global.cpp
  2. 104 20
      source/hook/hook/dllmain.cpp

+ 2 - 2
source/hook/WeChats/Global.cpp

@@ -225,12 +225,12 @@ HANDLE FindModuleEx(LPCTSTR lpModuleName, DWORD dwPid)
 		{
 			GetModuleFileNameEx(hProcess, hMods[i], szModName, _countof(szModName));
 #ifdef _DEBUG
-			WriteTextLog(_T("醴梓=%s, 埻宎=%s"),szModName, lpModuleName);
+			WriteTextLog(_T("醴梓=%s, 埻宎=%s, 華硊=%p"), szModName, lpModuleName, hMods[i]);
 #endif
 			if (_tcsicmp(lpModuleName, szModName) == 0)
 			{
 				CloseHandle(hProcess);
-				WriteTextLog(_T("醴梓=%s, 埻宎=%s, 華硊=%p"), szModName, lpModuleName, hMods[i]);
+				WriteTextLog(_T("醴梓=%s, 埻宎=%s, 華硊=%p"), szModName, lpModuleName, hMods[i]);
 				return hMods[i];
 			}
 		}

+ 104 - 20
source/hook/hook/dllmain.cpp

@@ -1,25 +1,106 @@
 // dllmain.cpp : 定义 DLL 应用程序的入口点。
 #include "stdafx.h"
 
-HHOOK g_hook = NULL;
-LRESULT CALLBACK Hook_CBT_Proc(int nCode, WPARAM wParam, LPARAM lParam)
+//https://docs.microsoft.com/zh-cn/windows/desktop/winmsg/using-hooks
+HHOOK	ghk_CBT = NULL;
+HHOOK	ghk_Mouse = NULL;
+HHOOK	ghk_CallWndProc = NULL;
+
+LRESULT WINAPI CallWndProc(int, WPARAM, LPARAM);
+LRESULT WINAPI CBTProc(int, WPARAM, LPARAM);
+LRESULT WINAPI DebugProc(int, WPARAM, LPARAM);
+LRESULT WINAPI GetMsgProc(int, WPARAM, LPARAM);
+LRESULT WINAPI KeyboardProc(int, WPARAM, LPARAM);
+LRESULT WINAPI MouseProc(int, WPARAM, LPARAM);
+LRESULT WINAPI MessageProc(int, WPARAM, LPARAM);
+
+LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
 {
-	WriteTextLog(_T("窗口HCBT_XXX"));
-	tagMSG* msg;
-	msg = (tagMSG*)lParam;
-	if (nCode == HCBT_MINMAX)
+	WriteTextLog(_T("CallWndProc"));
+
+	if (nCode < 0)  // do not process message 
+		return CallNextHookEx(ghk_CallWndProc, nCode, wParam, lParam);
+
+	switch (nCode)
 	{
-		WriteTextLog(_T("窗口HCBT_MINMAX"));
-		return 1;
+	case HC_ACTION:
+		break;
+
+	default:
+		break;
 	}
 
-	return CallNextHookEx(g_hook, nCode, wParam, lParam);
+	return CallNextHookEx(ghk_CallWndProc, nCode, wParam, lParam);
 }
 
-BOOL APIENTRY DllMain(HMODULE hModule,
-	DWORD  ul_reason_for_call,
-	LPVOID lpReserved
-)
+LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
+{
+	CHAR szBuf[128];
+	CHAR szCode[128];
+	static int c = 0;
+	size_t cch;
+	HRESULT hResult;
+
+	WriteTextLog(_T("CBTProc"));
+	if (nCode < 0)  // do not process message 
+		return CallNextHookEx(ghk_CBT, nCode, wParam,lParam);
+
+	switch (nCode)
+	{
+	case HCBT_ACTIVATE:
+		break;
+
+	case HCBT_CLICKSKIPPED:
+		break;
+
+	case HCBT_CREATEWND:
+		break;
+
+	case HCBT_DESTROYWND:
+		break;
+
+	case HCBT_KEYSKIPPED:
+		break;
+
+	case HCBT_MINMAX:
+		break;
+
+	case HCBT_MOVESIZE:
+		break;
+
+	case HCBT_QS:
+		break;
+
+	case HCBT_SETFOCUS:
+		break;
+
+	case HCBT_SYSCOMMAND:
+		break;
+
+	default:
+		break;
+	}
+	
+	return CallNextHookEx(ghk_CBT, nCode, wParam, lParam);
+}
+
+LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
+{
+	CHAR szBuf[128];
+	CHAR szMsg[16];
+	static int c = 0;
+	size_t cch;
+	HRESULT hResult;
+
+	if (nCode < 0)  // do not process the message 
+		return CallNextHookEx(ghk_Mouse, nCode,wParam, lParam);
+
+	WriteTextLog(_T("MOUSE - nCode: %d, msg: %s, x: %d, y: %d, %d times "), nCode, szMsg, LOWORD(lParam), HIWORD(lParam), c++);
+
+	return CallNextHookEx(ghk_Mouse, nCode, wParam, lParam);
+}
+
+BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
 {
 	g_hCurModule = hModule;
 	switch (ul_reason_for_call)
@@ -28,16 +109,16 @@ BOOL APIENTRY DllMain(HMODULE hModule,
 	{
 		DWORD dwThreadId = 0;
 		GetProcInfo(dwThreadId);
-		if (g_hook == NULL)
+		if (ghk_CBT == NULL)
 		{
-			g_hook = SetWindowsHookEx(WH_CBT, Hook_CBT_Proc, NULL, dwThreadId);
-			if (g_hook == NULL)
+			ghk_CBT = SetWindowsHookEx(WH_CBT, CBTProc, LPDWORD(0x000604F4), dwThreadId);
+			if (ghk_CBT == NULL)
 				WriteTextLog(_T("hook api失败"));
 			else
-				WriteTextLog(_T("hook api成功"));
+				WriteTextLog(_T("hook api成功:%ld,%p"), GetLastError(), HINSTANCE(0x000604F4));
 		}
 
-		WriteTextLog(_T("dll已成功注入:【当前线程id=%d, 进程id=%d】"), ::GetCurrentThreadId(), ::GetCurrentProcessId());
+		WriteTextLog(_T("dll已成功注入:【当前线程id=%d, 目标线程id=%d,进程id=%d】"), ::GetCurrentThreadId(), dwThreadId, ::GetCurrentProcessId());
 		WxInfo wxInfo;
 		GetWxInfo(wxInfo);
 	}
@@ -47,8 +128,11 @@ BOOL APIENTRY DllMain(HMODULE hModule,
 	case DLL_THREAD_DETACH:
 		break;
 	case DLL_PROCESS_DETACH:
-		if (g_hook)
-			UnhookWindowsHookEx(g_hook);
+		if (ghk_CBT)
+		{
+			if (UnhookWindowsHookEx(ghk_CBT))
+				WriteTextLog(_T("卸载hook成功"));
+		}
 		WriteTextLog(_T("dll已成功卸载"));
 		break;
 	default: