|
@@ -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);
|