话接上回,文章提到“主存档文件使用Bit-Packing
技术进行压缩,再使用BlowFish
算法进行加密”。我们是如何确定加密算法的呢?
工具选择
“工欲善其事,必先利其器”,既然我们要对PS2
游戏进行逆向,适合的工具是必不可少的。本文需要使用以下两个工具:
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,我之后会将逆向代码逐步上传,目标是完成一个存档查看甚至是编辑器。