Сейчас на форуме: bartolomeo, asfa, _MBK_, Adler (+7 невидимых)

 eXeL@B —› Вопросы новичков —› CRC32
Посл.ответ Сообщение

Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 декабря 2011 21:24
· Личное сообщение · #1

Есть простая задача - создать файл размером 4 байта с заданным CRC32.
Для этого можно использовать PEiD - плагин CRC32 натравить на пустой файл и ввести необходимое значение CRC. Однако таких файлов будет ~20k

В сети ничего готового не нашел (fakecrc не подходит).
Есть желание переделать для своих целей этот алгоритм:

Code:
  1. #include<stdio.h>
  2. unsigned long c,c2,p2,pol=0xEDB88320;
  3. long n,k;
  4. main()
  5. {
  6. printf("CRC32 Adjuster (c) 2001 by RElf @ HHT/2\n");
  7. printf("Length of data: "); scanf("%ld",&n);
  8. printf("Offset to patch: "); scanf("%ld",&k);
  9. = (n-k)<<3;
  10. printf("Current CRC32: 0x"); scanf("%x",&c);
  11. printf("Desired CRC32: 0x"); scanf("%x",&c2);
  12. c ^= c2;
  13. p2 = (pol << 1) | 1;
  14. while(n--) if(c&0x80000000) c = (c<<1)^p2; else c<<=1;
  15. printf("XOR masks:%02X%02X%02X%02X\n",c&0xff,(c>>8)&0xff,(c>>16)&0xff, c>>24);
  16. }


Буду благодарен за любую помощь.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 декабря 2011 21:46 · Поправил: Yuri4850
· Личное сообщение · #2

Насколько я понимаю, "Current CRC32", n и k в моем случае равны 0. Соответственно строки 9, 12 - 14 пропускаю.

Беру файл в четыре байта ( 69 12 36 С6 ), созданный пейдом, с CRC32 83D3E67B.
Беру 83D3E67B в качестве "Desired CRC32" и прогоняю через алгоритм. На выходе, естественно, получаю байты 7B E6 D3 83

Что я делаю не так?



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 11 декабря 2011 23:51
· Личное сообщение · #3

Обычно CRC считают по схеме CRC32 = NOT CalcCRC32(<DATA>,0xFFFFFFFF)

Code:
  1. {$Apptype Console}{$H-,I-,R-,E-,S-,Q-,N-,L-,Y-}
  2.  
  3. Type
  4.   crcword = LongInt;
  5.  
  6. var
  7.   CRC32Table    : array[0..255]of crcword;
  8.   CRC32TableINV : array[0..255]of byte;
  9.  
  10. const
  11.   CRCPOLY = $EDB88320;
  12.  
  13. function IntToHex(i: LongInt): string;
  14. const
  15.   HEXdigits: array[0..15]of char = '0123456789ABCDEF';
  16. begin
  17.   IntToHex[0]:= #8;
  18.   IntToHex[1]:= HEXdigits[((shr 28)and $0F)];
  19.   IntToHex[2]:= HEXdigits[((shr 24)and $0F)];
  20.   IntToHex[3]:= HEXdigits[((shr 20)and $0F)];
  21.   IntToHex[4]:= HEXdigits[((shr 16)and $0F)];
  22.   IntToHex[5]:= HEXdigits[((shr 12)and $0F)];
  23.   IntToHex[6]:= HEXdigits[((shr 08)and $0F)];
  24.   IntToHex[7]:= HEXdigits[((shr 04)and $0F)];
  25.   IntToHex[8]:= HEXdigits[( i        and $0F)];
  26. end;
  27.  
  28. procedure mkCrcTab;
  29. var
  30.   i,: integer;
  31.   c   : crcword;
  32. begin
  33.   for i:= 0 to 255 do begin
  34.     c:= i;
  35.     for j:= 0 to 7 do
  36.       if boolean(and 1)
  37.       then c:= (shr 1) xor CRCPOLY
  38.       else c:= (shr 1);
  39.     CRC32Table    [i]:= c;
  40.     CRC32TableINV[byte(shr 24)]:= i;
  41.   end;
  42. end;
  43.  
  44. function CRC32(x: crcword; c:byte): crcword;
  45. begin
  46.   CRC32:= (((x)shr 8)xor CRC32Table[Byte((x)xor(c))]);
  47. end;
  48.  
  49. function CRC_Fitter(DesiredCRC,CurrentCRC: LongInt): LongInt;
  50. var
  51.   TempByte_1,TempByte_2,TempByte_3,Byte_1,Byte_2,Byte_3: Byte;
  52.   Temp    : LongInt;
  53. begin
  54.   TempByte_1:= CRC32TableINV[Byte(DesiredCRC shr 24)];
  55.   Temp      := DesiredCRC  xor CRC32Table[TempByte_1];
  56.   TempByte_2:= CRC32TableINV[Byte(Temp shr 16)];
  57.   Temp      := (Temp shl 8)xor CRC32Table[TempByte_2];
  58.   TempByte_3:= CRC32TableINV[Byte(Temp shr 16)];
  59.   Temp      := (Temp shl 8)xor CRC32Table[TempByte_3];
  60.  
  61.   Byte_1    := Byte(CurrentCRC)xor CRC32TableINV[Temp shr 16];
  62.   Temp      := CRC32(CurrentCRC,Byte_1);
  63.   Byte_2    := TempByte_3 xor Byte(Temp);
  64.   Temp      := CRC32(Temp      ,Byte_2);
  65.   Byte_3    := TempByte_2 xor Byte(Temp);
  66.   Temp      := CRC32(Temp      ,Byte_3);
  67.  
  68.   CRC_Fitter:= LongInt(word((Byte_2                   )shl 8)or Byte_1)or
  69.                LongInt(word((TempByte_1 xor Byte(Temp))shl 8)or Byte_3)shl 16;
  70. end;
  71.  
  72. begin
  73.   mkCrcTab;
  74.   writeln(IntToHex(CRC_Fitter(NOT $C6361269,$FFFFFFFF)));
  75. end.


P.S. извините за корявый код, это с мясом выдрано из одного проекта.




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 11 декабря 2011 23:55 · Поправил: mysterio
· Личное сообщение · #4

-DEL ME-

-----
Don_t hate the cracker - hate the code.




Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 декабря 2011 01:03
· Личное сообщение · #5

CRC у меня уже посчитан.
Нужно решить обратную задачу - создать файл с заданным CRC (и при этом минимального размера - 4 байта в данном случае).



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 12 декабря 2011 01:27
· Личное сообщение · #6

Yuri4850 пишет:
CRC у меня уже посчитан.Нужно решить обратную задачу

см. код выше. работает. файл под crc=0xC6361269 будет (BD CF 25 8B)



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 декабря 2011 01:34
· Личное сообщение · #7

yagello, упс, похоже на правду, буду разбираться.
Просто фраза о расчете CRC сбила с пути




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 декабря 2011 07:01 · Поправил: PE_Kill
· Личное сообщение · #8

Yuri4850 твой случай является частным для теории CRC. Поэтому найти Msg32 под Crc32 - фактически найти делимое по остатку, а тот факт, что при делении не применяются переносы бит, вообще всё сводит к сдвигу бит и их перексориванию. Вот побитовый алгоритм:

Code:
  1. type
  2.   TData = packed array [0..3] of Byte;
  3.  
  4. procedure CreateDataForCrc32(Crc32: Cardinal; var Data: TData);
  5. var
  6.   Reg : Cardinal;
  7.   b: Byte;
  8. begin
  9.   Reg := not Crc32;
  10.   for b := 31 downto 0 do
  11.   begin
  12.     if Reg shr 31 = 1 then
  13.       Reg := ((Reg xor $EDB88320) shl 1) or 1
  14.     else
  15.       Reg := Reg shl 1
  16.     ;
  17.   end;
  18.   Reg := not Reg;
  19.   Move(Reg, Data, 4);
  20. end;
  21.  
  22. var
  23.   dwCrc32: Cardinal;
  24.   Data: TData;
  25.  
  26. begin
  27.   try
  28.     dwCrc32 := $C6361269;
  29.     CreateDataForCrc32(dwCrc32, Data);
  30.     WriteLn(Format('Data for CRC32(%.08X): %.02X %.02X %.02X %.02X', [dwCrc32, Data[0], Data[1], Data[2], Data[3]]));
  31.   except
  32.     on E:Exception do
  33.       Writeln(E.Classname, ': ', E.Message);
  34.   end;
  35. end.


Результат: Data for CRC32(C6361269): BD CF 25 8B

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

-----
Yann Tiersen best and do not fuck




Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 декабря 2011 01:17
· Личное сообщение · #9

Всем спасибо, получилось-таки.
Если кому интересно, вот вариант на VB :

Code:
  1. Const CRCPOLYNEW As Long = &HDB710641
  2. Sub CRC32Fix()
  3.     Dim crctarg As Long
  4.     crctarg = &HC6361269
  5.     Debug.Print Create4(crctarg)
  6. End Sub
  7. Private Function Create4(ByVal crc As Long) As String
  8.     Dim bytes(0 To 3) As Byte, n As Byte
  9.     For n = 0 To 31
  10.         If (crc And &H80000000) = 0 Then crc = shl(crc, 1) Xor CRCPOLYNEW Else crc = shl(crc, 1)
  11.     Next
  12.     PutMem4 bytes(0), Not crc
  13.     Create4 = Hex$(bytes(0)) & Hex$(bytes(1)) & Hex$(bytes(2)) & Hex$(bytes(3))
  14. End Function



 eXeL@B —› Вопросы новичков —› CRC32
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати