零之轨迹吧 关注:40,853贴子:930,144

回复:【辛苦大放送】零之轨迹遗漏宝箱回收器

只看楼主收藏回复

而我用的不是锁定内存地址的方法实现瞬移,而是直接换掉游戏里写入场景代码B的这段程序。如果游戏里写入的就是场景代码A,那么就是100%瞬移到场景A了,不存在任何瞬移到场景B(瞬移失败)的可能性。


49楼2012-05-17 07:23
回复
    然后在游戏切换场景,这时CE就查出了写入场景代码B的程序位置



    51楼2012-05-17 07:29
    回复
      2026-03-11 02:33:33
      广告
      不感兴趣
      开通SVIP免广告
      0092B2FE - 89 91 84 4e 00 00 - mov [ecx+00004e84],edx
      0092B304 - 8b 45 f8 - mov eax,[ebp-08]
      0092B307 - 8b 08 - mov ecx,[eax]
      0092B309 - 8b 55 0c - mov edx,[ebp+0c]
      0092B30C - 89 91 88 4e 00 00 - mov [ecx+00004e88],edx
      0092B312 - 68 6c e4 b3 00 - push 00b3e46c : ["NewSceneInit
      "]
      0092B317 - e8 50 38 d3 ff - call 0065eb6c
      


      52楼2012-05-17 07:30
      回复



        53楼2012-05-17 07:31
        回复
          很明显[ecx+00004e84]这个地址就是场景代码,而[ecx+00004e88]这个地址就是出入口代码


          54楼2012-05-17 07:33
          回复
            如果我要移动到21520100场景的67出入口,那么我会把以上的代码改为
            ???????? BA 00015221 MOV EDX,21520100
            ???????? 8991 844E0000 MOV DWORD PTR DS:[ECX+4E84],EDX
            ???????? 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
            ???????? 8B08 MOV ECX,DWORD PTR DS:[EAX]
            ???????? 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
            ???????? BA 67000000 MOV EDX,67
            ???????? 8991 884E0000 MOV DWORD PTR DS:[ECX+4E88],EDX


            55楼2012-05-17 07:38
            回复
              但是这样一来代码所需要的内存空间就比原来多了,如果在原来的地址上直接修改就会覆盖掉后面的无关代码。对于这种情况,一般都是用做钩子解决,把原来地址上的原代码改为跳转指令加空指令,跳转到足够大的新的内存空间执行新代码,执行完后再跳转回原代码之后的代码上去,就实现了新代码替换原代码执行。CE里有现成的这个功能能够用于手工调试(该功能叫做“创建跳转和初始化 Code-Cave”),当然最后我是用自己写的程序实现了同样的功能。

              


              56楼2012-05-17 07:47
              回复
                偷换之后,原代码就变成了跳转指令加空指令



                57楼2012-05-17 07:59
                回复
                  2026-03-11 02:27:33
                  广告
                  不感兴趣
                  开通SVIP免广告
                  而跳转到的内存空间里则是新代码和跳回指令



                  58楼2012-05-17 07:59
                  回复
                    不过我的程序在写入新代码和跳回指令之间是不会有空指令的,因为程序能精确的计算出需要的存储大小,一个字节都不浪费。


                    59楼2012-05-17 08:01
                    回复
                      关于如何实现自动瞬移,这个就比较麻烦了,调试的时间也主要用在这里。从引用场景代码的程序位置0092B2FE向上找,可以看见和int 3指令交界的位置0092B1D0,这个交界处一般都是函数的入口地址。在这里插入断点,发现游戏中每次切换场景的时候都会崩溃,但场景内移动时不会崩溃,说明这个函数只有在切换场景时才执行。

                      


                      60楼2012-05-17 08:08
                      回复
                        我的目的是要找出游戏里一直循环的程序是在什么地方调用这个切换场景的程序,以及什么条件下才会调用。如果我能够找到并且偷换程序,使该调用条件永远成立的话,那么就会达到自动切换场景的效果。


                        61楼2012-05-17 08:13
                        回复
                          我跳转到主程序模块ED_ZERO的首地址00400000开始搜索包含0092B1D0的代码,看看什么地方调用了这个函数。

                          


                          62楼2012-05-17 08:19
                          回复



                            63楼2012-05-17 08:20
                            回复
                              2026-03-11 02:21:33
                              广告
                              不感兴趣
                              开通SVIP免广告
                              之后发现0065A756这里有跳转到0092B1D0的指令



                              64楼2012-05-17 08:23
                              回复