www.pudn.com > DetourQQ.rar > CodeAtom.cpp
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 预处理 #include "Define.h" #include#include "CodeAtom.h" #pragma warning(disable:4312) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 执行文件并打补丁 UINT CCodeAtom::Execute(PTSTR ptzFileName, PCODEATOM pCa, UINT uNum, UINT uTry, UINT uSleep, BYTE bIgnore) { UINT i; UINT j; UINT uResult; BOOL bRunning; STARTUPINFO siStartup; PROCESS_INFORMATION piProcess; // 创建进程 uResult = 0; ZeroMemory(&siStartup, sizeof(STARTUPINFO)); siStartup.cb = sizeof(STARTUPINFO); if (CreateProcess(ptzFileName, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, 0, 0, &siStartup, &piProcess) == FALSE) { return 0; } // 初始化 for (i = 0; i < uNum; i++) { pCa[i].pbStart = (PBYTE) HeapAlloc(GetProcessHeap(), 0, pCa[i].uRangeSize); pCa[i].pbEnd = pCa[i].pbStart + pCa[i].uRangeSize - pCa[i].uStampSize; pCa[i].bPatched = FALSE; } // 尝试指定次数 uResult = 0; bRunning = FALSE; for (j = 0; j < uTry; j++) { // 打上每个补丁 for (i = 0; i < uNum; i++) { if ((pCa[i].bPatched == FALSE) && Patch(piProcess.hProcess, &pCa[i], bIgnore)) { pCa[i].bPatched = TRUE; uResult++; } } // 启动目标线程 if (bRunning == FALSE) { bRunning = TRUE; ResumeThread(piProcess.hThread); } // 如果补丁已经全部完成 if (uResult == uNum) { break; } // 休息一下 Sleep(uSleep); } // 释放内存 for (i = 0; i < uNum; i++) { if (pCa[i].pbStart) { HeapFree(GetProcessHeap(), 0, pCa[i].pbStart); } } CloseHandle(piProcess.hThread); CloseHandle(piProcess.hProcess); return uResult; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 打补丁 BOOL CCodeAtom::Patch(HANDLE hProcess, PCODEATOM pCa, BYTE bIgnore) { PBYTE p; DWORD dwAddress; // 读取数据 for (dwAddress = pCa->dwAddress; dwAddress < pCa->dwAddress + pCa->uRangeSize; dwAddress += 0x00001000) { if (ReadProcessMemory(hProcess, (PVOID) dwAddress, pCa->pbStart, pCa->uRangeSize - (dwAddress - pCa->dwAddress), NULL)) { // 查找指定标识 for (p = pCa->pbStart; p < pCa->pbEnd; p++) { // 与标识相等吗 if (EqualStamp(p, pCa->bStamp, pCa->uStampSize, bIgnore)) { // 写入补丁 dwAddress = dwAddress + (DWORD) (p - pCa->pbStart); return WritePatch(hProcess, dwAddress, pCa->bPatch, pCa->uStampSize, bIgnore); } } } } return FALSE; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 比较标识 BOOL CCodeAtom::EqualStamp(PBYTE pbData, PBYTE pbStamp, UINT uSize, BYTE bIgnore) { UINT i; for (i = 0; i < uSize; i++) { if ((pbStamp[i] != bIgnore) && (pbData[i] != pbStamp[i])) { return FALSE; } } return TRUE; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 写入补丁 BOOL CCodeAtom::WritePatch(HANDLE hProcess, DWORD dwAddress, PBYTE pbPatch, UINT uSize, BYTE bIgnore) { UINT i; for (i = 0; i < uSize; i++) { if (pbPatch[i] != bIgnore) { if (WriteProcessMemory(hProcess, (PVOID) (dwAddress + i), &pbPatch[i], 1, NULL) == FALSE) { return FALSE; } } } return TRUE; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////