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

PDB符号文件的更多相关文章

  1. PDB符号文件浏览工具介绍

    一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...

  2. PDB符号文件信息

    一.前言 这个方法是通过网上的一些方式自己学习枚举PDB文件信息. 二.代码实现 首先枚举驱动文件,这里用psapi库 #include "psapi.h" #pragma com ...

  3. 下载微软pdb符号文件

    使用symchk.exe  逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...

  4. .pdb 文件的内部结构

    粗略察看一 下.pdb 文件,会发现在其起始位置存放的是这样一个字符串“Microsoft C/C++ program database 2.00”.可以看出 PDB 是 Program Databa ...

  5. 从零开始山寨Caffe·零:必先利其器

    工作环境 巧妇有了米炊 众所周知,Caffe是在Linux下写的,所以长久以来,大家都认为跑Caffe,先装Linux. niuzhiheng大神发起了caffe-windows项目(解决了一些编译. ...

  6. 用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)

    原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为 ...

  7. (转).NET Memory Profiler 使用简介

    1         简介 .Net Memory Profiler(以下简称Profiler):专门针对于.NET程序,功能最全的内存分析工具,最大的特点是具有内存动态分析(Automatic Mem ...

  8. 派遣例程与IRP结构

    提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I ...

  9. OD: Kernel Vulnerabilities Analyze

    内核漏洞大多出没于 ring3 到 ring0 的交互中.从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞.例如:驱动程序中 IoControl 的处理函数,SS ...

随机推荐

  1. 【LEETCODE】52、数组分类,简单级别,题目:717,661,746,628,643,849

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  2. 【宁夏区域赛】G.Pot!

    题意: 给定两个操作: MULTIPLY L R x  区间里都乘以一个数x MAX L R : 计算区间内一个2,3,5,7个数最大值. #include<bits/stdc++.h> ...

  3. [UOJ #140]【UER #4】被粉碎的数字

    题目大意:定义$f(x)$为数字$x$每一位数字的和,求$\sum\limits_{i=1}^R[f(x)=f(kx)]$.$R\leqslant10^{18},k\leqslant10^3$ 题解: ...

  4. [转]mongodb authentication 设置权限之后,新建个管理账户和一般数据库用户,在win 7 64bit 环境下测试使用实例

    如果之前安装mongodb时没有使用 --auth,那么必须要卸载MongoDB服务,进行重新安装,设置账号权限才生效! 主要是解决在测试使用mongo db 时候,总是出现的MongoAuthent ...

  5. asp.net core EF code first

    以连接mysql数据库为例 一 安装组件 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Relational Microsof ...

  6. 无法将文件“E:\NetWorkPace\Permission\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.xml”复制到“bin\EntityFramework.xml”。对路径“bin\EntityFramework.xml”的访问被拒绝。

    无法将文件“E:\NetWorkPace\Permission\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.xml”复制到“bin ...

  7. 资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统

    资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是资源隔离 资源隔离是指为不同任务提供可独立使用的计算资源以 ...

  8. SHELL脚本编程的条件测试

    SHELL脚本编程的条件测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.条件测试概述 判断某需求是否满足,需要由测试机制来实现 专用的测试表达式需要由测试命令辅助完成测试过 ...

  9. Java 十大排序算法

    目录: 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序(Insertion Sort) 4.希尔排序(Shell Sort) 5.归并排序(Merg ...

  10. Andrew Ng机器学习 四:Neural Networks Learning

    背景:跟上一讲一样,识别手写数字,给一组数据集ex4data1.mat,,每个样例都为灰度化为20*20像素,也就是每个样例的维度为400,加载这组数据后,我们会有5000*400的矩阵X(5000个 ...