Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Подсчёт контрольной суммы.   Найти похожие ветки 

 
boalse ©   (2005-06-22 10:16) [0]

Задача. Имеется exe, который при запуске должен считать свою контрольную сумму и сравнивать её с уже прошитой в нём цифрой. Если эти значения не совпадают, программа прекращает работу. Вопрос. Как можно подсчитать эту контрольную сумму. Просто считать размер файла в байтах? Есть ли какие нибудь другие способы? Хотелось бы с реализацией, потому как не представляю как подсчитывать что-то в exe. Понимаю, что это не даст полноценной защиты, однако хочется доставить побольше гемороя хакерам, заодно и сразу отсечь хакеров-ламеров.


 
TUser ©   (2005-06-22 10:38) [1]

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


 
boalse ©   (2005-06-22 10:41) [2]

Ну тогда как подсчитать контрольную сумму критического участка? Можно простенький пример?


 
Рамиль ©   (2005-06-22 10:46) [3]

Можно XOR ом байты сложить.


 
Игорь Лан   (2005-06-22 10:46) [4]

Используй какой-нибудь упаковщик. У большинства упаковщиков есть такая опция.


 
boalse ©   (2005-06-22 10:56) [5]


> Можно XOR ом байты сложить.


Хе-хе, а как эти байты складывать? Как их выколупывать из ехе-шника?


> Используй какой-нибудь упаковщик. У большинства упаковщиков
> есть такая опция.


AsPack пойдёт?


 
TUser ©   (2005-06-22 10:57) [6]

Теорию можно посмотреть тут
http://embedded.ifmo.ru/embedded_old/ETC/REFERAT/crc/crc.htm

Пример (из головы)

const ValidSum: word = 125; // тут храним правильное значение

...

procedure Critical;
begin
 ...
end;

procedure EndProc;
begin
 // Пустая процедура сразу после Critical
end;

function CRC: word;
var w: ^word;
begin
 w:=@Critical;
 result:=w^;
 while w <> @EndProc do begin
   w:=pointer(integer(w)+4);
   if (integer(@EndProc)-integer(w)) < 4 then
     w:=pointer(integer(w)-(4-(integer(@EndProc)-integer(w))));
   result:=result xor w^;
   end;
end;

function Check;
begin
 if CRC <> ValidSum then
   Application.Terminate;
end;

Учти, что функция Check является узким местом всего этого произведения, т.к. компилятор преобразует ее в нечто такое
call @CRC;
cmp ax, [ValidSum]
jz куда-то,
а хавкер будет менять это самое jz. Фактически, это для него просто еще один лишний геморрой.


 
boalse ©   (2005-06-22 11:03) [7]

TUser, спасибо, буду учить матчасть!


> Фактически, это для него просто еще один лишний геморрой.


Для меня тоже. Только пусть он сначала найдёт эту cmp!


 
Игорь Лан   (2005-06-22 11:04) [8]

>>AsPack пойдёт?

Не знаю есть ли у него такая опция, смотри в хельпе. Я юзал petite.exe, нормально работает, только жмет медленно.


 
TUser ©   (2005-06-22 11:07) [9]

Найти-то он ее найдет.


 
TUser ©   (2005-06-22 11:08) [10]

По поводу упаковшиков - это стандартный способ, а против станлартных способов защиты есть стандартные способы взлома.


 
boalse ©   (2005-06-23 05:48) [11]


> TUser ©   (22.06.05 10:57) [6]


Пример  не работает. Вечный цикл получается. А что делает функция Integer? В справке написанно, что это тип, а про функцию - ничего.


 
AlexKniga ©   (2005-06-23 10:10) [12]

boalse ©   (23.06.05 05:48) [11]
Учи матчасть! С такими знаниями CRC двух слов не сосчитаешь.


 
AlexKniga ©   (2005-06-23 10:10) [13]

Почитай про приведение типов.


 
uny ©   (2005-06-23 20:03) [14]

md5 лучше! длиннее:)
рабочий исходник с примером, всё вместе 16 кб
http://www.fichtner.net/delphi/md5.delphi.phtml


 
SammIk ©   (2005-06-23 22:13) [15]

Нда, тяжолый случай).
Если контролировать критический участок, то его(критический участок)
Искать становится легче).
Лучше ничего не считать, а скажем использовать баиты(ворды\дворды)
Этокго критического участка, как(ну... скажем) константы при
каких либо вычислениях.
Тоды, если прога сломана(поменян баит или 2), то она(прога) считать результыт будет не правильно.
Вот это есть гемор)
-------
Или, если уж сильно хочется считать хеш, то можно его считануть, и
опять же заюзать результат в критических вычислениях.
Упаковщики, если прога деиствительно кому-то нужна, сымаются быстро.


 
Fredy314 ©   (2005-06-24 00:08) [16]


> Или, если уж сильно хочется считать хеш, то можно его считануть,
> и
> опять же заюзать результат в критических вычислениях.
> Упаковщики, если прога деиствительно кому-то нужна, сымаются
> быстро.


Интересная идея.

call @CRC;
cmp ax, [ValidSum]
jz куда-то,
а хавкер будет менять это самое jz. Фактически, это для него просто еще один лишний геморрой.

а если  в @CRC;
будет и  jz куда-то, учитываться
в смысле две взаимосвязаных системы
проверяют другдруга и при ошибках делают чёнибудь кривое?



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
6-1113123235
Петя Иванов
2005-04-10 12:53
2005.07.18
загрузка страницы в браузере


1-1119795483
heady
2005-06-26 18:18
2005.07.18
нажатие Enter в Edit


14-1118658811
Sergey Masloff
2005-06-13 14:33
2005.07.18
4 диска с собой на необитаемый остров ;-)


14-1119360062
mike_
2005-06-21 17:21
2005.07.18
Командный файл


6-1113128131
Stalker01
2005-04-10 14:15
2005.07.18
Трафик при отправке почты