Сначала я расскажу вам немного о том, почему я задаю этот вопрос:
В настоящее время я работаю в строго регламентированной отрасли, и поэтому наш кодекс тщательно проверяется официальными тестовыми компаниями. Эти тестовые дома рассчитывают на то, что смогут собрать код и сгенерировать .exe или .dll, которые ТОЧНО одинаковы каждый раз (без явного изменения кода!). Они проверяют MD5 и SHA1 исполняемых файлов, которые они создают, чтобы убедиться в этом.
До этого момента я преимущественно занимался кодированием на C ++, где (после нескольких настроек параметров проекта) мне удавалось заставить проекты последовательно перестраиваться на один и тот же MD5 / SHA1. Сейчас я использую C # в проекте и испытываю большие затруднения, чтобы заставить MD5 соответствовать после перестройки. Я знаю, что в PE-заголовке файла есть «временные метки», и они были очищены до 0. Я также знаю, что для .exe существует GUID, который снова был очищен до 00 00 00 ... и т. д. Однако файлы по-прежнему не совпадают.
Я использую CFF Explorer для просмотра и редактирования заголовка PE, чтобы удалить метки времени и даты. После использования бинарного инструмента сравнения в .exe есть только 2 блока байтов, которые отличаются (оба очень маленькие).
Один из несовместимых блоков появляется просто перед некоторым двоичным кодом, который в ASCII детализирует путь к файлу *Project*\obj\Release\xxx.pdb
.
РЕДАКТИРОВАТЬ: Теперь известно, что это 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` ... и т.д ..
Любые идеи или предложения приветствуются!