PSP《大众高尔夫 2P》XB 资源包算法分析
Jerry
2010-07-29
1
概述............................................................................................................................................................3
分析环境................................................................................................................................................3
准备工作................................................................................................................................................3
算法分析方法........................................................................................................................................4
文件名列表的 LZSS 算法分析................................................................................................................5
定位函数................................................................................................................................................5
MIPS 上函数的调用规范.....................................................................................................................7
确认函数功能........................................................................................................................................7
对应的反汇编列表..............................................................................................................................10
反编译过程..........................................................................................................................................12
编写模拟代码..................................................................................................................................12
恢复高级语言特征..........................................................................................................................15
增加可读性......................................................................................................................................16
算法功能验证..................................................................................................................................18
算法总结..............................................................................................................................................20
算法 0X20(LZSS)..............................................................................................................................20
未知算法 0X00(HUFFMAN+LZSS)...............................................................................................21
定位函数..............................................................................................................................................21
确认函数功能......................................................................................................................................22
反编译过程..........................................................................................................................................25
编写模拟代码..................................................................................................................................25
整理以及验证..................................................................................................................................27
编写主体部分模拟代码..................................................................................................................29
整理以及验证..................................................................................................................................31
算法总结..............................................................................................................................................33
未知算法 0X10(HUFFMAN)...........................................................................................................33
结束语......................................................................................................................................................33
2
概述
本文是继 Xinyu 的 PSP《大众高尔夫 2P》XB 资源包结构破解分析 的后续。
http://www.xinyuonline.net/blog/?action=show&id=43
主要是描述上文中提到的 3 中压缩算法。
我不认同通过观察编码前后数据变化的方式来编写 codec 的方法,这是一种非正规和不可
靠(你无法确认可以攻破他,尤其在运气不站在你这边的时候;同时也无法在一些细节处
理上和原算法保持一致,很可能游戏的恶性 bug 就是在这时引入的)的方法。于是我学习
到了下面这种方法,并详细的记录了整个分析的过程。希望大家在看完这篇文章后,会得
到这样的感受:没有破解不了的算法,问题只是要花多少时间而已。同样也会发现通过这
种方法,分析的进度是可以被量化的,也就是说是受控的。
非常感谢 tpu 教会了我这种方法,同时感谢他对于那些甚至是很低级的问题都耐心的一一
作答。谢谢!同时需要说明的是,他是这 3 种算法 decoder 部分的原作者。
分析环境
完整的 psptoolchain 编译环境(内含 psplinkusb 源代码)
IDA Pro
准备工作
修改 psplinkusb 中关于 api_hook 这部分的代码,以便于打印出 api 函数的调用参数
在 psplinkusb 的代码中添加对数据访问断点的支持
参考:http://www.pspchina.net/viewthread.php?tid=290484&highlight=psplink
在 psplinkusb 的代码中添加显示栈帧的功能
参考:http://blog.csdn.net/jerryutscn/archive/2010/07/30/5775226.aspx
通 过 IDA Pro 获 得 boot.bin 的 反 汇 编 信 息 ( 如 boot.bin 为 无 效 数 据 , 需 先 解 密
eboot.bin)
3
算法分析方法
函数定位:
如果无法获得目标函数的入口信息,庞大的反汇编清单会把我们淹没。
我们找出解压函数的地址是基于下面的假设:
任何访问(读)压缩数据地址的指令,都和解压函数相关。(这个假设不会总成立,你可以为
他的成立创造条件)
首先在游戏启动的时候通过 psplink,hook 住下面 6 个 API 函数:
sceIoOpen
sceIoOpenAsync
sceIoRead
sceIoReadAsync
sceIoLseek
sceIoLseekAsync
游戏启动时会看到下面显示:
!"#"$%&'(#)*+,-. .
./
01. $. . /
2
01. $. . /
3 .4.2./2
,) .../
01. $2256. . /
2256
3 .7'6.2./2
其中 sceIoLseek 里的 00055FC0 这个数值是指在 ISO 文件中偏移的扇区个数,sceIoRead 里
的 0x00000005 是说读入了 5 个扇区的信息量(2048*5Bytes)到内存地址 0x08BE47C0
0x55FC0 = 352192
从 UMDGen 导出的 ISO 结构文件中可以找到下面对应项:
0352192 , \PSP_GAME\USRDIR\xbdata\kuwa\loading\loading.xb
这是游戏启动加载的第一个 xb 文件。
经过多次试验发现 0x08BE47C0 这个地址是固定的。所以我们可以通过设置硬件读访问断
点来获取算法的地址。
4
文件名列表的 lzss 算法分析
定位函数
首先我们来分析那个用于文件名列表的 lzss 类压缩算法。用 WinHex 打开 loading.xb,确认
偏移量 0x44 的地址(0x40 已经是文件名列表了,设置到这里也没问题)是经过压缩过的
文件名列表。
82476'5
2++++++9++:++
'9++;++9++<++
'29++%++9++;++
2'259+++++++++$+++
'''262672=>++? 33?1,@3A
226654'26'5253B3?C3 !*?@$
7'6D/7'
于是设置下面断点:(注意这里的地址需要 字节对齐)
bpset 0x8BE4804 r
EE
253 .7'6.2./2
'!F'7(%
B3 F25
G3)F)3!
& ,CF
& G3)F)3!
'"6F'
6G0F
#3,F
HB3I7'5I74
3744737'363'
7455''7''5
'7''52'7''5'7''5'7''5
25'7'5
7442'526'7''5
'7''54'7''51455'71
*757455''J455'6B35
'4K++++KFCA,L3.L3
同时也可以获得当前的函数调用关系,以便于分析:
bt
5