简单的工作室

当前位置: 主页>编程技巧>VC++编程>

(转)魔兽争霸全图的制作

时间:2014-11-29 23:34来源:http://blog.sina.com.cn/s/blog 作者:简单的工作室 点击:
首先说这篇文章不是想让大家做全图,而是让大家知道魔兽做全图的原理,做全图大概可以分了3种做法 1.修改魔兽程序对应的也是是改game.dll 2.修改平台程序 3.做插件 本文不鼓励大家做全图,本文的全图算是插件把 本文参考了Chaotic的HowTo create a basic Maphack 软件版

首先说这篇文章不是想让大家做全图,而是让大家知道魔兽做全图的原理,做全图大概可以分了3种做法

1.修改魔兽程序对应的也是是改game.dll

2.修改平台程序

3.做插件

本文不鼓励大家做全图,本文的全图算是插件把

本文参考了Chaotic的HowTo create a basic Maphack

软件版本:
魔兽争霸3:1.24
CheatEngine:5.61

WindowsXP
VC6.0

 

制作MH的前期准备:
-游戏修改器,推荐使用CheatEngine(http://www.cheatengine.org/)
-基础的汇编语言知识
-基础的游戏修改知识
-基础的编程能力
-窗口模式下运行魔兽争霸3(加-window参数)->为其创建一个快捷方式,右键点击,选择“属性”,在“目标”框的

         最后加上“-     window”

第一部分 地图迷雾的实现原理

用窗口模式启动游戏,随便选个小兵到野怪附近,这时由于该野怪在视野范围内所以可以看见它。
=打开CE,选择魔兽3的进程war3.exe,将Value值设为1,Value Type值设为Byte,点击First Scan开始搜索。
=搜索完毕后,切换到WC3,拉开小兵使那个野怪不可见,返回CE,将Value值改为0,点击Next Scan。
=搜索完毕后,再回到游戏,移动小兵,使那个野怪可见,返回CE,搜索1(看见就Scan 1,没有看见就Scan 0,不一定要

      来回的切换)

魔兽争霸全图的制作

我选的值是0FB2D7BC,我锁定这个地址的值为1,切换到游戏中会看到那个野怪在不断的闪烁。
=找到了地址就可以对其跟踪了,非常方便CE就有这个功能!
=取消该地址的锁定,右键点击这个地址,在弹出的菜单中选择Find out what access from this address

在此我想特别说明:Chaotic原文为

Now do a “Memory breakpoint on access” onto the first 8 bytes!

You should reach this address:

6F2A3B91 |. 66:8B3C41 MOV DI,WORD PTR DS:[ECX EAX*2]

Remove that memory breakpoint again and try to change it like this :

MOV DI,1

他说的很简单You should reach this address但是我认为这部分确是最难的部分,应为我们在CE中得到的内存地址

并不是6F2A3B91 |. 66:8B3C41 MOV DI,WORD PTR DS:[ECX EAX*2] ,这条地址需要我们在汇编中去查找




当然找到那个地址后把他设置为1就OK了 这样就全图了

 

第三部分 编写代码

大致思路如下:
1.获取魔兽争霸3的进程号。
2.提升自己的debug权限(否则无法用writeprocessmemory)。
3.对魔兽进程的相关地址进行改写

 

对应的C 代码是这样的希望对照着Chaotic的HowTo create a basic Maphack看

#include <windows.h>  

 

void EnableDebugPriv();  

 

int main()  

 

      

    //We have to set debug privileges for our app to be allowed to OpenProcess (war3.exe)  

    EnableDebugPriv();  

    //Get a Handle on Warcraft III window  

    HWND hwar3 = FindWindow("Warcraft III",NULL);  

    if (!hwar3) //If we can't find the window...      

    {     

        MessageBox(0, "Run Warcarft III First!", "", MB_OK);  

        return false;     

    }  

    DWORD pid;  

    GetWindowThreadProcessId(hwar3, &pid);  

    HANDLE hopen = OpenProcess(PROCESS_ALL_ACCESS, false, pid);  

    if (!hopen) //Can't open Warcarft III's process.. Must be a PID error.  

    {  

        MessageBox(0, "Your getting a PID error, use LoaderZ.", "", MB_OK);   

        return false;  

    }  

    //Now we're ready to change the memory!  

    //We remember: 6F2A3B91 66:BF 0F00 MOV DI,0x0F  

    BYTE data[] = {0xBF,0x0F,0x00};  

    bool success = WriteProcessMemory(hopen,(LPVOID)0x6F2A3B92, &data,3, NULL);  

 

    if(success)//Everything worked  

        MessageBox(NULL, "Hack Loaded - Remember to Vist www.SkillHackerZ.com", "", MB_OK);  

    else//There was an error!  

        MessageBox(NULL, "Couldn't load hack", "", MB_OK);  

    // Remember to be clean  

    CloseHandle(hopen);  

    //Done!  

    return true;  

 

 

void EnableDebugPriv()  

 

    HANDLE hToken;  

    LUID sedebugnameValue;  

    TOKEN_PRIVILEGES tkp;  

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);  

    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue);  

    tkp.PrivilegeCount = 1;  

    tkp.Privileges[0].Luid = sedebugnameValue;  

    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  

    AdjustTokenPrivileges(hToken, false, &tkp, sizeof tkp, NULL, NULL);  

    CloseHandle(hToken);  

 

最后想说其实如果你真想开全图的话可以到国外的一些网站去下,下篇文章会介绍一样工具————能查出别人开外挂没有

(责任编辑:简单的工作室)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容