红色警戒2修改器原理百科

红色警戒2,一个经典的游戏。我上初中时经常周末回到家就开始玩任务模式,然后半天过不去一关,就开外挂……开外挂虐冷酷的不开超级武器的电脑。

先说一下版本,原版V1.006。其他版本只是基址不一样,可参考思路,如共和国之辉。当时比较好用一个外挂是胜利之歌的红色警戒2内存修改器,还有就是红警全能王——各种全能,全能的我不怎么喜欢用(功能默认全开,没得选)。

(一)最简单的开始——修改金钱

当初刚刚接触Cheat Engine,只会改个金钱。快速建造、地图全开、科技全开什么的完全不知道怎么办。现在貌似突然领悟了什么,回头看看,竟然莫名都搞定了。网上找类似的教程或资料,也只有改个金钱的东西。此文的目的,也就是分享些思路,和自己最后的一些成果。

此处假定读者对基本的CE使用已经了解,得到金钱的地址:[game.exe+635DB4]+24C。目前来看玩家的数据结构大概描述为:


1

2

3

4

5

6

7

8

9

10

11

class Player

{

private:

    //…其他变量

    int nMoney;  //金钱

    int nPower;  //电力

    int nLoad;   //负载

    //…

public:

    //各种函数

}

24C即是金钱在此结构中的偏移。程序中现在看来大概有这么一个变量——Player* CurrentPlayer。这个指针存储固定在game.exe+635DB4的位置,那么[game.exe+635DB4]就是很重要的玩家数据区地址。

(二)建造CD基址查找——实现瞬间建造

如果你把游戏速度调到最慢,然后找一个建造时间很长的建筑,仔细观察,你会发现从刚开始到就绪,所有单位都有54格变化,每格变化的间隔时间不同。这也说明,将CD改成54就是就绪。

首先,建造一个发电厂,等到CD刚变化了两三格,暂停建造,然后搜索1-10之间的数值。接着仔细观察CD变化了几格,然后搜索数值增加了几格,如此重复2次左右。这时能得到一个地址,将此值改为1,会发现CD又重新开始了。为了继续进行下去,千万别变成就绪状态或取消建造,可以先将此值锁定。查找什么改写了这个值,应该会得到一条指令:004B9367 - mov [esi+24],edx,然后搜索ESI寄存器的值,可以得到一个绿色地址game.exe+433A80,即基址。[game.exe+433A80]+24就是发电厂的CD地址。重复可以得到矿场、兵营……这时聪明的你,应该会想到一种实现秒建的方法了吧——当这个指针有效的时候(即不是0的时候),且数值小于54时,把CD都改成53。基址存放的指针指向的大概可以想象是如下类,+24偏移是CD,里面应该还有些其他信息……一旦建造完成或取消,这个相关的对象可能就要被销毁以创建新的,这就是上面不要等到变成就绪或取消的原因


1

2

3

4

5

6

class SometingAboutConstruction

{

    //…

    int nCD; //+24偏移

    //…

}

分享我找的几个:盟军电厂CD([game.exe+433A80]+24),以下只给出基址:盟军矿场(game.exe+433AB0),盟军兵营(game.exe+433AE0)。我才没有找全呢,也不会告诉你CD基址相差0x30偏移

=====================

本文补丁,2015/09/01:

1.CD基址并不关联于建造的单位,也就是说不是盟军电厂、盟军矿场之类的,它是对应他所在的位置的——第一格、第二格……

2.以上实际上有两个结构相关,而并非只有一个,这在第七篇有介绍。这里可以先这么简单的理解,为了避免以后理解上的混淆已经对上文进行了简单修改。

=====================

但是这么多个种类,都要找是很麻烦的。我们换个思路……熟悉游戏的你,应该都习以为常了:每种类型的单位只能同时建造一个——建筑,武器,步兵,战车,战船等等。程序中为了实现这个功能,可以枚举每种类型的所有单位,看是否有一种正在建造中,然后拒绝同时建造其他的同种单位。当然这是一种方案,但总觉得每当CD变化一次就要枚举这工作好累。有点技巧的方法是为每种类型设置一个标志变量,有正在建造的此类型单位就设置一个标志值。

红警2每种类型设置了一个指针,指向正在建造的单位的上述结构,+24偏移就是CD。怎么发现这个指针?上面你已经获得了不同建筑的CD地址,当你造一座电厂,暂停,这个指针应该指向电厂的上述相关对象,造矿场时指向矿场的,造兵营时指向兵营的。要精确搜索的内容就是CD地址减去偏移24——即SomethingAboutConstuction对象的起始地址。如此查找3次,最后我找到两个地址都符合,造什么时指向什么的描述对象,到底是哪一个!!突然想到,我什么都不造,应该是NULL,果断只剩下一个了。然后找什么改写,得到一条指令:004E607A - mov [edi+000052E8],esi,然后精确查找EDI的值,得到game.exe+635DB4——这个值熟悉不,和金钱起始基址一样,这更说明了,这个地址存放的是与玩家有关的数据,也就是CurrentPlayer对象的地址。

这样就把上面找每种建造单位的CD基址,变成了找每种类型的CD基址,只有建筑、武器、步兵、飞行器、战车和船只六种了。分享我找的结果:建筑CD([[game.exe+635DB4]+52E8]+24),以下只给出一级偏移:武器CD(52F8),步兵CD(52DC),飞机CD(52D8),战车CD(52E0),船只CD(52E4)。

(三)更优雅的方式——快速建造

上面实现了瞬间建造,有不少修改器是这样实现的。我不怎么喜欢这种方式,编程要用Timer,还有就是造步兵的时候,只有一两个兵营,点了十多下由于动画速度跟不上,只出来一两个,还要造好多好多兵营来配合这瞬间建造的速度。

游戏中一个设定就是,当你存在的兵营多的时候,步兵建造速度加快,军工厂多的时候,坦克就建造的快,基地多的时候,各种建筑就快。这必然有一个计数值。

当你有一个兵营的时候搜索1,两个兵营搜索2,三个搜索3,这时就剩5个地址了,再建造第四个,都变成4了。哪个是?一个个尝试是一种方法。可是如果弄清楚点,可以得到更多信息哦。换点不同操作,卖掉一个兵营!有三个变成3,两个还是4。再建造一个兵营——5个地址都增加了1。你建造一个兵营,取消,会发现有一个已经增加1了,再建造,取消,它又增加1,这个地址大概就是你曾经试图建造的所有兵营数。剩下4个地址,3个为4,一个为5。继续建造一个兵营,暂停,发现有一个增加了1,取消会再减少1,这个地址就是包含正在建造的所有兵营数。还有一个地址是随着你成功建造的兵营数,只增加不减少,这个地址就是该局游戏总共建造的兵营数。现在剩下两个地址,都是对应地图上实际的兵营数。正常游戏,我是没发现怎么让他两个不同。这两个地址一个就是与加速建造有关的,一个就是仅仅保存地图上兵营数的,两个地址修改一个看效果就区分完毕。

下图是我测试的时候的地址截图,在你电脑上肯定不一样,不过图中第一个和最后一个的相对偏移以及中间3个的相对偏移应该是相同的,可以参考。

然后就是找到基址,直接找什么改写了与加速有关的那个地址,会得到:004EACF4 - inc [eax],然而直接内存中搜索EAX,即上面找到的地址09F96EA4,你不会找到什么。此时一般有两条路可选:1.OD调试,跟踪EAX从哪里来。2.聪明人直接就知道了

我反正直接知道了,我没夸我自己,我没夸我自己,你一定要相信——快速建造-步兵([game.exe+635DB4]+52BC)。这显然是与玩家有关的数据,而这个地址又与上面提到的玩家数据地址不算远也不算近(这么一大块都存了些什么,地图迷雾肯定也在),直接相减,就是偏移了。

惯例,因为这是百科,分享我找到的结果:快速建造-步兵([game.exe+635DB4]+52BC),以下只给出偏移:快速建造-建筑(52C4),快速建造-船坞(52C8),快速建造-战车(52C0),快速建造-飞机(52B8)。其实也不用找,肯定都在附近,尝试+4,-4就OK了。因为程序员肯定不会把相似变量定义在相距太远的位置,除非是传说中吃饱撑的。

说到这,如果还不知道如何快速建造,我是服了,提示下,把这个值适当加大,15是个不错的数,这个数来源于胜利之歌的内存修改器,这个优雅的方式也是受其启发。

To be continued…

转载请注明来源,http://www.cnblogs.com/viewll/p/4768880.html

原文地址:https://www.cnblogs.com/jiftle/p/8158003.html

时间: 2024-10-13 15:07:37

红色警戒2修改器原理百科的相关文章

红色警戒2修改器原理百科(五)

都第五篇了,好长,这是个坑,没多少人看为什么要写这个,我就当是为了部落--还有什么没写?选中单位3星,随处建造(优雅),科技全开,转移单位所属(优雅),立即胜利(这个这个不怎么好意思发,我自己没找到).还有地图其他玩家数据,当然还有我还没试过也可以写的出售建筑CALL,自动修理,枚举地图上全部单位(然后可以配合出售建筑,卖掉全部不属于自己的)还要写几篇才能完结呢..还还有心灵探测(从来不想实现,造个心灵探测器会死),奶牛总统等特殊兵种(红警全能王谷子猫绿色珍藏版中的自定义函数好长好复杂,红色警戒

红色警戒2修改器原理百科(一)

红色警戒2,一个经典的游戏.我上初中时经常周末回到家就开始玩任务模式,然后半天过不去一关,就开外挂--开外挂虐冷酷的不开超级武器电脑. 先说一下版本,V1.006.共和国之辉只是基址不一样,其他版本可参考思路.当时比较好用一个外挂是胜利之歌的内存修改器,还有就是红警全能王,各种全能,全能的我不怎么喜欢用(功能默认全开,没得选). (一)最简单的开始--修改金钱 当初刚刚接触Cheat Engine,只会改个金钱.快速建造.地图全开.科技全开什么的完全不知道怎么办.现在貌似突然领悟了什么,回头看看

红色警戒2修改器原理百科(十)

(二十一)转换阵营--很炫酷却很简单 这个功能,貌似当初很火很轰动,感觉很强大--联网对战中控制对手单位,卖掉对手建筑!右边的建造选项也是对手的,你可以替对手建造单位.可是这个原理很简单,游戏中一个很重要的指针CurrentPlayer(即game.exe+635DB4这个基址)指向本地玩家的数据,你所有的操作依据最终都来源于此.如果你把这个指针指向对手的数据,游戏就认为你原本就是对手--这是游戏设计的缺陷. 但是只在联网对战中有效.单机时也有一定作用,能看到电脑的科技是全开的--当然除了超级武

红色警戒2修改器原理百科(三)

继续上次,上次给出的开全图,是不能看透盟军的裂缝产生器的,有的修改器的开全图是可以看透的.它的原理是修改了判断迷雾的一个关键跳转.此处不多说,本人觉得不够优雅——能少改动代码则少改动代码.当然他也有自己的优势——看透裂缝产生器.可能在最后补充中,再加上吧. 当然,如果你事先查找了一些关键字符串,可以直接快速的定位到关键位置,不需要像我利用升级箱子来找. (七)额外核弹——可能是全球首发 笔者在百度了那个升级箱子都能带来什么之后,发现那个箱子有可能会得到一次额外的核弹发射机会,我就在想能不能找到这

红色警戒2修改器原理百科(八)

(十五)科技全开2--问题终结 上一篇留下的问题,进行修改后为什么没有效果.试图让游戏添加所有可能的建造项,但是游戏中试图刷新建造项(建造新单位)后却没出现我们期望的.这是一个很简单,却难住我一段时间的问题.最初我以为是指令写错了,对比好几遍终于确信没有错误.这么解释这个问题,游戏会在合适的时候(通常是建造了新单位后)会刷新你的建造选项,刷新包括添加和删除.很不幸的是,游戏刷新建造项的流程是:添加当前可建造的->删除当前不可建造的,这是我发现的"证据",先发出来: 所以,当我们试

红色警戒2修改器原理百科(九)

完结了一个相对比较复杂的修改,其实说起来也简单,如果不去理解数据结构只追求修改效果的话.笔者的一个原则就是要搞明白:怎么找到的,怎么改,为什么.一个线索无法伸展了,换个点,就来下面这个吧. (十七)任意建造--大多数人离优雅只差一步 这次我们想试试新方法,这个方法在一些游戏中有奇效,简单快捷方便,一秒钟满足你!有时很有效的的大杀器--字符串搜索.从我们最初修改地图全开时,我们就发现游戏程序中包含一些字符串,那么不能建造有没有对应的字符串呢,有的话是什么字符串呢?字符串最常见的是现实在游戏界面中,

红色警戒2修改器原理百科(二)

上一篇中介绍了,金钱的修改,瞬间建造以及快速建造.不多说,本篇开始 (四)无限电力--共用代码处理 电力和负载的精确数值,可以选中一个发电厂来看 直接给出电力的地址:[game.exe+635DB4]+52D0 负载地址:[game.exe+635DB4]+52D4 红警2中,电厂提供的电力根据其健康程度是不同的,生命值越少提供的电力越少.所以当电厂被攻击时会更新电力值.当新放置建筑,或建筑被摧毁,卖掉建筑物,都会更新电力和负载.实现无线电力,可以把电力改大,也可以将负载减小.我选择第二种,将负

红色警戒2修改器原理百科(六)

先说一件事情,昨天我在继续OD调试游戏的时候,运行错了版本,然后OD的备注.标签和断点通通没有了.喜大普奔上天关上了一扇门,然后我开了一扇窗户——抛弃之前的枷锁,重新出发,目前来看可能是找到了判断地图触发器的整个过程,待进一步测试:还找到了立即胜利的源头. 让我们书接上回. (十三)枚举地图玩家——隐藏在背后的黑暗势力 如果细心的你在进行上一步的疯狂的掠夺的时候,发现了没人占有的建筑物的pOwner不是NULL,你就可能发现一片新大陆.是谁拥有了这个建筑物,却还能显示没有归属. 前一篇最后一个图

基于C++ Qt实现的红色警戒3修改器(Github开源)

前言 这部修改器制作有一段时间了,但是一直没出教程.今天利用周末空闲写篇教程,给后来者指路的同时也加深自己对游戏修改器的理解,大佬就随便看看吧 浏览了一下网络,形形色色的单机游戏修改器教程,但是基本只实现了一到两个功能,GUI图形界面也没有.网站上能下载到的实现很多功能的修改器却又不开源,对新手不够友好 为什么选择红警3而不是其他游戏呢? 其一,它是单机游戏,制作网络游戏修改器(外挂)是违法的,根据<计算机信息网络国际联网安全保护管理办法>第六条规定:“任何单位和个人不得从事下列危害计算机信息