码迷,mamicode.com
首页 > 其他好文 > 详细

War3之MH

时间:2015-01-05 00:19:41      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

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及改回来。

War3之MH

标签:

原文地址:http://www.cnblogs.com/yeluozhiqlai/p/4202482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!