原文 http://tctianchi.yo2.cn/articles/%e9%ad%94%e5%85%bd3%e5%86%85%e5%ad%98%e4%bf%ae%e6%94%b9%e5%99%a8-v8.html
[下载]
Filename: war3trainerv8.rar
Filesize: 69 kB
Upload-Date: 2009/9/8
Download-Link:
請勿用下载工具下載,否则得到错误文件
http://rapidshare.com/files/277160783/war3trainerv8.rar
http://www.easy-share.com/1907675614
[新特性]
这个程序区别于v7的特征包括:
- 所有代码用C#重写。
由于2009年年初的时候,我做出了彻底抛弃vb6的决定,所以一些vb6的旧工程,如果现在仍然需要使用,将不惜成本推倒重来。《修改器》也是其中的一员
- 更多的游戏版本支持
新的支持列表包括:1.20.4.6074、1.21.0.6263、1.21.1.6300、1.22.0.6328、1.23.0.6352、1.24.0.6372。
- 允许修改的游戏金钱从10家改为12家
这是v4版留下的陈年旧坑,一并填上。
- 允许修改物品种类和使用次数
现在可以将手上的物品替换成另一种物品。方法是:选中携带者的单位、更换物品的名称、物品扔在地上、捡起,即可。
[新版本的支持方法]
如果有下一个版本的魔兽3,我肯定不会马上更新修改器的,你可以用下面的方法更改修改器的代码,达到升级的目的。
修改的关键在于clsGameContext.cs中间部分,首先添加一组case,然后逐一找到War3AddressThisGame、War3AddressSelectedUnitList、War3AddressMoveSpeed的值,方法如下。
一、War3AddressThisGame
1、用通用修改器找到英雄的力量,4字节整数,唯一地址
2、查找谁访问了这个地址,该地址所在的函数我称为DrawHeroProperty,定义是:
- int __thiscall DrawHeroProperty( int *GameContext, int **HeroAttributes, int *AttributeBias, unsigned int *GBuffer)
3、这个函数很有特点,一些颜色字符串的中间穿插了读取命令,其中一定有:
(1)[xxx + 94h],这是力量
(2)[xxx + A8h],这是敏捷
(3)同理,Storm_578(... "%d" ...)之前,必然还有一次函数调用,这是智力
4、稍微跟进1、2个函数就能看到常量值dword_xxx,这个xxx就是War3AddressThisGame
二、War3AddressSelectedUnitList
方法很多,我的方法是:
1、查找字符串"LOCAL_PLAYER",搜索时不必从头开始,从字符串段1/2处开始即可
2、引用该字符串的函数有很多,从最后一个开始看,没有的话看倒数第2个函数
3、一定会有一个函数,头部同时有"LOCAL_PLAYER"、"LOCAL_GAME",末尾形如
- if ( !dword_6FAA2FFC )
- dword_6FAA2FFC = sub_6F0074F0();
这个6FAA2FFC就是War3AddressSelectedUnitList
三、War3AddressMoveSpeed
这个最简单:
1、打开修改器源代码,在clsGameTrainer.cs中有一行注释:“... set breakpoint here ...”
2、在此处设置断点,在游戏中选择一个单位,并在修改器中扫描,程序会马上运行到这里中断
3、这是一个循环结构,tmpAddress2通常情况下是同一个数字,但是有一轮迭代时会是不同的数字,这个数字就是War3AddressMoveSpeed
[后记]
还真是懒得花时间说明修改器的原理了。反正v8的源代码比v7的源代码更难懂就是了,一定要看而看不懂v8代码的同学,去看v7的代码,你会发现我把代码用C#重写,不见得是明智的选择……