话接上回,文章提到“主存档文件使用Bit-Packing技术进行压缩,再使用BlowFish算法进行加密”。我们是如何确定加密算法的呢?

工具选择

“工欲善其事,必先利其器”,既然我们要对PS2游戏进行逆向,适合的工具是必不可少的。本文需要使用以下两个工具:

  • PSCX2PS2模拟器,带debug功能
  • Ghidra – 逆向神器

PSCX2挑最新稳定版安装,GHDIRA安装说明如下:

  • 确保本机已安装JDK21
  • 下载Ghidra 11.2.1
  • 下载emotionengine插件,注意匹配Ghidra版本。
  • 将插件解压缩,得到ghidra-emotionengine-reloaded目录,将该目录复制到Ghidra根目录下的Ghidra/Extensions/目录下。
  • 运行./ghidraRun命令启动。

PSCX2配置说明如下:

  • 菜单“工具”下勾选“显示高级设置“。
  • 进入“设置”界面,选择“高级”,在“即时存档设置“选项卡中将“压缩模式”从“ZStandard“改成“未压缩”。(注意这一步是非必须的,这样做会导致游戏即时存档变大)

Dump游戏内存

启动PSCX2,进入游戏,在游戏进入到读取存档界面时暂停。

选择“保存即时存档”。

转到PSCX2安装目录下的sstates目录,找到刚才保存的即时存档。

注意看03和04两个文件,03是使用ZStandard压缩过的,04是未压缩的。

MAC环境下,可以直接使用“归档实用工具”解包。

在解包目录下,找到eeMemory.bin,这就是我们今天要分析的游戏内存。

内存逆向

eeMemory.bin拖拽进Ghidra,此时会弹出目标语言选择界面:

如果之前的插件安装步骤正确完成,应该可以出现MIPS-R5900选项,选择它。之后出现的Analysis选项保留默认即可。

之后点击Analyze进行分析,分析完毕后会出现如下界面:

恭喜你,你获得了游戏中的部分函数代码。但是这些函数是由反编译引擎反编译出来的,可读性非常差,懂得都懂。

搜索加密函数

回到PSCX2,在菜单栏选择“调试”-“打开调试器“。

在调试器中选中“函数”选项卡,在下面的输入框中输入BF_,此时出现在最上方的两个函数即是我们感兴趣的,记住它们的内存位置。

切换到Ghidra,在键盘按下G,出现对话框,输入内存地址378f10。此时会定位到一个函数,函数名为Fun_后面跟地址偏移量。

点击函数,右键Edit Function Signature,将函数名改为游戏中的BF_En

这样就顺眼多了。

破解加密函数

到了这一步是真正考验你编程技术的时刻了,读懂函数逻辑并将其改写为你自己熟悉的语言是这一步的目标。

根据函数名和函数逻辑大致可以判断出加密算法是BlowFish,当然你可以借助ChatGPT进一步确认。

最后

如果你对球会04游戏逆向感兴趣,欢迎关注Github,我之后会将逆向代码逐步上传,目标是完成一个存档查看甚至是编辑器。