欧陆战争4吧 关注:65,062贴子:1,597,024

【EW4 mod】上限技能数值修改原理大揭秘

只看楼主收藏回复

大家好,这里和泉纱雾。今天偶然发现有人将上限技能的+1改成了+2。没想到感兴趣的吧友居然不少诶,这次就跟大家分享一下这是怎么做到的叭
欢迎光临,纱雾教您改so~
#汇编##so文件#


IP属地:上海来自Android客户端1楼2025-03-04 23:54回复
    豺狼爱上yang、xiao19870123被楼主禁言,将不能再进行回复
    在欧四,技能效果、游戏机制的修改都需要修改lib文件夹下的so文件,不同版本欧四的so文件不完全相同。对于初学者而言,so改起来的难度大致可分类为:64位so > 1.6.0版本(含) 之后的 32位 so >1.6.0版本(不含) 之前的 32位so 。本次就以最简单的给大家举例,反馈好的话,下次会跟大家分享更多喔。原楼主说他用的是1.4.1版本的so,我们也用一样的先!(一猜就猜到辽,因为只有1.4.1是流传比较广的、有函数名的欧四so)


    IP属地:上海来自Android客户端2楼2025-03-04 23:55
    回复
      对于原楼主提到的x86,aembi和v7a,其实只要改v7a就行了,剩下两种删掉。这是为了兼容不同的手机的,而只能兼容前两者的手机比例很低很低,在十年前都低,更别提现在。对于现在而言,哪怕v7a都不够了,v7a是32位,而很多玩家的手机已经不支持32位应用;大家需要的其实是v8a,也就是ARM64,大家感兴趣的话,日后教大家怎么改64位的so~


      IP属地:上海来自Android客户端3楼2025-03-04 23:56
      回复
        使用到的工具:IDA,armconverter在线网站(非必需)
        第一步,在网上下载IDA,版本不限~。IDA是一款功能强大的反汇编软件,用它打开你准备好的so文件。打开后,做图1操作,IDA会在整个so里搜索函数名包含GetIncreaseMaxAttack的函数
        如果大家想问,一开始是怎么知道要搜“GetIncreaseaMaxAttack”这些字的。结合stringtable中的技能代码+立即数反推的策略可以帮你知道原因,但篇幅有限今天先不展开啦,我们先进入正题!


        IP属地:上海来自Android客户端4楼2025-03-05 00:01
        收起回复
          第二步,双击搜索结果,右侧的代码区域如图所示,部分数字的含义解释如图2。


          IP属地:上海来自Android客户端5楼2025-03-05 00:02
          回复
            通过图2可以看出,如果我们想在1.4.1的版本中修改骑兵与炮兵的上限技能的数值,只需要修改text:0008B9C6 处的 MOVNE R0, #1 指令,这里的 #1 就代表着上限+1。我们想让上限+2的话,把指令改成MOVNE R0, #2即可,以此类推。但指令要怎么改呢?


            IP属地:上海来自Android客户端6楼2025-03-05 00:04
            回复
              第三步,左键单击选中text:0008B9C6 处的 MOVNE R0, #1 指令,点击上方的Hex-View1视图,IDA会告诉你这条指令对应的十六进制代码是0120,如图3。右键它-> Edit -> 改成0220 -> 右键它 -> Apply Changes,然后点击上方的 IDA View-A。


              IP属地:上海来自Android客户端7楼2025-03-05 00:06
              回复
                我们回到了代码区域的视图,如图4,发现那条指令已经变成了MOVNE R0, #2,这意味着骑兵和炮兵的上限技能此时可以+2了。(如果你想要+5,就改成0520;如果想要+10,就改成0A20)若想知道更多指令与十六进制代码的关系,欢迎查询在线网站armconverter。Assembly Code就是指令,THUMB就是对应的十六进制代码,右上方的<->箭头可以切换输入模式,切换后可输入Hex Code。


                IP属地:上海来自Android客户端8楼2025-03-05 00:08
                回复
                  【大段警告】:
                  如果想要步兵上限技能的加成数值,也跟着一起+2,应该怎么办呢?
                  步兵上限不能跟着+2的原因在于:请观察骑兵和炮兵的代码,不难看出,上限技能的加成数值的设置(也是我们上文修改之处),发生在技能检验的函数(CUnitCommander::HasSkill)之后。而当兵种为步兵时,程序将从图3的黑色箭头方向检验skill_13的阵型技能,检验完毕后,它将不设置技能加成的数值,函数直接结束(POP意味着函数结束)。
                  所以,当兵种为步兵时,程序不经过被我们修改过的代码,所以阵型技能的加成数值还是1,并没有跟随着+2……
                  有小伙伴在这里可能会问,为什么它可以不设置加成的数值呢,这样简单粗暴地直接结束,会出问题吗?答案是不会。因为原汇编利用了HasSkill将在有技能时返回1、无技能时返回0,返回的布尔值与技能的加成数值正好相等的巧合,所以原汇编这么写的确不会出错。
                  但是,注意注意!这其实不是个好习惯!为了程序的可扩展性与易维护性,自己写的时候请勿耍这种得不偿失的小聪明!


                  IP属地:上海来自Android客户端9楼2025-03-05 00:13
                  回复
                    既然我们已经知道了问题的原因:程序没有经过被我们修改过的代码。那解决方法便呼之欲出:当兵种为步兵时,强制它跳转到我们改过的分支上,逼迫它使用 8B9BE 处的技能检验函数(即CUnitCommander::HasSkill),而不是8B9CE的,从而经过我们被我们修改过的代码。


                    IP属地:上海来自Android客户端10楼2025-03-05 00:15
                    回复
                      强制跳转指令是B、或B.W,书写格式为:B #偏移量

                      我们想强制8B9CE处的程序跳转到8B9BE,先计算:偏移量=#0x8B9BE - #0x 8B9CE = #0x FFFFFFF0;再写出指令:B.W #0xFFFFFFF0;再把它转化为十六进制:FF F7 F6 BF ,如图5!
                      (Assembly Code -> Thumb的结果不一定准确,但Hex Code –> Thumb 的结果是准确的,请以后者为准)。

                      接下来该改指令了,在第三步已经讲过,我们再来一遍:左键单击选中text:0008B9CE,点击上方的Hex-View1视图,右键-> Edit -> 改成FF F7 F6 BF -> 右键 -> Apply Changes,然后点击上方的 IDA View-A。


                      IP属地:上海来自Android客户端11楼2025-03-05 00:18
                      回复
                        我们回到了代码区域的视图,如图6:发现那条指令已经变成了B.W loc_8B9BE!这意味着步兵分支已经被汇总到了骑/炮兵分支里 步兵的上限技能终于也可以跟着一起+2了


                        IP属地:上海来自Android客户端12楼2025-03-05 00:19
                        回复
                          最后教大家如何将IDA的修改结果直接应用于so(用十六进制编辑器对着改太累辽):左上角 Edit -> Patch Program -> Apply Patches to -> 点击“...”,选择你所打开的so -> 点击Apply Patches


                          IP属地:上海来自Android客户端13楼2025-03-05 00:21
                          回复
                            最后小小地预告一下,支持全面屏、折叠屏和64位移动设备的经典模组:大鏖战,即将与大家见面哦~。






                            IP属地:上海来自Android客户端14楼2025-03-05 00:28
                            回复
                              贴贴纱雾酱w


                              IP属地:湖南来自Android客户端15楼2025-03-05 00:36
                              收起回复