没有所谓的失败!除非你不再尝试!

自制魔兽的Maphack

上一篇 / 下一篇  2007-07-12 07:33:01 / 个人分类:C++日记

目前只有显示敌方单位和去除大地图战争迷雾的功能
原理很简单就是修改内存
6F2A08B1改为66bf0f00(单位可见)
6f406b56改为b10090909090(大地图战争迷雾)
每个版本的内存地址不一样,这个内存地址仅适用war3 1.20e,其他版本也只要找到地址就可以了。

分析显示单位内存地址的方法:
用到的工具Cheat Engine(以下简称CE)
1.进入游戏进入地图,拉一个兵去野怪边上(不要战斗,只要看到就好)。
2.打开CE,选择进程war3.exe,下面的scan type=exact value,value type=4 bytes
3.游戏里拉小兵使它能看到野怪,切到CE搜索value=1,点firstscan
4.拉小兵使它看不到任何野怪,切到CE搜索value=0,点next scan
5.如此重复next scan value=1或0,5-10次左右,直至搜索结果只剩个位数而且不再减少
6.离开野怪,双击左边的任一个地址,双击下面的value设置为1并勾上frozen
7.如果没有反应就把下面的删了,左边的地址依次照第6频试过来,会看到怪在闪烁,那就找到了
8.先取消frozen,在地址上点右键选find out what reads from this address,CE就能找到这个地址6f2a08b1汇编内容:mov di,[ecx+eax*2]
9.点show disassembler双击这句汇编代码,改为mov di,1
10.到这步就成功啦,看到了地图上所有的敌方和中立单位。

分析战争迷雾内存地址的方法:
基本同上,只是搜索的数值不同,选搜255(全黑),再拉小兵去某块黑的地方,再搜0(无迷雾),拉开小兵搜128(迷雾,半透明),然后反复拉小兵去刚才那个地方搜索0再拉开小兵搜128,最终确定几个地址,而且是连续的,任意frozen其中一个地址为0,就会发现刚才测试的地方有一小块会变亮。先取消frozen,在地址上点右键选find out what writes to this address,找到内存地址6f405b56,同上改汇编代码mov cl,[ecx+6f832cbc]改为mov cl,0
呵呵大地图全亮了

其他小地图之类的修改方法应该差不多,暂时先搞到这。然后就是写程序实现自动改内存代码,不然你肯用CE每次开war3跳转内存地址改汇编代码也行-_-

代码如下:

#include <windows.h>
void EnableDebugPriv(); 
int main()
{
EnableDebugPriv();
HWND hwar3 = FindWindow("Warcraft III",NULL);
if (!hwar3){
    MessageBox(0, "先运行魔兽再运行小型MH", "", MB_OK); 
    return false;
}
DWORD pid;
GetWindowThreadProcessId(hwar3, &pid);    
HANDLE hopen = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (!hopen){
   MessageBox(0, "不能得到PID,可能是权限不足", "", MB_OK);
   return false;
}
BYTE data1[] = {0xBF,0xFF,0xFF};    
BYTE data2[] = {0xB1,0x00,0x90,0x90,0x90,0x90};
bool success1 = WriteProcessMemory(hopen,(LPVOID)0x6F2A08B2, &data1,3, NULL);
if (success1) MessageBox(NULL, "显示敌方单位成功", "", MB_OK);
else MessageBox(NULL, "修改失败", "", MB_OK);
bool success2 = WriteProcessMemory(hopen,(LPVOID)0x6f406b56, &data2,6, NULL);
if (success2){
   MessageBox(NULL, "去除大地图战争迷雾成功", "", MB_OK);
   MessageBox(NULL, "作者:Paull\n博客:paull.llbbll.com", "", MB_OK);
}else MessageBox(NULL, "修改失败", "", MB_OK);
CloseHandle(hopen);
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);
}


编译好的文件下载:http://www.llbbll.com/1145/viewspace-1071.html
相关阅读:

TAG: maphack 小型mh

Paull的网络硬盘 引用 删除 Paull   /   2008-08-29 09:24:52
Dev-Cpp
引用 删除 Guest   /   2008-08-05 15:06:11
请问是用什么平台编译的?
Paull的网络硬盘 引用 删除 Paull   /   2007-07-12 08:18:48
写完后发现还是不能在VS1.5上用,郁闷。所以暂时写到这。VS1.5个狗生的监视war3的进程,别的程序一往里面写东西就说发现作弊软件,然后退出-_-
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar