2011-04-26 1 views
2

Итак, я пытаюсь выяснить, как заставить мой exe иметь тот же хэш-код/​​контрольную сумму, когда он перекомпилирован. Я использую FastSum для создания контрольной суммы. В настоящее время никаких изменений кода не производится, я просто перестраиваю проект в VS, а контрольная сумма отличается. Код написан на языке C++.exe ​​checksum different после каждой перекомпиляции

Я не знаком с использованием хеш-кодов и/или контрольных сумм таким образом, но я сделал некоторые исследования и прочитал что-то о необходимости согласованного GUID. Но я понятия не имею, как это связано с программой генерации контрольной суммы ...

Хорошо, я оставлю это при этом, заранее.

ответ

0

Из того, что я помню, формат EXE включает в себя временную метку сборки, поэтому хэшировка exe, включая эту метку времени, будет меняться при каждой перекомпиляции.

+0

Хм, хорошо, я посмотрю, возможно, установил временную метку. Благодаря! –

3

Вы изучили различия между exes? Я подозреваю, что компилятор/компоновщик вставляет дату или время в двоичный файл, и в результате каждый двоичный файл будет отличаться от другого. Или это может быть хуже, иногда компиляторы/компоновщики создают статические таблицы в своей собственной системной памяти, а затем копируют их в двоичный файл, скажем, что у вас есть 9 байтов чего-то и для выравнивания, которые компилятор решает использовать 12 байтов в двоичном формате, я видел компиляторы/компоновщики берут все 3 байта в системную память этого компьютера и копируют их в файл. В идеале вы хотели бы, чтобы инструменты обнулили память, которую они используют для такой вещи, чтобы получить повторяющиеся результаты.

В основном выполните двоичную разницу между файлами, которые вы должны выяснить, почему они не совпадают.

+0

Кроме того, даже если компилятор/компоновщик не вставлял информацию о дате/времени, любая ссылка в коде на '__DATE__' имела бы такой же эффект. – Clifford

+0

Человек, я надеюсь, что это не имеет никакого отношения к решениям компилятора/линкера! Я знаю, что в коде, который мы написали, нет ссылки на [code] __ DATE __ [/ code], но это не значит, что он не используется. Я сделаю двойной бит и посмотрю, что получится, спасибо, ребята. –

+0

Я сделал двоичную разницу, и есть два раздела, которые разные. Один из них в начале, я предполагаю, что это часть заголовка, но я не знаю, как точно определить, что это такое. Есть строка «Эта программа не может быть запущена в режиме DOS». newline, затем «$ 00000000000000», а следующий фрагмент - это первое отличие. Второй, который состоит в основном из текста, примерно на полпути через данные и должен иметь какое-то отношение к компилятору, перемещающему материал только потому, что он чувствует себя так ... –

0

Является ли это управляемым двоичным кодом? Управляемые двоичные файлы имеют раздел GUID, который изменяется от сборки к сборке, и вы не можете сделать это, чтобы остановить это.

Вы можете лучше рассмотреть изменения в вашем двоичном файле, запустив «link/dump/all [filename]» или «link/dump/disasm [filename]». Параметр/all покажет вам все шестнадцатеричные значения, а также их эквивалент ascii, в то время как опция/disasm будет дизассемблировать код и показать его вам в сборке, что может быть проще читать, но может игнорировать некоторые тривиальные различия, которые могут иметь вызвало изменение хеша.

Смежные вопросы