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,對應信息如下:


 
PDB Stream Directory Pointers信息

從圖中可以看出存放了三個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,對應地址的信息如下:

PDB文件真實性信息

紅框中記錄的就是前面通過PEView工具查看CODEVIEW中的GUID,在它前面的dword就是對應的age字段。

參考

https://www.jianshu.com/p/7ad20a047bb4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM