18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
1

Расчет Контрольной суммы CRC части файла

11.01.2013, 20:33. Показов 12086. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
имеем файл OSC_13.nbf

первые 42 байта - это заголовок, где описано, для какого устройства, какая версия и какой язык в прошивке.
остальное - сама прошивка.
как подсказали люди:
CRC просчитывается простейшим способом - суммирование байтов прошивки (без заголовка). Затем это число сравнивается с CRC в заголовке (4 байта).
Можете подсказать алгоритм вычисления?

Не по теме:

а то в делфи полный ноль, но часть кода уже написали на делфи,а как расчитывать CRC не знают, просят алгоритм

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2013, 20:33
Ответы с готовыми решениями:

Расчет кода авторизации и CRC
Доброго времени суток уважаемые форумчане. Прошу помощи. Для расчета кода авторизации используется...

Расчет CRC с полиномом MODBUS
Доброго времени суток! Есть описание протокола счетчика серии СЭТ-4ТМ. Там есть пример на Паскале...

Вычисление контрольной суммы
procedure TForm1.Button5Click(Sender: TObject); Var fSave:file of byte; j,k,Ks:Integer; begin...

Вычисление контрольной суммы
Обрабатываю в программе файл по работе. Наткнулся на необходимость изменение данных в этом файле....

51
3 / 3 / 1
Регистрация: 08.12.2012
Сообщений: 59
11.01.2013, 20:53 2
В инете полно реализаций црц для файлов, только считывай файл не сначада, а с42 байта
0
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 00:28  [ТС] 3
а как проверить какой именно crc использован?
просто есть отдельная программа, которая просто расчитывает и все, специально для файлов подобных прошивок.
0
angstrom
12.01.2013, 00:32 4
Если не ошибаюсь, для CRC существует только один алгоритм (хотя и разные реализации).
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 00:39  [ТС] 5
то есть делаем:
1 + 2 + 3+ 4 + ... + ... n-1 + n
где n - конец файла.
а 1 - 42 байт прошивки?
0
angstrom
12.01.2013, 00:43 6
Один из вариантов подсчёта CRC.
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Unit CRC32;
Interface
  Const
    CRC32tab : Array[0..255] of LongInt = (
      $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,
      $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
      $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,
      $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
      $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
      $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
      $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,
      $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
      $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,
      $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
      $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,
      $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
      $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,
      $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
      $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
      $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
      $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,
      $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
      $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,
      $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
      $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,
      $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
      $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,
      $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
      $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
      $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
      $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,
      $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
      $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,
      $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
      $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,
      $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
      $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,
      $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
      $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
      $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
      $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,
      $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
      $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,
      $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
      $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,
      $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
      $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d  );
 
function UpdC32(Octet: Byte; Crc: LongInt) : LongInt;
 
Implementation
 
function UpdC32(Octet: Byte; Crc: LongInt) : LongInt;
begin
  UpdC32 := CRC32TAB[Byte(Crc XOR LongInt(Octet))] XOR ((Crc SHR 8) AND $00FFFFFF);
end;
 
end.
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 00:48  [ТС] 7
хм..
а мне надо вместо этого:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
CRC32tab : Array[0..255] of LongInt = (
      $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,
      $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
      $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,
      $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
      $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
      $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
      $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,
      $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
      $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,
      $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
      $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,
      $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
      $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,
      $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
      $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
      $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
      $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,
      $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
      $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,
      $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
      $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,
      $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
      $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,
      $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
      $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
      $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
      $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,
      $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
      $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,
      $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
      $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,
      $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
      $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,
      $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
      $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
      $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
      $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,
      $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
      $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,
      $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
      $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,
      $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
      $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d  );

просто название файла вставить?
0
angstrom
12.01.2013, 00:53 8
Считываешь файл, к примеру, в буфер и подсчитываешь:
Delphi
1
2
3
4
5
6
7
8
9
10
11
uses
  crc32;
...
var
  Crc : Longint;
  I : Integer;
...
  Crc := $FFFFFFFF;
  for I := 1 to LengthFile do
    Crc := UpdC32(Buf[I - 1], Crc);
...
3 / 3 / 1
Регистрация: 08.12.2012
Сообщений: 59
12.01.2013, 01:12 9
А почему именно црц32, это защита файла?
0
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 01:48  [ТС] 10
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
procedure TForm1.Button1Click (Sender: TObject);
var
   Present: TDateTime;
   Year, Month, Day, Hour, Min, Sec, MSec: Word;
   fs: TFileStream;
   a: array[0..6] of Byte;
 
   Buffer: PChar;
   Size: LongInt;
 
begin
   try
      currDate := Now;
      DecodeDate (currDate, Year, Month, Day);
 //Showmessage ('Now is: ' +inttostr(Year) +'/'+inttostr(Month) +'/'+inttostr(Day) );
 
      fs := nil;
// SetLength(a, 7);
      fs := TFileStream.Create ('OSV_10009U.nbf', fmOpenReadWrite);
      fs.Position := 1210066; //0x001276d2;
//Showmessage ( inttostr(fs.Seek( 1210066, soFromBeginning  )));// := 1210066; //0x001276d2;
// fs.ReadBuffer(a,7);
      a[0] := Year mod 256;
      a[1] := Year div 256;
      a[2] := Month;
      a[3] := 0;
      a[4] := 3;
      a[5] := 0;
      a[6] := Day - 1;
 
      fs := nil;
// SetLength(a, 7);
      fs := TFileStream.Create ('OSV_10009U.nbf', fmOpenRead);
      fs.Position := 42; //0x001276d2;
      fs.ReadBuffer (a, 4);
 
      fs.writeBuffer (a, 7);
      showmessage ('Patched!');
   except
      showmessage ('Patch failed!');
   end;
 
/////================
 
   try
      fs.Free;
   except
   end;
 
end;
 
procedure TForm1.Button2Click (Sender: TObject);
begin
   ShellExecute (Form1.Handle, 'open', PChar ('install.exe'), nil, nil, SW_SHOW);
end;
 
procedure TForm1.Button3Click (Sender: TObject);
var
   fs: TFileStream;
   a: array[0..3] of Byte;
   Buffer: PChar;
   Size: LongInt;
   i: integer;
   bi: integer;
   pbi: PInteger;
begin
 
   a[0] := 0;
   a[1] := 0;
   a[2] := 0;
   a[3] := 0;
   pbi := @a;
   bi := 0;
 
   fs := TFileStream.Create ('OSV_10009U.nbf', fmOpenRead);
   try
      Size := fs.Size;
      GetMem (Buffer, Size);
      try
         fs.Read (Buffer[0], Size);
         for i := 42 to Size - 1 do
         begin
            // a[(i - 42) mod 4] := a[(i - 42) mod 4] +  Byte (Buffer[i]); // накопление байтов в буфере
            a[(i - 42) mod 4] :=  Byte (Buffer[i]);
            if (i - 2) mod 4 = 3 then
               bi := bi + pbi^;
         end;
         pbi^ := bi;
          memo1.Lines.Add( 'integer = '+  inttostr(bi) );
          memo1.Lines.Add( 'bytes(0-3): ' + inttostr(a[0])+', ' + inttostr(a[1]) +', ' + inttostr(a[2]) +', ' + inttostr(a[3]) );
      finally
         FreeMem (Buffer);
 
      end;
   finally
      fs.Free;
   end;
end;

вроде вот такая процедура...
но не работает, вернее не тот результат дает...
программа выдает это:
bytes(0-3): 179, 97, 190, 47

в файле приатачена программа, которая собственно ведет расчет CRC и отображает.
на данный момент он AC 67 15 EE
а по ссылке, файл, с которыми она работает...
Вложения
Тип файла: zip FlashLoox.zip (11.7 Кб, 59 просмотров)
0
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 02:00  [ТС] 11
Цитата Сообщение от Маршак Посмотреть сообщение
А почему именно црц32, это защита файла?
знаю что CRC а вот CRC32 ли - не знаю...
это проверка файла на целоствность.
файло - прошивка на КПК

упс, вот конкретно процедура:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
procedure TForm1.Button3Click (Sender: TObject);
var
   fs: TFileStream;
   a: array[0..3] of Byte;
   Buffer: PChar;
   Size: LongInt;
   i: integer;
   bi: integer;
   pbi: PInteger;
begin
 
   a[0] := 0;
   a[1] := 0;
   a[2] := 0;
   a[3] := 0;
   pbi := @a;
   bi := 0;
 
   fs := TFileStream.Create ('OSV_10009U.nbf', fmOpenRead);
   try
      Size := fs.Size;
      GetMem (Buffer, Size);
      try
         fs.Read (Buffer[0], Size);
         for i := 42 to Size - 1 do
         begin
            // a[(i - 42) mod 4] := a[(i - 42) mod 4] +  Byte (Buffer[i]); // накопление байтов в буфере
            a[(i - 42) mod 4] :=  Byte (Buffer[i]);
            if (i - 2) mod 4 = 3 then
               bi := bi + pbi^;
         end;
         pbi^ := bi;
          memo1.Lines.Add( 'integer = '+  inttostr(bi) );
          memo1.Lines.Add( 'bytes(0-3): ' + inttostr(a[0])+', ' + inttostr(a[1]) +', ' + inttostr(a[2]) +', ' + inttostr(a[3]) );
      finally
         FreeMem (Buffer);
 
      end;
   finally
      fs.Free;
   end;
end;

а то выше я все скинул
но оно рабочее... кроме этого...
0
angstrom
12.01.2013, 02:08 12
Где сам код твоей программы и файл OSV_10009U.nbf?
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 02:23  [ТС] 13
OSV_10009U.nbf весит 37 метров, выложена ссылка в предыдущем посте на него.

Цитата Сообщение от angstrom Посмотреть сообщение
код твоей программы
Вложения
Тип файла: zip patcher0.zip (6.3 Кб, 25 просмотров)
0
angstrom
12.01.2013, 03:01 14
Если пропускать заголовок (42 байта), выходит $6DD735FE.
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 12:39  [ТС] 15
Суммировать надо не по 4 байта (UInt32), а по одному байту, но сумма накапливается в переменной типа UInt32.
вот ответили, как расчет ведется в программе FlashLoox.exe
0
angstrom
12.01.2013, 12:47 16
Алгоритм CRC именно так и работает. Лучше спросите их с какого смещения в файле начинать отсчёт, а то FlashLoox пишет какой-то стартовый адрес - $80040000.
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 13:26  [ТС] 17
а...
первые 42 байта - это заголовок
потом 512 - бутлоадер
а потом идет сколько то пустого пространства, и только потом прошивка...

спрошу, как ответят напишу..

Добавлено через 14 минут
От начала nbf файла прошивки отрезаем заголовок 42 байта, все остальное суммируем побайтно.
вот...
0
angstrom
12.01.2013, 13:29 18
Ну тогда они использую собственный алгоритм подсчёта.
18 / 18 / 6
Регистрация: 09.01.2013
Сообщений: 411
12.01.2013, 19:53  [ТС] 19
Цитата Сообщение от angstrom Посмотреть сообщение
Если пропускать заголовок (42 байта), выходит $6DD735FE.
а можете показать код расчета?
а то у меня он в 10м коде отображает...
да и считает как:
218, 97, 197, 192
0
angstrom
12.01.2013, 21:40 20
С тем модулем, что указывал
Delphi
1
2
3
4
5
      Crc := $FFFFFFFF;
      for I := 42 to Size - 1 do
        Crc := UpdC32(Byte(Buffer[I]), Crc);
 
      Memo1.Lines.Add('Подсчитанное CRC: ' + IntToHex(not Crc, 8));
12.01.2013, 21:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2013, 21:40
Помогаю со студенческими работами здесь

Создание контрольной суммы
Здравствуйте! есть массив: array of byte; { вида (0110000101100010....) } полином: polynomial:...

Вычисление контрольной суммы CRC16 (Modbus)
Нужна функция для вычисления CRC16 (Modbus). На входе есть данные (HEX) 01 17 80 01 11 02 DF 03...

Расчет контрольной суммы файла
Доброго времени, форумчане. Подскажите, пожалуйста, примеры расчета контрольной суммы файла....

Расчет контрольной суммы файла
Доброе время суток! не когда не работал с контрольными суммами, не подскажите библиотеку или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru