CodeAtom.cpp
上传用户:qc13828
上传日期:2007-06-21
资源大小:63k
文件大小:4k
源码类别:

ICQ弱点检测代码

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // 预处理
  3. #include "Define.h"
  4. #include <Windows.h>
  5. #include "CodeAtom.h"
  6. #pragma warning(disable:4312)
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. // 执行文件并打补丁
  10. UINT CCodeAtom::Execute(PTSTR ptzFileName, PCODEATOM pCa, UINT uNum, UINT uTry, UINT uSleep, BYTE bIgnore)
  11. {
  12. UINT i;
  13. UINT j;
  14. UINT uResult;
  15. BOOL bRunning;
  16. STARTUPINFO siStartup;
  17. PROCESS_INFORMATION piProcess;
  18. // 创建进程
  19. uResult = 0;
  20. ZeroMemory(&siStartup, sizeof(STARTUPINFO));
  21. siStartup.cb = sizeof(STARTUPINFO);
  22. if (CreateProcess(ptzFileName, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, 0, 0, &siStartup, &piProcess) == FALSE)
  23. {
  24. return 0;
  25. }
  26. // 初始化
  27. for (i = 0; i < uNum; i++)
  28. {
  29. pCa[i].pbStart = (PBYTE) HeapAlloc(GetProcessHeap(), 0, pCa[i].uRangeSize);
  30. pCa[i].pbEnd = pCa[i].pbStart + pCa[i].uRangeSize - pCa[i].uStampSize;
  31. pCa[i].bPatched = FALSE;
  32. }
  33. // 尝试指定次数
  34. uResult = 0;
  35. bRunning = FALSE;
  36. for (j = 0; j < uTry; j++)
  37. {
  38. // 打上每个补丁
  39. for (i = 0; i < uNum; i++)
  40. {
  41. if ((pCa[i].bPatched == FALSE) && Patch(piProcess.hProcess, &pCa[i], bIgnore))
  42. {
  43. pCa[i].bPatched = TRUE;
  44. uResult++;
  45. }
  46. }
  47. // 启动目标线程
  48. if (bRunning == FALSE)
  49. {
  50. bRunning = TRUE;
  51. ResumeThread(piProcess.hThread);
  52. }
  53. // 如果补丁已经全部完成
  54. if (uResult == uNum)
  55. {
  56. break;
  57. }
  58. // 休息一下
  59. Sleep(uSleep);
  60. }
  61. // 释放内存
  62. for (i = 0; i < uNum; i++)
  63. {
  64. if (pCa[i].pbStart)
  65. {
  66. HeapFree(GetProcessHeap(), 0, pCa[i].pbStart);
  67. }
  68. }
  69. CloseHandle(piProcess.hThread);
  70. CloseHandle(piProcess.hProcess);
  71. return uResult;
  72. }
  73. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. // 打补丁
  76. BOOL CCodeAtom::Patch(HANDLE hProcess, PCODEATOM pCa, BYTE bIgnore)
  77. {
  78. PBYTE p;
  79. DWORD dwAddress;
  80. // 读取数据
  81. for (dwAddress = pCa->dwAddress; dwAddress < pCa->dwAddress + pCa->uRangeSize; dwAddress += 0x00001000)
  82. {
  83. if (ReadProcessMemory(hProcess, (PVOID) dwAddress, 
  84. pCa->pbStart, pCa->uRangeSize - (dwAddress - pCa->dwAddress), NULL))
  85. {
  86. // 查找指定标识
  87. for (p = pCa->pbStart; p < pCa->pbEnd; p++)
  88. {
  89. // 与标识相等吗
  90. if (EqualStamp(p, pCa->bStamp, pCa->uStampSize, bIgnore))
  91. {
  92. // 写入补丁
  93. dwAddress = dwAddress + (DWORD) (p - pCa->pbStart);
  94. return WritePatch(hProcess, dwAddress, pCa->bPatch, pCa->uStampSize, bIgnore);
  95. }
  96. }
  97. }
  98. }
  99. return FALSE;
  100. }
  101. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. // 比较标识
  104. BOOL CCodeAtom::EqualStamp(PBYTE pbData, PBYTE pbStamp, UINT uSize, BYTE bIgnore)
  105. {
  106. UINT i;
  107. for (i = 0; i < uSize; i++)
  108. {
  109. if ((pbStamp[i] != bIgnore) && (pbData[i] != pbStamp[i]))
  110. {
  111. return FALSE;
  112. }
  113. }
  114. return TRUE;
  115. }
  116. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  117. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  118. // 写入补丁
  119. BOOL CCodeAtom::WritePatch(HANDLE hProcess, DWORD dwAddress, PBYTE pbPatch, UINT uSize, BYTE bIgnore)
  120. {
  121. UINT i;
  122. for (i = 0; i < uSize; i++)
  123. {
  124. if (pbPatch[i] != bIgnore)
  125. {
  126. if (WriteProcessMemory(hProcess, (PVOID) (dwAddress + i), &pbPatch[i], 1, NULL) == FALSE)
  127. {
  128. return FALSE;
  129. }
  130. }
  131. }
  132. return TRUE;
  133. }
  134. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////