魔獸爭霸III 全圖的制作


研究WarCraft III 全圖有一段時間了,在這里記錄一下制作的過程。

首先 憑經驗 假設每個單位都有一個標記 ,如果能被看見為1 不能被看見為0。用cheatengine來測試這個結論的正確性。

選擇一個單位 當有該單位視野時 搜索 (byte類型) 1,走到不能看見該單位的地方 搜索0 通過多次的篩選

可以找到一個地址 標記着該單位是否可見

在ce中鎖定這個值 回到游戲 能看見這個單位在閃爍

用ce找出是什么訪問了這個地址

6F3A20A3 - 66 8B 0C 41   - mov cx,[ecx+eax*2]
6F00F5CD - 0FB7 04 41   - movzx eax,word ptr [ecx+eax*2]
6F4AC4F4 - 0FB7 31  - movzx esi,word ptr [ecx]
6F4076F4 - 8B 0C 10   - mov ecx,[eax+edx]


Game.dll+3A20AB - 66 81 C9 00F0         - or cx,F000 { 61440 }
Game.dll+F5D1 - 0D 00F00000           - or eax,F000 { 61440 }
這兩個命令與全圖顯示單位有關的
我們把 F000 修改為 F001 然后地圖已經打開了 我們可以看見視野外的單位

這就是絕大多數 輔助工具的原理了。通過修改Game.DLL的字節碼來作弊。

其他的功能如顯示隱身單位,顯示敵方信號的功能都可以通過修改內存來實現。下面直接給出應該patch的地址

//Resource View
Patch(dwGameDll + 0x359AED, "\xEB\x02", 2);
Patch(dwGameDll + 0x35A1DF, "\xEB\x02", 2);
Patch(dwGameDll + 0x35A29F, "\xEB\x02", 2);
Patch(dwGameDll + 0x35A3D0, "\xEB\x02", 2);
Patch(dwGameDll + 0x28EAFA, "\xEB\x02", 2);
Patch(dwGameDll + 0x360584, "\xEB", 1);

//Make units clickable
Patch(dwGameDll + 0x285CBC, "\x90\x90", 2);
Patch(dwGameDll + 0x285CD2, "\xEB", 1);

//Reveal Illusions
Patch(dwGameDll + 0x28357C, "\x40\xC3", 2);

//Reveal Invisibles
Patch(dwGameDll + 0x362391, "\x3B", 1);
Patch(dwGameDll + 0x362394, "\x85", 1);
Patch(dwGameDll + 0x39A51B, "\x90\x90\x90\x90\x90\x90", 6);
Patch(dwGameDll + 0x39A52E, "\x90\x90\x90\x90\x90\x90\x90\x90\x33\xC0\x40", 11);

// Reveal Units on Main Map
Patch(dwGameDll + 0x39EBBC, "\x75", 1);
Patch(dwGameDll + 0x3A2030, "\x90\x90", 2);
Patch(dwGameDll + 0x3A20DB, "\x90\x90", 2);

// Reveal Units on Mini Map
Patch(dwGameDll + 0x361F7C, "\x00", 1);

// Show Enemies Ping Signals
Patch(dwGameDll + 0x43F9A6, "\x3B", 1);
Patch(dwGameDll + 0x43F9A9, "\x85", 1);
Patch(dwGameDll + 0x43F9B9, "\x3B", 1);
Patch(dwGameDll + 0x43F9BC, "\x85", 1);
Patch(dwGameDll + 0x3345E9, "\x39\xC0\x0F\x85", 4);

// Show Runes
Patch(dwGameDll + 0x3A201B, "\xEB", 1);
Patch(dwGameDll + 0x40A864, "\x90\x90", 2);

// Show Skills / Cooldowns
Patch(dwGameDll + 0x2031EC, "\x90\x90\x90\x90\x90\x90", 6);
Patch(dwGameDll + 0x34FDE8, "\x90\x90", 2);
Patch(dwGameDll + 0x28ECFE, "\xEB", 1);
Patch(dwGameDll + 0x34FE26, "\x90\x90\x90\x90", 4);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM