瀏覽代碼

1、在微信进程中,注入的hook.dll使用不了C++11的线程函数。
2、在微信进程中,注入的hook.dll不能在当前线程使用curl库,否则会阻塞在curl_easy_perform函数中;需要另起一个线程来才能正常使用curl库。
3、在hook.dll中,使用_beginthreadex来创建新的线程。

Jeff 6 年之前
父節點
當前提交
8a436df035
共有 2 個文件被更改,包括 48 次插入35 次删除
  1. 1 1
      source/hook/WeChats/WeChatsDlg.cpp
  2. 47 34
      source/hook/hook/dllmain.cpp

+ 1 - 1
source/hook/WeChats/WeChatsDlg.cpp

@@ -174,7 +174,7 @@ void CWeChatsDlg::OnBnClickedOpenWx()
 void CWeChatsDlg::OnBnClickedAttachWx()
 {
 	// TODO: 在此添加控件通知处理程序代码
-#if 1
+#if 0
 	CCurlClient curl;
 	if (curl.Initialize() == CURLE_OK)
 	{

+ 47 - 34
source/hook/hook/dllmain.cpp

@@ -1,6 +1,7 @@
 // dllmain.cpp : 定义 DLL 应用程序的入口点。
 #include "stdafx.h"
 #include "..\common\CurlClient.h"
+#include <process.h>
 
 //https://docs.microsoft.com/zh-cn/windows/desktop/winmsg/using-hooks
 HHOOK	ghk_CBT = NULL;
@@ -101,6 +102,47 @@ LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
 	return CallNextHookEx(ghk_Mouse, nCode, wParam, lParam);
 }
 
+static unsigned WINAPI WorkProc(LPVOID lpParam)
+{
+	DWORD dwThreadId = 0;
+	GetProcInfo(dwThreadId);
+	if (ghk_CBT == NULL)
+	{
+		ghk_CBT = SetWindowsHookEx(WH_CBT, CBTProc, HINSTANCE(0x000604F4), dwThreadId);
+		if (ghk_CBT == NULL)
+			WriteTextLog(_T("hook api失败"));
+		else
+			WriteTextLog(_T("hook api成功:%ld,%p"), GetLastError(), HINSTANCE(0x000604F4));
+	}
+
+	WriteTextLog(_T("dll已成功注入:【当前线程id=%d, 目标线程id=%d,进程id=%d】"), ::GetCurrentThreadId(), dwThreadId, ::GetCurrentProcessId());
+	WxInfo wxInfo;
+	GetWxInfo(wxInfo);
+
+#if 1
+	CCurlClient curl;
+	if (curl.Initialize() == CURLE_OK)
+	{
+		std::string strData;
+		if (curl.Get(wxInfo.strWxLImgAddr, strData) == CURLE_OK)
+		{
+			FILE* pf = NULL;
+			TCHAR szWxImage[MAX_PATH] = { 0 };
+			_stprintf_s(szWxImage, _T("%s%s\\%s.jpg"), g_szCurModulePath, _T("image"), wxInfo.strWxID.c_str());
+			pf = _tfopen(szWxImage, _T("wb+"));
+			if (pf)
+			{
+				fwrite(strData.c_str(), strData.size(), 1, pf);
+				fclose(pf);
+			}
+		}
+	}
+#endif
+
+	return 0;
+}
+
+
 BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
 {
 	g_hCurModule = hModule;
@@ -117,40 +159,11 @@ BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserve
 	{
 	case DLL_PROCESS_ATTACH:
 	{
-		DWORD dwThreadId = 0;
-		GetProcInfo(dwThreadId);
-		if (ghk_CBT == NULL)
-		{
-			ghk_CBT = SetWindowsHookEx(WH_CBT, CBTProc, HINSTANCE(0x000604F4), dwThreadId);
-			if (ghk_CBT == NULL)
-				WriteTextLog(_T("hook api失败"));
-			else
-				WriteTextLog(_T("hook api成功:%ld,%p"), GetLastError(), HINSTANCE(0x000604F4));
-		}
-
-		WriteTextLog(_T("dll已成功注入:【当前线程id=%d, 目标线程id=%d,进程id=%d】"), ::GetCurrentThreadId(), dwThreadId, ::GetCurrentProcessId());
-		WxInfo wxInfo;
-		GetWxInfo(wxInfo);
-
-#if 0
-		CCurlClient curl;
-		if (curl.Initialize() == CURLE_OK)
-		{
-			std::string strData;
-			if (curl.Get(wxInfo.strWxSImgAddr, strData) == CURLE_OK)
-			{
-				FILE* pf = NULL;
-				TCHAR szWxImage[MAX_PATH] = { 0 };
-				_stprintf_s(szWxImage, _T("%s%s\\%s.jpg"), g_szCurModulePath, _T("image"), wxInfo.strWxID.c_str());
-				pf = _tfopen(szWxImage, _T("w+"));
-				if (pf)
-				{
-					fwrite(strData.c_str(), strData.size(), 1, pf);
-					fclose(pf);
-				}
-			}
-		}
-#endif
+		
+		HANDLE hThread = NULL;
+		unsigned int dwThreadId = 0;
+		hThread = (HANDLE)_beginthreadex(NULL, 0, WorkProc, NULL, NULL, &dwThreadId);
+		CloseHandle(hThread);
 	}
 	break;
 	case DLL_THREAD_ATTACH: