是否可以在不安装任何软件的情况下下载 Microsoft Windows 二进制文件的程序数据库 (PDB) 文件?

逆向工程 视窗 调试符号 数据库
2021-07-06 18:34:01

我想在用户没有管理员权限,也没有任何调试器可用的机器上下载.pdbWindows 二进制文件(例如,notpad.exe)。我想知道是否可以使用 Windows 内置功能(例如 cmd/batch、Powershell 或 WSH VBScript 或 JScript)下载 PDB 文件?

我认为第一步是找到二进制文件的全局唯一标识符(GUID),然后可能有一些 URL 查询可以用来下载构建的特定程序数据库文件。

PS1。显然,新技术符号调试器 (NTSD) 曾经内置于 Windows 操作系统中。我不知道操作系统默认包含任何调试器。

PS2。这个评论中,我被指向正确的 URI来下载确切的 PDB 文件,给定二进制文件的 GUID。现在的问题是要知道如何从二进制文件本身中提取 GUID。

PS3。我想知道是否所有二进制文件的 CLSID/GUID/ProgID 都存储在注册表中,并且可以手动将它们映射到特定的.dll/.exe文件。

1个回答

您可以使用不需要任何安装的 PDB 下载器https://docs.microsoft.com/en-us/archive/blogs/webtopics/pdb-downloader或者您可以使用下面的源代码来查看如何使用 PowerShell 或其他一些方法重新创建。

https://github.com/rajkumar-rangaraj/PDB-Downloader

您也可以从安装了 WinDBg 的机器上复制 WinDBg 文件,它无需管理员权限即可运行。

您也可以从 Windows 调试工具中获取 SymChk.exe 来下载符号,或者如果机器没有互联网访问权限,则生成一个清单以从另一台机器上下载https://docs.microsoft.com/en-us/windows-hardware/驱动程序/调试器/使用-清单文件与 symchk

获取Debug GUID参考https://github.com/rajkumar-rangaraj/PDB-Downloader/blob/master/SymbolFetch/PeHeaderReader.cs 你需要从PE Header的debug目录中解压,参考struct IMAGE_DEBUG_DIRECTORY_RAW 你也可以看看对于以签名 RSDS (0x53445352) 开头的结构,后跟一个 GUID(16 个字节)、一个计数器(4 个字节),然后是 PDB 路径名。

CLSID/ProgID 存储在HKCR\CLSID 下的COM 类对象的注册表中,它映射到 HKLM\Software\Classes 和 HKCU\Software\Classes(在注册表的 32 位和 64 位视图中)但这是用于初始化的 GUID COM 对象,与用于 PDB 文件的 GUID 无关。