东方地灵殿吧 关注:2,044贴子:43,045
  • 16回复贴,共1

【原创】【东方地灵殿】浅析某全开档的 "Ai"(附清除"Ai"的补丁)

只看楼主收藏回复

阿空镇楼,正文在 2 楼


IP属地:上海1楼2014-08-01 09:50回复
    如果你的东方地灵殿使用了某全开档,你所保存的每一个 REP 的机签后面都会莫名其妙地多出 2 个字母 "Ai" ,使得原本应该只有 8 个字符的机签奇迹般地变成 10 个。



    由于我自己也用这个全开档,所以每次看到自己打的REP里多出这两个字母都很不爽。于是利用最近空余时间分析了一下游戏主程序 th11.exe ,发现原因貌似跟默认机签有关。
    我们知道游戏会保存你上次输入的机签(如果你从未输入过,那么就是 8 个空格)。而每次你保存 REP 时,默认的机签即为你上次输入的机签。而在游戏内部,会先把上次输入的机签拷贝到一个 buffer 中,玩家输入机签时所修改的,以及最终在 REP 里保存的便是这个 buffer 里的内容。而这个拷贝操作使用的是类似 C语言库函数 strcpy() 的操作,也就是循环拷贝字符,直至遇到 *\0* 结束。
    而问题在于这个全开档的默认机签,她的第 9 和 第 10 个字节分别为 *A* 和 *i*。我们知道东方STG的机签应该固定为 8 个字符(你没填的地方其实都填了空格,而不是没有字符哦),所以第 9 个字符应该为 *\0* (字符串结束标志)。那为什么这个全开档的默认机签的第 9 个字符不是 *\0* 呢?那就只有问全开档的作者了。
    正常情况下,因为玩家只能在游戏中输入长度为 8 个字节的机签。那么玩家不管怎么努力,都无法改变 buffer 中第 9 个字节及其之后的内容。于是,从默认机签中拷贝而来的 "Ai" 自然也是改不掉的,所以最终就跑到了所有你保存的 REP 里。
    那么,解决的办法就是,在游戏运行时直接改游戏内存,把默认机签的第9个字节改成 *\0*,关掉游戏。以后再保存 REP 时就不会有 "Ai" 了。
    默认机签的地址在 th11.exe 进程内存的 [4a8ebc]+2dde0 处 。如果使用了全开档,那你应该看到 第9 和 第 10 个字符(偏移 8 和 9)分别为 *A* 和 *i*,把 *A* 的十六进制值改成 00 ,改好后为了保险可以先退出游戏,以后你保存的 REP 的机签就不会再拖个 "Ai" 了。
    如果你不懂内存修改,或者懒得自己动手,可以下载我写的补丁程序。该补丁只需应用一次,以后保存的 REP 机签就正常了(除非你又重新用了没打补丁的全开档)。
    无论哪种改法理论上都不会影响除了默认机签以外的游戏数据。不过为了保险起见,建议先备份一下游戏数据文件 scoreth11.dat 。


    IP属地:上海2楼2014-08-01 09:52
    回复
      补丁程序(th11aifix.zip): http://pan.baidu.com/s/1kTwXL0F


      IP属地:上海3楼2014-08-01 09:54
      回复
        点赞


        IP属地:上海来自Android客户端4楼2014-08-01 13:22
        回复
          这个不错,那个AI是比较烦


          IP属地:广东来自Android客户端5楼2014-08-01 17:21
          回复
            碉堡了


            IP属地:江西6楼2014-08-03 09:32
            回复
              欢迎LZ,本人 OD+IDA 的路过…………


              7楼2014-09-15 13:10
              收起回复
                好评


                IP属地:山东8楼2014-09-25 11:26
                回复
                  赞 。。 收了(我竟然一直没发现那儿有个“ai”


                  来自Android客户端9楼2014-09-25 23:22
                  回复
                    给的EXE一运行游戏就崩,我只好下了个CE自己动手把它改了原来这么容易


                    IP属地:福建10楼2014-10-03 09:09
                    收起回复
                      感谢大佬分享!顺便问一下,已经存过的replay可以直接改么,梦B重新通一遍L难度太累了
                      希望这贴还活着


                      IP属地:北京11楼2019-01-24 21:29
                      收起回复