Проблема вычисления CRC исполняемого файла Windows PE - PullRequest
1 голос
/ 28 августа 2011

Позвольте мне объяснить, что я пытаюсь сделать. Я хочу узнать из моего исполняемого файла Windows, был ли он подделан после его сборки. Для этого я решил вычислить значение CRC для его собственного файла изнутри и сравнить его с предварительно заданным значением. Но я сталкиваюсь с тем, что после сборки исполняемого файла CRC остается прежним, но только до тех пор, пока я не пересоберу его заново (без каких-либо изменений в исходном коде). Вот когда меняется CRC. Что здесь за магия? Добавляет ли компилятор несколько произвольных байтов в исполняемый файл?

PS. Я использую Microsoft Visual Studio C ++ 2008 и запускаю свои тесты на Windows 7 Ultimate.

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Это может быть некоторая временная метка или номер версии, автоматически внедренный компилятором / компоновщиком ...

В связи с этим я предлагаю нечто иное (исходя из того факта, что это собственные EXE / DLL):

Просто постобработайте сгенерированный файл - не думайте о CRC32 результирующего файла до того, как он будет сгенерирован ...

В Windows есть действительно «приятная» функция при загрузке EXE / DLL: он просто игнорирует что-либо в конце файла, который не принадлежит ему.

Вы можете использовать это в своих интересах: добавьте блок байтов (например, 256 байтов) к файлу.Этот блок может содержать все, что вам нравится (хэш вашего файла, длина вашего файла и т. Д.), И может быть даже зашифрован ... когда вы хотите проверить, вычислите необходимую информацию (например, ваш CRC ...) и сравните ее сэтот блок вашего файла ...

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

1 голос
/ 28 августа 2011

Рассматривали ли вы использование цифровой подписи?Подпись может быть применена после компиляции и позволяет вам убедиться, что EXE не был отредактирован.Это идеальный случай для одного.

Вы можете использовать "SignTool.EXE" для подписи вашего EXE.

Для проверки вы можете использовать код, найденный по адресу:
Проверьте, подписан ли исполняемый файл (signtool использовался для подписи этого exe)

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

...