MH.h
上传用户:tree100901
上传日期:2016-07-12
资源大小:182k
文件大小:4k
源码类别:

外挂编程

开发平台:

Visual C++

  1. //SimpleWc3Hack for Warcraft 3 Patch 1.22...
  2. #include <windows.h>
  3. #include <Tlhelp32.h>
  4. DWORD GetPIDForProcess (TCHAR* process);
  5. void EnableDebugPriv();
  6. DWORD GetDLLBase(TCHAR* DllName, DWORD tPid);
  7. #define PATCH(i,w,l) WriteProcessMemory(hProc,reinterpret_cast<LPVOID>(gameBase+i),w,l,&dSize)
  8. typedef void (*pTextFun)(LPCTSTR);
  9. #define LOG(s) if (text) text(s)
  10. int startMH(pTextFun text)
  11. {
  12. LOG(_T("SimpleWc3Hack v1.0 by wyuzhu loaded!"));
  13. LOG(_T("Searching Wc3..."));
  14. if(GetPIDForProcess(_T("War3.exe")) == 0)
  15. {
  16. LOG(_T("Warcraft 3 was not found..."));
  17. return 0;
  18. }
  19. else
  20. {
  21. LOG(_T("Getting debug privileges..."));
  22. EnableDebugPriv();
  23. LOG(_T("Opening Warcraft 3 Process..."));
  24. HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, GetPIDForProcess(_T("War3.exe")));
  25. if(hProc)
  26. {
  27. LOG(_T("Process opened... Patching"));
  28. DWORD gameBase = GetDLLBase(_T("Game.dll"), GetPIDForProcess(_T("War3.exe")));
  29. DWORD dSize = 0;
  30. PATCH(0x406B4F,"x09x90",2); //Patch 6F3A04AB to nop nop :-)
  31. if(dSize == 0)
  32. {
  33. LOG(_T("Failed to patch showunitsingame"));
  34. }
  35. PATCH(0x406B54,"x09x90",2);
  36. if(dSize == 0)
  37. {
  38. LOG(_T("Failed to patch showunitsmap"));
  39. }
  40. PATCH(0x147C12,"x40x33xC0",3);  
  41. if(dSize == 0)
  42. {
  43. LOG(_T("Failed to patch clickableunits"));
  44. }
  45. PATCH(0x147C17,"x41x33xC9",3);  
  46. if(dSize == 0)
  47. {
  48. LOG(_T("Failed to patch clickableunits (2nd patch)"));
  49. }
  50. PATCH(0x1486F4,"x41x33xC9",3);
  51. if(dSize == 0)
  52. {
  53. LOG(_T("Failed to patch revealillu"));
  54. }
  55. PATCH(0x1486FB,"x41x33xC9",3);
  56. if(dSize == 0)
  57. {
  58. LOG(_T("Failed to patch removefogingame"));
  59. }
  60. PATCH(0x2A0923,"x40x33xC0x42x33xD2",6);
  61. if(dSize == 0)
  62. {
  63. LOG(_T("Failed to patch pingsigna"));
  64. }
  65. PATCH(0x1ACFFC,"x40xC3",2);
  66. if(dSize == 0)
  67. {
  68. LOG(_T("Failed to patch showinvisibleingame"));
  69. }
  70. PATCH(0x7D4E8,"x90x90x90x90xB8x01x00",7);
  71. if(dSize == 0)
  72. {
  73. LOG(_T("Failed to patch showinvisiblemap"));
  74. }
  75. PATCH(0x1491A8,"x00",1);
  76. if(dSize == 0)
  77. {
  78. LOG(_T("Failed to patch showinvisiblemap"));
  79. }
  80. PATCH(0x1494E0,"x39",1);
  81. if(dSize == 0)
  82. {
  83. LOG(_T("Failed to patch showinvisiblemap"));
  84. }
  85. PATCH(0x1494E3,"x85",1);
  86. if(dSize == 0)
  87. {
  88. LOG(_T("Failed to patch showinvisiblemap"));
  89. }
  90. CloseHandle(hProc);
  91. LOG(_T("Done, goodbye!"));
  92. return 1;
  93. }
  94. else
  95. {
  96. LOG(_T("Warcraft 3 could not be opened..."));
  97. return 0;
  98. }
  99. }
  100. return 0;
  101. }
  102. //Queries the ProcessId of a certain process
  103. DWORD GetPIDForProcess (TCHAR* process)
  104. {
  105. BOOL working = 0;
  106. PROCESSENTRY32 lppe = {0};
  107. DWORD targetPid = 0;
  108. HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  109. if (hSnapshot) 
  110. {
  111. lppe.dwSize = sizeof(lppe);
  112. working = Process32First(hSnapshot, &lppe);
  113. while (working)
  114. {
  115. if(wcscmp(lppe.szExeFile, process) == 0)
  116. {
  117. targetPid = lppe.th32ProcessID;
  118. break;
  119. }
  120. working = Process32Next(hSnapshot, &lppe);
  121. }
  122. }
  123. CloseHandle( hSnapshot );
  124. return targetPid;
  125. }
  126. //Enables to open other processes
  127. void EnableDebugPriv()
  128. {
  129. HANDLE hToken;
  130. LUID sedebugnameValue;
  131. TOKEN_PRIVILEGES tkp;
  132. if ( ! OpenProcessToken( GetCurrentProcess(),
  133. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
  134. return;
  135. if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
  136. CloseHandle( hToken );
  137. return;
  138. }
  139. tkp.PrivilegeCount = 1;
  140. tkp.Privileges[0].Luid = sedebugnameValue;
  141. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  142. if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
  143. CloseHandle( hToken );
  144. //Gets the base of our dll
  145. DWORD GetDLLBase(TCHAR* DllName, DWORD tPid)
  146. {
  147. HANDLE snapMod;  
  148. MODULEENTRY32 me32;
  149. if (tPid == 0) return 0;
  150. snapMod = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, tPid);  
  151. me32.dwSize = sizeof(MODULEENTRY32);  
  152. if (Module32First(snapMod, &me32)){ 
  153. do{
  154. if (wcscmp(DllName,me32.szModule) == 0){ 
  155. CloseHandle(snapMod); 
  156. return (DWORD) me32.modBaseAddr; 
  157. }
  158. }while(Module32Next(snapMod,&me32));
  159. }
  160. CloseHandle(snapMod); 
  161. return 0;  
  162. }