ce吧 关注:196,579贴子:3,801,610

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

取消只看楼主收藏回复

苏联部分(重点):
接下来的算是这个教程的核心部分了,也开始有点复杂了,我尽量讲的好懂一些。
前面提到,我们猜测苏联的CD是跟游戏进行时间有关系的,那我们接下来就要想办法找出游戏进行时间。
错误思路:
有人可能会想到,既然游戏进行时间是一直增加的,暂停游戏时会停止,那直接利用这两点,不断的搜增加和不变不就行了。emm,你可以试试,搜出来的是一大堆结果,而且看上去都差不多,因为游戏里好多值也是和时间一样增加的,所以这种方法基本搜不出来。
正确思路:
我们应该通过先找其他和时间相关的值,间接的找到游戏进行时间。找什么呢?还是要从建筑CD上着手,虽然我们按照常规方法搜不到苏联的CD,但是肯定能搜到与时间相关的东西。为什么呢?


22楼2019-07-08 21:41
收起回复
    开始进入实践环节:
    1、打开游戏,阵营选苏联,挑一个CD时间长的建筑,我选的“战斗研究所”。也是,点一下图标,立刻暂停,切到CE搜初始未知。

    2、这里注意一下,值的类型要选4字节,因为别的搜不到。

    3、搜增加,搜不变,一直到差不多剩下100多个结果,结果数量就不怎么减少了。现在观察一下结果的数值。



    4、发现有三种不同的数值,一种是一长串数字(这种基本可以排除),一种是两位数(跟盟军CD的搜索结果类似,但是改了没效果),还有一种是三四位数。我们把仅有的几个三四位数添加到地址栏,切回游戏,让CD跑一下,看看他们怎么变化。

    5、如下图,发现红框外的两个数一直增加,显然不是我们要的。红框内的两个数,第一个数在开始跑CD的时候会涨一下,然后不变了,第二个数会变成0,等暂停CD的时候又会变回来,应该也不是我们要的。

    6、现在尝试一下,把第一个数改成0,锁定,切回游戏,奇迹出现了,发现建筑物的模型立刻建好了,如下图,但是图标变成灰色了,而且好像点不了。发现这里其实只是模型建好了,但是这个建筑物还处于建造中。虽然不是我们最终想要的,但是这个值肯定是和我们要找的值关系密切。

    7、我们在那个值上,右键,看什么访问了这个地址,切回游戏,让CD跑一下,结果如下图。前两个一下子访问了那么多次,肯定不是。下面三个访问一次的很可疑,点开看,发现他们都有个共同点,都访问了红框里的地址。

    8、这就需要我们进到反汇编看一下是怎么回事了。选一个地址打开反汇编窗口,我选的第一个地址。


    24楼2019-07-08 22:42
    回复
      9、进到反汇编窗口,如下图,绿色那条是访问我们找到地址的命令,上面第一个红框内是我们发现的共同点。担心有人不了解汇编指令,我简单翻译一下这几个命令,其实很简单的。
      mov eax,[RA3_1.12.game+8D8CE4] 将“RA3_1.12.game+8D8CE4”地址的值,传给eax(像eax,ecx这些都 是寄存器,可以把它当做一个容器,用来保存数值)
      mov eax,[eax+50] 将eax中的地址+50得到一个新地址,再将这个地址中的值传给eax
      cmp ecx,eax 将ecx和eax做比较
      jae RA3_1.12.game+2F7184 如果ecx >= eax 就跳转到RA3_1.12.game+2F7184,否则继续执行
      sub eax,ecx eax = eax - ecx
      add [esi+3C],eax esi+3c的数值+=eax

      10、看上面的代码,我们发现,eax的值很关键,它修改了我们找到的那个地址的值(绿色那条命令),从绿色命令往上看,我们发现最开始eax是由[RA3_1.12.game+8D8CE4]赋予的,然后又在其地址上+50,那么这个地址肯定是关键地址。我们手动添加这个地址。


      11、得到了一长串数值,这是十进制,我们看一下它的十六进制是什么样子。

      12、是个地址,按照汇编指令里的【eax+50】,我们要在这个地址上+50才能得到后面的eax的值。

      13、加上50后,OK,看看我们发现了什么,一个不断增长的数值!现在切回游戏,新建一个建筑,再切回CE,把这个值加500,再回到游戏,建筑瞬间建好了!不过这并不是我们最想要的,每次建建筑都要改这个值也挺麻烦的,而且比较尴尬的是,如果你的队友或者对手是苏联,人家也是秒建,这显然不是我们想要的效果。


      25楼2019-07-08 23:14
      回复
        接下来要将怎么找真正的CD完成时间,还有解析数据结构,以及代码注入。然而今天莫名被吞楼,心态崩了,先停更吧


        26楼2019-07-08 23:22
        回复


          来自Android客户端27楼2019-07-09 11:12
          回复
            23楼被吞了,此楼补上
            接22楼为什么的原因,因为我们猜测苏联CD是根据游戏进行时间来计算的,所以我们提出下面的公式:
            苏联CD完成时间 = 当前游戏时间 + 当前建筑CD
            举个例子,比如现在建一个CD时长为100的建筑,当前游戏进行时间为12345,那么如果我们不暂停CD的情况下,这个建筑要在游戏进行时间为 12345 + 100 = 12445 的时候完成建造,这也是我们搜索的核心思路。


            29楼2019-07-10 00:30
            回复
              接下来讲找“CD完成时间”的方法,以及如何利用解析结构/数据来分析公用代码段。在没人回帖的情况下,是什么在支持着我写完教程


              30楼2019-07-11 00:03
              收起回复
                1、为了找到29楼的“CD完成时间”,我们打开游戏,观察之前找到的游戏进行时间,假设现在游戏进行时间为1000,我们立刻建造一个反应堆,游戏里给出的反应堆的建造时间是10秒钟,我们让它建完,然后再观察游戏进行时间,当反应堆建好的时候,游戏进行时间变成了1150,也就是说,游戏里给出的10秒=游戏进行时间的150。

                2、然后我们找一个20秒的精炼厂,根据刚才找到的规律,精炼厂对应300的游戏进行时间单位。假如在我们开始建精炼厂时,游戏进行时间为5200多一点,那么我们应该搜索5500左右的数值,我们搜索两数值之间,如图。


                3、游戏CD正在跑时,进行第一次搜索,然后再游戏里按ESC,让数值暂停,搜不变,回到游戏,右键暂停CD,等两秒左右,再开始,此时按照我们的推测,CD完成时间应该增加了,我们再搜增加,后面以此类推,直到搜到只剩一个结果,正是我们想要的值,证明我们猜测正确。把这个值改到低于当前游戏进行时间,切回游戏发现建造完成。

                4、成功找到我们要的值了,右键查找什么写入(如果建造完成了要重新再找一次),让CD暂停一次,开始一次,结果如图。

                5、我们进入到反汇编窗口,发现这个地址是被这段代码写入的,但是这段代码是共用代码段,不只改变这个地址的数值,因此,我们需要找到规律,识别出我们想改的地址,这就要用到解析结构/数据了。在这句代码上右键,查找此命令访问的地址。

                6、切回游戏,我们多暂停几次CD,然后点stop,让这个窗口按写入次数排序,找到那个次数最多的,就是我们的地址。

                7、这个窗口还有好多其他地址,我们选上几个数值跟我们的地址数值相似的,选中右键,打开解析数据窗口。

                8、如图,红色代表不相同的数据,这样对比不出来,为了防止数据变化,我们先在这几个地址上右键lock锁定,然后在我们的CD地址上右键,改变组别。

                9、如图,因为数据比较多,这样也看不出来。


                31楼2019-07-11 00:23
                回复
                  10、我们在View里,选择如图选项(偷懒)。

                  11、点scan,出来的结果就是group2数值与group1不同的地址,解释一下,这里如果group1里某一行都相同,但与group2不同,就会被搜索出来,亦或者group2的都相同,与group1不同。(其实这里group2里应该多几个地址)


                  12、这个过程要保存文件,记录结果,这跟指针扫描相似,也是找多次,进行筛选,找到一个稳定的差异,用作判断的依据。


                  32楼2019-07-11 00:30
                  回复
                    13、下图是我筛选几次后的结果,已经比较稳定了,这里因为地址变了,所以值都是问号,这里原来应该是group2的值都为0,group1的值也都相同但不为0。

                    14、找到规律后就要进行代码注入了,先要找好地方进行注入,必须要在改变CD完成时间的那行指令附加,我们这时仔细上下翻一下,发现有几个跳转,尤其是下图箭头指向的那个跳转,这直接导致我们不能直接在蓝色那行代码上注入了,因为注入后,下面的跳转会无法实现导致游戏崩溃。

                    15、最后我们选这行作为注入点,因为它不影响程序其他的跳转。

                    16、选中那行,按下图所示,进入自动汇编。

                    17、出现如下图所示界面,我们为了能在CE里方便取消功能,先选Cheat Table framework code,添加一个框架,这个框架可以实现一个功能开关,方便我们随时开启关闭功能。

                    18、再选择Full injection(其实这里可选项很多,上面几个也可以用,这里不做多解释)。

                    19、出现下图自动代码。

                    20、下图是我写好的代码,本来想解释一下,无奈没什么人回复,这里就不说明了。

                    21、写好后,在文件里,添加到CE表。然后在CE主窗口地址栏会多出一行,点击行左侧的方框即可激活功能,切回游戏,体验完美的秒建吧。


                    33楼2019-07-11 00:47
                    回复
                      苏联CD部分到此结束,日本的CD是由盟军CD和苏联CD一起组成的,也就不用再找了,两个一综合就是日本的CD。


                      34楼2019-07-11 00:49
                      收起回复
                        好了,终于,教程结束。代码注入那部分讲的比较潦草,其实好多细节没有讲,不过我觉得如果有基础的人看了应该就懂,无需多讲,没有基础的人还是先去学习一下再看吧,因为LZ一直没人搭理,没有动力细讲了实在抱歉。如果这个教程对你有帮助,还请回帖让我知道,回帖是一种美德。
                        OK,那我们有缘再见


                        35楼2019-07-11 00:53
                        收起回复
                          马上2000阅读量了,顶一下


                          来自Android客户端39楼2019-07-14 16:19
                          收起回复
                            解释33楼的代码段


                            71楼2020-04-17 11:57
                            收起回复