war3 MH常用的方法就是記憶體補丁。現貼點代碼,原始碼忘記從哪裡找的了。
是針對魔獸1.20的,注意和1.20e不是一個版本,這個當然不能過任何對戰平台了。
// mh2.cpp : Defines the entry point for the console application.<br />//</p><p>#include "stdafx.h"<br />/*<br />*WC3 Maphack<br />*ccyxcn@gmail.com<br />*/<br />#include <windows.h></p><p>int main(int argc, char* argv[])<br />{</p><p>//提升程式許可權,使其能夠修改war3進程。<br />HANDLE hcurrent=GetCurrentProcess();<br />HANDLE hToken;<br />BOOL bret=OpenProcessToken(hcurrent,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);<br />LUID luid;<br />bret=LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid);<br />TOKEN_PRIVILEGES NewState,PreviousState;<br />DWORD ReturnLength;<br />NewState.PrivilegeCount =1;<br />NewState.Privileges[0].Luid =luid;<br />NewState.Privileges[0].Attributes=2;<br />bret=AdjustTokenPrivileges(hToken,FALSE,&NewState,28,&PreviousState,&ReturnLength);<br />CloseHandle(hToken);</p><p>//Find wc3 windows<br />//找到war3的表單控制代碼,並獲得進程PID<br />HWND hwar3=::FindWindow(NULL,"Warcraft III");<br />DWORD PID, TID;<br />TID = ::GetWindowThreadProcessId (hwar3, &PID);</p><p>//Open wc3 process<br />//開啟war3進程以供編輯<br />HANDLE hopen=OpenProcess( PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|<br />PROCESS_VM_WRITE,FALSE,PID);</p><p>//Write memory<br />//這裡就是記憶體補丁的內容了,這個需要調試war3程式才能搞清楚怎麼補,國內的<br />//MH基本上都是靠調試國外的MH得到的修改方法,還沒見過什麼原創的<br />//這裡的修改是war3 1.20版的,和常用的1.20e不是一個版本。<br />DWORD data=0x74;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F4069F0,&data,1,0);<br />data=0x8B;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A0E,&data,1,0);<br />data=0x09;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A0F,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A10,&data,1,0);<br />data=0x8B;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A13,&data,1,0);<br />data=0x09;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A14,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A15,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F29FE20,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F29FE21,&data,1,0);<br />data=0x00;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F149198,&data,1,0);<br />data=0x40;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0803,&data,1,0);<br />data=0x33;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0804,&data,1,0);<br />data=0xC0;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0805,&data,1,0);<br />data=0x42;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0806,&data,1,0);<br />data=0x33;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0807,&data,1,0);<br />data=0xD2;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0808,&data,1,0);<br />data=0xEB;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F14A0B4,&data,1,0);<br />data=0xEB;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0703,&data,1,0);</p><p>//Close handle<br />bret=CloseHandle(hopen);<br />return 0;<br />}
還有另外一個都差不多。
// mh.cpp : Defines the entry point for the console application.<br />//</p><p>#include "stdafx.h"<br />#include <windows.h></p><p>void EnableDebugPriv();</p><p>int main(int argc, char* argv[])<br />{<br /> //We have to set debug privileges for our app to be allowed to OpenProcess (war3.exe)<br /> EnableDebugPriv(); </p><p> //Get a Handle on Warcraft III window<br /> HWND hwar3 = FindWindow("Warcraft III",NULL); </p><p> if (!hwar3) //If we can't find the window...<br /> {<br /> MessageBox(0, "Run Warcarft III First!", "", MB_OK);<br /> return false;<br /> } </p><p> DWORD pid;<br /> GetWindowThreadProcessId(hwar3, &pid);<br /> HANDLE hopen = OpenProcess(PROCESS_ALL_ACCESS, false, pid); </p><p> if (!hopen) //Can't open Warcarft III's process.. Must be a PID error.<br /> {<br />MessageBox(0, "Your getting a PID error, use LoaderZ.", "", MB_OK);<br />return false;<br /> } </p><p> //Now we're ready to change the memory!<br />//Write memory<br />BOOL bret;<br />DWORD data=0x74;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F4069F0,&data,1,0);<br />data=0x8B;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A0E,&data,1,0);<br />data=0x09;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A0F,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A10,&data,1,0);<br />data=0x8B;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A13,&data,1,0);<br />data=0x09;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A14,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F406A15,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F29FE20,&data,1,0);<br />data=0x90;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F29FE21,&data,1,0);<br />data=0x00;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F149198,&data,1,0);<br />data=0x40;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0803,&data,1,0);<br />data=0x33;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0804,&data,1,0);<br />data=0xC0;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0805,&data,1,0);<br />data=0x42;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0806,&data,1,0);<br />data=0x33;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0807,&data,1,0);<br />data=0xD2;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0808,&data,1,0);<br />data=0xEB;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F14A0B4,&data,1,0);<br />data=0xEB;<br />bret=WriteProcessMemory(hopen,(LPVOID)0x6F2A0703,&data,1,0);</p><p>if(bret)//Everything worked<br />{<br />MessageBox(NULL, "Hack Loaded - Remember to Vist www.SkillHackerZ.com", "", MB_OK);<br />}<br />else//There was an error!<br />{<br />MessageBox(NULL, "Couldn't load hack", "", MB_OK);<br />}</p><p> // Remember to be clean<br />CloseHandle(hopen);<br /> //Done!<br /> return true;<br />} </p><p>void EnableDebugPriv()<br />{ </p><p> HANDLE hToken; </p><p> LUID sedebugnameValue; </p><p> TOKEN_PRIVILEGES tkp; </p><p> OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); </p><p> LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue); </p><p> tkp.PrivilegeCount = 1; </p><p> tkp.Privileges[0].Luid = sedebugnameValue; </p><p> tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; </p><p> AdjustTokenPrivileges(hToken, false, &tkp, sizeof tkp, NULL, NULL); </p><p> CloseHandle(hToken);<br />}