13

我试图弄清楚 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 个)对文件进行散列,并且没有以任何方式匹配(直接向上、反向、交替 endian'd 等)

有任何想法吗?

更新 我想我终于找到了。从符号存储格式

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

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

4

5 回答 5

9

此页面包含有关计算符号文件以及可执行文件/DLL 的 ID 的信息。

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


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

于 2009-09-14T02:57:54.813 回答
2

试试看这个页面:符号服务器回调函数

于 2009-09-30T18:21:07.033 回答
2

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

于 2017-09-16T14:52:45.737 回答
2

查找 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


资料来源:布鲁斯·道森 (Bruce Dawson)的微软方式的象征。

于 2020-05-28T12:14:41.670 回答
1

你可以找到答案,

符号检索器外壳扩展;http://www.vitoplantamura.com/index.aspx?page=symretriever

调试目录.cpp;http://www.debuginfo.com/examples/src/DebugDir.cpp

PDB 文件内部结构;http://www.informit.com/articles/article.aspx?p=22685

于 2015-05-13T13:27:50.430 回答