ce吧 关注:195,429贴子:3,798,688

[写个小教程]红警3秒建(instant build)建筑物的修改方法

只看楼主收藏回复

背景
LZ大概一年之前,玩红警3(版本1.12)的时候,想做个修改器玩玩。刚开始,实现一些简单的小功能还是挺容易的(比如改金币、改电力之类的),但是在修改建筑CD的时候出问题了(就是不用等待,立刻完成建造),盟军的建筑CD很好找,也很容易实现,苏联和日本的建筑时间就改不了,倒是能搜到,然而改了没有任何效果。当时四处问,也没个人回答,去找个人家做好的修改器,大多也达不到我想要的效果,就很绝望。


IP属地:河北1楼2019-07-07 21:41回复
    一年之后,也就是现在,LZ有了一定的逆向基础了,再回头看这个问题,刚开始也是没头绪,在网上找答案,结果找到了自己一年前发的帖子,时隔一年都没人回复,难受。去google上也没找到答案,决定自己研究一下,用了两天时间,也算终于很完美的完成了。为了纪念,也为了传播一下知识,打算写个小教程,把我如何实现的思路和过程写一下。


    IP属地:河北2楼2019-07-07 21:46
    收起回复
      这个教程就不算是基础教程了,需要有一点汇编基础,涉及一点堆栈,一点代码注入,理论部分我应该是不会写多少,不了解的还请自行学习


      IP属地:河北3楼2019-07-07 21:52
      回复


        IP属地:广东来自iPhone客户端4楼2019-07-07 22:11
        收起回复


          IP属地:上海来自Android客户端6楼2019-07-07 22:28
          回复
            支持


            IP属地:河北来自Android客户端7楼2019-07-07 23:25
            回复
              还发吗?


              IP属地:河北来自Android客户端8楼2019-07-07 23:26
              收起回复
                教程开始:
                还是先给新人简单说一下怎么搜CD吧,一般都是浮点数float,搜初始未知,然后让CD变动,搜增加或者减少,红警里是增加。
                在开始修改之前,先回到最开始提出的问题:
                1、明明搜到了随CD变化的值,为什么修改了却没有效果?
                答:游戏中储存的值有多种作用,有的是我们想要的可以达到修改游戏目的的,也有仅仅只是作为显示或指示作用的数值。搜到了数值但修改无效,多半是搜到了只作为显示作用的值。
                2、为什么能修改盟军的CD,却无法修改苏联和日本的CD?
                答:因为这三个阵营的建造模式不同。盟军还是和红警2一样,点击图标,开始进入CD,CD跑完放置建筑;苏联是点击图标,先放置建筑,然后再进入CD;日本是前两者的综合,点击图标后先进入一小段CD,然后再放置建筑,再跑CD。


                IP属地:河北9楼2019-07-07 23:31
                回复
                  LZ写的速度比较随性,不过肯定会写完,不会太监的。看的人多的话,我就写快点,写详细点


                  IP属地:河北10楼2019-07-07 23:33
                  回复
                    接着上面的问题,三个阵营的建造模式不同,导致实现秒建的方法不同。
                    盟军的最简单,就按常规套路搜就行了,这里还是简单说一下。
                    苏联的是比较复杂的,就不能用简单的搜数值改数值了,需要写一个汇编注入,这里折腾了好久,主要是堆栈平衡没处理好,待会详细讲讲我遇到的坑。
                    日本的其实在上面两个找出来的情况下也很容易了,就是两个综合一下。


                    IP属地:河北11楼2019-07-07 23:44
                    回复
                      思路(划重点):
                      其实当你有了一定基础以后,做逆向也好,做外挂也好,都是思路比较重要,有了正确的思路,事半功倍;思路不正确,事倍功半。
                      1、盟军CD的思路就不再赘述了,上面已经说过了。
                      2、苏联的CD用普通搜法,搜到的都没啥用,说明苏联CD不是简单的存在一个地址里。那我们就需要换位思考一下,如果我们是写红警3的程序猿,我们如何实现这种先放置再跑CD的功能。再考虑一下日本的建造模式,也有这种先放置再跑CD的模式,很可能这两者用的是同一种方法。再考虑到,日本放置建筑后是无法暂停CD的,如果我是程序猿,我肯定不会为一个不能暂停的CD专门定义一个储存其变化值的变量,那么这个方法很可能是根据游戏进行时间来做判断的。游戏进行时间,就是从游戏一开局,开始从0计时,一直到游戏结束。
                      3、如果我们猜对了苏联CD的实现方法,那日本的CD也能找到了。


                      IP属地:河北12楼2019-07-08 00:01
                      回复
                        准备打开游戏和CE,开始正式进入具体步骤,多图预警。先讲最简单的,找盟军CD。


                        IP属地:河北13楼2019-07-08 00:11
                        回复
                          盟军CD修改过程:(这部分主要是给新手看的,老鸟直接飞过)
                          1、打开游戏,选个盟军,CE附加游戏(这别附加错了,附加完CE上方显示应该是RA3_1.12.game才对)。
                          2、进入游戏后,先在右侧的建造栏,点一个图标,出现CD后立刻右键暂停。

                          3、切到CE,值的类型选Float(浮点数),搜索类型选“初始未知数值”,然后点First Scan(首次搜索)。

                          4、再切回游戏,让CD动一下,点一下图标,再马上右键暂停,切回CE,搜索类型选“增加的数值”,然后再次搜索。

                          5、先不用切回游戏,先观察一下,发现很多值一直在变动,但是我们的CD是被暂停了的,应该是不变的,所以我们直接搜索“未改变的数值”。

                          6、反复上述步骤,直到最后结果数量不再发生多少变化,如下图,我们有32个结果,这里面只有一个是我们想要的。观察一下,发现有几个比较可疑,与众不同。我们把那几个“与众不同”的地址,双击添加到下面的地址栏。这里我一眼就看出来那个26.666肯定是我想找的,这是经验了,新手可以多尝试一下。

                          7、添加到地址栏后,我们要验证它是不是我们想要的,点击前面的方框,锁定这个地址的数值,再回到游戏,让CD跑,发现CD在“原地抖动”,没有继续进行,这就说明我们找对了。

                          是不是很简单
                          光找到这个地址可不算数,这个只是一个动态基址,当这个建筑CD完成,这个地址就没用了。我们要找到静态基址才可以,下面介绍如何找静态基址和偏移。


                          IP属地:河北14楼2019-07-08 00:41
                          回复
                            基址和偏移寻找过程:
                            网上90%的教程是怎么教你找基址的?都是找到一个地址后,右键,找什么写入了这个地址,然后再找什么访问了这个地址。很遗憾,这种方法对于大部分游戏都不适用。找着找着你就懵逼了,而且还特累,最后还不一定能找出来。

                            我这里介绍一种方法,Pointer scan for this address,翻译过来应该是“扫描当前地址指针”。


                            IP属地:河北15楼2019-07-08 01:04
                            回复
                              1、点进后,弹出如下窗口。就按照下图设置就行,简单说明一下几个标号的地方:①搜到的地址必须是32位的,如果是32位游戏就选,64位就别选了。②只找包含静态地址的路径,不勾的话,你最后找出来的好多还是动态基址。③不要包含只读节点的指针,这个保证你找到的都是可写的。④不要循环指针,这应该不用解释吧。⑤把线程中的地址视为静态基址,这个针对一些多线程的游戏可以选,我们这里不选。⑥偏移的最大数值,这个是限制搜到的偏移最大不能超过多少,32位的2048就够用了,64位的可以设置大一点。⑦最大几级偏移,32位的一般都是5级以内,但是红警3偏不。这个数越大,搜的越慢,时间成指数增加,我们搜盟军CD可以用5级,但是LZ测试的时候发现,5级好像不是特别稳定,但是也能用,你要是愿意等就设置高一点。

                              2、点OK开始搜,等几分钟,弹出如下界面,玩过的人应该都能看懂,我就不解释了。

                              3、这些地址并不全是我们要的,也要进行筛选。可以重启游戏后,如下图,再次扫描。扫描可以通过地址,也可以通过数值,这里用的是地址。红框里填入的是重启游戏后,新找到的地址,必须是正确的,别填错了。然后OK。


                              4、上述步骤重复几次后,基本就能得到正确的基址了,可能有好多个。这个过程会要你保存文件,最后一次保存的文件别删,当你发现自己选的基址不是正确的时候,可以再从这里挑一个正确的。
                              是不是比传统方法好多了
                              附上一个我找到的基址和偏移:
                              [[[[["RA3_1.12.game"+008E9258] + 40] + 18] + C] + 14] + 1C


                              IP属地:河北16楼2019-07-08 01:25
                              收起回复