// 获取进程句柄
HANDLE hProcess = OnGetProcessHandle(GAME_WND_CLASS, GAME_WND_TITLE);
if (NULL == hProcess)
{
return -1;
}
// 在目标进程分配空间
LPVOID pvAddr = ::VirtualAllocEx(hProcess, (LPVOID)pOp->ImageBase, pOp->SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if ((LPVOID)-1 == pvAddr)
{
return -1; // 函数参数错误
}
// 如果在 ImageBase 的位置没有占到了空间, 那么则需要修复重定位表
if (NULL == pvAddr)
{
printf("自分配并且修复重定位表\n");
pvAddr = ::VirtualAllocEx(hProcess, NULL, pOp->SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (NULL == pvAddr)
{
return -1;
}
else
{
// 修复重定位表
OnUpDataRelocation(&pcImageBuffer, &pvAddr, &pOp, (DWORD)((LPSTR)pvAddr - pOp->ImageBase));
}
}
// 修复 IAT 表
if (0 != OnUpDataIAT(&pcImageBuffer, &pOp))
{
return -1;
}
::WriteProcessMemory(hProcess, pvAddr, pcImageBuffer, pOp->SizeOfImage, NULL);
// 保存 OEP
DWORD dwOEP = pOp->AddressOfEntryPoint;
// 释放 ImageBuffer 的资源
free(pcImageBuffer);
pcImageBuffer = NULL;
HANDLE hThread = ::CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)((LPSTR)pvAddr + dwOEP), NULL, 0, NULL);
::WaitForSingleObject(hThread, INFINITE);
// 释放目标进程虚拟空间
::VirtualFreeEx(hProcess, pvAddr, 0, MEM_RELEASE);
::CloseHandle(hProcess);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
这个 MyPeTools 是我自己写的, 如果我把目标进程设定为这个, 然后我重新生成一个默认的 win32 窗口程序, 然后往里面注入,可以弹出窗口, 并且目标进程也不会崩溃, 但是我换成“热血江湖”这一款游戏则就不行了, 只要代码执行完“CreateRemoteThread()” 游戏进程就崩掉了。求教各路大神帮忙看看,需要整个源代码可以加 QQ 3258286196 , 谢谢了, 可以请大佬抽烟。