Сейчас на форуме: Slinger, Rio (+5 невидимых)

 eXeL@B —› Основной форум —› Алгоритм CRC в CDMA телефонах
Посл.ответ Сообщение

Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 05 ноября 2006 11:08
· Личное сообщение · #1

Кто-нибудь занимается/занимался сабжем?

Не могу расколупать алгоритм формирования CRC для ESN , вот что говорит один человек:

----
алгоритм контрольной суммы придуман и реализован qualcomm inc на основе класической схемы CRC30. c начальным заполнением 3FFFFFFF и полиномом 6030B9C7 (в принципе это все что надо знать чтоб ее считать).
----

В качестве эталона выступает программа UniCDMA которая показывает этот CRC для введенного ESN, UniCDMA написана на Delphi, поэтому все функции где что считается разбираются через Dede, но вот в сам алгоритм я не врубаюсь.

Выходная CRC это 4 байта (две пары), все это свободно лежит в памяти телефона.

Есть еще CRC для внутренних команд телефона, она 2 байта и считается отлично, а вот для ESN у меня затруднения.

Может кто помочь?



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

Создано: 06 ноября 2006 04:39
· Личное сообщение · #2

Pluton пишет:
c начальным заполнением 3FFFFFFF и полиномом 6030B9C7

Интернет завален текстами стандартного алгоритма CRC32. Только в них начальное заполнение FFFFFFFF и полином EDB88320. Правда в некоторых таблица, но легко найти именно c заполнением по слову InitCRC32. Транслировать примитивную программу мне не хочется, тем более сравнивать результаты мне не с чем.



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 06 ноября 2006 05:46
· Личное сообщение · #3

tundra37tundra37 пишет:
Интернет завален текстами стандартного алгоритма CRC32. Только в них начальное заполнение FFFFFFFF и полином EDB88320. Правда в некоторых таблица, но легко найти именно c заполнением по слову InitCRC32. Транслировать примитивную программу мне не хочется, тем более сравнивать результаты мне не с чем.


Об этом я знаю, но ведь я то говорю о CRC30, а не 32




Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 06 ноября 2006 15:42
· Личное сообщение · #4

CRC16, CRC32 , а что такое CRC30 ?

-----
Что один человек сделал , другой всегда сломать может...




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

Создано: 07 ноября 2006 19:48
· Личное сообщение · #5

А ты 3FFFFFFF переведи в двоичку и поимешь. Как раз недавно подстраивал алгоритм CRC32 под свои нужды, разобрался как работает. Для CRC30 таблицу построит не проблема, а вот с расчетом интересней Тело цикла
mov bl,al;<- в eax заполнение
xor bl,byte [edx];<- буфер
shr eax,8;<-А как это сдвигать для CRC30 фик его знает ( на 7.5 наверное :s14
xor eax,cardinal [CRCtable+ebx*4];



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 07 ноября 2006 21:53
· Личное сообщение · #6

Shooshpanchik

А как ты табличку заполняешь? Мне тут сказали что дескать полином $6030B9C7, 31 бит, а не 30, и что дескать где-то тут ошибка.

я заполняю так:
----
for i := 0 to 255 do // Table initialization.
begin
c := i;
for j := 1 to 8 do
if odd(c) then
c := (c shr 1) xor $6030B9C7
else
c := (c shr 1);
CRC32Table[i] := c;
end;
-------------




Ранг: 124.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 08 ноября 2006 01:14
· Личное сообщение · #7

Pluton
ну так ты побывал тот код что чел тебе на соседнем форуме дал?
и кстати он прав, 0x6030B9C7 таки 31-битное число



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

Создано: 08 ноября 2006 01:20
· Личное сообщение · #8

Pluton
Табличка получиться 32-х битной. Слухай, универсальный способ найти в программе то место где это вычисляеться: функцию для построения таблички ищи по xor *,6030B9C7h. А место вычисления суммы по and eax,3FFFFFFFh, а уж по ним можно восстановить алгоритм.



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

Создано: 08 ноября 2006 01:40
· Личное сообщение · #9

Nitrogen пишет:
0x6030B9C7 таки 31-битное число

Просто самый старший бит в алгоритме отбрасывается. Т.е. надо задавать 0x2030B9C7
Полином 32-й степени содержит 33 бита и старший бит просто "не виден".



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 08 ноября 2006 04:59
· Личное сообщение · #10

Я стал юзать самый простой метод CRC32, не табличный, тк для посдчета crc 4 байта скорость и сложность не нужна:

-----
crc:= $3fffffff;
j:= 1;

while j<= CountS do
begin
d:= CRCArray1[j];

for i:= 0 to 7 do
begin
if ( ((crc xor d) and $1) <> 0 ) then
begin
crc:= crc shr 1;
crc:= crc xor $6030B9C7;
end
else
crc:= crc shr 1;
d:= d shr 1;
end;
j:= j + 1;
end;

crc:= crc xor $FFFFFFFF;

crc:= crc and $3FFFFFFF;

Result:= crc;
-------

Если подставить стандарное начальное заполнение и полином все считается как надо для CRC32, но для моих значенией не считает правильно.

Правильно считает UniCDMA в аттаче, вводишь ESN 8 цифр и тут же отображается CRC, при помощи DeDe обработчик который считает легко найти.

Называется он edESNChange шестой call с верху в этом обработчике и считает CRC, только вот я в асме мало что понимаю, может кто помочь разобрать что он там считает?

Я пробовал в своей процедуре полином $6030B9C7 который советуют, а также его зеркальное отражение $E39D0C06 один хрен.

8 цифр ESN храняться в памяти как 4 байта, пробовал считать как этих 4 байт так и для 8 байт напрямую, тоже не сходиться результат с UniCDMA.



9d22_08.11.2006_CRACKLAB.rU.tgz - UniCDMA.rar




Ранг: 124.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 08 ноября 2006 09:24
· Личное сообщение · #11

ну во первых там две таблички
_table_1 dd 2C201919h,0C10A0DEh,0C71D350h,2C416A97h,0CB3344Ch,2C838D8Bh
dd 2CE2FE05h,0CD247C2h,0D36FA74h,2D0643B3h,2D67303Dh,0D5789FAh
dd 2DA5D721h,0D956EE6h,0DF41D68h,2DC4A4AFh,0E3D6604h,2E0DDFC3h
dd 2E6CAC4Dh,0E5C158Ah,2EAE4B51h,0E9EF296h,0EFF8118h,2ECF38DFh
dd 2F2B8569h,0F1B3CAEh,0F7A4F20h,2F4AF6E7h,0FB8A83Ch,2F8811FBh
dd 2FE96275h,0FD9DBB2h, 82A5EE4h,281AE723h,287B94ADh, 84B2D6Ah
dd 28B973B1h, 889CA76h, 8E8B9F8h,28D8003Fh,293CBD89h, 90C044Eh
dd 96D77C0h,295DCE07h, 9AF90DCh,299F291Bh,29FE5A95h, 9CEE352h
dd 2A3721F9h,0A07983Eh,0A66EBB0h,2A565277h,0AA40CACh,2A94B56Bh
dd 2AF5C6E5h,0AC57F22h,0B21C294h,2B117B53h,2B7008DDh,0B40B11Ah
dd 2BB2EFC1h,0B825606h,0BE32588h,2BD39C4Fh, 4042F24h,243496E3h
dd 2455E56Dh, 4655CAAh,24970271h, 4A7BBB6h, 4C6C838h,24F671FFh
dd 2512CC49h, 522758Eh, 5430600h,2573BFC7h, 581E11Ch,25B158DBh
dd 25D02B55h, 5E09292h,26195039h, 629E9FEh, 6489A70h,267823B7h
dd 68A7D6Ch,26BAC4ABh,26DBB725h, 6EB0EE2h, 70FB354h,273F0A93h
dd 275E791Dh, 76EC0DAh,279C9E01h, 7AC27C6h, 7CD5448h,27FDED8Fh
dd 200E68D9h, 3ED11Eh, 5FA290h,206F1B57h, 9D458Ch,20ADFC4Bh
dd 20CC8FC5h, 0FC3602h, 1188BB4h,21283273h,214941FDh, 179F83Ah
dd 218BA6E1h, 1BB1F26h, 1DA6CA8h,21EAD56Fh, 21317C4h,2223AE03h
dd 2242DD8Dh, 272644Ah,22803A91h, 2B08356h, 2D1F0D8h,22E1491Fh
dd 2305F4A9h, 3354D6Eh, 3543EE0h,23648727h, 396D9FCh,23A6603Bh
dd 23C713B5h, 3F7AA72h,1C58CCA4h,3C687563h,3C0906EDh,1C39BF2Ah
dd 3CCBE1F1h,1CFB5836h,1C9A2BB8h,3CAA927Fh,3D4E2FC9h,1D7E960Eh
dd 1D1FE580h,3D2F5C47h,1DDD029Ch,3DEDBB5Bh,3D8CC8D5h,1DBC7112h
dd 3E45B3B9h,1E750A7Eh,1E1479F0h,3E24C037h,1ED69EECh,3EE6272Bh
dd 3E8754A5h,1EB7ED62h,1F5350D4h,3F63E913h,3F029A9Dh,1F32235Ah
dd 3FC07D81h,1FF0C446h,1F91B7C8h,3FA10E0Fh,38528B59h,1862329Eh
dd 18034110h,3833F8D7h,18C1A60Ch,38F11FCBh,38906C45h,18A0D582h
dd 19446834h,3974D1F3h,3915A27Dh,19251BBAh,39D74561h,19E7FCA6h
dd 19868F28h,39B636EFh,1A4FF444h,3A7F4D83h,3A1E3E0Dh,1A2E87CAh
dd 3ADCD911h,1AEC60D6h,1A8D1358h,3ABDAA9Fh,3B591729h,1B69AEEEh
dd 1B08DD60h,3B3864A7h,1BCA3A7Ch,3BFA83BBh,3B9BF035h,1BAB49F2h
dd 347CFA99h,144C435Eh,142D30D0h,341D8917h,14EFD7CCh,34DF6E0Bh
dd 34BE1D85h,148EA442h,156A19F4h,355AA033h,353BD3BDh,150B6A7Ah
dd 35F934A1h,15C98D66h,15A8FEE8h,3598472Fh,16618584h,36513C43h
dd 36304FCDh,1600F60Ah,36F2A8D1h,16C21116h,16A36298h,3693DB5Fh
dd 377766E9h,1747DF2Eh,1726ACA0h,37161567h,17E44BBCh,37D4F27Bh
dd 37B581F5h,17853832h,1076BD64h,304604A3h,3027772Dh,1017CEEAh
dd 30E59031h,10D529F6h,10B45A78h,3084E3BFh,31605E09h,1150E7CEh
dd 11319440h,31012D87h,11F3735Ch,31C3CA9Bh,31A2B915h,119200D2h
dd 326BC279h,125B7BBEh,123A0830h,320AB1F7h,12F8EF2Ch,32C856EBh
dd 32A92565h,12999CA2h,137D2114h,334D98D3h,332CEB5Dh,131C529Ah
dd 33EE0C41h,13DEB586h,13BFC608h,338F7FCFh

_table_2 dd 336D1A92h, 6EA8CE3h,0DD519C6h,1BAA338Ch,37546718h,0E9877F7h
dd 1D30EFEEh,3A61DFDCh, 173CE8Eh, 2E79D1Ch, 5CF3A38h,0B9E7470h
dd 173CE8E0h,2E79D1C0h,3CC31A47h,19B68D49h, 0C112BDh, 182257Ah

по мне это на CRC32 даже близко не похоже

вот чуть подредактин на асме:
some_crc proc _input_dword:DWORD
local loop_count:dword

так что бы на пальцах - наш ESN, ну например 0x12345678
mov eax, _input_dword
shr eax, 18h

zzz:=esn shr $18 ;zzz=0x12

mov edi, _table_1[eax*4]

xxx:=_table_1[xxx]

mov ecx, _input_dword
and ecx, 0FFFFFFh
mov esi, ecx

esi:=esn and $FFFFFF ;esi=0x345678

ну тут дальше идет цикл for i:=0 to 17

xor eax, eax
mov loop_count, eax

loop:
mov ecx, loop_count
xor edx, edx
inc edx
shl edx, cl
edx:=1 shl i ;хз можно ли так, на ЯВУ не писал сто лет
xor edx, esi
edx:=edx xor esi
cmp edx, esi
jnb short @F
mov eax, loop_count
mov edx, _table_2[eax*4]
esi:= esi xor _table_2[i+1]
xor esi, edx
@@:
inc loop_count
cmp loop_count, 18h
jl short loop
mov eax, edi
some_crc endp




Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 08 ноября 2006 21:05
· Личное сообщение · #12

Nitrogen

Может это компилятор все перевернул, ведь юзается табличка, в ней формируются значения при помощи полинома, странно что две таблички.

Ты сам то проверял эту процедуру вырезанную? Дает она теже значения что и программа в GUI считает? Я наверное не смогу это все под Delphi адаптировать.




Ранг: 124.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 08 ноября 2006 22:42
· Личное сообщение · #13

Pluton
а че там адаптировать? я часть тебе написал
то что таблицы - это у тебя будет array с забитыми значениями
табличка не генерируется - она зашита константой



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2006 03:37
· Личное сообщение · #14

Nitrogen

Все. всем спасибо, перевели этот код в паскаль добрые люди. Вообще эта табличка же формируется через полином, можно ее online заполнять, а можно в качестве константы держать, так что это CRC алгоритм, только непонятный какой-то и вторая таблица тоже непонятно для чего.




Ранг: 124.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 09 ноября 2006 03:43
· Личное сообщение · #15

Pluton
вот именно не понятно одно, не понятно другое и с чего вообще ты взял что ее можно создать с помощью crc32 с измененными константами



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

Создано: 09 ноября 2006 05:41 · Поправил: tundra37
· Личное сообщение · #16

По длинам напоминает blowfish P-box 18 двойных слов и S-box 256. Правда в blowfish S-box в 4 раза больше. Судя по Интернету для ESN считают хеш или что-то криптуют, т.ч. это не CRC. Скорее всего сигнатура/сертификат подлинности.
============================
А вот какой-то A-key и там таблица похожая.
kgb.scriptmania.com/



Ранг: 50.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2006 07:12
· Личное сообщение · #17

Nitrogen пишет:
вот именно не понятно одно, не понятно другое и с чего вообще ты взял что ее можно создать с помощью crc32 с измененными константами


Потому что все CRC алгоритмы основаны на одном алгоритме, но с разными начальными значениями и полиномом, а уж как он реализован, таблицой или нет, дело десятое, вот я и рыл в этом направлении, тем более знающий человек прям так и сказал.



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

Создано: 12 ноября 2006 09:07
· Личное сообщение · #18

www.zorc.breitbandkatze.de/crc.html
30 бит полином 2030B9C7, Initial & Final= 3FFFFFFF, direct, галочек в реверсе нет( для CRC32 есть обе).
Это и есть искомая функция. Кроме скрипта(см. в виде HTML), есть ссылка на чистый СИ.


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


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