代码之家  ›  专栏  ›  技术社区  ›  Synetech

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

  •  9
  • Synetech  · 技术社区  · 15 年前

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

    例如,本地缓存可以如下所示

      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种)对文件进行哈希处理,但没有以任何方式匹配(直接向上、反向、交替的endian_墖墖D等)。

    有什么想法吗?

    更新 我想我终于找到了。从 Symbol Storage Format :

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

    编辑 dang,不幸的是,它只提到了目录名是从各个方面派生的(我猜这不是一个散列),但没有具体说明如何派生。搜索继续进行-(

    4 回复  |  直到 7 年前
        1
  •  6
  •   Synetech    15 年前

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

    基本上,对于可执行文件和DLL,可以从griff链接到的页面中列出的PE头中提取时间戳和文件大小。但是,对于PDB文件,您需要Windows调试工具中的dbh命令。只需将pdb文件加载到dbh中,然后使用info命令获取 PDBSIG/PDBSIG70 PDBEY . 巴姆!那是真的。


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

        2
  •  2
  •   Chris Kline    10 年前

    尝试查看此页面: Symbol Server Callback Function

        3
  •  1
  •   r16    7 年前

    exe/dll目录名是通过连接“file modified”时间戳的十六进制字符串和“sizeofimage”创建的 IMAGE_OPTIONAL_HEADER