零之轨迹吧 关注:40,880贴子:929,852

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

取消只看楼主收藏回复

CE锁定内存地址实际上就是不停的向该内存地址写入想瞬移到的场景代码A。而游戏向该地址写入正常的目标场景代码B与游戏引用该地址的场景代码B进行切换场景的两处代码不是同时运行的,中间有一定的时间间隙。如果在该时间间隙内CE把场景代码B偷换成了场景代码A那么游戏就会用场景代码A进行切换场景,效果就是瞬移到场景A。但是CE向该内存地址写入场景代码A的代码也是有时间间隙的,并不是游戏一写入场景代码B,CE就立刻能改成场景代码A。所以如果当CE来不及把场景代码B偷换为场景代码A时,游戏就用进行切换场景了,那么场景还是会变成场景B,也就是瞬移无效。


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


    49楼2012-05-17 07:23
    回复
      2026-04-23 22:08:50
      广告
      不感兴趣
      开通SVIP免广告
      然后在游戏切换场景,这时CE就查出了写入场景代码B的程序位置



      51楼2012-05-17 07:29
      回复
        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
                回复
                  2026-04-23 22:02:50
                  广告
                  不感兴趣
                  开通SVIP免广告
                  偷换之后,原代码就变成了跳转指令加空指令



                  57楼2012-05-17 07:59
                  回复
                    而跳转到的内存空间里则是新代码和跳回指令



                    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
                            回复
                              2026-04-23 21:56:50
                              广告
                              不感兴趣
                              开通SVIP免广告



                              63楼2012-05-17 08:20
                              回复