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; 
} 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////