天天看點

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資料組織結構

PDB符号檔案

2.2 PDB頭部結構

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符号檔案

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,該位址對應資訊如下:

PDB符号檔案

從上圖可以看出該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符号檔案

PDB檔案真實性資訊

繼續閱讀