Реверс-инжиниринг блока Smart Key Toyota. Часть 3: Цифровая археология шины Microwire (S93C86)

Реверс-инжиниринг блока Smart Key Toyota. Часть 3: Цифровая археология шины Microwire (S93C86)

В прошлых двух статьях мы выяснили как устроена система питания блока smart key denso. Также в этой статье мы смотрели как устроен тракт кан шины в этом блоке. Сегодня мы снимем с блока Smart Key цифровую маску. Мы проследим путь данных от кремниевого кристалла памяти EEPROM до шины CAN, заставим блок общаться на столе «вживую» и подготовим почву для поиска кодов ошибок через дилерский Techstream.

1. Подключение: Логический анализатор на передовой

Чтобы увидеть, как процессор NEC общается с энергонезависимой памятью, мы подпаиваемся к выводам микросхемы EEPROM 93C86 (да, где-то есть прищепка, но искать лень). Использовать будем доступный логический анализатор (например, Saleae Logic), но работать с ним предпочтительнее в открытом ПО PulseView (проект sigrok). Я им пользуюсь всегда, я так привык и у меня линукс.

Нам понадобятся 4 канала:

  • CS (Chip Select) — выбор микросхемы (активный высокий уровень).
  • CLK (Serial Clock) — тактовая частота шины.
  • DI (Data Input) — команды и адреса от процессора к памяти.
  • DO (Data Output) — вычитываемые процессором данные.

Подаем питание на блок. Транзистор B1669 открывается, на шине +5В стабилизируется напряжение, и процессор NEC мгновенно начинает штурмовать память запросами. Поток импульсов зафиксирован, лог сохранен в CSV. Но тут мы сталкиваемся с первой аппаратной преградой.


2. Когда софт бессилен: Пишем свой декодер Microwire x16

Так выглядит запрос и ответ в Microwire x16

Попытка использовать встроенные протокол-декодеры в Saleae Logic или PulseView быстро заводит в тупик. Стандартный SPI здесь работает некорректно. Протокол Microwire имеет свои капризы:

  1. Нестандартная длина команд: Сначала идет стартовый бит (1), затем 2 бита опкода (для чтения это 10), а затем — 10-битный адрес (так как наша 93C86 работает в 16-битном режиме ORG=x16). Итого — 13 бит на заголовок.
  2. Аппаратный зазор (Dummy Bit): После получения адреса память не выдает данные сразу. Ей нужен ровно один холостой такт (синхронный ноль), чтобы «прийти в себя», и лишь затем на линии DO появляются полезные данные.
  3. Фазовый сдвиг фронтов: Процессор выставляет команды по нарастающему фронту (Rising Edge), а память выдает слова данных по спаду (Falling Edge). Чтение всей шины по одному фронту превращает дамп в кашу со сдвигом на 1 бит (вместо пустых ячеек 0xFFFF вылавливаются странные 0xFF7F).
цитата из даташита 93c86

Поскольку готовые декодеры пасовали, мы написали собственный парсер на Python. Он разделяет чтение: фиксирует команды процессора по Rising Edge, делает микросекундную паузу на Dummy Bit и собирает 16-битные слова данных строго по Falling Edge, автоматически меняя байты местами (Byte Swap).

Результат? Байт-в-байт полное совпадение с дампом, считанным профессиональным программатором на столе!

Адрес: 0x126 -> Считано слово: 0x1000
Адрес: 0x127 -> Считано слово: 0x5A4A
Адрес: 0x128 -> Считано слово: 0xEFFF
Адрес: 0x12A -> Считано слово: 0x1000
Адрес: 0x12B -> Считано слово: 0x5A4A
Адрес: 0x12C -> Считано слово: 0xEFFF
Адрес: 0x12E -> Считано слово: 0xFF00

А вот дамп который я считал программатором из 93c86 

3. Анатомия дампа: Где живут ключи?

Теперь, когда перед нами чистый, верифицированный дамп, можно заглянуть в его структуру. Без раскрытия уязвимостей и коммерческих тайн отметим главное: дамп 93C86 в режиме x16 представляет собой упорядоченный массив из 1024 слов.

Данные здесь хранятся в открытом виде (без тотального криптографического шифрования самой структуры), но защищены контрольными суммами. Ключи автомобиля (их уникальные идентификаторы Page 1, Page 2 и крипто-ключи) лежат в строго определенных страницах памяти. Процессор при старте не просто вычитывает их, он сверяет их целостность. Если контрольная сумма блока ключей нарушена — машина превратится в недвижимость.


4. Жизнь на столе: Голос из шины CAN

Блок Smart Key не должен молчать. Чтобы проверить его диагностическую активность, мы подключаем к линиям CAN-High и CAN-Low самодельный CAN-Hacker. Блок лежит на столе в полном одиночестве — к нему не подключены ни антенны, ни кнопки, ни защелка руля, ни другие блоки автомобиля. Только питание и CAN.

И блок начинает говорить! В сеть циклически сыплются следующие пакеты с периодом 1сек:

  • 0x44D [8] 4D 04 00 00 06 00 00 00 — Это статусное сообщение самого блока Smart Key (ID 0x44D традиционно закреплен за системой бесключевого доступа Toyota). Блок сообщает остальной (несуществующей на столе) сети о своем состоянии.
  • 0x630 [8] 17 00 00 00 00 00 00 00
  • 0x632 [8] 80 00 00 00 00 00 00 00
  • 0x633 [8] 81 00 00 00 00 00 00 00
    Диапазон идентификаторов 0x630–0x633 — это классические телеграммы управления питанием, зажиганием и реле (Power Management). Блок выдает эти байты, потому что «паникует»: он не видит защелки руля, не видит ответа от зажигания и пытается понять, в каком статусе находится автомобиль. Нули в данных — явный признак отсутствия связи с другими ЭБУ.

5. Анонс 4-й части: Диагностика Techstream и охота за DTC в EEPROM

Наш блок успешно запущен в лабораторных условиях, но его текущий статус на шине CAN — это крик о помощи. Наличие кучи оборванных цепей (нет антенн, нет кнопок) гарантированно заставило процессор NEC прописать в свою память пачку кодов неисправностей (DTC).

В следующей, 4-й части цикла, мы перейдем к полноценной интерактивной диагностике:

  1. Мы подключим к нашему «настольному» сетапу диагностический сканер с программой Toyota Techstream.
  2. Запишем весь сеанс обмена (запросы 0x7E0 / 0x7E8 или аналогичные диагностические ID для Smart Key).
  3. Прочитаем текущие сохраненные ошибки (например, обрывы цепей антенн B27A1 и др.).
  4. Самое главное: Мы снимем повторный лог с шины Microwire в момент работы сканера, сопоставим адреса и найдем конкретные ячейки в EEPROM 93C86, куда процессор записывает коды неисправностей (DTC) и счетчики их проявления.

PS: неполучится пока, блок сертификации же не находится в диагностической шине (500), а он находится в своей шине с Main Body ECU (250) и блоком парктроника, поэтому диагностика идёт через бодик который выполняет роль gateway и которого у меня нет.

шины кан тойота камри 500кбит и 250кбит

🛠 Об авторе:

Меня зовут Алексей. Я профессионально занимаюсь разработкой кастомной электроники, проектированием устройств автоматизации и эмуляторов автомобильных шин (CAN, LIN, K-Line). В свободное время увлекаюсь реверс-инжинирингом сложных штатных блоков управления, систем безопасности и автомобильной периферии.

Произвожу и продаю авторские CAN/LIN-хакеры, анализаторы протоколов, а также проектирую и печатаю на 3D-принтерах эргономичные корпуса для кастомных OLED-дисплеев, приборов и тестовых стендов.

Открыт к интересным инженерным задачам и коммерческим предложениям:

  • Разработка устройств под ваши задачи (от схемы до готового прототипа в корпусе).
  • Реверс-инжиниринг проприетарных протоколов связи и логики работы ЭБУ.
  • B2B-сотрудничество в сфере автоэлектроники и систем мониторинга.

📩 Связаться со мной:

Email: kozlovalex78@inbox.ru

Также некоторые интересные вещи выкладываю на мой гитхаб. И являюсь автором приложения CAN BUS Terminal для чтения кан шины через андроид приложение для ELM327.