Сохранить временную метку .exe от изменений - PullRequest
1 голос
/ 26 апреля 2011

Кто-нибудь знает способ предотвратить изменение временной метки исполняемого файла? Я пытаюсь создать согласованный хэш-код для .exe, но я думаю, что временная метка может препятствовать этому. Каждый раз, когда я перекомпилирую код (VS C ++), FastSum генерирует другую контрольную сумму.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 26 апреля 2011

Формат файла PE (как в вашем EXE) имеет поле метки времени. Проверьте "Таблица 2. Поля IMAGE_FILE_HEADER" по этой ссылке: http://msdn.microsoft.com/en-us/library/ms809762.aspx

Похоже, что если вы действительно этого хотите, вы можете отредактировать TimeDateStamp в шестнадцатеричном редакторе или написать небольшую программу, которая сделает это за вас. Если я правильно прочитал приведенный выше документ, он выглядит как 4 байта со смещением 10.

Я не уверен, каковы последствия изменения этого. Я думаю, это может сделать вас не в состоянии найти символы при отладке программы. Возможно, вместо изменения этого поля в вашем бинарном файле вы должны хешировать области вне PE-заголовка. (Ссылка, которую я предоставляю, может помочь вам определить, где это имеет смысл.)

1 голос
/ 29 апреля 2011

В зависимости от того, что вам нужно для контрольной суммы, вы можете удалить заголовок COFF (где находится временная метка) или дополнительный заголовок.В последнем случае вы просто сохраняете только таблицу разделов и данные разделов (двоичное содержимое исполняемого файла).Если вы убедитесь, что ваш исходный код не изменен, а флаги компиляции и ссылки не изменены, данные раздела должны остаться прежними.Если вы хотите включить номера версий или размер кода в контрольную сумму, необходимо включить дополнительный заголовок.

Чтобы найти начало дополнительного заголовка, выполните процедуру:

  1. Чтение4-байтовый базовый адрес подписи от 0x3c.
  2. Перейти к смещению подписи.
  3. Смещение 20 байтов.Это начало необязательного заголовка.
  4. Вы должны ожидать здесь 0x10b, если это 32-битный исполняемый файл, или 0x20b, если 64-битный.

Чтобы найти начало разделаТаблица, выполните процедуру:

  1. Считать 4-байтовый базовый адрес подписи из 0x3c.
  2. Перейти к смещению подписи.
  3. смещение 16 байтов.
  4. Считайте 2-байтовый размер дополнительного заголовка здесь.
  5. Перейдите к дополнительному заголовку.
  6. Смещение байтов дополнительного размера заголовка.Это начало таблицы разделов.
  7. Вы должны ожидать здесь имя раздела (например, ".text", ".data" и т. Д.).

Для полной спецификацииФормат PE & COFF, скачайте это: Спецификация Microsoft PE и COFF .

0 голосов
/ 26 апреля 2011

Файловые метки времени контролируются и поддерживаются ОС - они не являются внутренними для самого файла (включая исполняемые файлы).

0 голосов
/ 26 апреля 2011

Какая временная метка? Последний доступ? Вы не можете предотвратить это изменение, если вы получаете к нему доступ - однако вы можете принять это к сведению и затем изменить его обратно?

Для хеша - что ты имеешь в виду? Способ гарантировать, что .exe не изменился? Я бы использовал CRC.

...