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,对应信息如下:

从图中可以看出存放了三个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
PDB符号文件的更多相关文章
- PDB符号文件浏览工具介绍
一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...
- PDB符号文件信息
一.前言 这个方法是通过网上的一些方式自己学习枚举PDB文件信息. 二.代码实现 首先枚举驱动文件,这里用psapi库 #include "psapi.h" #pragma com ...
- 下载微软pdb符号文件
使用symchk.exe 逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...
- .pdb 文件的内部结构
粗略察看一 下.pdb 文件,会发现在其起始位置存放的是这样一个字符串“Microsoft C/C++ program database 2.00”.可以看出 PDB 是 Program Databa ...
- 从零开始山寨Caffe·零:必先利其器
工作环境 巧妇有了米炊 众所周知,Caffe是在Linux下写的,所以长久以来,大家都认为跑Caffe,先装Linux. niuzhiheng大神发起了caffe-windows项目(解决了一些编译. ...
- 用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)
原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为 ...
- (转).NET Memory Profiler 使用简介
1 简介 .Net Memory Profiler(以下简称Profiler):专门针对于.NET程序,功能最全的内存分析工具,最大的特点是具有内存动态分析(Automatic Mem ...
- 派遣例程与IRP结构
提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I ...
- OD: Kernel Vulnerabilities Analyze
内核漏洞大多出没于 ring3 到 ring0 的交互中.从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞.例如:驱动程序中 IoControl 的处理函数,SS ...
随机推荐
- Go语言( 流程控制)
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”. Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码.降低重复代码而生的结 ...
- 【LEETCODE】44、509. Fibonacci Number
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- twbsPagination.js分页插件
分页插件在使用时注意,如果页面中存在其他异步加载的数据,在运行分页方法第一次后,页面上的分页样式与分页中的data数据就是第一次的数据,如果异步加载重新在页面上录入数据,并希望分页继续在新的数据上实现 ...
- mabatis缓存
一级缓存 public static SqlSession getSqlSession() { String resource = "mybatis-config.xml"; In ...
- ADO,net 实体数据模型增、删、改,浅谈
第一步:建立ADO.net数据模型,一步步操作就行 第二步:画个简单的测试界面 第三步铺代码 using DevComponents.DotNetBar.SuperGrid; using DevCom ...
- js 简单的滑动2
js 简单的滑动教程(二) 作者:Lellansin 转载请标明出处,谢谢 现在我们让滑动多一个功能,三张图.点击左边向左滑动,点右向右滑,碰到临界值的时候可以循环滑动 原理也很将简单,用posi ...
- JAVA日期格式化yyyyMMddHHmmssSSS
String nowtime = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
- php操作表格(写)
一,转载:http://www.thinkphp.cn/extend/832.html 二,转载:http://m.blog.csdn.net/article/details?id=7827038
- 浅谈Vue.js2.0某些概念
Vue.js2.0是一套构建用户界面的渐进式框架,目标是实现数据驱动和组件系统. A 渐进式框架 Vue.js是一个提供MVVM数据双向绑定的库,只专注于UI层面,这是它的核心.它本身没有解决SP ...
- SQL SERVER-Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.SmoExtended)
Q:先在一个实例中恢复一个数据A,然后又想在恢复一次,取别名为A2,这是报异常SQL SERVER-Exclusive access could not be obtained because the ...