ce吧 关注:196,555贴子:3,801,422

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

只看楼主收藏回复

盟军部分结束,今天到此为止,等明天中午看看有多少人看,再继续


17楼2019-07-08 01:27
回复
    翻了翻贴吧,明明是CE贴吧,但是除了DNF好像没啥别的了,技术贴也太少了


    来自Android客户端18楼2019-07-08 09:45
    回复
      没什么回复啊,我这可是干货,没回贴没动力


      来自Android客户端19楼2019-07-08 10:50
      回复
        楼主辛苦,支持一下


        IP属地:河北20楼2019-07-08 14:33
        收起回复
          今天比较忙,待会开更。说实话,没人回帖我都不想更了,但一想到以后总是会有人需要的,还是更一下吧,无奈,此时心情同LZ头像


          21楼2019-07-08 21:08
          收起回复
            苏联部分(重点):
            接下来的算是这个教程的核心部分了,也开始有点复杂了,我尽量讲的好懂一些。
            前面提到,我们猜测苏联的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
                    回复
                      支持楼主这样的技术贴!建议加精!


                      来自iPhone客户端28楼2019-07-09 19:11
                      收起回复
                        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
                              回复