Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2011, 23:24   #1
Haladdin
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 26
По умолчанию Вопрос о контрольной сумме

Задача такая, есть несколько файлов, текстовых и графических, которыми пользуется программа. Соответственно их изменение приведет к некорректной ее работе. Хочу сделать простенькую защиту от этого на основе проверки контрольной суммы. Смысл такой, при запуске, программа проверяет контрольную сумму нужных файлов, сравнивает значение с эталонным и в зависимости от этого либо отказывается дальше работать, либо нет.
Нашел такой вот код:

Код:
function GetCheckSum(FileName: string): DWORD; 
var 
  F: file of DWORD; 
  P: Pointer; 
  Fsize: DWORD; 
  Buffer: array [0..500] of DWORD; 
begin 
  FileMode := 0; 
  AssignFile(F, FileName); 
  Reset(F); 
  Seek(F, FileSize(F) div 2); 
  Fsize := FileSize(F) - 1 - FilePos(F); 
  if Fsize > 500 then Fsize := 500; 
  BlockRead(F, Buffer, Fsize); 
  Close(F); 
  P := @Buffer; 
  asm 
     xor eax, eax 
     xor ecx, ecx 
     mov edi , p 
     @again: 
       add eax, [edi + 4*ecx] 
       inc ecx 
       cmp ecx, fsize 
     jl @again 
     mov @result, eax 
   end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  ShowMessage(IntToStr(GetCheckSum('c:\Autoexec.bat'))); 
end;
Я плохо разбираюсь в особенностях подсчета контрольных сумм, поэтому интересует, будет ли это корректно работать вообще, корректно работать при разных файловых системах и разных операционках?
Ну и до кучи, насколько сложно будет обмануть такую "систему". То есть, если кто-нибудь злой, например, в текстовом файле поменяет одно слово (или одну букву), отразится ли это на контрольной сумме?
Haladdin вне форума Ответить с цитированием
Старый 12.01.2011, 00:19   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

есть классический crc32. работать будет.. ну теоретически на любом x86. Вызывать checksum := CRC32($FFFFFFFF, data, len);

Код:
function CRC32(crc: longWord; data: pointer; dataSize: longWord): longWord; assembler; 
{
	IN:	EAX = CRC
		EDX = Data
		ECX = DataSize

	OUT:    EAX = result
}
asm
	or	edx, edx
	jz	@exit

	jecxz	@exit

	push	ebx
	push	edi

	xor	ebx, ebx
	lea	edi, @crc32table

  @loop:
	mov	bl, al
	shr	eax, 8
	//
        {$IFDEF FPC }
	xor	bl, [{$IFDEF CPU64 }rdx{$ELSE }edx{$ENDIF CPU64 }]
	{$ELSE }
	xor	bl, [edx]
        {$ENDIF FPC }
	inc	edx
	//
        {$IFDEF FPC }
	xor	eax, [{$IFDEF CPU64 }rdi + rbx * 4{$ELSE }edi + ebx * 4{$ENDIF CPU64 }]
	{$ELSE }
	xor	eax, [edi + ebx * 4]
        {$ENDIF FPC }
	loop	@loop

	pop	edi
	pop	ebx

  @exit:
	ret

	dd	0, 0 // align

  @crc32table:
	// 00..0F
	DD 0000000AAh, 077073096h, 0EE0E612Ch, 0990951BAh
	DD 0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h
	DD 00EDB8832h, 079DCB8A4h, 0E0D5E91Eh, 097D2D988h
	DD 009B64C2Bh, 07EB17CBDh, 0E7B82D07h, 090BF1D91h
	// 10..1F
	DD 01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh
	DD 01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h
	DD 0136C9856h, 0646BA8C0h, 0FD62F97Ah, 08A65C9ECh
	DD 014015C4Fh, 063066CD9h, 0FA0F3D63h, 08D080DF5h
	// 20..2F
	DD 03B6E20C8h, 04C69105Eh, 0D56041E4h, 0A2677172h
	DD 03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh
	DD 035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h
	DD 032D86CE3h, 045DF5C75h, 0DCD60DCFh, 0ABD13D59h
	// 30..3F
	DD 026D930ACh, 051DE003Ah, 0C8D75180h, 0BFD06116h
	DD 021B4F4B5h, 056B3C423h, 0CFBA9599h, 0B8BDA50Fh
	DD 02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h
	DD 02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh
	// 40..4F
	DD 076DC4190h, 001DB7106h, 098D220BCh, 0EFD5102Ah
	DD 071B18589h, 006B6B51Fh, 09FBFE4A5h, 0E8B8D433h
	DD 07807C9A2h, 00F00F934h, 09609A88Eh, 0E10E9818h
	DD 07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h
	// 50..5F
	DD 06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh
	DD 06C0695EDh, 01B01A57Bh, 08208F4C1h, 0F50FC457h
	DD 065B0D9C6h, 012B7E950h, 08BBEB8EAh, 0FCB9887Ch
	DD 062DD1DDFh, 015DA2D49h, 08CD37CF3h, 0FBD44C65h
	// 60..6F
	DD 04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h
	DD 04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh
	DD 04369E96Ah, 0346ED9FCh, 0AD678846h, 0DA60B8D0h
	DD 044042D73h, 033031DE5h, 0AA0A4C5Fh, 0DD0D7CC9h
	// 70..7F
	DD 05005713Ch, 0270241AAh, 0BE0B1010h, 0C90C2086h
	DD 05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh
	DD 05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h
	DD 059B33D17h, 02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh
	// 80..8F
	DD 0EDB88320h, 09ABFB3B6h, 003B6E20Ch, 074B1D29Ah
	DD 0EAD54739h, 09DD277AFh, 004DB2615h, 073DC1683h
	DD 0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h
	DD 0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h
	// 90..9F
	DD 0F00F9344h, 08708A3D2h, 01E01F268h, 06906C2FEh
	DD 0F762575Dh, 0806567CBh, 0196C3671h, 06E6B06E7h
	DD 0FED41B76h, 089D32BE0h, 010DA7A5Ah, 067DD4ACCh
	DD 0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h
	// A0..AF
	DD 0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h
	DD 0D1BB67F1h, 0A6BC5767h, 03FB506DDh, 048B2364Bh
	DD 0D80D2BDAh, 0AF0A1B4Ch, 036034AF6h, 041047A60h
	DD 0DF60EFC3h, 0A867DF55h, 0316E8EEFh, 04669BE79h
	// B0..BF
	DD 0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h
	DD 0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh
	DD 0C5BA3BBEh, 0B2BD0B28h, 02BB45A92h, 05CB36A04h
	DD 0C2D7FFA7h, 0B5D0CF31h, 02CD99E8Bh, 05BDEAE1Dh
	// C0..CF
	DD 09B64C2B0h, 0EC63F226h, 0756AA39Ch, 0026D930Ah
	DD 09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h
	DD 095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h
	DD 092D28E9Bh, 0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h
	// D0..DF
	DD 086D3D2D4h, 0F1D4E242h, 068DDB3F8h, 01FDA836Eh
	DD 081BE16CDh, 0F6B9265Bh, 06FB077E1h, 018B74777h
	DD 088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch
	DD 08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h
	// E0..EF
	DD 0A00AE278h, 0D70DD2EEh, 04E048354h, 03903B3C2h
	DD 0A7672661h, 0D06016F7h, 04969474Dh, 03E6E77DBh
	DD 0AED16A4Ah, 0D9D65ADCh, 040DF0B66h, 037D83BF0h
	DD 0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h
	// F0..FF
	DD 0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h
	DD 0BAD03605h, 0CDD70693h, 054DE5729h, 023D967BFh
	DD 0B3667A2Eh, 0C4614AB8h, 05D681B02h, 02A6F2B94h
	DD 0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh, 02D02EF8Dh
	//
end;
Обмануть легко, достаточно пересчитать сумму и подправить данные хранящиеся у тебя. Чтобы было сложно обмануть, нужны сертификаты и подписи.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.01.2011, 00:21   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Честно говоря, не знаю как работает приведенный вами подсчет хеша, но вот есть неплохой md5 хеш. Почему не воспользоваться им? Его уж точно не ломанет простой пользователь без хоть каких-либо знаний в программировании

Вычисление хеш-суммы MD5
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.01.2011, 00:31   #4
Haladdin
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 26
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Обмануть легко, достаточно пересчитать сумму и подправить данные хранящиеся у тебя. Чтобы было сложно обмануть, нужны сертификаты и подписи.
Но для этого придется ломать сам экзешник, ведь эталон будет туда зашит. А если его сломают, то последнее о чем я буду плакать - это об злодейских актах вандализма в виде изменения сопутствующих файлов программы. =)

Цитата:
Сообщение от BDA Посмотреть сообщение
Честно говоря, не знаю как работает приведенный вами подсчет хеша, но вот есть неплохой md5 хеш. Почему не воспользоваться им? Его уж точно не ломанет простой пользователь без хоть каких-либо знаний в программировании

Вычисление хеш-суммы MD5
Ох... Это как-то жестко! =) В принципе столь суровую защиту мне, наверное, не нужно. Может быть просто посчитать сумму бит файла и считать это за контрольную сумму? Насколько я понимаю при этом никакой привязки к файловым системам или осям в принципе не будет, конечно могут быть файлы с одинаковой суммой бит, но на глаз это не угадать, да и не зная принципа подсчета контрольной суммы тоже подбирать соответствия будет сложно. Для моих целей подобной упрощенной схемы должно быть достаточно...

Последний раз редактировалось Haladdin; 12.01.2011 в 00:48.
Haladdin вне форума Ответить с цитированием
Старый 12.01.2011, 17:39   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от Haladdin Посмотреть сообщение
Может быть просто посчитать сумму бит файла и считать это за контрольную сумму?
Я вас правильно понял?
Если бит равен 1, то S=S+1?
тогда биты 101 = английская буква e
и 110 = английская буква n
будут давать одинаковую сумму(
а если быть точным, то ОЧЕНЬ много комбинаций будут давать правильную сумму(

если изменение данных файлов во время работы программы (конечное использование, т.е. не при отладке) не планируется, то можно их засунуть в res или приписать в конец самого exe (сложнее для реализации, так как нужно будет считывать потоком)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.01.2011, 18:22   #6
Haladdin
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Я вас правильно понял?
Если бит равен 1, то S=S+1?
тогда биты 101 = английская буква e
и 110 = английская буква n
будут давать одинаковую сумму(
а если быть точным, то ОЧЕНЬ много комбинаций будут давать правильную сумму(
Ну, безболезненно подменить один файл, другим, да еще так чтобы сумма сошлась будет все равно довольно сложно. А главное, если не знать по какому принципу она считается. Тем более что и тут можно поднамудрить, складывая например попарно, например биты 101 будут считаться как 10+1... Блин, всеравно с буквой n одинаково выходит... =) Ну тогда по три бита. Соответственно будет сто десять для n и сто один для e.
Haladdin вне форума Ответить с цитированием
Старый 12.01.2011, 19:50   #7
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

а чем crc32 не нравится? Быстрый алгоритм, полностью готов, даже думать не надо. Копируй, прогоняй, записывай эталон. Ломануть без разбора и изменения exe - практически невозможно. Подобрать файлы с такой же контрольной суммой почти невозможно. А если разбирать exe - то тебе ни один алгоритм не поможет. Это делается в два счета. Дергаем алгоритм хеширования, считаем хеши для новых файлов, правим в exe эталонные хеши и все. Есть способы еще проще. Ставим перед процедурой проверки jmp и все.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прибавить отрицательный процент к сумме. ms.green Microsoft Office Excel 5 11.06.2010 00:07
Сортировка по максимальной сумме полей KIrich iz Che Общие вопросы C/C++ 2 24.05.2010 16:06
Вопрос в решении контрольной XAOC-forever Помощь студентам 2 29.04.2010 22:54
Запрос по общей сумме зарплат. Tanusha SQL, базы данных 2 01.09.2008 11:39