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

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

取消只看楼主收藏回复

之后发现0065A756这里有跳转到0092B1D0的指令



64楼2012-05-17 08:23
回复
    再回到主模块首地址开始搜索包含65A756的代码



    65楼2012-05-17 08:41
    回复
      2026-04-24 01:04:03
      广告
      不感兴趣
      开通SVIP免广告
      但结果搜出了3个调用65A756的地方,那么切换场景时到底调用的是哪个呢。虽然也可以分别设置断点,通过游戏是否崩溃来判断。但是还有其他更精确更科学的方法。

      


      66楼2012-05-17 08:46
      回复
        从0092B1D0这个函数一直向下找,到函数结束的地方(与int 3交界的地方),可以看见返回指令ret



        67楼2012-05-17 08:50
        回复
          所谓的ret返回指令其实就是从堆栈里取出一个数值,赋值给EIP寄存器实现跳转。也就是说运行到ret指令时,堆栈里存放的必定是函数调用者的地址。如何得知这个地址,一般情况下设置断点调试当然可以,但是在游戏里执行到CE断点就会崩溃,但可以进行类似dump操作的方法把数值保存在一个可以被CE监视的内存地址即可。调试这里时我用了106D8EF0这个地址来记录调用者地址。在ret指令之前对106D8EF0做出栈和入栈操作,出栈是为了取得记录调用者地址,入栈是为了让ret指令还能取得记录调用者地址。


          


          68楼2012-05-17 09:00
          回复
            在游戏中切换场景,发现106D8EF0的数值变为008F3D70,说明切换场景的代码在008F3D70处。



            69楼2012-05-17 09:03
            回复
              -70
              谢谢支持


              72楼2012-05-17 09:17
              回复
                -71
                这个软件是重新写的,CE只是用来调试得出需要的数据。CE的脚本可以生成简单的可执行文件,做各种内存操作也非常方便,但还是无法实现复杂功能,也不能产生调用DevExpress控件之类的友好界面。这个软件不仅仅是实现直接瞬移,还有中对宝箱信息的管理。


                73楼2012-05-17 09:20
                回复
                  2026-04-24 00:58:03
                  广告
                  不感兴趣
                  开通SVIP免广告
                  下载软件后的readme.txt里说明了,编写语言是.NET,实现内存操作的API目前就SetProcessWorkingSetSize、OpenProcess、VirtualAllocEx、VirtualFreeEx、WriteProcessMemory、ReadProcessMemory、VirtualProtectEx这几个


                  75楼2012-05-17 09:35
                  回复
                    得到008F3D70这个地址后,从该地址的上一条指令008F3D6B处一直向上寻找条件分支的语句并设置断点。在切换场景时,这些语句必定被执行而发生崩溃。那么我的目的就是找到平时不切换场景也会发生崩溃的分支点,最终我找出008F3C8E这个分支点。


                    


                    76楼2012-05-17 10:01
                    回复
                      切换场景时,008F3C8E处不发生跳转(在008F3C90处设断点,平时不崩溃,而切换场景崩溃),而008F3CB2处发生跳转(在008F3CB6处设断点,平时不崩溃,而切换场景崩溃)

                      


                      77楼2012-05-17 10:05
                      回复
                        还有切换场景时,008F3CA0处也不能发生跳转。所以我要实现自动切换场景,先要使008F3C8E处不发生跳转,直接去除je 008f3cb4这条指令即可。要使008F3CA0处不发生跳转,直接去除jnp 008f3cb4这条指令即可。然后在执行8F3CB2的条件判断之前,AX寄存器的值应该和切换场景时一样。
                        


                        78楼2012-05-17 10:16
                        回复
                          如何取得执行008F3CB2前的寄存器状态,设置断点会导致崩溃当然不行,所以还是要用类似68楼的修改代码把数据记录到特定内存地址,然后用CE监视这些地址来实现。而且在这里修改代码空间不足,还得做code-cave存放做记录的代码。


                          


                          79楼2012-05-17 10:24
                          回复
                            原代码就变成了



                            80楼2012-05-17 10:38
                            回复
                              2026-04-24 00:52:03
                              广告
                              不感兴趣
                              开通SVIP免广告
                              记录代码就是



                              81楼2012-05-17 10:38
                              回复