Статьи Королевства Дельфи


Продолжение - часть 2


Происходило это всё в воскресный день, и я решил развлечения ради написать программу с аналогичными функциями. Рассмотрев что дано и что требуется мною была написана процедура: procedure Crc32UpdateDelta (CrcFrom, CrcTo: LongWord; lpData: Pointer); где

  • CrcFrom - CRC32 файла испорченного хакером
  • CrcTo - CRC32 оригинального файла, т.е. то к которому надо привести
  • LpData - указатель на область памяти в которую будут занесены корректировочные байты
Сначала я написал процедуру генерирующую 8 байт, но немного подумав сократил количество корректирующих CRC32 байт до 4х. После этого я перепробовал её на разных файлах и разных поверяльщиках CRC32. Итоги были одинаковы - сгенерированные процедурой байты приводят CRC32 к нужному. Существенным ограничением является то, что образующий полином для процедуры Crc32UpdateDelta и поверяльщика должны (скорее всего ;-) совпадать, НО учитывая то что стандартом де-факто во всех программах считающих CRC32 (пр: RAR и pkZIP) является $EDB88320, то ограничение почти не существенно.

Исходный код (распространяется по принципу GratitudeWare - если вы имеете с этого выгоду, автор хочет получить презент ;-). function StepBack (Crc: LongWord): LongWord;//>Index var i: Integer; Begin Result:=0; for i:=0 to 255 do if ((CRC32Table[i] xor Crc) shr 24)=0 then begin Result:=i; EXIT; end; End;//StepBack - индекс элемента массива с HiByte=Crc var Crc,A,B,C,D: LongWord; P: PChar; Begin P:=lpData; CrcFrom:=Crc32Done(CrcFrom);//привести к истинному виду CrcTo:=Crc32Done(CrcTo); //1.DCBA - поиск в таблице индексов элементов со старшими байтами образующими новый CRC32 D:=StepBack(CrcTo); CrcTo:=(CrcTo xor Crc32Table[D]) shl 8; C:=StepBack(CrcTo); CrcTo:=(CrcTo xor Crc32Table[C]) shl 8; B:=StepBack(CrcTo); CrcTo:=(CrcTo xor Crc32Table[B]) shl 8; A:=StepBack(CrcTo); //2. (X xor Crc) xor Crc = X - зная какие элементы таблицы формируют // нужный CRC - просто подставляем их Crc:=CrcFrom; P^:=chr(A xor Crc); Crc:=(Crc shr 8) xor Crc32Table[A]; //*Crc32Table[Crc]; inc(P); P^:=chr(B xor Crc); Crc:=(Crc shr 8) xor Crc32Table[B]; inc(P); P^:=chr(C xor Crc); Crc:=(Crc shr 8) xor Crc32Table[C]; inc(P); P^:=chr(D xor Crc); End;//Crc32UpdateDelta

Andrew P.Rybin
Специально для





Начало  Назад  Вперед