注入 - 远线程注入DLL到目标进程
// // 函数 -- void InjectDLL(LPCTSTR) // // 功能 -- 注入DLL到指定窗口 // // @param -- 要注入的DLL全路径 // // 返回值 -- 无 // void InjectDLL(LPCTSTR lpDLLFullPath) { DWORD dwPID = 0; // 目标进程PID HANDLE hGameProcess = NULL; // 目标进程句柄 LPDWORD lpdwAddr = NULL; // 远程申请的内存空间地址 DWORD dwWriteByteSize = 0; // 写入的字节数 HANDLE hRemoteThread = NULL; // 远程线程句柄 // 1. 获取窗口句柄 HWND hGameWnd = ::FindWindow(GAME_CLASS_NAME, NULL); if (hGameWnd) { // 2. 通过窗口句柄, 获取窗口PID GetWindowThreadProcessId(hGameWnd, &dwPID); if (dwPID) { // 3. 通过窗口PID, 获取游戏进程句柄 hGameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID); if (hGameProcess) { // 4. 在游戏进程里, 分配一片内存空间, 用于存放要注入的DLL; // @param1 : 游戏进程句柄; @param2 : 指定的内存地址(一般为NULL); @param3 == 256 代表DLL路径的最大长度; @param4 : 可读可写 lpdwAddr = (LPDWORD)VirtualAllocEx(hGameProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE); if (lpdwAddr) { // 5. 写入DLL全路径 WriteProcessMemory(hGameProcess, lpdwAddr, lpDLLFullPath, strlen(lpDLLFullPath) + 1, &dwWriteByteSize); //MAIN_DLL_FULL_PATH if (dwWriteByteSize >= strlen(lpDLLFullPath)) { // 6. 创建远程线程注入DLL hRemoteThread = CreateRemoteThread(hGameProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpdwAddr, 0, NULL); // 7. 清理资源 WaitForSingleObject(hRemoteThread, INFINITE); CloseHandle(hRemoteThread); // 关闭远程线程句柄 VirtualFreeEx(hGameProcess, lpdwAddr, 256, MEM_DECOMMIT); // 释放申请的内存空间 CloseHandle(hGameProcess); // 关闭目标进程句柄 printf(_T("\r\n资源清理完毕!\r\n")); } else { CloseHandle(hGameProcess); printf(_T("\r\n写入DLL路径失败!\r\n")); } } } } } }