韩版三国志11吧 关注:3,316贴子:5,939

国版自定义包移植pk2教程

只看楼主收藏回复

一楼不给看


IP属地:浙江1楼2023-12-05 14:44回复
    前言
    目前,pk2已支持在游戏内加载sire的自定义包,但由于国版韩版内存地址不同,国版包没法直接使用,所以搬运势在必行。但如何搬运还没人介绍过,这边就来抛砖引玉一下,给大家指个路。
    首先要确保自己有一定的理解能力和动手能力,游戏还没玩明白,工具都不怎么会用的请直接略过(等等党永远不亏)


    IP属地:浙江2楼2023-12-05 14:46
    回复
      1.需要用到的工具,丁神的三国志11中韩映射工具~感谢丁神的神级工具,没有他,转换会非常吃力


      IP属地:浙江3楼2023-12-05 14:46
      收起回复
        下面由简单到复杂,简单介绍下如何把国版的自定义包转到韩版来用
        首先是适用于没啥汇编基础的普通玩家的方法。
        方法一
        说明适用于没啥汇编基础的普通玩家的方法。优点是需要会简单的复制黏贴就好了,缺点是适用范围窄。
        第一步是确认下哪些包适合迁移
        最简单的方法就是比较这些自定义包的文件大小,越大的包移植起来要改的东西就越多,肯定越不适合迁移。所以大的包直接跳过,优先选只有1-3kb的包,越小约好。另外注意,加密的包无法迁移。
        选定包后,就用记事本打开,定位到所有address的地方,将address复制到丁神的映射工具里,工具就会自动转成韩版的对应地址,并且发送到剪切板,然后只需将转换好的地址黏贴回原来的地址,就好了。


        IP属地:浙江4楼2023-12-05 14:46
        回复
          范例


          IP属地:浙江5楼2023-12-05 14:47
          回复
            转换完成后,将转好的包放到pk2.2/data/sirecm目录下,就能自动加载了,在游戏中按f12就能看到对应包。包是否生效就得看包对应的功能在游戏中是否起效了。


            IP属地:浙江6楼2023-12-05 14:48
            回复
              方法二
              适用范围更广,一般的中小包都能转,但需要一定的理解能力,小白请绕道
              需要用到额外的工具,cheatengine7.2。


              IP属地:浙江7楼2023-12-05 14:48
              回复
                先以”火横扫1020.scp”为例子简单分析下scp包。

                1 Address里是修改代码的插入点
                2 EnableCode里是具体执行代码
                3 DisableCode里是取消执行后运行的代码,一般照抄游戏原代码就行。
                我们知道国版和韩版内存地址有很大不同,所以scp包要应用到pk2就得更改“所有”涉及到“具体内存地址”的代码。在方法一中,我们只改了address内的内容来让scp包适配pk2。这对2,3(EnableCode,DisableCode)中的执行代码不多,没有具体跳转的情况,是适用的。但更多的情况下,2,3中的执行代码实际上也会包含内存地址,所以方法二就是要教大家学会改这部分内容。


                IP属地:浙江8楼2023-12-05 14:48
                回复
                  正式开始:
                  第一步:找到要转的包,用sire加载这个包并打开游戏,等待sire修改完成。
                  第二步:打开cheatengine,按下图顺序挂载san11.exe的主进程


                  IP属地:浙江9楼2023-12-05 14:50
                  回复
                    第三步:火横扫1020这个包为例,这个包有2个注入位点(即包内Address的地址),

                    可以看到第一个注入位点是添加一条跳转到第二个注入位点的代码。(图中的3 jmp san
                    11pk.exe + 530000就等于跳转到0x930000(530000+400000,san11在ce看到的所有地址都是要加400000的,0x930000正好是第二个注入点位的位置。)。
                    继续跳转到0x930000看第二个注入点位的内容,如下图

                    可以看到,这段修改代码其实很短,其中涉及到具体跳转点位的就三处。其中1 (je san
                    11pk.exe +53002e是代码内部跳转,可以看到左侧有虚线箭头指向mov ebp,[exp+10])是不用改的,一般来说,代码内部的短距离跳转都是不需要改的,他跳的是相对位置。然后2(call san11pk.exe+1887e0)是调用一个指定地址的函数, 是需要改的,因为这是个具体的地址,国版和韩版地址是不同的。最后3这处(jmp san11pk.exe+194a67)是跳回到第一个注入点之后的位置,也就是返回,因为是长距离跳转,也是要改的。所以总结下,对于第二个注入位点,我们只需要把2和3箭头处的位置改了就好,修改方法如下图。

                    2,3改完后把图中4的修改后的数据选中,复制,黏贴回scp包的enablecode里。就可以用了

                    同时注意,如果disablecode里有对应的具体内存地址,也要如上述方法一样修改。
                    第二个注入位点的最终修改结果


                    IP属地:浙江10楼2023-12-05 14:55
                    回复
                      现在我们回过头来看第一个注入位点,前面提到它其实就是做了一件事,从原来的代码跳转出来,跳到修改代码(也就是第二个注入位点)的执行部分,执行完修改代码,再跳回去。(PS如果有写过pk2的cpp自定义包,可以简单理解成是一个trigger,trigger也是运行到某段代码时,跳出来,执行你要加入的代码,再跳回去继续执行原代码)。实际上这个注入位点的enablecode和disablecode也需要改,但这个跳转代码基于当前内存位置计算出的一个相对位置,当我们将address里的594a60改成595b40之后,这个相对位置也会变,我们可以重启下游戏,重新加载我们改之后的包,看看它变成什么了。
                      第一张图是修改前,第二张图是修改后



                      IP属地:浙江11楼2023-12-05 14:56
                      回复
                        可以看到由于我们对第一个注入位点address的修改,此处变成了jmp9310e0,不是我们一开始要的930000,所以我们需要在ce里在双击此处,把jmp 009310e0改成jmp 00930000,改完如下

                        然后再把1箭头所指的代码替换掉第一个注入位点的enablecode和disablecode,至此,基本的内存地址迁移就完成了,结果如下。

                        简单总结下方法二的所做的事,实际上就是把所有注入位点及注入位点内包含的绝对内存地址及长距离跳转(非函数内部跳转)的内存地址都改成pk2的内存地址。一般来说,完成上述事项后,大部分国版的自定义包都能在pk2正常使用了。


                        IP属地:浙江12楼2023-12-05 14:57
                        回复
                          接下来是扩展内容,请学有余力的玩家继续学习,如果方法二都没看懂,后面就不用看了。
                          扩展1:
                          关于方法二,简单介绍下方法二介绍的火横扫包在汇编层面做了啥。

                          可以看到其实方法二修改还有个漏洞,没有修改特技id。此处输入的特技id是000003fc,换成十进制就是1020。我们应该要把这个特技id改成我们想要的id,比方说,如果想要拥有飞将特技(特技id:0)的武将释放横扫时可以点火,那就是把这个000003fc改成00000000。


                          IP属地:浙江13楼2023-12-05 14:58
                          回复
                            扩展2:
                            关于930000空地址
                            我们知道大部分汇编修改实际上都是选择一个内存位置跳到一个“未被使用的内存位置”(在此位置写上自己要执行的代码),运行完要执行的代码再跳回去。而方法二中的930000就是被分析出来的一个“未被使用的内存位置”。这样的内存地址其实有很多,国版大佬们已经分析总结过了,如果要进行国版的汇编修改,都是需要向rk大佬申请一个未被使用的空的地址段,做好登记。假设不做登记,大家都以为930000是空的地址段,都把代码写在此处,那不同人的修改就会冲突,从而出现异常。
                            关于韩版已使用的地址段以及可以申请的空地址段请参考下方文档。


                            IP属地:浙江14楼2023-12-05 14:59
                            回复
                              扩展3:
                              关于韩版特殊的跳转
                              韩版内存修改相较于国版不一样的地方在于韩版内置的修改引擎实际上已经在运行游戏时通过core2.dll修改过一次内存,所以其他内存修改都是在此基础上进行的,core2.dll修改过的地方建议不要动,不然很容易出bug。(类比就是sire加载自定义包前,实际上sire本来也修改了一部分地方,这部分国版肯定也不建议动的)。那么如何确认哪些内存位置是core2.dll修改过呢?参考下图,下方是攻击函数的起始位置,发现有个jmpcore2.xxxxx,这种就是core2.dll修改过的地方了。(ps:此处直接把整个攻击伤害函数都jmp掉了,所以涉及攻击伤害函数运算的地方,就建议只在cpp里改了。)


                              IP属地:浙江15楼2023-12-05 14:59
                              回复