SAF为休闲ucbug游戏网黄金传说“Talismania Deluxe”所使用的一种资源包格式,你可以在http://download.pchome.net/game/puzzle/download-73900.html下载该ucbug游戏网。
安装后其中的Talismania.saf即为我们要破解的对象,用WinHex打开分析一下,首先要找的是文件索引信息的位置,任何一种资源包都必须包含文件个数,每个文件的大小,偏移,和“文件名”(文件名有可能是以ID的形式保存),而这些信息为了查找方便,通常都是放在一起的。
下面是Talismania.saf文件头部:
00000000h: 46 46 41 53 01 00 00 00 F8 B8 AD 00 3C 61 74 6C ; FFAS....??<atl
00000010h: 61 6E 74 69 73 64 61 74 61 3E 0D 0A 0D 0A 09 3C ; antisdata>.....<
00000020h: 62 6F 61 72 64 20 6E 61 6D 65 3D 22 41 31 22 20 ; board name="A1"
00000030h: 6F 66 66 73 65 74 3D 22 30 2C 30 22 3E 0D 0A 09 ; offset="0,0">...
00000040h: 09 3C 70 6F 74 70 72 6F 70 73 20 73 69 7A 65 3D ; .<potprops size=
00000050h: 22 36 32 2C 37 32 22 20 2F 3E 0D 0A 09 09 3C 63 ; "62,72" />....<c
00000060h: 65 6C 6C 73 70 61 77 6E 69 6E 67 70 6F 6F 6C 20 ; ellspawningpool
00000070h: 6E 61 6D 65 3D 22 64 65 66 61 75 6C 74 22 20 63 ; name="default" c
00000080h: 6C 61 73 73 3D 22 41 31 22 2F 3E 0D 0A 09 ; lass="A1"/>...
除了很明显的SAFF标记外,没有其他什么可疑之处,不过我们看出从0000000Ch开始是一个XML文件,其文件是明文存放的,也就是说文件数据本身并没有被加密,但不排除其他类型文件被加密的可能。既然是ucbug游戏网资源则肯定包含图片,而GameHouse很喜欢使用jpg和png格式,我们就搜下jpg的文件标志JFIF,果然搜到了很多
00164610h: 67 FF D9 FF D8 FF E0 00 10 4A 46 49 46 00 01 01 ; g鮂F???.JFIF...
00164620h: 01 00 76 00 76 00 00 FF DB 00 43 00 05 03 04 04 ; ..v.v..鮂F?C.....
这也就证明了资源没有被加密过,呵呵,这下可省劲多了。
下面接着找文件索引信息。索引信息不是放在文件头就是放在文件尾,让我们看看Talismania.saf文件尾部:
00affd50h: 72 77 61 72 6E 69 6E 67 2E 6F 67 67 00 39 B4 AD ; rwarning.ogg.9喘
00affd60h: 00 B9 00 00 00 24 F5 F0 7B A2 99 66 27 96 A4 82 ; .?..$躔{?f\'枻?
00affd70h: 71 F1 95 5A E3 0F 00 72 65 73 2F 5F 62 6C 61 6E ; q駮Z?.res/_blan
00affd80h: 6B 2E 70 6E 67 00 F2 B4 AD 00 06 04 00 00 C6 7C ; k.png.虼?....苵
00affd90h: 68 D2 24 A4 0E 20 5F DE E7 04 6C E5 39 5F 12 00 ; h?? _掮.l?_..
00affda0h: 72 65 73 2F 5F 66 61 6C 6C 62 61 63 6B 2E 70 6E ; res/_fallback.pn
00affdb0h: 67 00 ; g.
没啥特别的!仔细数数res/_fallback.png.恰好是18个字符吧,其前面两个字节00 12由十六进制转成十进制恰好是18,也就是说前面这两个字节是文件名长度。但是如何获得文件索引的起始位置呢?不在尾部就在头部!再看看文件头发现FFAS后紧跟的8个字节有问题,其中一个为01 00 00 00,另一个为F8 B8 AD 00。第二个好象是一个偏移量,其所指的位置为00ADB8F8h,转到00ADB8F8h看看:
00adb8f0h: 49 45 4E 44 AE 42 60 82 01 00 00 00 5A 51 E5 79 ; IEND瓸`?...ZQ鍄
00adb900h: F6 CE C6 20 68 C8 13 A9 05 33 24 F0 E1 09 00 00 ; 鑫?h??3$疳...
00adb910h: 0C 00 00 00 FF 1B 00 00 CE 88 2D FC DF 5A 9D 53 ; ....鮂F...螆-?Z漇
00adb920h: F3 61 6D F9 C5 EF 0F FC 1A 00 63 6F 6E 66 69 67 ; 骯m???.config
00adb930h: 2F 62 6F 61 72 64 73 2F 61 62 6F 61 72 64 73 2E ; /boards/aboards.
00adb940h: 78 6D 6C 00 0B 1C 00 00 55 55 00 00 9E 1E B1 87 ; xml.....UU..?眹
00adb950h: 6* *4 31 11 54 77 8* 84 *D 1C 52 D4 1C 00 63 6F ; m?.Tw弰?R?.co
00adb960h: 6E 66 69 67 2F 62 6F 61 72 64 73 2F 61 62 75 69 ; nfig/boards/abui
00adb970h: 6C 64 68 75 74 2E 78 6D 6C 00 60 71 00 00 DF 1B ; ldhut.xml.`q..?
00adb980h: 00 00 82 BD B7 BE E4 46 EA C3 CF 6E 4C 4A 9B 4E ; ..偨肪銯昝蟦LJ汵
00adb990h: 6B A9 1A 00 63 6F 6E 66 69 67 2F 62 6F 61 72 64 ; k?.config/board
00adb9a0h: 73 2F 62 62 6F 61 72 64 73 2E 78 6D 6C 00 3F 8D ; s/bboards.xml.?
下面与我们在文件尾看到的差不多,这里应该就是文件索引开始的位置了,接着我们就要分析文件索引信息。
还是从文件尾动手吧,发现res/_fallback.png距离其上一个文件res/_blank.png之间有28个字节,最后两个已被认为是文件名长度,还剩26==4*6字节,也就是6个4字节,我们需要一个偏移量(4byte),一个文件大小(4byte),共8字节,统计一下便发现,26个字节中前面8个就是我们所需要的。
下面还缺文件个数,文件个数肯定在索引信息开始的地方,看看上边十六进制的那段,又发现眼熟的01 00 00 00 了吧,这个我们在文件头见过,估计是个标记,其后的E1 09 00 00就应该是文件个数了。现在就可以给出SAF的文件格式,C语言描述:
SAF file format:
{
DWORD nSign // equal \'SAFF\'
DWORD nUnknow // always equal 0x00000001
DWORD nOffset // the start postion of files info from the SAF begin