【问题标题】:Microsoft Symbol Server / Local Cache Hash AlgorithmMicrosoft 符号服务器/本地缓存哈希算法
【发布时间】:2026-02-01 11:45:01
【问题描述】:

我正在尝试找出 Microsoft 符号本地缓存目录使用的散列算法。

例如,本地缓存可以是这样的

L:\符号 \browseui.dll \44FBC679fe000 浏览器.dll \browseui.pdb \44F402F62 浏览ui.pdb \explorer.exe \3EBF1F14f7000 资源管理器.exe \explorer.pdb \3EBF1F141 资源管理器.pdb \msvcr71.pdb \60D915C6AB6A4F3586E9096E2F8856482 msvcr71.pdb

文件与其调试数据库之间似乎存在某种对应关系。除此之外,我无法弄清楚这些(大概)十六进制字符串文件夹的名称是如何生成的。

其中一些是 9 位,一些是 13 位,还有一些是 33 位。它看起来像一个实际的活动文件(由于某种原因存储在符号缓存中)具有 13 位哈希,而其(几乎相似)调试数据库具有 9 位哈希。一些调试数据库得到一个 13 位的哈希值;无法弄清楚这些文件的特别之处,尽管它们没有相应的实时文件。

我已经尝试使用我所知道的各种哈希算法(其中 39 个)对文件进行哈希处理,但没有一个匹配(直接向上、反向、交替字节序等)

有什么想法吗?

更新 我想我终于找到了。来自Symbol Storage Format

SymStore 使用文件系统本身作为数据库。它会创建一个大型目录树,目录名称基于符号文件时间戳、签名、年龄和其他数据等内容。

编辑 Dang,不幸的是它只提到目录名称是从各个方面派生的(我猜不是一个哈希),但没有确切说明如何。搜索继续…… :-(

【问题讨论】:

    标签: hash symbol-server symstore


    【解决方案1】:

    This page 提供有关计算符号文件以及可执行文件/DLL 的 ID 的信息。

    基本上,对于可执行文件和 DLL,您可以从 Griff 链接到的页面中列出的 PE 标头中提取时间戳和文件大小。但是,对于 PDB 文件,您将需要 Windows 调试工具中的 DBH 命令。只需将 PDB 文件加载到 DBH 中并使用 INFO 命令获取 PdbSig/PdbSig70PdbAge。砰!就是这样。


    由于某种原因,我刚刚为我的 SYSTEM32 文件夹中的 PDB 文件创建了适当的文件夹,最后将它们移动到本地符号存储。

    【讨论】:

    【解决方案2】:

    试试看这个页面:Symbol Server Callback Function

    【讨论】:

    • 这当然有帮助。这些 ID 似乎确实是字符串的来源,但我仍然需要弄清楚如何计算这些 ID。
    【解决方案3】:

    EXE/DLL 目录名是通过连接“文件修改”时间戳的十六进制字符串和来自IMAGE_OPTIONAL_HEADER的“SizeOfImage”创建的

    【讨论】:

      【解决方案4】:

      查找 PE 文件

      符号服务器共享中PE文件的路径格式为:

      "%s\%s\%08X%x\%s" % (serverName, peName, timeStamp, imageSize, peName)

      例子:

      https://msdl.microsoft.com/download/symbols/ntdll.dll/B29ECF521f0000/ntdll.dll

      查找 PDB 文件

      符号服务器共享中 PDB 文件的路径格式为:

      "%s\%s\%s%x\%s" % (serverPath, pdbName, guid, age, pdbName)

      例子:

      https://msdl.microsoft.com/download/symbols/ntdll.pdb/4BC147AE72E8D05022366D6570A8E3461/ntdll.pdb


      来源:Symbols the Microsoft Way Bruce Dawson。

      【讨论】:

        【解决方案5】:

        【讨论】: