Обратный инжиниринг комбинированный CRC / командный байт - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть неизвестный хеш / CR C байт, который является 4-битным случайным / crc / unknown и 4-битными контрольными флагами. Каждый раз, когда командный байт виден, он может иметь в общей сложности 16 различных байтовых форм. И будет 16 разных групп. Столкновения не происходит, и каждый байт виден только один раз. Я занимаюсь разработкой платы управления лазером Moshiboard / MS10105. Таким образом, некоторые из флагов кода могут быть угаданы. Логично предположить, что различия между включением лазера и его выключением должны быть немного перевернутыми.

Это похоже на solid головоломку, но я не могу понять это. Есть много информации для go, но также много неизвестных. Некоторые контрольные группы никогда не появляются, и поэтому у меня их нет.

1. 0A 0E 1A 1E 4A 4E 51 53 59 5A 5B 5E 71 74 79 7B
2. 00 01 03 04 09 0C 10 14 21 23 29 2B 40 44 50 54
3. 55 57 5D 5F 75 77 7D 7F 8A 8E 9A 9E CA CE DA DE
4. 05 07 0D 0F 25 27 2D 2F 80 84 90 94 C0 C4 D0 D4
5. AA AE BA BE D5 D7 DD DF EA EE F5 F7 FA FD FE FF
6. 15 17 1D 1F 35 37 3D 3F 88 8C 98 9C C8 CC D8 DC
7. 45 47 4D 4F 65 67 6D 6F 82 86 92 96 C2 C6 D2 D6
8. A2 A6 B2 B6 C5 C7 CD CF E2 E5 E6 E7 ED EF F2 F6

Примечание: они отсортированы по номерам, поскольку их фактический порядок неизвестен.

Существует частичное версии другого диапазона кодов команд 08 0C 13 19 1B 1C 31 3B 48 58 5C ?? ?? ?? ?? ??, которые я мог бы выяснить с большим размером выборки. Хотя, вероятно, я мог бы также понять это только по шаблонам.

1. Command header control byte. Followed by 1 int16_le. (Speed, Unk)
2. Position byte. Followed by 3 int16_le
3. Laser Off, X value, Y value. Followed by 2 int16_le
4. Termination byte. 0 int16_le
5. Laser On, X value, Y value. Followed by 2 int16_le
6. Laser Off, Y value. Followed by 1 int16_le
7. Laser Off, X value. Followed by 1 int16_le
8: Laser On, X value. Followed by 1 int16_le.

Теперь разумно предположить, что 3 и 5 немного отличаются. И 7 и 8 немного отличаются. И в байт-кодах есть куча паттернов. И 4 из этих битов случайные sh. Они могут быть CR C или на самом деле просто случайными, байты равномерно распределены внутри группы. Таким образом, 4 неконтролирующих байта, вероятно, являются чем-то равномерно распределенным.

Учитывая, что я не знаю ha sh или даже где расположен какой-либо из этих байтов. Это разрешимо? Я думаю, что позиция была бы разрешима, если бы был очень простой способ сделать ха sh. Я ничего не знаю о битах randomi sh. И я могу только принять некоторые образованные предположения о других битах. Но такие вещи, как шаблоны 3, 4, 6 и 7, очень похожи, и я могу ясно сказать, что если вы добавите 0x50 к первым 8 байтам из 3 и вычтите 0x0A из вторых 8 байтов, эти шаблоны будут одинаковыми. Или что 4 и 6 одинаковы, если вы добавляете 0x10 для первых 8 байтов и вычитаете 0x08 из вторых 8 байтов.

Однако я не могу решить это. И части, которые я думаю, должны быть на 1 бит отстоят друг от друга из-за их контекстуального значения (3,5 и 7,8), кажутся менее похожими. Я имею в виду, что части № 5 явно 2х частей № 3. Некоторым кажется, что они сдвинуты на биты, а другие - на c количество в верхнем и нижнем полушариях.

Здесь много шаблонов, и это лазерная доска серии 2013 года, поэтому она не собирается делать что-то высокопроизводительное интенсивный.


Доступна дополнительная, казалось бы, не очень релевантная информация: https://github.com/meerk40t/moshi для проекта, а также вики там.


Все числа в шестнадцатеричном формате.

  • Что это за строки в шестнадцатеричном формате?

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

  • Они извлекаются из сетевых пакетов?

Они были перехвачены с помощью wireshark, работающего по каналу USB. Затем сообщения были отправлены на последовательный чип CH341.

  • Какие значения "x" и "y" вы использовали для генерации этого трафика c?

Значения X и Y являются позициями для лазерного резака до go до. Они задаются 16-битным прямым порядком байтов. Выпущенная команда имеет некоторый флаг относительно того, какой тип значения отправляется. Либо х или у, либо оба, и у. Это разные команды, но у каждой команды есть 16 форм.

  • Что вы подразумеваете под "с последующим 1 int16_le"

Я имею в виду, что в структуре команд за командой в одной из этих 16 форм следует единственное 16-битное целое число в форме с прямым порядком байтов.

Проблема заключается в том, что я ожидаю, что эти значения будут одинаковыми, как правило, помеченные определенными байтами включены или выключены для объяснения от программного обеспечения для лазерной резки, что эта команда хочет, чтобы доска для лазерной резки делала. Но вместо 1 команды, которая означает 1 вещь, у меня есть 16 команд, которые означают 1 (я думаю) вещь. Что кажется странным. Существует множество паттернов, но я не могу понять, что это за паттерн.

color-chart for the bytes

1 Ответ

0 голосов
/ 03 мая 2020
def swizzle(b, p7, p6, p5, p4, p3, p2, p1, p0):
    return ((b >> 0) & 1) << p0 | ((b >> 1) & 1) << p1 | \
           ((b >> 2) & 1) << p2 | ((b >> 3) & 1) << p3 | \
           ((b >> 4) & 1) << p4 | ((b >> 5) & 1) << p5 | \
           ((b >> 6) & 1) << p6 | ((b >> 7) & 1) << p7

def convert(q):
    if q & 1:
        return swizzle(q, 7, 6, 2, 4, 3, 5, 1, 0)
    else:
        return swizzle(q, 5, 1, 7, 2, 4, 3, 6, 0)

Применяется для преобразования строк кода в:

['50', '51', '52', '53', '54', '55', '56', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '8e']
['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0c', '0d', '0e', '0f', '18']
['70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f']
['20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f']
['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff']
['30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f']
['60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f']
['e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef']

Используемые шаблоны немного отличаются в зависимости от четности битов. В первом и втором строках есть ошибочное число, которое не соответствует шаблону. В обоих случаях это число увеличивается на 1 по сравнению с прогнозируемым числом. Это как минимум пригодно для использования. Может быть другой алгоритм, вызывающий колебание с ошибкой переноса, приводящим к округлению до 0x0 C, не равного 0x0B, и 0x74, не равному 0x73.

Это также предсказывает другие невидимые шаблоны:

['00', '01', '40', '03', '10', '21', '50', '23', '04', '09', '44', '0b', '14', '29', '54', '2b']
['08', '11', '48', '13', '18', '31', '58', '33', '0c', '19', '4c', '1b', '1c', '39', '5c', '3b']
['80', '05', 'c0', '07', '90', '25', 'd0', '27', '84', '0d', 'c4', '0f', '94', '2d', 'd4', '2f']
['88', '15', 'c8', '17', '98', '35', 'd8', '37', '8c', '1d', 'cc', '1f', '9c', '3d', 'dc', '3f']
['02', '41', '42', '43', '12', '61', '52', '63', '06', '49', '46', '4b', '16', '69', '56', '6b']
['0a', '51', '4a', '53', '1a', '71', '5a', '73', '0e', '59', '4e', '5b', '1e', '79', '5e', '7b']
['82', '45', 'c2', '47', '92', '65', 'd2', '67', '86', '4d', 'c6', '4f', '96', '6d', 'd6', '6f']
['8a', '55', 'ca', '57', '9a', '75', 'da', '77', '8e', '5d', 'ce', '5f', '9e', '7d', 'de', '7f']
['20', '81', '60', '83', '30', 'a1', '70', 'a3', '24', '89', '64', '8b', '34', 'a9', '74', 'ab']
['28', '91', '68', '93', '38', 'b1', '78', 'b3', '2c', '99', '6c', '9b', '3c', 'b9', '7c', 'bb']
['a0', '85', 'e0', '87', 'b0', 'a5', 'f0', 'a7', 'a4', '8d', 'e4', '8f', 'b4', 'ad', 'f4', 'af']
['a8', '95', 'e8', '97', 'b8', 'b5', 'f8', 'b7', 'ac', '9d', 'ec', '9f', 'bc', 'bd', 'fc', 'bf']
['22', 'c1', '62', 'c3', '32', 'e1', '72', 'e3', '26', 'c9', '66', 'cb', '36', 'e9', '76', 'eb']
['2a', 'd1', '6a', 'd3', '3a', 'f1', '7a', 'f3', '2e', 'd9', '6e', 'db', '3e', 'f9', '7e', 'fb']
['a2', 'c5', 'e2', 'c7', 'b2', 'e5', 'f2', 'e7', 'a6', 'cd', 'e6', 'cf', 'b6', 'ed', 'f6', 'ef']
['aa', 'd5', 'ea', 'd7', 'ba', 'f5', 'fa', 'f7', 'ae', 'dd', 'ee', 'df', 'be', 'fd', 'fe', 'ff']

Задано в порядке байтов, а не отсортировано.

...