CodeAtom.cpp
资源名称:DetourQQ.rar [点击查看]
上传用户:qc13828
上传日期:2007-06-21
资源大小:63k
文件大小:4k
源码类别:
ICQ弱点检测代码
开发平台:
Visual C++
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // 预处理
- #include "Define.h"
- #include <Windows.h>
- #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;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////