首先说这篇文章不是想让大家做全图,而是让大家知道魔兽做全图的原理,做全图大概可以分了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,没有看见就Scan0,不一定要
来回的切换)
我选的值是0FB2D7BC,我锁定这个地址的值为1,切换到游戏中会看到那个野怪在不断的闪烁。
=找到了地址就可以对其跟踪了,非常方便CE就有这个功能!
=取消该地址的锁定,右键点击这个地址,在弹出的菜单中选择Find out whataccess from thisaddress
在此我想特别说明:Chaotic原文为
Now do a “Memory breakpoint on access” onto the first 8bytes!
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 likethis :
MOV DI,1
他说的很简单You should reach thisaddress但是我认为这部分确是最难的部分,应为我们在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 basicMaphack看
#include<windows.h>
void EnableDebugPriv();
int main()
{
//We haveto set debug privileges for our app to be allowed to OpenProcess(war3.exe)
EnableDebugPriv();
//Get aHandle on Warcraft IIIwindow
HWNDhwar3 = FindWindow("WarcraftIII",NULL);
if(!hwar3) //If we can't find thewindow...
{
MessageBox(0, "Run Warcarft III First!", "",MB_OK);
returnfalse;
}
DWORDpid;
GetWindowThreadProcessId(hwar3,&pid);
HANDLEhopen = OpenProcess(PROCESS_ALL_ACCESS, false,pid);
if(!hopen) //Can't open Warcarft III's process.. Must be a PIDerror.
{
MessageBox(0, "Your getting a PID error, use LoaderZ.", "",MB_OK);
return false;
}
//Nowwe're ready to change thememory!
//Weremember: 6F2A3B91 66:BF 0F00 MOVDI,0x0F
BYTEdata[] = {0xBF,0x0F,0x00};
boolsuccess = WriteProcessMemory(hopen,(LPVOID)0x6F2A3B92,&data,3,NULL);
if(success)//Everythingworked
MessageBox(NULL, "Hack Loaded - Remember to Vistwww.SkillHackerZ.com", "",MB_OK);
else//There was an error!
MessageBox(NULL, "Couldn't load hack", "",MB_OK);
//Remember to be clean
CloseHandle(hopen);
//Done!
returntrue;
}
void EnableDebugPriv()
{
HANDLEhToken;
LUIDsedebugnameValue;
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, sizeoftkp, NULL, NULL);
CloseHandle(hToken);
}
最后想说其实如果你真想开全图的话可以到国外的一些网站去下,下篇文章会介绍一样工具————能查出别人开外挂没有