Russian Qt Forum
Ноябрь 23, 2024, 06:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Контрольная сумма файла  (Прочитано 5776 раз)
OKTA
Гость
« : Июнь 05, 2014, 17:55 »

Товарищи, дайте идею  Улыбающийся
Есть задача внедрить в приложение вычисление контрольной суммы от самого себя. Какие могут быть варианты, кроме добавления к концу исполняемого файла какой-то последовательности, которую сам исполняемый файл сможет посчитать и сравнить?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июнь 05, 2014, 18:07 »

можно разбить напополам и добавить кусок в начало и кусок в конец Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Figaro
Гость
« Ответ #2 : Июнь 05, 2014, 18:07 »

ЭЦП
Записан
Bepec
Гость
« Ответ #3 : Июнь 05, 2014, 18:24 »

Ну я разберу для себя
1) Нужно сосчитать CRC себя.
2) Куда то сохранить более ранний CRC.
3) ну и там уже сравнение и прочее.

1) Не проблема, читается.
2) а вот тут засада. Изменение самого себя приведёт к невозможности запуска... Точнее добавление записи к концу приводит (у меня) к ошибке.

Я пока вижу только как вариант вынести CRC за пределы программы. В какой нить файл настроек или ещё чего.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 05, 2014, 18:55 »

Не понял причем тут "дописать", что это решает? Я делал для Вындоуз dll, года 2-3 назад. Пытался здесь обсуждать но все уже смутно, помню Витек советовал типа "дык почитай статьи" Улыбающийся  В общем сделал так

- нашел модуль и его образ в памяти ф-циями API
- в отладчике посмотрел какая область соответствует коду
- написал утилитку - дамп кода, сделал неск дампов с разными раскладами памяти
- написал еще утилитку - сравнение дампов. В рез-те получил массив областей вида
Код:
const int offset[] = {
0x6c80, 0x6eb6,
0x6eb8, 0x70da,
0x70f0, 0x714a,
0x714c, 0x720a,
0x7220, 0x7a10
};
И через каждые 100 рисований считаю CRC всех кусков. Не соответствует - испускаю exception, ну а там уже по рогам
Записан
OKTA
Гость
« Ответ #5 : Июнь 06, 2014, 09:21 »

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

По поводу добавления в начало файла - придется делать утилиту, которая будет выковыривать из файла суммы, проверять их, а потом запускать exe-шник, очищенный от этих сумм? Или можно как-то хитрее?

По поводу дампа памяти идея самая интересная, но как быть уверенным, что эти дампы будут всегда одинаковыми?  К тому же приложение у меня должно быть кроссплатформенным и с API тут будет тяжковато  В замешательстве И сам образ в памяти ищет сторонняя утилита или само приложение в себе копается?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 06, 2014, 10:24 »

По поводу дампа памяти идея самая интересная, но как быть уверенным, что эти дампы будут всегда одинаковыми?  К тому же приложение у меня должно быть кроссплатформенным и с API тут будет тяжковато  В замешательстве И сам образ в памяти ищет сторонняя утилита или само приложение в себе копается?
Само. Дампы одинаковыми не будут, надо еще выпасти отличия.

Если же "проверить файл на диске" (не в памяти) - то просто определить глобальную переменную, напр
Код:
const char  theCRC[] =  {
   0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6,   // маркер начала (для поиска утилитой)
   0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,   // сюда пишем CRC + флаг "авторизовано"
   0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0    // маркер конца
};
   
Записан
OKTA
Гость
« Ответ #7 : Июнь 06, 2014, 10:45 »

А..вот какой дамп.. т.е. защищает программу от изменений в процессе работы грубо говоря, а не проверяет целостность при старте, да?

А как вычислять CRC, если само поле для CRC в итоге изменится после записи туда этого CRC?)))
Записан
Figaro
Гость
« Ответ #8 : Июнь 06, 2014, 11:11 »

При расчете CRC просто не учитывать
Записан
OKTA
Гость
« Ответ #9 : Июнь 06, 2014, 11:15 »

Ну точно  Смеющийся спасибо)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.538 секунд. Запросов: 22.