首页 > 代码库 > War3之MH
War3之MH
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);//获得窗口进程ID16 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 else45 return false;46 }
至于在什么地方做什么修改,这个也是参考了网上的公开资料。http://blog.csdn.net/breeze356/article/details/4814685这位前辈的博客中有介绍,
当然他也实现了过平台的功能。
上面代码就是将mov di,[ecx+eax*2]修改为mov di,1及改回来。
War3之MH
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。