Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
#1

Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 - C++

03.02.2014, 18:28. Просмотров 979. Ответов 14
Метки нет (Все метки)

Работаю под Windows 7 64x + Visual Studio 2010

Если считать в бинарном виде exe-файл в массив и посчитать стандартным алгоритмом CRC32 получим CRC32, который мы можем увидеть нажав правой клавишей мышки на exe-файле->свойства->Контрольные суммы.

Дело в том, что я дописываю некоторую информацию в конец exe файла и даже Google Chrome это замечает и начинает ругаться. (информация служебная - не вирусы пишу)

Если что-то дописать в файл, то упомянутый CRC32 меняется(казалось бы ну и пусть). Но есть CRC32 расположенный в самом exe-файле по смещению: адрес PE заголовка + 0x08 остаётся неизменным. И этот CRC32 изначально отличен от CRC32 посчитанного на лету, и после добавления данных в конец exe он само собой остаётся прежним. И как я догадываюсь, по какому-то несовпадению между двумя CRC32 Google Chrome и прочие проверяющие программы находят подвох? Объясните, пожалуйста,

1) как считается тот самый вшитый CRC32, чтобы я мог сам его перегенерировать после вставки информации в exe, чтобы Google не видел подвохов
2) как происходит проверка тем же Google и другим проверяющим софтом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2014, 18:28     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8
Посмотрите здесь:
C++ [C/C++]Не могу объявить static функцию в header файле.
Конструктор копирования при инициализации в header файле C++
Необработанное исключение по адресу 0x4050D302 в ConsoleApplication17.exe: 0xC0000005: Access violation (параметры: 0x00000008) C++
Вызвано исключение по адресу 0x01361A1E в Matrix 1.0.exe: 0xC0000005: нарушение прав доступа при записи C++
Как вычисляется выражение C++
C++ Как вычисляется выражение a+++b?
Сохранение программы в exe файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 18:36     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #2
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Дело в том, что я дописываю некоторую информацию в конец exe файла
Как это в конец файла? по какому праву и почему именно в конец?

Добавлено через 1 минуту
Цитата Сообщение от Konstantin__ Посмотреть сообщение
после добавления данных в конец exe он само собой остаётся прежним
Да в том то и дело что он не остается прежним...
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
03.02.2014, 18:40  [ТС]     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #3
Извиняюсь, не успел поправить часть предложений в стартовом сообщении топика(оказывается, что даётся лишь 5 минут на правку)...Надеюсь, суть проблемы будет понятной.

Как это в конец файла? по какому праву и почему именно в конец?
Это была одна из моих идей как можно передать данные в exe. Приложение при запуске считывает их и использует для дальнейшей работы.

Да в том то и дело что он не остается прежним...
Я просматривал в HEX editor - данные по этому адресу остаются прежними. Или может я неверно ищу CRC32 в теле exe и то, что я нашёл это другие данные? Адрес PE заголовка можно получить по смещению 0x3C от начала файла. Далее PE addr + 0x08 = CRC32. Или это не так?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 18:45     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #4
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Это была одна из моих идей как можно передать данные в exe. Приложение при запуске считывает их и использует для дальнейшей работы.
При том чужая программа, а не ваш код... А я стесняюсь спросить а откуда она узнает что с эти мусором делать которую вы дописали?? Пример такой взяли русскую книгу и на полях написали китайские иероглифы, как их читающему понимать?
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
03.02.2014, 18:54  [ТС]     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #5
При том чужая программа, а не ваш код... А я стесняюсь спросить а откуда она узнает что с эти мусором делать которую вы дописали?? Пример такой взяли русскую книгу и на полях написали китайские иероглифы, как их читающему понимать?
Моя программа. Я делаю вставку данных в Win32 приложение из под *nix сервера, т.к. входные данные постоянно меняются. Целевой платформой является семейство Windows. Такое решение позволяет мне отказаться от кросплатформенной компиляции c помощью скриптов, т.к. есть задача, которая должна быть автоматизирована.
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,259
Завершенные тесты: 1
03.02.2014, 19:10     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #6
Цитата Сообщение от Konstantin__ Посмотреть сообщение
1) как считается тот самый вшитый CRC32, чтобы я мог сам его перегенерировать после вставки информации в exe, чтобы Google не видел подвохов
А кто сказал, что там именно CRC32 ?
Там довольно простой алгоритм, но он недокументирован.
Реализацию можно найти, к примеру, в исходниках (W2K).

Цитата Сообщение от Konstantin__ Посмотреть сообщение
2) как происходит проверка тем же Google и другим проверяющим софтом.
Например:

CheckSumMappedFile function
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Но что-то у меня подозрение, что там весь сыр-бор вовсе не из-за контрольной суммы.
Сейчас практически любой exe-файл, скаченный из интернета, имеет цифровую подпись.
При изменении файла подпись становится невалидной, и на этот факт сразу реагируют
антивирусы, система безопасности Windows и другие программы.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 19:18     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #7
Ну кто Вам сказал что эти данные находятся в конце? https://ru.wikipedia.org/wiki/Exe
Они могут по разным адресам находится и надо менять исполняемый код самой программы...Не проще ли сделать так чтоб рядом с вашей программой находился какой-нибудь файл *.dat произвольной структуры, в который бы данные сбрасывались, а ваша программа их бы просто считывала?
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
04.02.2014, 13:06  [ТС]     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #8
Цитата Сообщение от mustimur Посмотреть сообщение
Ну кто Вам сказал что эти данные находятся в конце? https://ru.wikipedia.org/wiki/Exe
Они могут по разным адресам находится и надо менять исполняемый код самой программы...
Никто не говорил, что CRC32 данные находятся в конце! Записанные мною данные - да, находятся(это факт) Кстати, по той ссылке, которую Вы дали по смещениям 0x12-0x13 находится CRC16. Мне это поле не нужно. Там стоят 0x00.

Цитата Сообщение от mustimur Посмотреть сообщение
Не проще ли сделать так чтоб рядом с вашей программой находился какой-нибудь файл *.dat произвольной структуры, в который бы данные сбрасывались, а ваша программа их бы просто считывала?
Так делать нельзя. Во-первых, есть ТЗ! Во-вторых, клиент попросту не поймёт, что это ещё за .dat файл скачивается вместе с выбранным им файлом для закачки (весь проект описывать не буду).

Цитата Сообщение от Убежденный
А кто сказал, что там именно CRC32 ?
Там довольно простой алгоритм, но он недокументирован.
Реализацию можно найти, к примеру, в исходниках (W2K).
Я опирался на раздел "Как защитить свою программу от взлома" из этой статьи http://www.xakep.ru/post/21788/

Цитата Сообщение от Убежденный
Посмотрю, спасибо. Возможно, пригодится.
Цитата Сообщение от Убежденный
Но что-то у меня подозрение, что там весь сыр-бор вовсе не из-за контрольной суммы.
Сейчас практически любой exe-файл, скаченный из интернета, имеет цифровую подпись.
При изменении файла подпись становится невалидной, и на этот факт сразу реагируют
антивирусы, система безопасности Windows и другие программы.
Воможно, Вы правы.

Добавлено через 16 часов 24 минуты
Может кто-то занимался описанной задачей? Как всё таки корректно перегенерировать CRC32 после внесения изменений в exe? (алгоритм) Или это правда не нужно?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
04.02.2014, 13:16     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #9
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Может кто-то занимался описанной задачей? Как всё таки корректно перегенерировать CRC32 после внесения изменений в exe? (алгоритм) Или это правда не нужно?
Это все таки алгоритм вирусов, посмотрите там
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,259
Завершенные тесты: 1
04.02.2014, 13:38     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #10
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Может кто-то занимался описанной задачей? Как всё таки корректно перегенерировать CRC32 после внесения изменений в exe? (алгоритм)
MapFileAndCheckSum function
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Можно и вручную.
Найдите исходники W2K, там есть файл checksum.c с реализацией алгоритма,
который Вы ищете.
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
05.02.2014, 13:02  [ТС]     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #11
Цитата Сообщение от Убежденный
MapFileAndCheckSum function
Уже пробовал. Выдаёт CRC не схожий ни с одним из описанных. Видимо, там другая реализация.
Цитата Сообщение от Убежденный
Можно и вручную.
Найдите исходники W2K, там есть файл checksum.c с реализацией алгоритма,
который Вы ищете.
Возможно. Хотя уже есть мысль, что мне нужен алгоритм CRC32 генерируемый именно VS2010.
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,259
Завершенные тесты: 1
05.02.2014, 13:11     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #12
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Уже пробовал. Выдаёт CRC не схожий ни с одним из описанных. Видимо, там другая реализация.
Я делал по-другому: с помощью CheckSumMappedFile вычисляю
контрольную сумму и вручную прописываю ее в нужное место PE-файла.

Цитата Сообщение от Konstantin__ Посмотреть сообщение
Хотя уже есть мысль, что мне нужен алгоритм CRC32 генерируемый именно VS2010.
VS2010 тут не при чем. Алгоритм проверки контрольной суммы "прошит" в Windows, и
если генерировать ее по другому принципу, проверка сразу сфейлится.
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
05.02.2014, 13:28  [ТС]     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #13
Цитата Сообщение от Убежденный Посмотреть сообщение
Я делал по-другому: с помощью CheckSumMappedFile вычисляю
контрольную сумму и вручную прописываю ее в нужное место PE-файла.
А не помните по какому смещению Вы прописывали?

Цитата Сообщение от Убежденный Посмотреть сообщение
VS2010 тут не при чем. Алгоритм проверки контрольной суммы "прошит" в Windows, и
если генерировать ее по другому принципу, проверка сразу сфейлится.
Понял. Спасибо!
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,259
Завершенные тесты: 1
05.02.2014, 13:47     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #14
Цитата Сообщение от Konstantin__ Посмотреть сообщение
А не помните по какому смещению Вы прописывали?
64 байта от начала Optional Header (началом считается поле Magic).
Смещение одинаково для 32-битных и 64-битных PE-файлов.

Последняя актуальная информация о PE-формате здесь:

Microsoft PE and COFF Specification (v8.3, Updated: February 6, 2013)
http://msdn.microsoft.com/en-us/libr.../gg463119.aspx
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 13:48     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8
Еще ссылки по теме:
Dll и exe в одном файле C++
Можно ли посмотреть что в exe файле??? C++
C++ Изменение строки текста в exe файле
Crc32 библиотека C++
Может ли переменная X использоваться как счётчик в цикле, в теле которого вычисляется заданная функция? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
05.02.2014, 13:48     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 #15
Как только TS перестанет называть контрольную сумму файла CRC (которая здесь вообще ни при чем), жить ему станет проще.

А если данные дописываются как оверлей, то что мешает там же и хранить какую угодно проверочную информацию - от CRC до ECC?
Yandex
Объявления
05.02.2014, 13:48     Как вычисляется CRC32 в exe файле по адресу PE header + 0x8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru