标签:
MH的原理就是找到关键的内存地址,然后利用WriteProcessMemory进行修改,修改之前需要一下提高权限。
这里实现的功能就是魔兽对战类RPG可以大地图现形,游戏平台为1.24E,局域网可用,对战平台无法使用。
具体步骤如下:
得到窗口句柄;打开与进程相关的访问令牌;提高权限;获得窗口进程id;打开进程对象;修改进程内存。
依次对应的API:FindWindowA、OpenProcessToken、AdjustTokenPrivileges、GetWindowThreadProcessId、OpenProcess、WriteProcessMemory。功能只能实现了对战类RPG地图的MH,并且对战平台无法使用,代码参考了网上一些公开的资料,就贴出来了。
环境为:win8 32位 VS2010。
vista以上系统以标准用户启动的话,AdjustTokenPrivileges会调用失败,返回一个没有完全调整的错误代码,需要以管理员权限运行。
1 int Ctest_MHDlg::MapHack(void) 2 { 3 BOOL ok=false; 4 HWND hWar3=FindWindowA(NULL,"Warcraft III"); 5 if(hWar3!=NULL) 6 { 7 HANDLE hToken; 8 ok=OpenProcessToken(::GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);//用来打开与进程相关联的访问令牌 9 if(ok) 10 { 11 ok=EnablePrivilege(hToken,SE_DEBUG_NAME);//提高特权 12 if(ok) 13 { 14 DWORD pId; 15 GetWindowThreadProcessId(hWar3,&pId);//获得窗口进程ID 16 HANDLE hOpen=OpenProcess(PROCESS_ALL_ACCESS,0,pId);//打开进程对象 17 if(hOpen!=NULL) 18 { 19 UpdateData(); 20 BYTE buf1[4]={0x66,0xB9,0x01,0x00}; 21 BYTE buf2[4]={0x66,0x8B,0x0C,0x41}; 22 ok=WriteProcessMemory(hOpen, LPVOID(0x6F3a20a3), &buf1, 4, &ss);//大地图显形 23 DWORD d=GetLastError(); 24 WriteProcessMemory(hOpen, LPVOID(0x6F3a20a3), &buf2, 4, &ss);//关闭 25 } 26 } 27 } 28 } 29 return 0; 30 } 31 32 33 bool Ctest_MHDlg::EnablePrivilege(HANDLE hToken, LPCTSTR szPrivName) 34 { 35 bool ok=false; 36 TOKEN_PRIVILEGES tp; 37 tp.PrivilegeCount = 1; 38 ok=LookupPrivilegeValue(NULL,szPrivName,&tp.Privileges[0].Luid); 39 tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED; 40 ok=AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp), (PTOKEN_PRIVILEGES) NULL,(PDWORD) NULL);//调整令牌特权 41 DWORD ErrorCode=GetLastError(); 42 if(ErrorCode==0) 43 return true; 44 else 45 return false; 46 }
至于在什么地方做什么修改,这个也是参考了网上的公开资料。http://blog.csdn.net/breeze356/article/details/4814685这位前辈的博客中有介绍,
当然他也实现了过平台的功能。
上面代码就是将mov di,[ecx+eax*2]修改为mov di,1及改回来。
标签:
原文地址:http://www.cnblogs.com/yeluozhiqlai/p/4202482.html