RDB文件格式分析

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文件,上一次在仙剑的某个版本中看到过类似的结构,只不过多了对文件数据的加密。

发表评论