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

    继续上次,上次给出的开全图,是不能看透盟军的裂缝产生器的,有的修改器的开全图是可以看透的。它的原理是修改了判断迷雾的一个关键跳转。此处不多说,本人觉得不够优雅——能少改动代码则少改动代码。当然他也有自己的优势——看透裂缝产生器。可能在最后补充中,再加上吧。

    当然,如果你事先查找了一些关键字符串,可以直接快速的定位到关键位置,不需要像我利用升级箱子来找。

(七)额外核弹——可能是全球首发

    笔者在百度了那个升级箱子都能带来什么之后,发现那个箱子有可能会得到一次额外的核弹发射机会,我就在想能不能调用这个CALL,具体位置由上面确定的字符串已经可以确定,关键的就是获得调用的参数。

hd

   hd2

    上图最后一个JMP就跳到函数尾部了,这个捡到核弹的处理还是比较短的。直接尝试调用最后一个CALL<添加建造选项>。跟入个CALL发现需要3个参数,1寄存器,2个堆栈。分析参数来源:

move    ecx,14
call    0069F7E0
...
mov    ebx,eax
...
mov    eax,[ebx+98]
mov    ecx,008324E0
push    eax
push    1F

    最初我以为只用上面一个函数就够了,前面都是初始化什么的,结果是——只增加了一个核弹选项,却不是就绪状态,也不能倒计时……1

    于是上面一个CALL 0069CCF0也是必须的(一共4个CALL,一个是输出调试信息,一个是上面的CALL 0069F7E0得到一个参数值,另一个是增加选项,不是它还有谁?),既然上一个CALL的效果是增加核弹选项,这个CALL就是大概调整CD咯。那这个CALL的参数是什么?跟进分析,3个固定PUSH,一个ECX。分析参数来源:

mov     edx,[ecx+1B4]    //来源于调用此函数的参数
...
mov     edx,[edx+1A0]
mov     [esp+3C],edx
...
mov     eax,[ebx+98]      //EBX和上面来源相同
mov     ecx,[esp+3C]
mov     ecx,[ecx+eax*4]

    最重要的就是上面的ECX参数了,程序不断在这里,怎么可能知道……正常情况下,能捡到一个核弹箱子的概率是多大,我是不想试,何况单人游戏,箱子出现的还那么少。想到瘸腿大象(修改高手,已经不再修改游戏了,从他的教程中收益良多)的魔兽修改教程中,都是用的专门的地图,相当方便。幸好有大神已经写出了红警地图编辑器,费好大劲建好一张地图。遇到不少问题,不知道错哪里,这不是主题,不深究吐舌笑脸

    断下后来回跟踪好多层ECX又从哪里来,貌似都跟到游戏的消息循环了?!困惑搞了一下午,然后觉得EDX的值好眼熟,突然发现EDX=[ECX+1B4]=玩家数据地址,WTF!果断写脚本,稍微改造下,用CE也是可以的。

pushad
mov ecx,14
call 0069F7E0
mov ebx,eax
//调整核弹CD
mov eax,[ebx+98]  //超武编号
mov edx,[00A35DB4]
mov ecx,[edx+1A0]
push 0  //初始状态,1=等待
push 0  //对应建筑
mov ecx,[ecx+eax*4]
push 1  //1=一次性机会。游戏设计问题,核弹必须=1,其他超武可以=0
call 0069CCF0
//增加核弹攻击选项
mov eax,[ebx+98]  //超武器编号
mov ecx,008324E0
push eax
push 1F
call 0067C530
popad
ret

搞定!注意,如果你之前造好了核弹,并已经进入CD了,是没有效果的

(八)添加任意建造选项——额外核弹带来的惊喜1

    进入0067C530这个函数:首先是一个Switch,然后看到一个字符串

nco

    新建造选项!莫非这个还可以增加其他建筑,兵种什么的?如果是的话,那个PUSH的1F参数,应该是类型(比如基础建筑,防御建筑,步兵兵种等等),EAX应该是具体编号。

    将上面的脚本,更改了两个CALL之前EAX的赋值(原本是0,改成1,2,3等),果然增加了其他超级武器的一次使用机会,但是使用后选项不会消失……找原因未果,猜想是游戏中设计只有核弹有一次性使用机会,其他超级武器也就不必要消失。

    试图修改1F为1D或20来添加其他建造选项,比如建筑物或者兵种,游戏却崩溃了。马后炮一次,这个字符串前面的Switch是关键。

mhp

更改为上图中的一些值后,果然能添加一些其他建造选项了,逐步确定:

03=飞机,07=建筑物,10=步兵,1F=防御技能(超级武器、伞兵),28=车船

    那么这个CALL单独调用,就可以完成增加一个建造选项的功能了,脚本如下:

pushad
mov ecx,008324E0  //数据基址
push 36  //添加的建筑项,此处是核弹发射井
push 07   //添加的选项类型,此处是建筑物
CALL 0067C530
popad
ret

    但是最初,我不是这样确定的。。我猜想这个函数并不是这里专属的,在函数头下断点。当你展开基地车的时候,会获得建造发电站的选项;建造完发电站,获得矿场和兵营的选项。建造任意单位,需要刷新建造选项的时候,果然成功断下来了,然后查看堆栈传进来的值得到03,07及其含义的。

    各种建筑物的编号,我也用最笨的方法逐一确定了——依次使用上面的脚本添加,还有一些无法建造的地图上的其他元素,比如爱因斯坦实验室什么的:

00=发电厂
01=盟军矿石精炼厂
02=盟军建造厂
03=盟军兵营
04=沙袋
05=盟军维修厂
06=盟军作战实验室
07=盟军战车工厂
09=磁能反应炉
0A=苏联作战实验室
…限于篇幅省略,见资料打包

    盟军建造厂和苏军建造厂,就是指基地,是可以直接平地而起,不需要基地车!我都惊呆了惊讶当然是有条件的,你只有有了一个盟军建造厂,才可以直接建造盟军建造厂,苏军同理。而其他建筑物,只要有任意基地就可以,巨炮除外。。

    对于步兵,也有对应的具体编号,同见资料打包。战车战船,无资料,苦力活……因为有了后文的科技全开,不必要捧腹大笑

    这个CALL的用途,可以在没有开超级武器的情况下,给自己添加上建造超级武器的选项。一旦建造任意单位,该选项就会消失,因为游戏刷新了当前可建造项。网上有种修改器,需要在上方修改器增加的选项条中选择超级武器类型,然后建造围墙,来建造超级武器。文中这种方式是不是更优雅些?(无贬义)建造围墙的修改方式,应该是找到了建造CALL,修改了传入的参数,具体没研究过这种方式是修改了建造选项对应的建筑编号(第七篇有介绍)。

To be continued…

署名许可转载请注明来源,http://www.cnblogs.com/viewll/p/4769473.html

posted @ 2015-08-29 19:29  vIewll  阅读(3325)  评论(0编辑  收藏  举报