浏览代码

使用curl下载图片失败,hook.dll在微信进程使用curl存在未知问题。

Jeff 6 年之前
父节点
当前提交
d5dd00f1a0

+ 4 - 4
source/hook/WeChats/WeChats.vcxproj

@@ -120,6 +120,8 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\common\CharEncoding.cpp" />
+    <ClCompile Include="..\common\CurlClient.cpp" />
     <ClCompile Include="..\pb\msg.pb.cc">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
@@ -140,8 +142,6 @@
     <ClCompile Include="..\skinui\SubLabel.cpp" />
     <ClCompile Include="..\skinui\TreeComboBox.cpp" />
     <ClCompile Include="CDLG_Login.cpp" />
-    <ClCompile Include="CharEncoding.cpp" />
-    <ClCompile Include="CurlClient.cpp" />
     <ClCompile Include="CWxObject.cpp" />
     <ClCompile Include="Global.cpp" />
     <ClCompile Include="Injection.cpp" />
@@ -154,6 +154,8 @@
     <ClCompile Include="WxMgr.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\common\CharEncoding.h" />
+    <ClInclude Include="..\common\CurlClient.h" />
     <ClInclude Include="..\pb\msg.pb.h" />
     <ClInclude Include="..\skinui\BCMenu.h" />
     <ClInclude Include="..\skinui\BtnST.h" />
@@ -171,8 +173,6 @@
     <ClInclude Include="..\skinui\SubLabel.h" />
     <ClInclude Include="..\skinui\TreeComboBox.h" />
     <ClInclude Include="CDLG_Login.h" />
-    <ClInclude Include="CharEncoding.h" />
-    <ClInclude Include="CurlClient.h" />
     <ClInclude Include="CWxObject.h" />
     <ClInclude Include="Global.h" />
     <ClInclude Include="IClient.h" />

+ 4 - 4
source/hook/WeChats/WeChats.vcxproj.filters

@@ -96,10 +96,10 @@
     <ClCompile Include="..\skinui\TreeComboBox.cpp">
       <Filter>skinui</Filter>
     </ClCompile>
-    <ClCompile Include="CharEncoding.cpp">
+    <ClCompile Include="..\common\CharEncoding.cpp">
       <Filter>curl</Filter>
     </ClCompile>
-    <ClCompile Include="CurlClient.cpp">
+    <ClCompile Include="..\common\CurlClient.cpp">
       <Filter>curl</Filter>
     </ClCompile>
   </ItemGroup>
@@ -185,10 +185,10 @@
     <ClInclude Include="..\skinui\TreeComboBox.h">
       <Filter>skinui</Filter>
     </ClInclude>
-    <ClInclude Include="CharEncoding.h">
+    <ClInclude Include="..\common\CharEncoding.h">
       <Filter>curl</Filter>
     </ClInclude>
-    <ClInclude Include="CurlClient.h">
+    <ClInclude Include="..\common\CurlClient.h">
       <Filter>curl</Filter>
     </ClInclude>
   </ItemGroup>

+ 26 - 3
source/hook/WeChats/WeChatsDlg.cpp

@@ -175,6 +175,18 @@ void CWeChatsDlg::OnBnClickedAttachWx()
 {
 	// TODO: 在此添加控件通知处理程序代码
 	m_wxMgr.AttachUnMgrWxProc(GetDlgItem(WX_RECT));
+	if ( m_wxMgr.GetAttachCount() )
+	{
+		CButtonST *pButton = m_wxMgr.GetButton(m_wxMgr.m_mapIds[10000]);
+		CStatic *pWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[10000]);
+		CWxObject *pWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[10000]);
+
+		if (pButton)
+		{
+			pButton->SetCheck(TRUE);
+			pWxChatWnd->ShowWindow(SW_SHOW);
+		}
+	}
 }
 
 void CWeChatsDlg::OnBtnClickedWxName(UINT uID)
@@ -189,9 +201,20 @@ void CWeChatsDlg::OnBtnClickedWxName(UINT uID)
 		return;
 	}
 
-	m_wxMgr.GetButton(m_wxMgr.m_mapIds[lastID])->SetCheck(FALSE);
-	m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[lastID])->ShowWindow(SW_HIDE);
+	if ( lastID == uID)
+	{
+		return;
+	}
+
+
 	// 单击了则显示当前微信窗口,隐藏上一个;
+	CButtonST *plastButton = m_wxMgr.GetButton(m_wxMgr.m_mapIds[lastID]);
+	CStatic *plastWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[lastID]);
+	CWxObject *plastWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[lastID]);
+	//plastButton->EnableWindow(TRUE);
+	plastButton->SetCheck(TRUE);
+	plastWxChatWnd->ShowWindow(SW_HIDE);
+
 	CButtonST *pButton = m_wxMgr.GetButton(m_wxMgr.m_mapIds[uID]);
 	CStatic *pWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[uID]);
 	CWxObject *pWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[uID]);
@@ -200,7 +223,7 @@ void CWeChatsDlg::OnBtnClickedWxName(UINT uID)
 	{
 		pButton->SetCheck(TRUE);
 		pWxChatWnd->ShowWindow(SW_SHOW);
-
+		//pButton->EnableWindow(FALSE);
 		lastID = uID;
 	}
 }

+ 1 - 0
source/hook/WeChats/WxMgr.h

@@ -41,6 +41,7 @@ public:
 	CButtonST *GetButton(DWORD dwProcId);
 	CStatic *GetWxChatWnd(DWORD dwProcId);
 	CWxObject *GetWxObject(DWORD dwProcId);
+	int GetAttachCount() { return m_mapWx.size(); }
 public:
 	VOID SetMainWnd(CWnd *pWnd, CRect rcWxList, CRect rcWxShow) {
 		m_pMainWnd = pWnd;

+ 16 - 30
source/hook/hook/WxGlobal.cpp

@@ -13,8 +13,11 @@ using namespace std;
 
 #include "EncodingConversion.h"
 
-HMODULE g_hCurModule = NULL;
+#include "..\common\CurlClient.h"
 
+HMODULE g_hCurModule = NULL;
+TCHAR g_szCurModulePath[MAX_PATH] = {0};
+TCHAR g_szFna[MAX_PATH] = {0};
 /************************************************************************/
 /*  函数:WriteTextLog[7/28/2016 IT];
 /*  描述:写文本日志;
@@ -32,20 +35,7 @@ void WriteTextLog(const TCHAR *format, ...)
 {
 	// 解析出日志路径;
 	TCHAR szlogpath[MAX_PATH] = { 0 };
-	static TCHAR szModulePath[MAX_PATH] = { 0 };
-	static TCHAR szFna[MAX_PATH] = { 0 };
-	if (szModulePath[0] == _T('\0'))
-	{
-		TCHAR szDrive[MAX_PATH] = { 0 };
-		TCHAR szDir[MAX_PATH] = { 0 };
-		TCHAR szExt[MAX_PATH] = { 0 };
-		::GetModuleFileName(g_hCurModule, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
-		_tsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
-		_tcscpy_s(szModulePath, szDrive);
-		_tcscat_s(szModulePath, szDir);
-	}
-
-	_stprintf_s(szlogpath, _T("%s%s.txt"), szModulePath, szFna);
+	_stprintf_s(szlogpath, _T("%s%s.txt"), g_szCurModulePath, g_szFna);
 	// 打开或创建文件;
 	FILE *fp = NULL;
 	//if (_taccess(szlogpath, 0) != -1)
@@ -98,20 +88,7 @@ void WriteTextLogW(const WCHAR *format, ...)
 {
 	// 解析出日志路径;
 	WCHAR szlogpath[MAX_PATH] = { 0 };
-	static WCHAR szModulePath[MAX_PATH] = { 0 };
-	static WCHAR szFna[MAX_PATH] = { 0 };
-	if (szModulePath[0] == L'\0')
-	{
-		WCHAR szDrive[MAX_PATH] = { 0 };
-		WCHAR szDir[MAX_PATH] = { 0 };
-		WCHAR szExt[MAX_PATH] = { 0 };
-		::GetModuleFileNameW(g_hCurModule, szModulePath, sizeof(szModulePath) / sizeof(WCHAR));
-		_wsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
-		wcscpy_s(szModulePath, szDrive);
-		wcscat_s(szModulePath, szDir);
-	}
-
-	swprintf_s(szlogpath, L"%s%s.txt", szModulePath, szFna);
+	swprintf_s(szlogpath, L"%s%s.txt", g_szCurModulePath, g_szFna);
 	// 打开或创建文件;
 	FILE *fp = NULL;
 	if (_waccess(szlogpath, 0) != -1)
@@ -173,40 +150,49 @@ BOOL GetWxInfo(WxInfo &wxInfo)
 	memcpy(szTemp, (LPVOID)(dwWeChatWinAddr+0x1131B90), MAX_PATH);
 #endif
 	WriteTextLog(_T("微信账号:%s"), szTemp);
+	wxInfo.strWxAccount = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131B78)));
 	WriteTextLog(_T("微信ID:%s"), szTemp);
 	_stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131BEC)));
 	WriteTextLog(_T("微信ID:%s"), szTemp);
-
+	wxInfo.strWxID = szTemp;
 	
 	// 微信中文不是宽字符,而是URL编译的UTF8格式;
 	string str;
 	_stprintf_s(szTemp, _T("%s"), LPDWORD(dwWeChatWinAddr + 0x1131C64));	
 	EncodingConverion::DeCode_URLUTF8(szTemp,str);
 	WriteTextLog(_T("微信昵称:%s"), str.c_str());
+	wxInfo.strWxNick = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131C98);
 	WriteTextLog(_T("微信手机:%s"), szTemp);
+	wxInfo.strWxPhone = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131D50);
 	WriteTextLog(_T("微信省:%s"), szTemp);
+	wxInfo.strWxProvince = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131D68);
 	WriteTextLog(_T("微信市:%s"), szTemp);
+	wxInfo.strWxCity = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1132030);
 	WriteTextLog(_T("微信手机设备:%s"), szTemp);
+	wxInfo.strWxDevice = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131C80)));
 	WriteTextLog(_T("微信邮箱:0x%p, 0x%p"), dwWeChatWinAddr + 0x1131C80, *(LPDWORD(dwWeChatWinAddr + 0x1131C80)) );
 	WriteTextLog(_T("微信邮箱:%s"), szTemp);
+	wxInfo.strWxEmail = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131F2C)));
 	WriteTextLog(_T("微信大头像:%s"), szTemp);
+	wxInfo.strWxLImgAddr = szTemp;
 
 	_stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131F44)));
 	WriteTextLog(_T("微信小头像:%s"), szTemp);
+	wxInfo.strWxSImgAddr = szTemp;
 
 	return TRUE;
 }

+ 2 - 0
source/hook/hook/WxGlobal.h

@@ -134,6 +134,8 @@ typedef struct __WECHAT__{
 
 
 extern HMODULE g_hCurModule;
+extern TCHAR g_szCurModulePath[MAX_PATH];
+extern TCHAR g_szFna[MAX_PATH];
 extern void WriteTextLog(const TCHAR *format, ...);
 extern void WriteTextLogW(const WCHAR *format, ...);
 extern BOOL GetWxInfo(WxInfo &wxInfo);

+ 49 - 13
source/hook/hook/dllmain.cpp

@@ -1,5 +1,6 @@
 // dllmain.cpp : 定义 DLL 应用程序的入口点。
 #include "stdafx.h"
+#include "..\common\CurlClient.h"
 
 //https://docs.microsoft.com/zh-cn/windows/desktop/winmsg/using-hooks
 HHOOK	ghk_CBT = NULL;
@@ -103,24 +104,59 @@ LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
 BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
 {
 	g_hCurModule = hModule;
+#if 1 // 获取dll的目录;
+	TCHAR szDrive[MAX_PATH] = { 0 };
+	TCHAR szDir[MAX_PATH] = { 0 };
+	TCHAR szExt[MAX_PATH] = { 0 };
+	::GetModuleFileName(g_hCurModule, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
+	_tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
+	_tcscpy_s(g_szCurModulePath, szDrive);
+	_tcscat_s(g_szCurModulePath, szDir);
+#endif
+
+#ifdef _DEBUG
+	Sleep(5000);
+#endif
+
 	switch (ul_reason_for_call)
 	{
 	case DLL_PROCESS_ATTACH:
 	{
-		DWORD dwThreadId = 0;
-		GetProcInfo(dwThreadId);
-		if (ghk_CBT == NULL)
-		{
-			ghk_CBT = SetWindowsHookEx(WH_CBT, CBTProc, HINSTANCE(0x000604F4), dwThreadId);
+		std::thread t([]() {
+			DWORD dwThreadId = 0;
+			GetProcInfo(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);
+			{
+				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);
+
+			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);
+					}
+				}
+			}
+			});
+		t.detach();
 	}
 	break;
 	case DLL_THREAD_ATTACH:

+ 13 - 2
source/hook/hook/hook.vcxproj

@@ -27,6 +27,7 @@
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <PlatformToolset>v141</PlatformToolset>
     <CharacterSet>MultiByte</CharacterSet>
+    <UseOfMfc>false</UseOfMfc>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -54,30 +55,34 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;HOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;HOOK_EXPORTS;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+      <AdditionalIncludeDirectories>..\Include;</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Windows</SubSystem>
       <TargetMachine>MachineX86</TargetMachine>
+      <AdditionalLibraryDirectories>..\lib;</AdditionalLibraryDirectories>
+      <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HOOK_EXPORTS;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalIncludeDirectories>..\Include;</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -85,9 +90,13 @@
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <TargetMachine>MachineX86</TargetMachine>
+      <AdditionalLibraryDirectories>..\lib;</AdditionalLibraryDirectories>
+      <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\common\CharEncoding.cpp" />
+    <ClCompile Include="..\common\CurlClient.cpp" />
     <ClCompile Include="dllmain.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
       </PrecompiledHeader>
@@ -105,6 +114,8 @@
     <ClCompile Include="WxGlobal.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\common\CharEncoding.h" />
+    <ClInclude Include="..\common\CurlClient.h" />
     <ClInclude Include="EncodingConversion.h" />
     <ClInclude Include="stdafx.h" />
     <ClInclude Include="targetver.h" />

+ 15 - 0
source/hook/hook/hook.vcxproj.filters

@@ -13,6 +13,9 @@
       <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
       <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
     </Filter>
+    <Filter Include="curl">
+      <UniqueIdentifier>{7c5b6df7-ad07-456f-89e2-6896cbaa45da}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="dllmain.cpp">
@@ -30,6 +33,12 @@
     <ClCompile Include="WxGlobal.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="..\common\CharEncoding.cpp">
+      <Filter>curl</Filter>
+    </ClCompile>
+    <ClCompile Include="..\common\CurlClient.cpp">
+      <Filter>curl</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="EncodingConversion.h">
@@ -44,6 +53,12 @@
     <ClInclude Include="WxGlobal.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="..\common\CharEncoding.h">
+      <Filter>curl</Filter>
+    </ClInclude>
+    <ClInclude Include="..\common\CurlClient.h">
+      <Filter>curl</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Text Include="ReadMe.txt" />

+ 5 - 0
source/hook/hook/stdafx.h

@@ -22,3 +22,8 @@
 //#include <ntifs.h>
 //#include <wudfwdm.h> // UNICODE_STRINGµÄÍ·Îļþ;
 
+#pragma comment(lib, "legacy_stdio_definitions.lib")
+#include <thread>
+#include <future>               // std::async, std::future
+#include <chrono>               // std::chrono::milliseconds
+