zoukankan      html  css  js  c++  java
  • 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信息解析如下:

    Streamssizepage 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

  • 相关阅读:
    分数拆分
    thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
    iOS_12_tableViewCell的删除更新_红楼梦
    关于0基础磁盘管理(gpt UEFI...)最好的一篇文章(来自gentoo linux)
    HDU 3564 Another LIS splay(水
    jsp表达式
    XML(四)dom4j解析XML
    Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源代码)
    Oracle企业管理框架
    em grid control网格控制
  • 原文地址:https://www.cnblogs.com/yilang/p/11203115.html
Copyright © 2011-2022 走看看