Russian Qt Forum

Программирование => Общий => Тема начата: OKTA от Июнь 05, 2014, 17:55



Название: Контрольная сумма файла
Отправлено: OKTA от Июнь 05, 2014, 17:55
Товарищи, дайте идею  :)
Есть задача внедрить в приложение вычисление контрольной суммы от самого себя. Какие могут быть варианты, кроме добавления к концу исполняемого файла какой-то последовательности, которую сам исполняемый файл сможет посчитать и сравнить?


Название: Re: Контрольная сумма файла
Отправлено: kambala от Июнь 05, 2014, 18:07
можно разбить напополам и добавить кусок в начало и кусок в конец :)


Название: Re: Контрольная сумма файла
Отправлено: Figaro от Июнь 05, 2014, 18:07
ЭЦП


Название: Re: Контрольная сумма файла
Отправлено: Bepec от Июнь 05, 2014, 18:24
Ну я разберу для себя
1) Нужно сосчитать CRC себя.
2) Куда то сохранить более ранний CRC.
3) ну и там уже сравнение и прочее.

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

Я пока вижу только как вариант вынести CRC за пределы программы. В какой нить файл настроек или ещё чего.


Название: Re: Контрольная сумма файла
Отправлено: Igors от Июнь 05, 2014, 18:55
Не понял причем тут "дописать", что это решает? Я делал для Вындоуз dll, года 2-3 назад. Пытался здесь обсуждать но все уже смутно, помню Витек советовал типа "дык почитай статьи" :)  В общем сделал так

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


Название: Re: Контрольная сумма файла
Отправлено: OKTA от Июнь 06, 2014, 09:21
Насчет добавить CRC в конце файла, сосчитав его дополнительной утилитой - не проблема. Потестировал на паре приложений - брал экзешники и запихивал им в конец мильён байт - все нормально, запускается. Странно, почему у тебя Верес вылетало  ???

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

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


Название: Re: Контрольная сумма файла
Отправлено: Igors от Июнь 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    // маркер конца
};
   


Название: Re: Контрольная сумма файла
Отправлено: OKTA от Июнь 06, 2014, 10:45
А..вот какой дамп.. т.е. защищает программу от изменений в процессе работы грубо говоря, а не проверяет целостность при старте, да?

А как вычислять CRC, если само поле для CRC в итоге изменится после записи туда этого CRC?)))


Название: Re: Контрольная сумма файла
Отправлено: Figaro от Июнь 06, 2014, 11:11
При расчете CRC просто не учитывать


Название: Re: Контрольная сумма файла
Отправлено: OKTA от Июнь 06, 2014, 11:15
Ну точно  ;D спасибо)))