Bladeren bron

1、手势鼠标图标
2、CWxObject包含CInject类功能,不从CInject中继承。

Jeff 6 jaren geleden
bovenliggende
commit
0962da0d37

+ 0 - 1
source/hook/WeChats/CDLG_Login.cpp

@@ -135,7 +135,6 @@ void CDLG_Login::InitAllCtrl()
 #endif
 
 	// 设置静态文本背景透明;
-	m_stStudioID.SetTransparent(TRUE);
 	m_stAccount.SetTransparent(TRUE);
 	m_stPassWord.SetTransparent(TRUE);
 

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

@@ -25,7 +25,6 @@ public:
 	CEnBitmap		m_DLGBackground;
 	// 不规则背景要去掉的颜色;
 	HRGN			m_hrgn;
-	CLabel			m_stStudioID;
 	CLabel			m_stAccount;
 	CLabel			m_stPassWord;
 	CSkinButton		m_btnLogin;

+ 183 - 0
source/hook/WeChats/CWxObject.cpp

@@ -0,0 +1,183 @@
+#include "stdafx.h"
+#include "CWxObject.h"
+
+
+CWxObject::CWxObject()
+	:m_dwWxProcId(0)
+	, m_hWxProcess(NULL)
+	, m_lpInjectData(NULL)
+	, m_lpEjectData(NULL)
+	, m_hInjectThread(NULL)
+	, m_hEjectThread(NULL)
+	, m_dwPathLen(0)
+{
+
+}
+
+CWxObject::CWxObject(DWORD dwProcId, LPCTSTR lpDynamicLibraryPath)
+	:m_dwWxProcId(dwProcId)
+	, m_hWxProcess(NULL)
+	, m_lpInjectData(NULL)
+	, m_lpEjectData(NULL)
+	, m_hInjectThread(NULL)
+	, m_hEjectThread(NULL)
+	, m_dwPathLen(0)
+{
+	ASSERT(dwProcId != 0);
+	ASSERT(lpDynamicLibraryPath != NULL);
+
+	memset(m_szDllPath, 0, sizeof(m_szDllPath));
+	_tcscpy_s(m_szDllPath, lpDynamicLibraryPath);
+
+	m_hWxProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwWxProcId);
+	if (m_hWxProcess == NULL)
+	{
+		WriteTextLog(_T("打开WeChat.exe进程失败"));
+	}
+	//m_hWxProcess = OpenProcess(PROCESS_CREATE_THREAD	| PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, m_dwWxProcId);
+}
+
+CWxObject::~CWxObject()
+{
+	// 卸载dll;
+	EjectDynamicLibrary();
+
+	// 释放所有资源;
+	if (m_hInjectThread)
+		CloseHandle(m_hInjectThread);
+	m_hInjectThread = NULL;
+
+	if (m_hEjectThread)
+		CloseHandle(m_hEjectThread);
+	m_hEjectThread = NULL;
+
+	if (m_lpInjectData)
+		VirtualFreeEx(m_hWxProcess, m_lpInjectData, m_dwPathLen, MEM_RELEASE);
+	m_lpInjectData = NULL;
+
+	if (m_lpEjectData)
+		VirtualFreeEx(m_hWxProcess, m_lpEjectData, m_dwPathLen, MEM_RELEASE);
+	m_lpEjectData = NULL;
+
+	if (m_hWxProcess)
+		CloseHandle(m_hWxProcess);
+	m_hWxProcess = NULL;
+}
+
+
+void CWxObject::setInjectionObj(DWORD dwProcId, LPCTSTR lpDynamicLibraryPath)
+{
+	ASSERT(dwProcId != 0);
+	ASSERT(lpDynamicLibraryPath != NULL);
+
+	memset(m_szDllPath, 0, sizeof(m_szDllPath));
+	_tcscpy_s(m_szDllPath, lpDynamicLibraryPath);
+	m_dwWxProcId = dwProcId;
+	m_hWxProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwWxProcId);
+	if (m_hWxProcess == NULL)
+	{
+		WriteTextLog(_T("打开WeChat.exe进程失败"));
+	}
+	//m_hWxProcess = OpenProcess(PROCESS_CREATE_THREAD	| PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, m_dwWxProcId);
+}
+
+BOOL CWxObject::InjectDynamicLibrary()
+{
+	ASSERT(m_hWxProcess != NULL);
+
+	m_dwPathLen = _tcslen(m_szDllPath) * sizeof(TCHAR) + 1;
+	m_lpInjectData = VirtualAllocEx(m_hWxProcess, NULL, m_dwPathLen, MEM_COMMIT, PAGE_READWRITE);
+	if (NULL == m_lpInjectData)
+	{
+		WriteTextLog(_T("创建WeChat.exe进程虚拟内存失败"));
+		return FALSE;
+	}
+
+	if (WriteProcessMemory(m_hWxProcess, m_lpInjectData, m_szDllPath, m_dwPathLen, NULL) == 0)
+	{
+		// 注意:MEM_RELEASE释放时第三参数一定要为0,请查看MSDN;
+		VirtualFreeEx(m_hWxProcess, m_lpInjectData, 0, MEM_RELEASE);
+		return FALSE;
+	}
+
+	HMODULE hk32 = GetModuleHandle(_T("kernel32.dll"));
+	// 注意:微信使用的是W版本;
+	LPVOID lpAddr = GetProcAddress(hk32, "LoadLibraryW");
+
+	m_hInjectThread = CreateRemoteThread(m_hWxProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpAddr, m_lpInjectData, 0, NULL);
+	if (NULL == m_hInjectThread)
+	{
+		// 注意:MEM_RELEASE释放时第三参数一定要为0,请查看MSDN;
+		VirtualFreeEx(m_hWxProcess, m_lpInjectData, 0, MEM_RELEASE);
+		return FALSE;
+	}
+
+	WaitForSingleObject(m_hInjectThread, INFINITE);
+	if (m_hInjectThread)
+		CloseHandle(m_hInjectThread);
+	m_hInjectThread = NULL;
+
+	/* 注入成功后,不能释放内存否则微信会挂;
+	if (m_lpInjectData != NULL)
+		VirtualFreeEx(m_hWxProcess, m_lpInjectData, 0, MEM_RELEASE);
+	*/
+
+	return TRUE;
+}
+
+BOOL CWxObject::EjectDynamicLibrary()
+{
+	if (m_hWxProcess == NULL)
+		return TRUE;
+
+	// 获取模块句柄;
+	HANDLE hModule = FindModuleEx(m_szDllPath, m_dwWxProcId);
+	if (hModule == NULL)
+	{
+		WriteTextLog(_T("获取WeChat.exe进程模块hook.dll失败"));
+		return FALSE;
+	}
+
+	LPVOID lpAddr = GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "FreeLibraryAndExitThread");//FreeLibraryAndExitThread//FreeLibrary
+	if (lpAddr == NULL)
+	{
+		WriteTextLog(_T("获取kernel32.dll中的FreeLibraryAndExitThread失败"));
+		return FALSE;
+	}
+
+	m_hEjectThread = CreateRemoteThread(m_hWxProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpAddr, hModule, 0, NULL);
+	if (m_hEjectThread == NULL)
+	{
+		WriteTextLog(_T("创建WeChat.exe远程线程(FreeLibraryAndExitThread)失败"));
+		return FALSE;
+	}
+
+	WaitForSingleObject(m_hEjectThread, INFINITE);
+	if (m_hEjectThread)
+		CloseHandle(m_hEjectThread);
+	m_hEjectThread = NULL;
+
+	return TRUE;
+}
+
+BOOL CWxObject::FindWxWnd()
+{
+	while(true)
+	{
+		::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
+		if(NULL != m_hWxWnd)
+			break;
+	}
+}
+
+int CWxObject::EnumWindowsProc(HWND hwnd, LPARAM lParam)
+{
+    DWORD pID;
+    DWORD tpID = GetWindowThreadProcessId(hwnd,&pID);
+    if(tpID == (DWORD)lParam)
+    {
+        apphWnd = hwnd;
+        return false;
+    }
+    return true;
+}

+ 44 - 0
source/hook/WeChats/CWxObject.h

@@ -0,0 +1,44 @@
+#ifndef __WX_OBJECT__
+#define __WX_OBJECT__
+
+#pragma once
+
+//#include "Injection.h"
+
+class CWxObject
+{
+public:
+	CWxObject();
+	explicit CWxObject(DWORD dwProcId, LPCTSTR lpDynamicLibraryPath);
+	~CWxObject();
+
+protected:
+	// 进程id;
+	DWORD			m_dwWxProcId;
+	// 进程句柄;
+	HANDLE			m_hWxProcess;
+	// 进程窗口句柄;
+	HWND			m_hWxWnd;
+	// 动态库路径;
+	TCHAR			m_szDllPath[MAX_PATH];
+	// 路径分配的内存;
+	LPVOID			m_lpInjectData;
+	LPVOID			m_lpEjectData;
+	// 路径长度;
+	DWORD			m_dwPathLen;
+	// 注入线程句柄;
+	HANDLE			m_hInjectThread;
+	// 卸载线程句柄;
+	HANDLE			m_hEjectThread;
+
+public:
+	inline DWORD GetProcId() { return m_dwWxProcId; };
+	// dll路径和要注入的进程id;
+	void setInjectionObj(DWORD dwProcId, LPCTSTR lpDynamicLibraryPath);
+	BOOL InjectDynamicLibrary();
+	BOOL EjectDynamicLibrary();
+	BOOL FindWxWnd();
+	static int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
+};
+
+#endif //__WX_OBJECT__

+ 66 - 19
source/hook/WeChats/Global.cpp

@@ -938,15 +938,14 @@ BOOL getWeChatPath()
 
 BOOL OpenWeChat()
 {
-#if 1
 	STARTUPINFO si;
 	PROCESS_INFORMATION pi;
 	ZeroMemory(&si, sizeof(si));
 	si.cb = sizeof(si);
 	ZeroMemory(&pi, sizeof(pi));
 
-	si.dwFlags = STARTF_USESHOWWINDOW;  // 指定wShowWindow成员有效
-	si.wShowWindow = TRUE;				// 此成员设为TRUE的话则显示新建进程的主窗口
+	si.dwFlags = STARTF_USESHOWWINDOW;		// 指定wShowWindow成员有效
+	si.wShowWindow = SW_HIDE;				// 设置创建进程时,窗口不显示
 	// 为FALSE的话则不显示
 	BOOL bRet = ::CreateProcess (
 		g_szWeChatPath,		// 不在此指定可执行文件的文件名
@@ -954,9 +953,6 @@ BOOL OpenWeChat()
 		NULL,				// 默认进程安全性
 		NULL,				// 默认线程安全性
 		FALSE,				// 指定当前进程内的句柄不可以被子进程继承
-		//CREATE_SUSPENDED,	// 挂起进程;CREATE_SUSPENDED
-		//NORMAL_PRIORITY_CLASS,
-		//CREATE_NEW_CONSOLE,
 		NULL,
 		NULL,				// 使用本进程的环境变量
 		NULL,				// 使用本进程的驱动器和目录
@@ -976,16 +972,6 @@ BOOL OpenWeChat()
 // 			inject.EjectDynamicLibrary();
 // 		}
 
-		//不sleep就会出现读取不到的297错误
-		//Sleep(5000);				
-
-		//获取线程上下文
-// 		CONTEXT ct = { 0 };
-// 		ct.ContextFlags = CONTEXT_CONTROL;
-// 		GetThreadContext(pi.hThread, &ct);
-// 
-// 		::ResumeThread(pi.hThread);	
-
 		// 既然我们不使用两个句柄,最好是立刻将它们关闭
 		::CloseHandle (pi.hThread);
 		::CloseHandle (pi.hProcess);
@@ -993,8 +979,12 @@ BOOL OpenWeChat()
 		// 当进程挂起时,是无法修改关闭微信句柄;
 		PatchWeChat();
 	}
-#else
 
+	return TRUE;
+}
+
+BOOL OpenWeChat2()
+{
 	SHELLEXECUTEINFO sei;
 	memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
 	sei.cbSize = sizeof(SHELLEXECUTEINFO);
@@ -1008,13 +998,70 @@ BOOL OpenWeChat()
 	sei.nShow = SW_NORMAL;
 	sei.hInstApp = NULL;
 
-	if ( !ShellExecuteEx(&sei) )
+	if (!ShellExecuteEx(&sei))
 	{
 		DWORD dw = GetLastError();
 		return FALSE;
 	}
 	PatchWeChat();
-#endif
+
+	return TRUE;
+}
+
+BOOL OpenWeChatAndSuspended()
+{
+	STARTUPINFO si;
+	PROCESS_INFORMATION pi;
+	ZeroMemory(&si, sizeof(si));
+	si.cb = sizeof(si);
+	ZeroMemory(&pi, sizeof(pi));
+
+	si.dwFlags = STARTF_USESHOWWINDOW;  // 指定wShowWindow成员有效
+	si.wShowWindow = TRUE;				// 此成员设为TRUE的话则显示新建进程的主窗口,
+	// 为FALSE的话则不显示
+	BOOL bRet = ::CreateProcess(
+		g_szWeChatPath,		// 不在此指定可执行文件的文件名
+		NULL,				// 命令行参数
+		NULL,				// 默认进程安全性
+		NULL,				// 默认线程安全性
+		FALSE,				// 指定当前进程内的句柄不可以被子进程继承
+		CREATE_SUSPENDED,	// 挂起进程;CREATE_SUSPENDED
+		NULL,				// 使用本进程的环境变量
+		NULL,				// 使用本进程的驱动器和目录
+		&si,
+		&pi);
+
+	if (bRet)
+	{
+		// 进程挂起后,仍能成功注入dll;
+// 		TCHAR szDllPath[MAX_PATH];
+// 		ZeroMemory(szDllPath,MAX_PATH);
+// 		_stprintf_s(szDllPath, _T("%shook.dll"), g_szModulePath);
+// 		for (int i = 0; i < 10; i++)
+// 		{
+// 			CInjection inject(pi.dwProcessId,szDllPath);
+// 			inject.InjectDynamicLibrary();
+// 			inject.EjectDynamicLibrary();
+// 		}
+
+		//不sleep就会出现读取不到的297错误
+		//Sleep(5000);				
+
+		//获取线程上下文
+ 		CONTEXT ct = { 0 };
+ 		ct.ContextFlags = CONTEXT_CONTROL;
+ 		GetThreadContext(pi.hThread, &ct);
+
+ 		::ResumeThread(pi.hThread);	
+
+		// 既然我们不使用两个句柄,最好是立刻将它们关闭
+		::CloseHandle(pi.hThread);
+		::CloseHandle(pi.hProcess);
+
+		// 当进程挂起时,是无法修改关闭微信句柄;
+		PatchWeChat();
+	}
+
 
 	return TRUE;
 }

+ 26 - 5
source/hook/WeChats/Injection.cpp

@@ -1,6 +1,10 @@
 #include "StdAfx.h"
 #include "Injection.h"
 
+CInjection::CInjection()
+{
+}
+
 CInjection::CInjection(DWORD dwPid, LPCTSTR lpDynamicLibraryPath)
 :m_dwInjectPID(dwPid),
 m_hInjectProcess(NULL),
@@ -51,6 +55,23 @@ CInjection::~CInjection(void)
 	m_hInjectProcess = NULL;
 }
 
+void CInjection::setInjectionObj(DWORD dwPid, LPCTSTR lpDynamicLibraryPath)
+{
+	ASSERT(dwPid != 0);
+	ASSERT(lpDynamicLibraryPath != NULL);
+
+	m_dwInjectPID = dwPid;
+	memset(m_szDllPath, 0, sizeof(m_szDllPath));
+	_tcscpy_s(m_szDllPath, lpDynamicLibraryPath);
+
+	m_hInjectProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwInjectPID);
+	if (m_hInjectProcess == NULL)
+	{
+		WriteTextLog(_T("打开WeChat.exe进程失败"));
+	}
+	//m_hInjectProcess = OpenProcess(PROCESS_CREATE_THREAD	| PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, m_dwInjectPID);
+}
+
 BOOL CInjection::InjectDynamicLibrary()
 {
 	ASSERT(m_hInjectProcess!=NULL);
@@ -82,6 +103,7 @@ BOOL CInjection::InjectDynamicLibrary()
 		return FALSE;
 	}
 
+	WaitForSingleObject(m_hInjectThread, INFINITE);
 	if (m_hInjectThread)
 		CloseHandle(m_hInjectThread);
 	m_hInjectThread = NULL;
@@ -122,12 +144,11 @@ BOOL CInjection::EjectDynamicLibrary()
 	}
 
 	WaitForSingleObject(m_hEjectThread, INFINITE);
+	if (m_hEjectThread)
+		CloseHandle(m_hEjectThread);
+	m_hEjectThread = NULL;
 
 	return TRUE;
 }
 
-void CInjection::InjectionExistProcess()
-{
-	// 查找现在的进程;
-	vector<DWORD> vtPID = FindAllProcess(WECHAT);
-}
+

+ 9 - 10
source/hook/WeChats/Injection.h

@@ -23,12 +23,19 @@
 class CInjection
 {
 public:
-	CInjection(DWORD dwPid, LPCTSTR lpDynamicLibraryPath);
+	CInjection();
+	explicit CInjection(DWORD dwPid, LPCTSTR lpDynamicLibraryPath);
 	~CInjection(void);
+	// dll路径和要注入的进程id;
+	void setInjectionObj(DWORD dwPid, LPCTSTR lpDynamicLibraryPath);
 
+public:
 	BOOL InjectDynamicLibrary();
 	BOOL EjectDynamicLibrary();
-
+	inline HANDLE GetInjectProcess(){
+		return m_hInjectProcess;
+	}
+private:
 	// 当前注入的进程ID;
 	DWORD			m_dwInjectPID;
 	// 动态库路径;
@@ -44,14 +51,6 @@ public:
 	HANDLE			m_hInjectThread;
 	// 卸载线程句柄;
 	HANDLE			m_hEjectThread;
-
-public:
-	// 注入已有的进程;
-	void InjectionExistProcess();
-
-	// 创建新进程并注入;
-
 };
 
-
 #endif

+ 5 - 3
source/hook/WeChats/Resource.h

@@ -9,8 +9,10 @@
 #define IDR_MAINFRAME                   128
 #define IDD_DLG_LOGIN                   129
 #define IDD_DLG_REGISTER                131
+#define IDC_CURSOR_HAND                 133
+#define IDC_BUTTON1                     1000
+#define BTN_OPEN_WX                     1000
 #define TX_ACCOUNT                      1001
-#define IDC_EDIT3                       1002
 #define TX_PASSWROD                     1002
 #define ST_ACCOUNT                      1035
 #define ST_PASSWORD                     1036
@@ -19,9 +21,9 @@
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        133
+#define _APS_NEXT_RESOURCE_VALUE        135
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_CONTROL_VALUE         1001
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 29 - 15
source/hook/WeChats/WeChats.rc

@@ -87,27 +87,28 @@ BEGIN
     DEFPUSHBUTTON   "确定",IDOK,113,41,50,14,WS_GROUP
 END
 
-IDD_WECHATS_DIALOG DIALOGEX 0, 0, 320, 200
+IDD_WECHATS_DIALOG DIALOGEX 0, 0, 543, 306
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 EXSTYLE WS_EX_APPWINDOW
 CAPTION "WeChats"
 FONT 9, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
-    DEFPUSHBUTTON   "确定",IDOK,209,179,50,14
-    PUSHBUTTON      "取消",IDCANCEL,263,179,50,14
-    CTEXT           "TODO: 在此放置对话框控件。",IDC_STATIC,10,96,300,8
+    DEFPUSHBUTTON   "确定",IDOK,7,264,50,14
+    PUSHBUTTON      "取消",IDCANCEL,7,285,50,14
+    PUSHBUTTON      "启动微信",BTN_OPEN_WX,7,244,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_BLACKRECT,63,7,473,292
 END
 
-IDD_DLG_LOGIN DIALOGEX 0, 0, 311, 180
+IDD_DLG_LOGIN DIALOGEX 0, 0, 287, 153
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_SYSMENU
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
-    DEFPUSHBUTTON   "确定",IDOK,90,113,50,14
-    PUSHBUTTON      "取消",IDCANCEL,146,113,50,14
-    EDITTEXT        TX_ACCOUNT,78,64,161,12,ES_AUTOHSCROLL
-    EDITTEXT        TX_PASSWROD,78,80,161,12,ES_PASSWORD | ES_AUTOHSCROLL
-    LTEXT           "用户:",ST_ACCOUNT,40,66,29,8
-    LTEXT           "密码:",ST_PASSWORD,40,83,28,8
+    DEFPUSHBUTTON   "确定",IDOK,90,109,50,14
+    PUSHBUTTON      "取消",IDCANCEL,165,109,50,14
+    EDITTEXT        TX_ACCOUNT,78,60,161,12,ES_AUTOHSCROLL
+    EDITTEXT        TX_PASSWROD,78,76,161,12,ES_PASSWORD | ES_AUTOHSCROLL
+    LTEXT           "用户:",ST_ACCOUNT,39,62,29,8
+    LTEXT           "密码:",ST_PASSWORD,39,79,28,8
 END
 
 IDD_DLG_REGISTER DIALOGEX 0, 0, 310, 177
@@ -178,17 +179,17 @@ BEGIN
     IDD_WECHATS_DIALOG, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 313
+        RIGHTMARGIN, 536
         TOPMARGIN, 7
-        BOTTOMMARGIN, 193
+        BOTTOMMARGIN, 299
     END
 
     IDD_DLG_LOGIN, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 304
+        RIGHTMARGIN, 280
         TOPMARGIN, 7
-        BOTTOMMARGIN, 173
+        BOTTOMMARGIN, 146
     END
 
     IDD_DLG_REGISTER, DIALOG
@@ -217,6 +218,19 @@ BEGIN
     0
 END
 
+IDD_WECHATS_DIALOG AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+
+IDC_CURSOR_HAND         CURSOR                  "res\\Hand.cur"
+
 
 /////////////////////////////////////////////////////////////////////////////
 //

+ 3 - 0
source/hook/WeChats/WeChats.vcxproj

@@ -135,6 +135,7 @@
     <ClCompile Include="..\skinui\Subclass.cpp" />
     <ClCompile Include="..\skinui\SubLabel.cpp" />
     <ClCompile Include="CDLG_Login.cpp" />
+    <ClCompile Include="CWxObject.cpp" />
     <ClCompile Include="Global.cpp" />
     <ClCompile Include="Injection.cpp" />
     <ClCompile Include="stdafx.cpp">
@@ -157,6 +158,7 @@
     <ClInclude Include="..\skinui\Subclass.h" />
     <ClInclude Include="..\skinui\SubLabel.h" />
     <ClInclude Include="CDLG_Login.h" />
+    <ClInclude Include="CWxObject.h" />
     <ClInclude Include="Global.h" />
     <ClInclude Include="IClient.h" />
     <ClInclude Include="InjectInterface.h" />
@@ -175,6 +177,7 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="config.ini" />
+    <None Include="res\Hand.cur" />
     <None Include="res\WeChats.rc2" />
   </ItemGroup>
   <ItemGroup>

+ 9 - 0
source/hook/WeChats/WeChats.vcxproj.filters

@@ -72,6 +72,9 @@
     <ClCompile Include="..\skinui\SubLabel.cpp">
       <Filter>skinui</Filter>
     </ClCompile>
+    <ClCompile Include="CWxObject.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Global.h">
@@ -137,6 +140,9 @@
     <ClInclude Include="..\skinui\SubLabel.h">
       <Filter>skinui</Filter>
     </ClInclude>
+    <ClInclude Include="CWxObject.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Image Include="res\WeChats.ico">
@@ -153,6 +159,9 @@
       <Filter>资源文件</Filter>
     </None>
     <None Include="config.ini" />
+    <None Include="res\Hand.cur">
+      <Filter>资源文件</Filter>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Text Include="ReadMe.txt" />

+ 7 - 0
source/hook/WeChats/WeChatsDlg.cpp

@@ -63,6 +63,7 @@ BEGIN_MESSAGE_MAP(CWeChatsDlg, CDialog)
 	ON_WM_PAINT()
 	ON_WM_QUERYDRAGICON()
 	//}}AFX_MSG_MAP
+	ON_BN_CLICKED(BTN_OPEN_WX, &CWeChatsDlg::OnBnClickedOpenWx)
 END_MESSAGE_MAP()
 
 
@@ -151,3 +152,9 @@ HCURSOR CWeChatsDlg::OnQueryDragIcon()
 	return static_cast<HCURSOR>(m_hIcon);
 }
 
+
+
+void CWeChatsDlg::OnBnClickedOpenWx()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}

+ 2 - 0
source/hook/WeChats/WeChatsDlg.h

@@ -29,4 +29,6 @@ protected:
 	afx_msg void OnPaint();
 	afx_msg HCURSOR OnQueryDragIcon();
 	DECLARE_MESSAGE_MAP()
+public:
+	afx_msg void OnBnClickedOpenWx();
 };

BIN
source/hook/WeChats/res/Hand.cur


+ 2 - 3
source/hook/WeChats/stdafx.cpp

@@ -23,6 +23,7 @@ HANDLE DuplicateHandleEx(DWORD pid, HANDLE h, DWORD flags)
 }
 
 
+// 获取指定名称的进程ID数组;
 int GetProcIds(LPTSTR Name, DWORD* Pids)
 {
 	PROCESSENTRY32 pe32 = {sizeof(pe32)};
@@ -34,7 +35,6 @@ int GetProcIds(LPTSTR Name, DWORD* Pids)
 		if(Process32First(hSnap, &pe32))
 		{
 			do {
-				//if(!wcsicmp(Name, pe32.szExeFile))
 				if(!_tcsicmp(Name, pe32.szExeFile))
 				{
 					if(Pids)
@@ -137,7 +137,7 @@ int PatchWeChat()
 	{
 		if(IsTargetPid(pHandleInfo->Handles[nIndex].UniqueProcessId, Pids, Num))
 		{
-			//
+			// 从微信进程中,复句柄到本进程中;
 			HANDLE hHandle = DuplicateHandleEx(pHandleInfo->Handles[nIndex].UniqueProcessId, 
 				(HANDLE)pHandleInfo->Handles[nIndex].HandleValue,
 				DUPLICATE_SAME_ACCESS
@@ -200,7 +200,6 @@ int PatchWeChat()
 
 			CloseHandle(hHandle);
 		}
-
 	}
 
 Exit0: