原文链接:http://www.titilima.cn/?action=show&id=281
Windows 系统文件的调试符号保存在 Microsoft Symbol Server 上面,每个文件的链接格式为:
http://msdl.microsoft.com/download/symbols/PDB 文件名/PE 特征签名/PDB 文件名.pd_
其中,PE 映像签名和 PDB 文件名都保存在 PE 文件的 IMAGE_DIRECTORY_ENTRY_DEBUG 数据目录之中,遵循如下的数据结构定义:
-
- typedef struct _tagCV_RSDS {
- DWORD dwHeader;
- GUID Signature;
- DWORD dwAge;
- CHAR pdb[1];
- } CV_RSDS, *PCV_RSDS;
这个结构各个域的含义如下:
- dwHeader 的值应为 0x53445352 ,即字符串 "RSDS" 。
- Signature 为 PE 的映像签名。
- dwAge 域和 Signature 组合使用,成为 PE 的特征签名。
- pdb 为该 PE 对应的 PDB 文件名。
以一个 kernel32.dll 为例(版本 5.1.2600.2945),它的 CV_RSDS 结构如下图:
这样一来,便可得到它的特征签名为 "BCE8785C57B44245A669896B6A19B9542" ,完整的下载链接为:
需要指出的是,下载这个文件的时候,需要将 HTTP 请求的 agent 参数设置为微软所允许的字符串,否则就有可能(并不是必然,原因不明)被 Microsoft Symbol Server 拒绝。因此,推荐使用 srmsrv.dll 中的 agent ,如 "Microsoft-Symbol-Server/6.9.0003.113" 。
在下载完成后,就可以使用 Windows 自带的 expand.exe 来解压缩 kernel32.pd_ 了。