由于hsluoyz同学强烈要求我研究一下魔兽3 1.20e的HP摆放位置,以便达到他某个不可告人的目的,加上本人确实无法接受v5版修改器不能改一般单位的事实,所以昨天晚上作了这个v6修改器。这一次的重点是对3个版本的支持以及无注入的新思路。
修改器+源代码+手册打包:war3trainerv6.rar
[新特性]- v6版区别于v5版的特征:
- 无注入的新思路:这一版实现了不修改游戏代码,当然更不是内存搜索,全部直接定位。游戏怎么运行,我就怎么拿到数据,十分猥琐。
- 同时改多个单位:现在你可以一次选中几个单位,我会列出你选择了什么。
- 又可以改单位了:既然单位可以改,建筑也就可以改。
- 多版本支持:受不了某些不肯升级游戏的朋友了,现在支持1.20e、1.21、1.22.0.6328三个版本。
- 修改单位的坐标:下图就演示了主基地平移。
- 英雄技能:按照hyp的指示,加了最简单的技能修改,更加复杂的修改没有做。
![]()
主基地平移, 采矿速度提升;
注意到树丛中的大法师了吗?
另外建筑的阴影明显只是一张贴图
[关于选中单位ESI的获得]
以下以1.22为例说明我是怎么拿到玩家选择的所有单位。
另外我要正告hsluoyz同学:我怀疑你找来的那个静态指针不具有普遍意义。我愿意以一顿晚饭的代价跟你打赌。
获得选中列表并不困难,如果你不愿意用我的思路,你也可以直接在内存中搜索“.?AUCUnitListNode@@”获得ESI队列,或者用.\CPlayerWar3.cpp所在的段+90拿到链表基地址然后推算单位地址,都可以。但是我是不做内存搜索的,所以步骤略多:
- [6FAA2FFC] 记为A1
参考:
6F416B0A mov edi, 6FAA2FFC
6F416B10 movzx ebx, word ptr [edi + 28]
6F416B14 call 6F52F4A0 - [A1 + 58 + 4 * a2] 记为A2,a2取0
参考:6F3A0564 mov eax, [ecx + eax * 4 + 58] - [A2 + 34] 记为UnitListRoot
参考:6F2CC0AE mov ebp, [eax + 34] - 这个UnitListRoot的数据结构:
struct UnitListRoot
{
BYTE NotSure[0x1F0];
UnitListNode* Head, End;
DWORD Length;
}
参考:6f415b95 mov eax, [ebx+1F4] - UnitListNode的数据结构:
struct UnitListNode
{
UnitListNode* Next;
DWORD notNext;
UnitBase* thisUnit;
}
其中notNext总是等于~Next,而thisUnit就是上次要找的ESI。
[后记]
这一次我会说得比较小心:我不知道我还会不会更新这个修改器了。

没有评论:
发表评论