诡计对逻辑吧 关注:1,774贴子:7,094

诡计对逻辑汉化研究

只看楼主收藏回复

大概在去年,有汉化组的成员表示希望汉化这款游戏,托我研究一下技术上是否可行。但由于现实中的事情,加上拖延症,以及有其它汉化坑,迟迟没有开坑这个游戏。经过漫长的拖延,终于在今年年初抽出时间开始研究。十分巧合的是,我与本吧另外一个汉化贴的开坑时间非常接近,时隔多年,实在是没想到有其他人还在关注这款冷门游戏的汉化。


IP属地:云南来自Android客户端1楼2019-04-20 09:41回复
    游戏的破解早在2月份就已经基本完成了,但是由于我没有做笔记的习惯,所以为了写这篇帖子,相当于重新做一遍破解过程。
    这是我第一次接触PSP游戏的破解,我对这个平台并不了解。不过好在PPSSPP的调试功能还算完备,对逆向分析游戏十分有帮助。


    IP属地:云南2楼2019-04-20 11:54
    回复
      首先,我们来看一下游戏镜像文件(ISO)的目录结构:

      PSP游戏遵循程序和数据分别储存的原则:程序的路径是PSP_GAME/SYSDIR/EBOOT.BIN,这是一个加密的ELF文件,关于如何让解密这个ELF后面会提及;数据的路径是PSP_GAME/USRDIR/,一般我们需要汉化的文本、图片等内容都在数据目录下,当然,少数情况下,EBOOT.BIN中也可能会有一些文本。
      下面着重看一下USRDIR这个目录。在USRDIR/data下有几个子目录,根据它们的命名,我们可以猜测当中包含的文件的用途,分别是:视频(movie)、共享游戏(sharing)、音频(sound),很明显,我们需要汉化的文本,并不存在于这些目录下。那么,我们可以猜测,文本应该是储存在data目录下的bin文件中的,但是这些bin(二进制)文件到底是什么呢?


      IP属地:云南3楼2019-04-20 12:51
      回复
        为了进一步分析,我们利用模拟器进行调试。 首先,勾选调试菜单中的“载入后停止”选项,并打开反汇编窗口:
        然后,加载游戏,此时游戏就会停止在程序入口处:
        PPSSPP会对SDK中的一些函数进行自动标记,这是一个非常方便的功能。


        IP属地:云南6楼2019-05-22 21:10
        回复
          我们要分析 SectPack 文件,我们不妨先思考一下,从这些文件包中读取文件,需要经历哪些过程。
          首先,一个最基本的事实:这些 SectPack 都是 ISO 文件系统中的文件。因此必定会调用标准库中的打开文件函数;
          然后,在打开文件后,必然需要读取,读取文件也是标准库中包含的函数之一;
          接着,需要调整文件指针来读取指定位置中的内容,就需要 fseek 之类的函数;
          另外,要打开/读取 SectPack 中的文件,我们假设包中的文件是通过路径来索引的(从文件头部附近确实也看到了一些文件路径), 那么就需要进行字符串比较,也就是 strcmp。
          大致整理一下思路,我们可以着手进行分析的函数分别是SDK中的sceIoOpenAsync、sceIoReadAsync、sceIoLseekAsync,以及 strcmp ,这些函数,模拟器已经为我们标注出来了:


          IP属地:云南7楼2019-05-22 21:11
          回复
            关于以上几个io函数的原型,我们可以在网上搜到 vitasdk 中的文档。 虽然是 vitasdk ,但是既然都是索尼的东西,基本上就是一脉相承的,可以作为参考。
            以下是从 vitasdk 网站中摘抄的函数说明:
            SceUID sceIoOpenAsync( const char * file, int flags, SceMode mode)
            Open or create a file for reading or writing (asynchronous)
            Parameters
            file- Pointer to a string holding the name of the file to open
            flags- Libc styled flags that are or'ed together
            mode- File access mode (One or more SceIoMode).
            Returns
            A non-negative integer is a valid fd, anything else an error
            int sceIoReadAsync(SceUID fd, void * data, SceSize size)
            Read input (asynchronous)Example:bytes_read = sceIoRead(fd, data, 100);
            Parameters
            fd- Opened file descriptor to read from
            data- Pointer to the buffer where the read data will be placed
            size- Size of the read in bytes
            Returns< 0 on error.
            int sceIoLseekAsync(SceUID fd,SceOff offset,int whence )
            Reposition read/write file descriptor offset (asynchronous)
            Parameters
            fd- Opened file descriptor with which to seek
            offset- Relative offset from the start position given by whence
            whence- One of SceIoSeekMode.
            Returns< 0 on error.
            Actual value should be passed returned by the ::sceIoWaitAsync call.


            IP属地:云南8楼2019-05-22 21:14
            回复
              首先简单说明一下,PSP采用的MIPS架构处理器,参数的传递使用的是 $a0 ~ $a3 寄存器, 分别对应的是 C/C++ 中函数声明的第1 ~ 第4个参数,当参数数目大于4个时, 多出的参数会使用栈进行传递。而函数的返回值使用 $v0 传递,函数返回地址保存在 $ra 寄存器中。
              我们先对 sceIoOpenAsync 断点,继续运行,当断点触发时,跳转到 $a0 寄存器指向的内存地址, 可以看到, $a0 指向的就是将要打开的文件路径:

              这里打开的文件 common.bin 恰好是一个 SectPack 文件。 我们切换到 $ra 寄存器指向的代码处(0x88BFF04),下断点,可以看到, $v0 寄存器的值,即sceIoOpenAsync 的返回值是 0x00000004 ,根据文档中的说明, 这个返回值是一个文件指针,无论是 Seek、Read、Write、Close等IO操作,都需要传入这个指针。


              IP属地:云南9楼2019-05-22 21:15
              回复
                我们继续运行,这次断点停在了 sceIoReadAsync 处,可以看到,这里传入的文件指针($a0)正是前面打开的 SectPack 的文件指针(0x00000004)。

                跳转到 $a1 指向的内存视图,这个参数是读取的内容存放的地址。 跳出 sceIoReadAsync ,可以看到 common.bin 的前 0x10 字节已经被读到内存中。

                ↑内存中的视图
                ↓common.bin 文件视图


                IP属地:云南10楼2019-05-22 21:16
                回复
                  虽不明,但觉厉


                  IP属地:河南来自Android客户端11楼2019-06-25 08:43
                  回复
                    9102年还能看到汉化进度热泪盈眶


                    IP属地:江苏12楼2019-07-03 22:42
                    回复
                      真的有人要完整汉化吗?太好了,持续关注


                      IP属地:浙江13楼2019-07-09 15:50
                      回复
                        哭了,等了这么多年,居然还有人也在关注


                        IP属地:湖北来自Android客户端14楼2019-08-01 15:01
                        回复
                          不明觉厉。。。支持有心人!!!!


                          IP属地:广西15楼2019-08-07 22:44
                          回复
                            这款游戏要是真有人汉化了。。。出钱买我都愿意。。有生之年系列啊


                            IP属地:四川16楼2019-08-10 13:14
                            回复
                              谢谢楼主,楼主加油


                              IP属地:上海来自Android客户端17楼2019-10-19 14:37
                              回复