Чип-тюнингкурс с нуля

Модуль 07. Чтение и запись ЭБУ: OBD, Bench, Boot, BDM, контрольные суммы#

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


07.1 Как ЭБУ вообще позволяет себя перепрограммировать#

Заводская схема (упрощённо, по стандартам ISO 14229 / UDS):

1. Тестер → ЭБУ:  "Перейди в режим программирования"  (DiagnosticSessionControl 0x02)
2. ЭБУ → тестер:  "Вот тебе seed (случайное число)"   (SecurityAccess 0x27 01)
3. Тестер:        считает key = f(seed) по секретному алгоритму
4. Тестер → ЭБУ:  "Вот key"                            (SecurityAccess 0x27 02)
5. ЭБУ:           проверяет. Не сошлось → отказ, счётчик попыток
6. Тестер → ЭБУ:  "Сотри блок памяти"                  (RoutineControl / EraseMemory)
7. Тестер → ЭБУ:  "Пиши данные по адресу…"             (RequestDownload 0x34 + TransferData 0x36)
8. Тестер → ЭБУ:  "Проверь целостность"                (RoutineControl CheckMemory)
9. ЭБУ:           считает checksum. Не сошлось → прошивка невалидна
10. Сброс, старт с новой прошивкой

Ключевые точки риска: - Шаг 6. После стирания старой прошивки уже нет. Прервали питание — кирпич. - Шаг 9. Неверная checksum → блок не стартует или уходит в аварию. - Шаг 3–5. Алгоритм seed/key — то, что коммерческие инструменты покупают/реверсят. Отсюда цены на них.

Современные блоки (примерно с 2018 г.) добавляют криптографическую подпись прошивки (RSA/ECC). Тут «просто поправить байт» не работает вообще: подписать вы не можете. Обходы бывают (уязвимости загрузчика, подмена ключей, режимы отладки), но это уже отдельная область.


07.2 Четыре способа доступа: когда какой#

OBD (через диагностический разъём)#

✅ Быстро, не разбирая машину ✅ Минимум риска механического повреждения ❌ Не всегда доступна вся флеш (часто только «калибровочная» часть) ❌ Шлюз (gateway) машины может блокировать ❌ Счётчики попыток программирования

Когда использовать: всегда, если протокол доступен. Это 70 % работы.

Bench (блок на столе, штатный протокол)#

✅ Обходит шлюз и другие блоки ✅ Можно спокойно повторять попытки ✅ Часто больший доступ к памяти, чем по OBD ❌ Надо снять блок (иногда это полдня — например, под впуском) ❌ Нужен правильный жгут именно под этот блок

Когда: OBD закрыт; или блок б/у и надо клонировать; или машина не заводится и не отвечает.

Boot mode / BSL#

✅ Полный доступ к флеш, включая загрузчик и защищённые области ✅ Работает на «мёртвых» блоках ❌ Вскрытие корпуса ❌ Пайка или подключение к конкретным точкам платы ❌ Легко повредить плату

Когда: нужна вся флеш; блок окирпичен; нет OBD/bench-протокола.

BDM / JTAG#

✅ Максимальный доступ, включая внутренние регистры MCU ✅ Единственный путь для многих старых Bosch (EDC15, EDC16, ME7 в части случаев) ❌ Самый высокий риск: иглы, давление, статика ❌ Требует опыта

Когда: старые блоки, полная дампа, спасение из кирпича.


07.3 Процедура безопасного чтения#

Никогда не пропускайте эти шаги. Это не бюрократия, это ваши деньги.

[ ] 1. Записать в наряд: VIN, пробег, № блока, номер ПО (по сканеру)
[ ] 2. Сфотографировать: шильдик блока, подкапотное, панель приборов
[ ] 3. Считать ОШИБКИ до работ и сохранить их (скрин)
[ ] 4. Проверить напряжение бортсети (>12.4 В на стоянке, 13.8–14.5 на ХХ)
[ ] 5. Подключить блок питания 13.8 В
[ ] 6. Выключить всё потребляющее
[ ] 7. Прочитать блок
[ ] 8. Прочитать ВТОРОЙ РАЗ, сравнить два дампа побайтно
        (совпали → чтение корректно; нет → плохой контакт/протокол)
[ ] 9. Прочитать EEPROM, если применимо
[ ]10. Сохранить в архив с именем {VIN}_{дата}_{ЭБУ}_orig.bin
[ ]11. Посчитать SHA-256 и записать в наряд
[ ]12. Скопировать на второй носитель и в облако

Пункт 8 — самый недооценённый. Битое чтение выглядит нормально, пока вы не запишете его обратно и не получите кирпич. Сверка двух чтений занимает 10 секунд:

# macOS/Linux
shasum -a 256 read1.bin read2.bin
cmp read1.bin read2.bin && echo "OK"

07.4 Процедура безопасной записи#

[ ] 1. Есть ли ПОДТВЕРЖДЁННЫЙ бэкап оригинала? (два чтения совпали)
[ ] 2. Пересчитаны ли контрольные суммы?
[ ] 3. Проверен ли файл в редакторе после правки (открывается, карты на месте)?
[ ] 4. Размер файла совпадает с оригиналом?
[ ] 5. Блок питания подключён, напряжение стабильно?
[ ] 6. Все потребители выключены?
[ ] 7. Ноутбук от сети, отключён спящий режим, отключены обновления Windows
[ ] 8. Кабели зафиксированы, никто не заденет
[ ] 9. Телефон убран, дверь мастерской закрыта — 5 минут никто не мешает
[ ]10. ЗАПИСЬ. Не трогать ничего, не выключать зажигание
[ ]11. После записи: не заводить сразу. Выключить зажигание, подождать
        30–60 с (блок должен корректно уснуть и записать данные)
[ ]12. Включить зажигание, проверить связь с блоком, прочитать ошибки
[ ]13. Пуск. Слушать. Дать поработать на ХХ 1–2 минуты
[ ]14. Проверить ошибки повторно
[ ]15. Первый выезд — только после проверки лога на ХХ

Что делать, если запись прервалась#

  1. Не выключать питание. Оставить как есть.
  2. Попробовать продолжить/повторить запись тем же инструментом (большинство определяют «блок в режиме программирования» и продолжают).
  3. Если инструмент потерял связь — попробовать повторную инициализацию без выключения зажигания.
  4. Только потом — выключение и повтор с нуля.
  5. Не пошло → bench → boot → BDM.

07.5 Контрольные суммы: подробно#

Зачем они#

ЭБУ при каждом старте (или периодически) проверяет целостность флеш. Это требование функциональной безопасности: повреждённая ячейка памяти не должна привести к неуправляемому мотору.

Типы#

Тип Как считается Где
Простая сумма Сложение всех слов области, результат сравнивается с записанным Старые ЭБУ
Сумма + дополнение Сумма + записанное значение = 0xFFFF…, или сумма == константа Очень частый вариант
XOR Побайтный XOR Простые блоки
CRC16 / CRC32 Полиномиальная Современные
CRC + подпись CRC для целостности + RSA/ECC-подпись для аутентичности С ~2018

Сколько их#

Обычно несколько: - отдельно на область кода; - отдельно на область калибровок (иногда несколько «окон»); - иногда «внутренние» суммы конкретных таблиц; - «главная» сумма всего файла.

Как найти алгоритм самому (когда корректора нет)#

  1. Возьмите две заводские прошивки одного семейства.
  2. Найдите отличающиеся области — там же где-то будут отличающиеся суммы.
  3. Попробуйте: сумма uint16/uint32 по всей области, сравните с кандидатами.
  4. Если не сошлось — в Ghidra найдите функцию, которая в цикле читает большой диапазон адресов и сравнивает результат. Оттуда видны и границы области, и алгоритм, и адрес хранения суммы.

Симптомы неверной суммы#

  • Блок не отвечает вообще (жёсткая проверка в загрузчике).
  • Мотор заводится, но сразу аварийный режим и ошибка вида «внутренняя ошибка ЭБУ / контрольная сумма ПО».
  • Мотор работает, но через N минут глохнет (периодическая проверка).
  • Ошибка появляется только после нескольких циклов зажигания.

07.6 Иммобилайзер, VIN и клонирование#

При замене блока на контрактный или при клонировании нужно перенести не только флеш, но и EEPROM: там VIN, коды иммо, адаптации, идентификаторы.

Три сценария:

  1. Клон 1-в-1: флеш + EEPROM донора заменяются на данные оригинала. Блок становится «тем самым» — машина не замечает подмены. Требует, чтобы блоки были аппаратно идентичны (тот же индекс).
  2. Адаптация: новый блок прописывается штатной процедурой сканером (нужен PIN/SKC, доступ у дилера или расчёт по EEPROM).
  3. IMMO OFF: функция иммобилайзера отключается в прошивке. См. модуль 00 — только с документами.

Правило: EEPROM читаем и сохраняем ВСЕГДА, даже если сегодня она не нужна. Через месяц окажется, что нужна.


07.7 Частые ошибки новичков#

Ошибка Последствие Как избежать
Записал файл от другой версии ЭБУ Кирпич или неработающая машина Сверять идентификатор ПО, размер файла, «шапку» файла
Не пересчитал checksum Авария/не заводится Автопересчёт в редакторе + проверка
Записал файл, полученный «из каталога», не открыв его Мотор с чужого железа Всегда открывать и смотреть карты перед записью
Работал от аккумулятора Кирпич при просадке Блок питания
Сохранил файл поверх оригинала Нет пути назад Иммутабельные имена, _orig только для чтения
Не сверил два чтения Записал битый дамп cmp двух чтений
Отключил все DTC «чтобы не мешали» Пропустил реальную неисправность Отключать точечно и осознанно
Не проверил ошибки ДО работ Виноват в чужой поломке Скрин ошибок в наряд
Читал/писал с открытыми дверями на CAN-машине Просыпаются блоки, помеха на шине Закрыть, не трогать
Обновил Windows во время записи Кирпич Отключить обновления на тюнинг-ноутбуке

07.8 Отдельно: «виртуальное чтение» и файлы из каталогов#

Есть практика: не читать блок, а взять «стоковый» файл из базы по номеру ПО, поправить его и записать. Или купить готовый «Stage 1» в каталоге и залить.

Почему это опасно: - В блоке могут быть заводские варианты калибровок, отличающиеся от базы (рынок, опции, ревизия). - В блоке может быть уже чужой тюнинг, и вы затрёте его, не зная, что там было (и что клиент уже поменял железо под него). - Нет пути назад: без бэкапа вы не вернёте машину в исходное состояние. - Файл из каталога сделан для среднего экземпляра, а перед вами конкретный, с конкретным износом и конкретным топливом.

Использовать каталожные файлы можно — как отправную точку, которую вы открываете, сравниваете со стоком клиента, понимаете каждое изменение, адаптируете и проверяете логом. Заливать вслепую — это то, из-за чего существует спрос на модуль 14.


Практическое задание#

  1. На донорском ЭБУ: прочитайте прошивку 3 раза. Сравните все три дампа. Совпали? Теперь специально ухудшите контакт (пошевелите разъём) и прочитайте снова — увидите ли вы разницу?
  2. Найдите контрольную сумму в вашем учебном ROM. Подсказка: возьмите две версии одной прошивки, сделайте дифф, посмотрите на изменившиеся байты вне карт.
  3. Напишите себе чек-лист записи на бумаге и повесьте над рабочим местом. Серьёзно. Он окупится в первый же месяц.

Следующий модуль: 08. Поиск карт в бинарнике

КПЦ — Комплекс Промышленной Цифровизации · kpc-control.ru

Материал носит образовательный характер. Работы, влияющие на состав отработавших газов и экологический класс ТС, а также корректировка показаний одометра курсом не рассматриваются как допустимая практика — см. модуль 00.