LINUX.ORG.RU

Поиск алгоритма CRC

 , ,


0

4

имеется кусок данных из EEPROM для которого рассчитывается CRC и значение данной CRC, нужно узнать алгоритм подсчета. Вкурсе, что их бесчисленное множество может быть, но есть основания предполагать отсутствие экзотики - CRC там сугубо для защиты от случайных повреждений. Пробовал считать в НЕХ редакторе, в том числе подставляя полиномы вручную разные - без результата. Пробовал загнать в RevEng - not found.

Вот оно:

00760000014D01503E536201002500442D313332372D30352D53000000000031373139333930372E30313426F4EE540000000000030060000534C03E8D16C03E0E96C43E033C403F4E91403F0EB4443F88F08F3F0169903FB043933FD392C53FD58FC53FC9B5C53F9325C23F130DC23F796BC23F1DC6BE3FBB84BE3F6124BF3FE9AA163F1407D03FFC59044083DDC53F2D053EC09823444006001200B603EC0000001904440214096501510260260D001600D935420100350000000000000000000000000000000005008C00A6E1D53F20730040A374DC3F927589C4276872439E7251445610BDC2FC33614464E642C46A3761449B9333447FDA8D4478A942BF38D04BC4E0478A4476D82D3F9B9188C4955A95C4338B333FA57B36BFE65E672561B7DF3EEB1CDC3EF6434ABFA4B429423046624200000000015E883FDA0881BF3A297A3F4CAE67BFAF103CBE338DE83F7B249F3DC0D5BD3D

CRC подчеркнута.

Из логов проги взимодействующей с данной железкой выдернуто следующее:Whole EEPROM CRC = 1649622608 (0x62533e50)

Область по которой считается CRC идентифицирована внесением изменений и реакцией на них в виде EEPROM error либо ее отсутствием.

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

Задача - вручную модифицировать данные и пересчитать CRC чтоб все работало. Прям очень надо, само содержимое EEPROM расшифровано, осталась только CRC.

Кто что посоветует?


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

anonymous
()

Что за железка хоть?

anonymous
()

читать спеки немодно?

почти к любой железке можно найти аналогичную инженерную плату для которой вдоль и поперёк всё расписано. В большинстве случаев разработчики не заморачиваются и загрузчик остаётся почти тем-же.

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

Вот и у меня не получилось

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

halo
() автор топика
Ответ на: комментарий от MKuznetsov

Это не тот случай. Железка сугубо закрытая.

Данные эти находятся в 1-wire EEPROM, представляют собой идентификаторы, флаги, дату/время, калибровочные данные аналоговой части. Оттуда их читает ПК, записывает дату активации устройства,эту CRC и собственно все. Сие выяснено чтением логов общения компа с железкой и поиском потом соотв данных в прошиве.

halo
() автор топика
Последнее исправление: halo (всего исправлений: 1)
Ответ на: комментарий от anonymous

Далее микросхема заполнена

Далее микросхема заполнена AA55AA55AA55, изменения этой области ни на что не влияет, ошибка EEPROM error не возникает

halo
() автор топика

Данные эти находятся в 1-wire EEPROM, представляют собой идентификаторы, флаги, дату/время, калибровочные данные аналоговой части

кто изначально/штатно считает эту вашу «CRC»?

MKuznetsov ★★★★★
()
Ответ на: комментарий от beastie

Этим тоже занимаюсь

Пока без особого успеха - закрытое ПО с привязкой к железу, доступ к компу где оно стоит ограничен, ящик куда 1-wire втыкается есть только на этом компе, он далеко не только 1-wire адаптер, забрать играться весь комплект не получится.

Как налету софтайсом ковырять я примерно представляю, имея в распоряжении только набор файлов программы - нет. Советуйте, если знаете способ, попробую.

halo
() автор топика
Последнее исправление: halo (всего исправлений: 1)
Ответ на: Этим тоже занимаюсь от halo

SoftIce — давно это слово не слышал. :) Можно было бы Ida на программу натравить. Вряди там что-то пострипенно. Хотя бы зацепки были, уже по названием функций / константам до много чего догадаться можно.

По поводу самой CRC — подозреваю, что там что-то совсем стандартное. От какого участка оно считается? Можно и методом научного тыка найти, меня по байту с начала и с конца.

beastie ★★★★★
()
Ответ на: комментарий от MKuznetsov

Похоже считает комп

Изначально/штатно все выглядит так - устройство подключается к «ящику», предположительно довольно безмозглому,точно аналоговому по большей части, через него устройство «видит» компьютер, о чем радостно сообщает соответствующей надписью после чего происходят следующие изменения:

00760000014D01здесь другая CRC01002500442D313332372D30352D53000000000031373139333930372E30313426F4EE54здесь текущие датавремя00030060000534C03E8D16C03E0E96C43E033C403F4E91403F0EB4443F88F08F3F0169903FB043933FD392C53FD58FC53FC9B5C53F9325C23F130DC23F796BC23F1DC6BE3FBB84BE3F6124BF3FE9AA163F1407D03FFC59044083DDC53F2D053EC09823444006001200B603EC0000001904440214096501510260260D001600D935420100350000000000000000000000000000000005008C00A6E1D53F20730040A374DC3F927589C4276872439E7251445610BDC2FC33614464E642C46A3761449B9333447FDA8D4478A942BF38D04BC4E0478A4476D82D3F9B9188C4955A95C4338B333FA57B36BFE65E672561B7DF3EEB1CDC3EF6434ABFA4B429423046624200000000015E883FDA0881BF3A297A3F4CAE67BFAF103CBE338DE83F7B249F3DC0D5BD3D

а в компьютере появляется информация из устройства.

Если потом отключить устройство от компа и подключив к 1-wire адаптеру вернуть все как было можно подключать к компу снова, опять получая дату и CRC (другие). Если внести любые другие изменения комп пишет EEPROM error и не пишет и не читает ничего.

Сама сверхзадача как раз и «вернуть как было» на тех устройствах, где это «как было» неизвестно. Прошивки разных экземпляров разнятся содержанием, но принцип один, в одни и те же ячейки все пишется.

halo
() автор топика
Последнее исправление: halo (всего исправлений: 1)
Ответ на: комментарий от anonymous

если заполнить все нулями EEPROM error и никаких изменений в сабже

halo
() автор топика
Ответ на: комментарий от beastie

ну так лет 12 назад дело было) с тех пор далек от программизма/взлома

за наводку на IDA спасибо, читаю чо к чему пока.

Да, должно быть что-то простое, ибо делалось нормальными современными программистами и недавно, не взлома против, а зашиты от сбоев для.

halo
() автор топика
Ответ на: комментарий от anonymous

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

halo
() автор топика
Ответ на: комментарий от halo

уже выяснил. Завтра доберусь до файлов и буду пробовать.

halo
() автор топика
Ответ на: комментарий от beastie

Ещё к ней есть модуль, декомпелирующий обратно в C.

Не в бесплатной версии.

anonymous
()
Ответ на: комментарий от anonymous

длина такая странная (344 байта)

очевидно длина payload задана в 6,7 байте (4D01), за ней следует 4 байта CRC(скорее 32), далее с 11 байта сам payload (333 = 014D), итого 344 байта..

порядок байт также очевиден :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Именно

Среди прочего сегодня и это выяснил, и куда что пишется. Собственно CRC только и осталось разгадать. Такая малость, ога, начать да закончить)

halo
() автор топика
Ответ на: комментарий от beastie

тут - http://habrahabr.ru/post/220245/ пишут что: «Пользовательские функции, которые представляют реализацию задач программы, а не ее обертку из API-шных и системных вызовов, дизассемблер не распознает и называет попросту sub_цифры.»

какие признаки могут указывать на то, что это таки нужный алгоритм?

halo
() автор топика

CRC — это же остаток от деления на полином, так? То есть msg = a * d + r, где d — полином, а r — контрольная сумма. Попробуй взять два сообщения, вычесть из них CRC, а потом посчитать НОД — gcd(a1 * d, a2 * d).

trycatch ★★★
()
Ответ на: комментарий от halo

Тебе надо найти текст сообщения об ошибке «EEPROM error». Найти место, где эта строка используется для вывода сообщения. Потом найти все места, откуда этот код вызывается. Посмотреть, что там проверяют перед тем как прыгнуть на сообщение об ошибке. Выяснить, как считается то число, которое проверяют. Это и будет искомый код валидации EEPROM.

i-rinat ★★★★★
()
Ответ на: комментарий от trycatch

Полином какой брать?

Если честно слабо понял о чем речь. Или вообще не понял

a- это в данном случае что?

Туго у меня с математикой, давно это было.

Значит открываю я два сообщения (это как я понял вот эти мои наборы данных) в НЕХ редакторе, вычитаю из них их CRC, это еще может получиться. Делитель потом как искать? Как матрицы их рассматривать или как этакие длинные числа?

halo
() автор топика
Ответ на: комментарий от i-rinat

Пока понятно. Спасибо.

Как наковыряю соответствующих «подозрительных» кусков отпишусь, врядли сам осилю найти алгоритм, вся на форум надежда.

halo
() автор топика
Ответ на: комментарий от beastie

Спасибо за информацию. Как расковыряю отпишусь чего нашел.

halo
() автор топика
Ответ на: Полином какой брать? от halo

a — это частное, результат деления сообщения на полином CRC. Он не имеет значения и отбрасывается.

Делитель потом как искать? Как матрицы их рассматривать или как этакие длинные числа?

В какой-нибудь библиотеке наверняка должен быть поиск наибольшего общего делителя для полиномов. Но реализовать алгоритм Евклида для полиномов над GF(2) совсем не сложно, например, первая в гугле имплементация на джаве https://github.com/ehotinger/OldCode/blob/master/PolynomialGCD/PolynomialGCD.... .

trycatch ★★★
()
Ответ на: Полином какой брать? от halo

Суть в том, что CRC — это просто остаток от деления на полином и тут то же самое, что и обычными числами. Например, если взять число (не полином) 11 в качестве делителя и два сообщения 123, 456, то остаток от деления на 11 будет 2 и 5. НОД(123 - 2, 456 - 5) = 11.

trycatch ★★★
()
Ответ на: комментарий от i-rinat

Выяснить, как считается то число, которое проверяют. Это и будет искомый код валидации EEPROM.

можно не выяснять КАК..а просто всю проверку забить «nop» ом - ломать так ломать..

и не будет сломанный драйвер проверять сломанную прошивку :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Идея хороша)

Однако сохранить проверку очень хотелось бы - очень серьезные вещи от корректности этих данных зависят, а сбои в епромках редко, но бывают.

halo
() автор топика
Ответ на: комментарий от trycatch

Принцип понятен

Реализовать не умею. Нашел примеры для чисел, в том же bash запустил - считает, все отлично, как втуда затолкать мои данные не представляю. Приведенный пример на Яве откровенно ниасиливаю.

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

Либо попробую вот в сюда

#include <fstream> #include <iostream>

using namespace std;

unsigned int CRC32_function(unsigned char *buf, unsigned long len) { unsigned long crc_table[256]; unsigned long crc; for (int i = 0; i < 256; i++) { crc = i; for (int j = 0; j < 8; j++) crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1; crc_table = crc; }; crc = 0xFFFFFFFFUL; while (len--) crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8); return crc ^ 0xFFFFFFFFUL; }

//возвращание конечного CRC32. Достаточно вызвать эту функцию и указать имя файла, для которого будет произведён расчёт unsigned int CRC32_count(char* filename){ char buf[4096*64]; //сколько символов в файле, на самом деле, это должно быть больше, 2^31-1 будет для файла размером 2ГБ ifstream f (filename,std::ios::binary); f.read(buf,4096*64); return CRC32_function((unsigned char*)buf, f.gcount()); }

добавить вместо 0xEDB88320UL цикл перебора всех полиномов от ноликов до ffff и сравнение с имеющейся CRC. Правда тоже не очень представляю как, последнюю прогу на С++ на лабе в универе писал лет 13 назад, темнеменее мне это более простым представляется, пусть комп себе перебирает-брутфорсит)

halo
() автор топика
Ответ на: комментарий от RiseOfDeath

Поясните, что имеется ввиду?

Расчет самой CRC по предварительно заданной таблице видел, а в обратно расчете как ее применить?

halo
() автор топика
Ответ на: Идея хороша) от halo

я бы не стал взрывать себе мозг - проверить несколько вариантов и если всё мимо, то просто грубый хак..

из возможных вариантов:

  • crc32 (широко применимы несколько вариаций)
  • оно-же но с учётом порядка байт (просто поменять местами чётные/нечётные)
  • xor по 4 байта с заполнением 00 55aa aa55 (или чем там ваш eeprom заполняется)

чисто теоретически на месте CRC может быть криптоподпись - а чтобы угадывать метод,ключ и сахарок - тут совсем не тот вариант :-)

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

Поставь себя на место разработчика: тебе надо проверять целостность данных небольшого блока. В куче разных устройств. Будешь изобретать уникальный метод? нах. он нужен..

Естественно будет взято что-то готовое, быстрое и всем известное.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

xor по 4 байта с заполнением 00 55aa aa55 (или чем там ваш eeprom заполняется)

В середине длинная последовательность нулей, так что вряд ли.

anonymous
()
Ответ на: Принцип понятен от halo

Так RevEng перебирает все варианты, я так понимаю? То есть заново имплементировать не имеет смысла. Возможно, что там и не CRC, а слово «CRC» они просто использовали как синоним «контрольной суммы».

trycatch ★★★
()
Ответ на: Пока понятно. Спасибо. от halo

Вот чего удалось наковырять

Файл EEPROMGenerator.exe, в нем такое:

seg000:00052981 aHoleEepromCrcU db 'hole EEPROM CRC = %u (0x%08x).',0Ah,0

но подозреваю, что это наоборот чтение текущего значения CRC

табличек расчета невидать

halo
() автор топика
Ответ на: комментарий от Sorcerer

в понедельник наделаю примеров

На самом деле у меня даже один не совпал если речь идет именно о подборе. Опятьже в понедельник попробую разные перестановки, начинать считать с конца файла (идея выглядит перспективной, учитывая явно перевернутую относительно прочих полей запись CRC)

halo
() автор топика
Ответ на: в понедельник наделаю примеров от halo

Я не об этом. Просто подбор невозможно осуществить по одному примеру (хотя бы из-за возможно произвольных стартовых данных до суммирования, это же не обязательно 0 может быть). Получите 5 различных примеров crc+данных, тогда может и RevEng на них отработает.

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.