一、什麼是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 | DS | 簽名 | |
+1Eh | null-terminator | 終結符 | |
+20h | dword | 00000400h(1024) | page的大小(機關:位元組) |
+24h | 00000002h(2) | 未知 | |
+28h | 00000293h(659) | 整個檔案有占用多少個page | |
+2ch | 00000AE0h(2784) | stream directory占用大小(機關:位元組) | |
+30h | 00000000h(0) | ||
+34h | 00000291h(657) | stream directory指針的頁位址(機關:頁) |
2.3 PDB Stream Directory Pointers資訊結構
根據上述資訊可以計算出stream directory指針位址為A4400h,對應資訊如下:
PDB Stream Directory Pointers資訊
從圖中可以看出存放了三個stream的頁位址指針,分别為028Eh, 028Fh, 0290h,之是以是三個是因為stream directory占用了0AE0(2784)位元組,需要三個page才能存放。
注意:這裡的指針并不需要是連續的,隻是這裡剛好是連續的而已。
2.4 PDB Stream Directory資訊結構
Stream Directory的資料結構如下所示:
注釋 | ||
---|---|---|
stream的個數 | ||
+4h | stream大小(機關:位元組),忽略0和-1(FFFFFFFF) | |
+?h | 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,對應位址的資訊如下:
PDB檔案真實性資訊