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