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

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

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

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

03.02.2014, 18:28. Просмотров 1024. Ответов 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 и другим проверяющим софтом.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2014, 18:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как вычисляется CRC32 в exe файле по адресу PE header + 0x8 (C++):

Вызвано исключение по адресу 0x013C1891 в Jacobi.exe: 0xC0000005: нарушение прав доступа при чтении по адресу - C++
#include <math.h> const double eps = 0.001; ///< желаемая точность /// N - размерность матрицы; A - матрица коэффициентов, F -...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC - C++
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...

Как ускорить получения crc32 о файле? md5 не читает файлы более 512 мегабайт! - C#
Доброго времени суток уважаемые читатели ! столкнулся с очень большой проблемой ! нужно получить от файла некую информацию для...

Как спрятать exe файл в другом exe файле? - C++ Builder
Как спрятать exe файл в другом exe файле?А потом его запустить?И не хотелось бы чтобы этот exe файл извлекался куда нибудь :-[. Может...

Не вычисляется корни квадратного уравнения в Delphi. Даже если а=0,то вычисляется а при целых числ х1 и х2 = 0 - Delphi
program Laba1; {$APPTYPE CONSOLE} uses SysUtils; procedure SolveQE(A,B,C: integer; Var x1,x2:real); var D:real; begin

Ошибка по адресу xNtKrnl.exe+80640 - BSOD
С периодичность раз в несколько дней вышибает экран смерти. Последний вылет: Файл дампа : 111614-14133-01.dmp Время аварии ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 18:36 #2
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Дело в том, что я дописываю некоторую информацию в конец exe файла
Как это в конец файла? по какому праву и почему именно в конец?

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

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

Да в том то и дело что он не остается прежним...
Я просматривал в HEX editor - данные по этому адресу остаются прежними. Или может я неверно ищу CRC32 в теле exe и то, что я нашёл это другие данные? Адрес PE заголовка можно получить по смещению 0x3C от начала файла. Далее PE addr + 0x08 = CRC32. Или это не так?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 18:45 #4
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Это была одна из моих идей как можно передать данные в exe. Приложение при запуске считывает их и использует для дальнейшей работы.
При том чужая программа, а не ваш код... А я стесняюсь спросить а откуда она узнает что с эти мусором делать которую вы дописали?? Пример такой взяли русскую книгу и на полях написали китайские иероглифы, как их читающему понимать?
0
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
03.02.2014, 18:54  [ТС] #5
При том чужая программа, а не ваш код... А я стесняюсь спросить а откуда она узнает что с эти мусором делать которую вы дописали?? Пример такой взяли русскую книгу и на полях написали китайские иероглифы, как их читающему понимать?
Моя программа. Я делаю вставку данных в Win32 приложение из под *nix сервера, т.к. входные данные постоянно меняются. Целевой платформой является семейство Windows. Такое решение позволяет мне отказаться от кросплатформенной компиляции c помощью скриптов, т.к. есть задача, которая должна быть автоматизирована.
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
03.02.2014, 19:10 #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 и другие программы.
2
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 19:18 #7
Ну кто Вам сказал что эти данные находятся в конце? https://ru.wikipedia.org/wiki/Exe
Они могут по разным адресам находится и надо менять исполняемый код самой программы...Не проще ли сделать так чтоб рядом с вашей программой находился какой-нибудь файл *.dat произвольной структуры, в который бы данные сбрасывались, а ваша программа их бы просто считывала?
0
Konstantin__
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
04.02.2014, 13:06  [ТС] #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? (алгоритм) Или это правда не нужно?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
04.02.2014, 13:16 #9
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Может кто-то занимался описанной задачей? Как всё таки корректно перегенерировать CRC32 после внесения изменений в exe? (алгоритм) Или это правда не нужно?
Это все таки алгоритм вирусов, посмотрите там
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
04.02.2014, 13:38 #10
Цитата Сообщение от Konstantin__ Посмотреть сообщение
Может кто-то занимался описанной задачей? Как всё таки корректно перегенерировать CRC32 после внесения изменений в exe? (алгоритм)
MapFileAndCheckSum function
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

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

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

Цитата Сообщение от Убежденный Посмотреть сообщение
VS2010 тут не при чем. Алгоритм проверки контрольной суммы "прошит" в Windows, и
если генерировать ее по другому принципу, проверка сразу сфейлится.
Понял. Спасибо!
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
05.02.2014, 13:47 #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
0
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
05.02.2014, 13:48 #15
Как только TS перестанет называть контрольную сумму файла CRC (которая здесь вообще ни при чем), жить ему станет проще.

А если данные дописываются как оверлей, то что мешает там же и хранить какую угодно проверочную информацию - от CRC до ECC?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 13:48
Привет! Вот еще темы с ответами:

Как сохранить проект в exe-файле? - C#
Существует готовый проект Windows Forms на C#. Как сохранить/или скомпилировать в один единый exe-файл?

Как сохранить переменные в exe файле? - PascalABC.NET
Пример: Я запускаю exe файл и у меня он обращается к текстовому файлу и берёт от туда переменные и прочее, но можно ли эти переменные после...

Как в EXE файле узнать код Активации - C++ Builder
вот эта прога кпо сможет помоч?

Как хранить динамические данные в exe файле? - C++ Builder
Как узнать сколько раз запустили exe файл? Слышал что есть строковые ресурсы но так не получилось это реализовать.Подскажите как это...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.02.2014, 13:48
Ответ Создать тему
Опции темы

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