RDB文件常见于腾讯的客户端软件,大多数与UI资源相关,包括了各种图片、XML等。
Layout
[File Header][File Description Table][File Data]
文件头包含了文件基本结构的信息,File Description Table描述了文件名、大小和偏移,最后就是实际文件的数据,没有加密或者压缩。
File Header
File Header由四个域组成,C语言描述如下:
typedef struct _RDB_FILE_HEADER { char Magic[0x10]; unsigned long NumberOfItems; unsigned long long SizeOfHeader; unsigned long long SizeOfFDT; } RDB_FILE_HEADER, *PRDB_FILE_HEADER;
各个字段的描述如下:
Magic 偏移0x00, 大小0x10。文件头部标识,为固定字符串531E98204F8542F0。 NumberOfItems 偏移0x10,大小0x04。描述了当前RDB中包含的文件总数。 SizeOfHeader 偏移0x14,大小0x08。文件头的大小,也为File Description Table的偏移,目前的大小都是0x24。 SizeOfFDT 偏移0x1C,大小0x08。File Description Table的大小。
File Description Table
FDT描述了当前RDB中所有文件的信息,其中的每一项是一个变长的结构,里面的三个字段分别是FileName、OffsetToData以及SizeOfData。
FileName Unicode形式的文件名,偏移0x00,字符串没有描述长度的地方,所以使用两个0x00作为结尾。 OffsetToData FileName之后的8个字节,描述了实际数据在FileData中的偏移。 SizeOfData OffsetToData之后的8个字节,描述了实际数据的大小。
File Data
紧挨着的文件数据。
[file_data1][file_data2]...[file_dataN]
实例分析
以下是一个文件头的Dump:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 35 33 31 45 39 38 32 30 34 46 38 35 34 32 46 30 531E98204F8542F0 00000010 C2 07 00 00 24 00 00 00 00 00 00 00 16 CC 01 00 Â...$........Ì.. 00000020 00 00 00 00 ....
可知,FDT位于0x24,FileData位于0x24 + 0x01CC16 = 0x1CC3A。
查看FDT的前两个Items:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000020 42 00 74 00 6E 00 52 00 65 00 70 00 B.t.n.R.e.p. 00000030 6F 00 72 00 74 00 5C 00 47 00 75 00 69 00 64 00 o.r.t..G.u.i.d. 00000040 32 00 54 00 74 00 2E 00 64 00 61 00 74 00 00 00 2.T.t...d.a.t... 00000050 00 00 00 00 00 00 00 00 85 F1 01 00 00 00 00 00 ........…ñ...... 00000060 46 00 61 00 63 00 65 00 5C 00 30 00 2E 00 67 00 F.a.c.e..0...g. 00000070 69 00 66 00 00 00 85 F1 01 00 00 00 00 00 14 10 i.f...…ñ........ 00000080 00 00 00 00 00 00 46 00 61 00 63 00 65 00 5C 00 ......F.a.c.e.. 00000090 31 00 2E 00 67 00 69 00 66 00 00 00 99 01 02 00 1...g.i.f...™... 000000A0 00 00 00 00 2E 06 00 00 00 00 00 00 ............
得到的两个文件信息如下:
File name BtnReportGuid2Tt.dat Offset 0x00 Size 0x1F185 File name Face.gif Offset 0x1F185 Size 0x1014
查看GIF的信息,偏移为0x1CC3A + 0x1F185 = 0x3BDBF,对应的数据如下:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0003BDB0 47 G 0003BDC0 49 46 38 39 61 18 00 18 00 F7 FF 00 B6 82 47 F4 IF89a....÷ÿ.¶‚Gô 0003BDD0 E7 DA FF D2 2D 9C 48 09 FE B3 0E F4 C8 5A D9 98 çÚÿÒ-œH.þ³.ôÈZÙ˜ 0003BDE0 21 DE D9 D5 E8 C7 92 E4 A9 3C DA A4 43 FF C9 25 !ÞÙÕèÇ’ä©<Ú¤CÿÉ% 0003BDF0 EC D3 B8 E4 97 0A D7 D1 CC E8 E5 E2 C7 94 50 D4 ìÓ¸ä—.×ÑÌèåâÇ”PÔ
End
这种文件结构有点类似于游戏使用的pak文件,上一次在仙剑的某个版本中看到过类似的结构,只不过多了对文件数据的加密。