Сначала я расскажу вам немного о том, почему я задаю этот вопрос:
В настоящее время я работаю в строго регулируемой отрасли, и поэтому наш код довольно тщательно просматривается официальными тестовыми домами. Эти тестовые дома ожидают, что смогут построить код и сгенерировать файл .exe или .dll, который ТОЧНО один и тот же каждый раз (без изменения кода явно!). Они проверяют MD5 и SHA1 исполняемых файлов, которые они создают для обеспечения этого.
До этого момента я преимущественно кодировал на С++, где (после нескольких настроек настройки проекта) мне удалось заставить проекты последовательно перестраиваться на один и тот же MD5/SHA1. Я теперь использую С# в проекте, и мне очень трудно получить MD5 для соответствия после восстановления. Я знаю, что в PE-заголовке файла есть "метки времени", и они были очищены до 0. Я также знаю, что есть GUID для .exe, который снова был очищен до 00 00 00... и т.д. Однако файлы все еще не совпадают.
Я использую CFF Explorer для просмотра и редактирования заголовка PE, чтобы удалить отметки времени и даты. После использования двоичного инструмента сравнения в файле .exe есть только 2 блока байтов, которые отличаются (оба очень маленькие).
Один из непоследовательных блоков появляется непосредственно перед некоторым двоичным кодом, который в ASCII указывает путь к файлу *Project*\obj\Release\xxx.pdb
.
EDIT: Теперь известно, что это GUID файла *.pdb, однако я до сих пор не знаю, могу ли я изменить его, не вызывая никаких ошибок!?
Другой блок появляется в середине того, что выглядит как имена функций, т.е. (типичный раздел) AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
то разный кодовый блок:
4A134ACE-D6A0-461B-A47C-3A4232D90816
а затем:
"}. ValueType.__ StaticArrayInitTypeSize = 7.. $$ method0x60000ab-1.RuntimeFieldHandle.InitializeArray`... и т.д.
Любые идеи или предложения были бы наиболее желанными!