file анализ алгоритма Denso

Больше
5 мес. 1 нед. назад #463 от chipadla
Целью настоящей статьи анализ одного из алгоритмов применяемых для кодирования пробега в одометрах автомобилей. Ясно, что в различных марках авто используются разные алгоритмы кодирования. Их не то чтобы много, но достаточно, чтобы сразу все не охватить. Поэтому выберем в качестве жертвы один из алгоритмов кодирования изготовителя щитков Denso. У меня под рукой два дампа с разным пробегом от Lacetti 2006 года 93C46 170695.BIN и 93C46 81156.BIN
Загрузим их в программу сравнения дампов, например вот в эту Grizzly_dump или какая есть и посмотрим результат:




Что можно полезного здесь увидеть? Первое: программа определила и показала внизу тип микросхемы 93C46. Второе: сравнила дампы и показала области где находится пробег (выделенно красным). Видно, что пробег записан в EEPROM в 3-х местах и представлен в виде 3-х байтного шестнадцатеричного числа. Вот почему я добавил к названию алгоритма Denso индекс 3. Размер дампа 128 байт, что действительно соответствует объему микосхемы серии 93С46. В левом дампе число A9 EE E7 соответствующее пробегу 81156 км., в правом 6A F9 E8 - 170695 км.

Но для понимания алгоритма кодирования приведенной информации мало. Тут два варианта: первый - брать щиток и "ездить на столе", второй - т.к. нас в данном случае интересует не результат, а сам алгоритм кодирования, то брать любой калькулятор пробега и вычислять код (с калькуляторами надо быть внимательными, их пишут люди и никто не застрахован от ошибок, в т.ч. и знаменитая тахософт). В любом случае получим определенный результат, который и показан ниже в таблице 1:
Но прежде чем начать анализ, надо разобраться с функцией XOR, поскольку эта функция применяется повсеместно. Это булева функция, по научному называется исключающее ИЛИ. Функция XOR выполняет действие над двумя операндами (м.б. и более чем два) согласно следующему правилу:

Т.е. по-простому: если операнды не равны, то результатом будет 1, иначе 0. Практически это все происходит так: любое число в какой бы системе счисления не было представлено преобразововыятся к двоичному виду, затем сравнивается побитно и результат преобразуется обратно в нужном представлении. На первом этапе лучше преобразования выполнять с помощью виндовозного калькулятора (инженерный вид), там есть кнопка XOR.
Сначала вводим 1-е число, нажимаем кнопку XOR, вводим второе число и на кнопку =.
На самом деле всю эту мутотень никто и не запоминает. Ниже я покажу как без всяких калькуляторов и таблиц пользоваться функцией XOR.


Операнд 1 Операнд 2 Результат
0 0 0
0 1 1
1 0 1
1 1 0

Т.е. по-простому: если операнды не равны, то результатом будет 1, иначе 0. Практически это все происходит так: любое число в какой бы системе счисления не было представлено преобразуется к двоичному виду, затем сравнивается побитно и результат преобразуется обратно в нужном представлении. На первом этапе лучше преобразования выполнять с помощью виндовозного калькулятора (инженерный вид), там есть кнопка XOR.
Сначала вводим 1-е число, нажимаем кнопку XOR, вводим второе число и на кнопку =.
На самом деле всю эту мутотень никто и не запоминает. Ниже я покажу как без всяких калькуляторов и таблиц пользоваться функцией XOR.




Смотрим табл.1 и думаем. Проехали от 0 км. до 9 км. Видим, что коде меняется только младшие 4-е разряда левого крайнего байта (выделено красным). Проехали от нуля 1 км., от F отнимаем 1, получаем Е. При пробеге следующего км. от Е отнимается очередная единица и т.д. и так до 9 км. с кодом F6. Отсюда делаем вывод, что за единицы километров отвечает именно эта часть кода. Обратим внимание, что символы 1, 2, 3, 4, 5 не используются. Самый младший символ 6. У разработчиков кода получилась своеобразная десятично-шестнадцатеричная система счисления.
Теперь плавно переходим к десяткам км. табл. 2.




Смотрим табл. 2. При смене пробега от 9 км. на 10 км. меняются старшие разряды байта на значение Е, при этом младшие разряды становятся F. И код становится равным EF. Ну и так далее до 19 км когда код станет равным E6. При появление пробега 20 км опять поменяется старший полубайт и станет равным D. И так по 99 км. включительно. Отсюда можно сделать вывод, что за пробег в десятки км. отвечает старший полубайт старшего слова (левый крайний байт).

Как вы думаете каким будет самое последнее число в десятках километрах в шестнадцатеричном виде? Я думаю 66. А теперь обещаннное, как мысленно хорить число без пользования калькулятором и перевода в битовое представление?
Общая формула: Операнд1 XOR Операнд2 = Результат. Здесь Операнд1 - наше число, XOR - название операции, операнд2 - число на которое "хорим", Результат - то, что получим. Как правило в качестве Операнда2 будет использоваться число состоящее из символов F, например F, FF, FFFF, FFFFFF. У функции XOR есть замечательное свойство: результатом ее выполнения является дополнение до 2-го операнда. Немного непонятно? Сейчас поясню на примере:
2 XOR F = ? Если перевести F из шестнадцатеричного представления в десятичное, то получим число 15, т.е. 0хF = 15 (здесь 0х не умножение 0 на F, а просто указание на то что за символами 0х следует число в шестнадцатеричном виде. Для десятичного представления никаких префиксов не используется). В нашем случае дополнением числа 2 будет 15 - 2 = 13. В шестнадцатеричном виде это будет число D.
Возьмем из табл.2 строку с пробегом 17 км E8. E8 XOR FF = ?. Смотрим, дополнением до 15 числа Е будет: F - E = 15 - 14 = 1, дополнением до 15 числа 8 будет: F - 8 = 15 - 8 = 7. Т.е. собираем все вместе и получаем 17. Теперь мы знаем, что Е8 XOR FF = 17. Число 17 ничего не напоминает?




Остальные диапазоны пробегов в таблицах 3-6 рассматривать подробно смыcла нет, т.к. все по аналогии с табл. 1 и 2. Красным выделены полубайты отвечающие за пробег в соответствующем диапазоне.
Ответим на два вопроса:
1. С какой точностью можно менять пробег по алгоритму Denso_3?
2. Какой максимальный пробег можно установить?
На первый вопрос, глядя на табл.1, можно сказать, что с точностью 1 км. На второй: последнее число которое можно прописать в коде равно 0х666666, что соответствует пробегу 999999 км.
И напоследок пару примеров:
1. Допустим считали дамп и в коде прописано E6 CA ED. Какой пробег? Прочитаем это число справа налево ED CA E6 и после функции XOR получим 123519.
Или подробнее:
1 - 100000 - сотни тысяч км.
2 - 20000 - десятки тыс. км.
3 - 3000 - тысячи км.
5 - 500 - сотни км.
7 - 10 - десятки км.
8 - 9 - единицы км.
_____________________
Итого: 123519 км.

2. Надо установить пробег 95436 км. Над числом 09 54 36 выполняем XOR на FF FF FF, получаем F6 AB C9. Читаем справо налево C9 AB F6.
Можно наоборот, сначала пробег прочитать справо налево 36 54 09. Затем хорим на FF FF FF, получим C9 AB F6.
Собственно и все, очень не сложный код Denso_3. Я отнюдь не утверждаю, что не надо пользоваться программами-калькуляторами. Наоборот, мозги они разгружают. Но хотя бы иметь понятие о механизме кодирования, кажется, не помешает


Список авто, работающими с щитками по алгоритму Denso-3

1. Toyota Arde denso 93c46
2. Toyota Aristo denso 93c46
3. Toyota Avensis denso 93c46 2004-2008 years
4. Toyota Celica denso 93c46 2000-2002 years
5. Toyota Celsior denso 93c46
6. Toyota Chaser denso 93c46
7. Toyota Corolla American denso 93c46 2007
8. Toyota Corolla Runx denso 93c46
9. Toyota Corolla Verso denso 93c46 2006
10. Toyota Cressida denso 93c46 1997-1999
11. Toyota Cresta denso 93c46 1997-1999
12. Toyota Crown denso 93c46 2001
13. Toyota Duet denso 93c46 1998
14. Toyota Echo denso 93c46 2000-2005
15. Toyota Emina denso 93c46
16. Toyota Fielder denso 93c46 2001-2002
17. Toyota Gracia denso 93c46
18. Toyota Harrier denso 93c46 1998-1999
19. Toyota Kluger denso 93c46
20. Toyota Landcruiser denso 93c46
21. Toyota Matrix denso 93c46 2004
22. Toyota MR-2 denso 93c46 2004
23. Toyota Odyssey denso 93c46 1998
24. Toyota Porte denso 93c46
25. Toyota Previa denso 93c46
26. Toyota Probox denso 93c46
27. Toyota Progres denso 93c46 2000
28.Toyota Pronard denso 93c46
29. Toyota Qualis denso 93c46
30. Toyota Raum denso 93c46
31. Toyota Regius denso 93c46
32. Toyota Regius Ace denso 93c46
33. Toyota RunX denso 93c46
34. Toyota Spacio denso 93c46
35. Toyota Soarer denso 93c46
36. Toyota Spacio denso 93c46 2001-2002
37. Toyota Verossa denso 93c46
38. Toyota Vios denso 93c46
39. Toyota Vista Ardeo denso 93c46
40. Toyota Vish denso 93c46

Ford
41. Ford Ranger 93c46
42. Ford Expedition 93c46 2006
Honda
43. Honda Element denso 93c46
44. Honda Integra denso 93c46 2003
45 .Honda Odyssey denso 93c46 2005

Hyundai
46. Hyundai Atos denso 93c46
47. Hyundai Grand Starex denso 93c46 2008
48. Hyundai Tiburon denso 93c46

Kia
49. Kia Shuma denso 93c46 1997-2004

Mitsubisi
50. Mitsubisi Eclips denso 93c46 2000
51. Mitsubisi Grandis denso 93c46 2006
52. Mitsubisi Montero denso 93c46 1997-2003

Suzuki
53. Suzuki Aero denso 93c46 2001-2002
54. Suzuki Eskudo denso 93c46
55. Suzuki Forenza denso 93c46 2004
56. Suzuki Ignis denso 93c46 2001
57. Suzuki Intruder denso 93c46
58. Suzuki Jimny denso 93c46 1998
59. Suzuki Wagon R denso 93c46
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.537 секунд
Работает на Kunena форум