一、什么是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