//
// 函数 -- 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"));
}
}
}
}
}
}
来源:https://www.cnblogs.com/DuanLaoYe/p/5472344.html