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

    完结了一个相对比较复杂的修改,其实说起来也简单,如果不去理解数据结构只追求修改效果的话。笔者的一个原则就是要搞明白:怎么找到的,怎么改,为什么。一个线索无法伸展了,换个点,就来下面这个吧。

(十七)任意建造——离优雅只有一步之遥

    这次我们想试试新方法,这个方法在一些游戏中有奇效,简单快捷方便,一秒钟满足你!有时很有效的的大杀器——字符串搜索。从我们最初修改地图全开时,我们就发现游戏程序中包含一些字符串,那么不能建造有没有对应的字符串呢,有的话是什么字符串呢?字符串最常见的是显示在游戏画面中,红警中是语音。当不能在某处放置建筑物的时候,你会听到“Can Not Deploy Here”,我们就搜索“deploy”字符串,如果听不懂“deploy”就试试“here”嘛。

    OD搜索字符串,然后查找,找到如下结果:

sy1

    有3个,双击来到对应位置,全部下断点。为什么是“eva_”开头,猜想因为游戏中是个女声提示,“Eva”是一个女名“伊娃”。吐槽下,难道是男声还要“bob”开头!言归正传,接下来就是去洗洗脸,坐等游戏断下来?

    好了,等了3个多小时,游戏终于断下来了。捧腹大笑你信吗?而且是断在了0049BDEB,国际惯例,找跳转——观察周围有没有跳转不执行这段代码。

sy2

    可以看出,是不满足放置的条件,跳过来的。根据OD提示,跳转来自0049BC1C和0049BC2A,尝试NOP替换~达到传统效果:虽然显示是红色,但还是放置成功了。但是显示的是红色,很不优雅啊!刚开始从网上下载修改器用的时候(我是从红警知道游戏竟然有修改器、外挂这东西的),我就在想为什么不能是绿色的?

    我们来看看程序中大概是什么样的流程:

//判断能否放置
if(canDeploy() == True)
    deploy();
else
    canot();

//绘制提示颜色
if(canDeploy() == True)
    drawGreen();
else
    drawRed();

    上面看出,我们只要修改了canDeply()这个函数,就能同时改变绘制的颜色和放置判断。我们已经找到了关键的跳转了,上面附近就应该关键的CALL。跟踪这个函数的执行,可以找到关键指令:0049BBC9  call    004991D0。使其返回1就可以了,修改如下:

004991D0:
mov eax,1
retn 10    //平衡堆栈

这样还直接省去了游戏复杂的判断,提高了执行效率大笑

    红色警戒2修改大师,修改了第一个跳转,效果是相同的。也是我尝试这么多红警修改器以来第一个能显示绿色任意建造的修改器。其它修改器离优雅只有一步之遥……用破解中的术语就是,关键跳和关键CALL:改跳转只能该处起作用,改CALL可以影响所有调用的地方。

(十八)自动修理——所有人心中的痛

    由于之后就没有什么新的寻找思路和方法了,在此之后只给出提示和结果。

    方法1.字节,建筑物的+5B8偏移 = 修理标志;CE搜索字节类型,修理状态查找1,不修理查找0,反复几次后结果数量不再减少,筛选游戏单位地址后面不太远的地址即是。

    方法2.调用CALL

//作用:修理建筑
//思路:改写修理标记,返回一层
//备注:参考指令下方Case16是出售单位;联网可用
//参考指令:004B67FF call [eax+184]
pushad
mov ecx,单位地址
mov edx,[ecx]
push -1
call [edx+184]
popad
ret

结合第五篇讲的的遍历游戏中所有单位,并判断归属,选择上述其中一种方法即可。

(十九)出售单位

//作用:获取单位出售价格
//思路:卖掉建筑物金钱增加,返回1层
//参考指令:0044610C call [eax+29C]
//...保护现场
mov ecx,单位地址
mov eax,[ecx]
call [eax+29C]
//...恢复现场及返回

//作用:出售单位,可以直接出售奶牛刷钱,不需要复制工厂
//思路:地图编辑器,类似转移所属 
//备注:此函数联网不可用;可以卖出非己方单位
//参考指令:006AE13B call [edx+188]
pushad
mov ecx,单位地址
mov edx,[ecx]
push 1
call [edx+188]
popad
ret

(二十)建造队列上限

1.搜索出当前队列剩余数目  

    选择一个兵种建造,暂停(为了方便),然后建造另一个同类型(都是步兵,或都是战车…飞机不属于战车,战船也不属于)兵种,增加或减少此兵种的队列数量,CE精确数值搜索即可。注意,暂停的那一个单位因为已经开始建造了,不包含在等待建造的队列数目之内。

例如:

sl,要搜索10

2.查找谁改写了

    找到增加的那一条指令(004B94FB  mov [esi+10], ecx),附近可以分析出[game.exe+439848]+E8=最大队列数目。当然也可以改跳转。

To be continued…

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

posted @ 2015-09-02 10:12  vIewll  阅读(2148)  评论(0编辑  收藏  举报