PDB符号文件
一、什么是PDB文件
PDB(Program DataBase),全称为“程序数据库”文件。存储程序的所有调试信息数据。在编译连接时,如果选择了/debug选项或/debug:full选项,则最新的Microsoft链接器在链接时创建程序数据库(PDB)文件。pdb文件包含有关可执行文件创建的信息,还包含最新codeview格式的符号信息。可执行文件包含本地计算机上PDB文件的路径和文件名以及标识代码,以便找到正确的PDB文件。
它包含用于引入的调试信息存储在 Visual c + + 版本 1.0 中新的格式。 格式更改为最重要的动机是允许的第一次在 Visual c + + 2.0 版中引入了更改的程序的调试版本的增量链接。现在的格式版本是7.0版本。将来可能还会变化,比如在将来.PDB 文件也将保留其他项目状态信息。
二、PDB文件存储格式
pdb文件格式与磁盘文件系统使用的格式类似。磁盘文件系统将被分为若干块数据,这些数据称为固定大小的“扇区”。文件中的数据包含在那些在文件写入磁盘时标识为备用的扇区中,但它们不一定是连续的。文件目录跟踪数据在磁盘上的位置。在pdb文件中,将数据块称为“pages”、将文件中的数据称为“stream”以及将文件目录称为“stream directory”可能更为合适。
PDB文件格式并未公开,但是Microsoft提供了API来读取PDB中的数据,可以参考CCI开源项目。虽然官方未公开格式,但是The RSDS pdb format对PDB的文件格式做了较详细的介绍。PDB的文件格式类似于磁盘的文件系统,每个磁盘会被划分成很多个大小一样的扇区,文件中的数据就存放在不同的扇区中,而且无需保证这些扇区在磁盘上是连续的。PDB文件用page进行划分,类似于扇区,stream就类似于文件,stream directory类似于文件目录。
下面我们就用winhex来看下PDB中到底存放了那些信息吧。
2.1 PDB数据组织结构
2.2 PDB头部结构
上图中PDB头部信息解析如下:
偏移地址 | 数据类型 | 数据 | 备注 |
---|---|---|---|
+0h | byte string | Microsoft C/C++ MSF 7.00 | PDB版本信息,不同版本字符串长度不一样 |
+1Ah | byte | EOF | 标志PDB版本信息字符串结束 |
+1Bh | byte string | DS | 签名 |
+1Eh | byte | null-terminator | 终结符 |
+20h | dword | 00000400h(1024) | page的大小(单位:字节) |
+24h | dword | 00000002h(2) | 未知 |
+28h | dword | 00000293h(659) | 整个文件有占用多少个page |
+2ch | dword | 00000AE0h(2784) | stream directory占用大小(单位:字节) |
+30h | dword | 00000000h(0) | 未知 |
+34h | dword | 00000291h(657) | stream directory指针的页地址(单位:页) |
2.3 PDB Stream Directory Pointers信息结构
根据上述信息可以计算出stream directory指针地址为A4400h,对应信息如下:
从图中可以看出存放了三个stream的页地址指针,分别为028Eh, 028Fh, 0290h,之所以是三个是因为stream directory占用了0AE0(2784)字节,需要三个page才能存放。
注意:这里的指针并不需要是连续的,只是这里刚好是连续的而已。
2.4 PDB Stream Directory信息结构
Stream Directory的数据结构如下所示:
偏移地址 | 数据类型 | 注释 |
---|---|---|
+0h | dword | stream的个数 |
+4h | dword | stream大小(单位:字节),忽略0和-1(FFFFFFFF) |
+?h | dword | stream的指针数组 |
以028Eh为例,乘以400h之后得到A3800h,该地址对应信息如下:
从上图可以看出该stream directory中存在002Fh(47)个stream,而接下来的47个dword分别表示每个stream的大小。因此page指针将从A38C0h处开始。
前3个stream信息解析如下:
Streams | size | page pointers |
---|---|---|
Stream1 | 0000001Ch | 00000004h |
Stream2 | 00000072h | 0000028Ch |
Stream3 | 00050FD0h | 0000028Dh,00000134h,... |
2.5 PDB Stream信息结构
不同的stream包含不同信息,这里主要介绍下存放PDB文件真实性相关的信息。一般Stream2包含了这些信息。通过计算可以得到Stream2在文件中的地址为A3000h,对应地址的信息如下:
红框中记录的就是前面通过PEView工具查看CODEVIEW中的GUID,在它前面的dword就是对应的age字段。
参考
https://www.jianshu.com/p/7ad20a047bb4