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

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

只看楼主收藏回复

再回到主模块首地址开始搜索包含65A756的代码



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

    


    66楼2012-05-17 08:46
    回复
      2026-03-11 02:33:29
      广告
      不感兴趣
      开通SVIP免广告
      从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
          回复


            IP属地:重庆70楼2012-05-17 09:06
            回复
              话说没用过CE,楼主是直接用CE生成这个软件的?


              IP属地:上海71楼2012-05-17 09:14
              回复
                -70
                谢谢支持


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


                  73楼2012-05-17 09:20
                  回复
                    这样啊,受教了
                    那楼主是用什么语言写的呢?难道是直接写机器语言?应该不会吧


                    IP属地:上海74楼2012-05-17 09:24
                    回复
                      下载软件后的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
                            回复
                              2026-03-11 02:21:29
                              广告
                              不感兴趣
                              开通SVIP免广告
                              如何取得执行008F3CB2前的寄存器状态,设置断点会导致崩溃当然不行,所以还是要用类似68楼的修改代码把数据记录到特定内存地址,然后用CE监视这些地址来实现。而且在这里修改代码空间不足,还得做code-cave存放做记录的代码。


                              


                              79楼2012-05-17 10:24
                              回复