首页 > 代码库 > 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