Pārlūkot izejas kodu

创建进程,并挂机进程;同时,挂起的进程仍能注入dll.

Wang 6 gadi atpakaļ
vecāks
revīzija
b79395f704
1 mainītis faili ar 54 papildinājumiem un 1 dzēšanām
  1. 54 1
      source/hook/WeChats/WeChats.cpp

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

@@ -55,7 +55,60 @@ BOOL CWeChatsApp::InitInstance()
 	GetIniInfo();
 	GetDebugPriv();
 
-#if _DEBUG
+#if _DEBUG // 创建进程,并挂起;
+	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 (
+		_T("C:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe"),				// 不在此指定可执行文件的文件名
+		NULL,				// 命令行参数
+		NULL,				// 默认进程安全性
+		NULL,				// 默认线程安全性
+		FALSE,				// 指定当前进程内的句柄不可以被子进程继承
+		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(3000);
+		}
+
+		//不sleep就会出现读取不到的297错误
+		Sleep(5000);				
+
+		//获取线程上下文
+		CONTEXT ct = { 0 };
+		ct.ContextFlags = CONTEXT_CONTROL;
+		GetThreadContext(pi.hThread, &ct);
+
+		::ResumeThread(pi.hThread);	
+
+		// 既然我们不使用两个句柄,最好是立刻将它们关闭
+		::CloseHandle (pi.hThread);
+		::CloseHandle (pi.hProcess);
+
+	}
+#endif
+
+#if !_DEBUG
 	TCHAR szDllPath[MAX_PATH];
 	ZeroMemory(szDllPath,MAX_PATH);
 	DWORD ss = sizeof(szDllPath);