Как symstore рассчитывает хэш-значение каталога
Я ищу алгоритм хеширования, который symstore использует для создания имени каталога. Я нашел эту ссылку Microsoft Symbol Server / Алгоритм хэширования локального кэша, который описывает элементы данных, которые используются для генерации хеша, но не содержит подробностей о том, как вычисляется значение хеша. Мне интересно посмотреть, как symstore генерирует каталог хешей, и если у кого-нибудь есть пример кода, который он может показать, это было бы здорово!
2 ответа
symstore.exe вычисляет имена каталогов хэша следующим образом:
Для файлов PDB используются GUID + Age. Вот пример Python:
pdb = pdbparse.parse("some.pdb")
pdb.STREAM_PDB.load()
guid = pdb.STREAM_PDB.GUID
guid_str = "%.8X%.4X%.4X%s" % (guid.Data1, guid.Data2, guid.Data3,
guid.Data4.encode("hex").upper())
symstore_hash = "%s%s" % (guid_str, pdb.STREAM_PDB.Age)
Для файлов PE (exe/dll) используются TimeDateStamp (из IMAGE_FILE_HEADER) и SizeOfImage (из IMAGE_OPTIONAL_HEADER). Вот пример Python:
pe = pefile.PE("some.exe")
symstore_hash = "%X%X" % (pe.FILE_HEADER.TimeDateStamp,
pe.OPTIONAL_HEADER.SizeOfImage)
Вот пример скрипта Python, который печатает хеш-значения symstore для файлов PDB и PE:
Не уверен, что вы уже рассмотрели это, но это патент США, описывающий процесс хранения символов. Он довольно плотный, как вы можете себе представить, но он довольно подробно описывает, как каталоги хранилищ символов расширяются и удаляются (в частности, в разделах 6, 7, 8). Надеюсь, это поможет или направит вас в правильном направлении.