微软符号服务器 / 本地缓存哈希算法

14

我正在尝试弄清楚Microsoft Symbol Local Cache目录使用的哈希算法。

例如,本地缓存可以是以下内容之一

  L:\Symbols
      \browseui.dll
        \44FBC679fe000
          browsue.dll
      \browseui.pdb
        \44F402F62
          browseui.pdb
      \explorer.exe
        \3EBF1F14f7000
          explorer.exe
      \explorer.pdb
        \3EBF1F141
          explorer.pdb
      \msvcr71.pdb
        \60D915C6AB6A4F3586E9096E2F8856482
          msvcr71.pdb

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

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

我已尝试使用我所知道的所有哈希算法(39个)对文件进行哈希,并且没有任何匹配项(直接,反转,备用端序等)

有什么想法吗?

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

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

编辑 可惜的是,它只提到目录名称是由各种方面派生而来(我猜不完全是哈希),但并没有说具体如何。搜索继续... :-(

5个回答

9

这个页面提供了有关计算符号文件、可执行文件和动态链接库ID的信息。

基本上,对于可执行文件和动态链接库,您可以从PE头中提取时间戳和文件大小,如Griff链接的页面所列出的那样。然而,对于PDB文件,您需要使用Windows调试工具中的DBH命令。只需将PDB文件加载到DBH中,然后使用INFO命令获取PdbSig/PdbSig70PdbAge即可。就是这样。


我刚刚为我在SYSTEM32文件夹中拥有的PDB文件创建了适当的文件夹,并最终将它们移动到本地符号存储中。


那个页面不再可用了。你没有备份吗? - nothrow
3
即使是Wayback Machine也无法找到那个页面了。但从URL来看,我猜测它是这个帖子的副本:"Resyncing PDB and EXE",该帖子还提到了帖子"Minidumps and source indexing" - Chris Kline

2

请尝试查看此页面:符号服务器回调函数


该页面介绍了符号服务器回调函数在IT技术中的应用。建议您花些时间仔细阅读并理解其中的内容。

那确实有所帮助。这些ID似乎是由字符串生成的,但我仍然需要弄清楚如何计算这些ID。 - Synetech

2

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


2

查找PE文件

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

"%s\%s\%08X%x\%s" % (服务器名称, PE文件名, 时间戳, 文件大小, PE文件名)

例如:

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

查找PDB文件

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

"%s\%s\%s%x\%s" % (服务器路径, PDB文件名, GUID, 年龄, PDB文件名)

例如:

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


来源:Symbols the Microsoft Way by Bruce Dawson。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接