Microsoft Symbol Server / Алгоритм хеширования локального кэша

Я пытаюсь выяснить, какой алгоритм хеширования используется для каталога 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.pdb6.66F660FFXXXXXXXXXF или здесь -тиардовых библиотек файловой системы на базе файловой системы 660-й резервной копии 660-й версии для печати

Кажется, существует какое-то соответствие между файлом и его отладочной базой данных. Кроме этого, я не могу понять, как генерируются имена этих (предположительно) шестнадцатеричных строковых папок.

Некоторые из них 9 цифр, некоторые 13 цифр, а другие 33 цифры. Похоже, что реальный живой файл (который по какой-то причине хранится в кеше символов) имеет 13-значный хэш, а его (почти аналогичная) база данных отладки получает 9-значный хэш. Некоторые отладочные базы данных получают хэш из 13 цифр; не могу понять, что делает их особенными, хотя у них нет соответствующего live-файла.

Я пытался хэшировать файлы с помощью всех известных мне хэш-алгоритмов (39 из них), и ни один из них не соответствовал (прямой, обратный, альтернативный endian'd и т. Д.)

Есть идеи?

Обновление, я думаю, я наконец нашел его. Из формата хранения символов:

SymStore использует саму файловую систему в качестве базы данных. Он создает большое дерево каталогов с именами каталогов, основанными на таких вещах, как метки времени файла символов, подписи, возраст и другие данные.

Отредактируйте Dang, к сожалению, он только упоминает, что имя каталога получено из различных аспектов (я думаю, не совсем хеш), но не говорит, как именно. Поиски продолжаются…:-(

4 ответа

Решение

На этой странице есть информация о расчете идентификаторов для файлов символов, а также исполняемых файлов /DLL.

По сути, для исполняемых файлов и библиотек DLL вы извлекаете метку времени и размер файла из заголовка PE, как указано на странице, на которую ссылается Грифф. Однако для файлов PDB вам понадобится команда DBH из средств отладки Windows. Просто загрузите файл PDB в DBH и используйте команду INFO, чтобы получить PdbSig/PdbSig70 и PdbAge. Бам! Вот и все.


Я просто создал соответствующие папки для файлов PDB, которые по какой-то причине были в моей папке SYSTEM32, и, наконец, переместил их в локальное хранилище символов.

Поиск файлов 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 Брюса Доусона.

Попробуйте посмотреть на этой странице: функция обратного вызова Symbol Server

Имя каталога EXE/DLL создается путем объединения шестнадцатеричной строки временной метки "файл изменен" и "SizeOfImage" из IMAGE_OPTIONAL_HEADER

Вы можете найти ответ,

СИМВОЛ РАСШИРЕНИЯ ОБОЛОЧКИ РАСШИРЕНИЯ; http://www.vitoplantamura.com/index.aspx?page=symretriever

DebugDir.cpp; http://www.debuginfo.com/examples/src/DebugDir.cpp

PDB File Internals; http://www.informit.com/articles/article.aspx?p=22685

Другие вопросы по тегам