Модуль 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. Первый выезд — только после проверки лога на ХХ
Что делать, если запись прервалась#
- Не выключать питание. Оставить как есть.
- Попробовать продолжить/повторить запись тем же инструментом (большинство определяют «блок в режиме программирования» и продолжают).
- Если инструмент потерял связь — попробовать повторную инициализацию без выключения зажигания.
- Только потом — выключение и повтор с нуля.
- Не пошло → bench → boot → BDM.
07.5 Контрольные суммы: подробно#
Зачем они#
ЭБУ при каждом старте (или периодически) проверяет целостность флеш. Это требование функциональной безопасности: повреждённая ячейка памяти не должна привести к неуправляемому мотору.
Типы#
| Тип | Как считается | Где |
|---|---|---|
| Простая сумма | Сложение всех слов области, результат сравнивается с записанным | Старые ЭБУ |
| Сумма + дополнение | Сумма + записанное значение = 0xFFFF…, или сумма == константа | Очень частый вариант |
| XOR | Побайтный XOR | Простые блоки |
| CRC16 / CRC32 | Полиномиальная | Современные |
| CRC + подпись | CRC для целостности + RSA/ECC-подпись для аутентичности | С ~2018 |
Сколько их#
Обычно несколько: - отдельно на область кода; - отдельно на область калибровок (иногда несколько «окон»); - иногда «внутренние» суммы конкретных таблиц; - «главная» сумма всего файла.
Как найти алгоритм самому (когда корректора нет)#
- Возьмите две заводские прошивки одного семейства.
- Найдите отличающиеся области — там же где-то будут отличающиеся суммы.
- Попробуйте: сумма uint16/uint32 по всей области, сравните с кандидатами.
- Если не сошлось — в Ghidra найдите функцию, которая в цикле читает большой диапазон адресов и сравнивает результат. Оттуда видны и границы области, и алгоритм, и адрес хранения суммы.
Симптомы неверной суммы#
- Блок не отвечает вообще (жёсткая проверка в загрузчике).
- Мотор заводится, но сразу аварийный режим и ошибка вида «внутренняя ошибка ЭБУ / контрольная сумма ПО».
- Мотор работает, но через N минут глохнет (периодическая проверка).
- Ошибка появляется только после нескольких циклов зажигания.
07.6 Иммобилайзер, VIN и клонирование#
При замене блока на контрактный или при клонировании нужно перенести не только флеш, но и EEPROM: там VIN, коды иммо, адаптации, идентификаторы.
Три сценария:
- Клон 1-в-1: флеш + EEPROM донора заменяются на данные оригинала. Блок становится «тем самым» — машина не замечает подмены. Требует, чтобы блоки были аппаратно идентичны (тот же индекс).
- Адаптация: новый блок прописывается штатной процедурой сканером (нужен PIN/SKC, доступ у дилера или расчёт по EEPROM).
- IMMO OFF: функция иммобилайзера отключается в прошивке. См. модуль 00 — только с документами.
Правило: EEPROM читаем и сохраняем ВСЕГДА, даже если сегодня она не нужна. Через месяц окажется, что нужна.
07.7 Частые ошибки новичков#
| Ошибка | Последствие | Как избежать |
|---|---|---|
| Записал файл от другой версии ЭБУ | Кирпич или неработающая машина | Сверять идентификатор ПО, размер файла, «шапку» файла |
| Не пересчитал checksum | Авария/не заводится | Автопересчёт в редакторе + проверка |
| Записал файл, полученный «из каталога», не открыв его | Мотор с чужого железа | Всегда открывать и смотреть карты перед записью |
| Работал от аккумулятора | Кирпич при просадке | Блок питания |
| Сохранил файл поверх оригинала | Нет пути назад | Иммутабельные имена, _orig только для чтения |
| Не сверил два чтения | Записал битый дамп | cmp двух чтений |
| Отключил все DTC «чтобы не мешали» | Пропустил реальную неисправность | Отключать точечно и осознанно |
| Не проверил ошибки ДО работ | Виноват в чужой поломке | Скрин ошибок в наряд |
| Читал/писал с открытыми дверями на CAN-машине | Просыпаются блоки, помеха на шине | Закрыть, не трогать |
| Обновил Windows во время записи | Кирпич | Отключить обновления на тюнинг-ноутбуке |
07.8 Отдельно: «виртуальное чтение» и файлы из каталогов#
Есть практика: не читать блок, а взять «стоковый» файл из базы по номеру ПО, поправить его и записать. Или купить готовый «Stage 1» в каталоге и залить.
Почему это опасно: - В блоке могут быть заводские варианты калибровок, отличающиеся от базы (рынок, опции, ревизия). - В блоке может быть уже чужой тюнинг, и вы затрёте его, не зная, что там было (и что клиент уже поменял железо под него). - Нет пути назад: без бэкапа вы не вернёте машину в исходное состояние. - Файл из каталога сделан для среднего экземпляра, а перед вами конкретный, с конкретным износом и конкретным топливом.
Использовать каталожные файлы можно — как отправную точку, которую вы открываете, сравниваете со стоком клиента, понимаете каждое изменение, адаптируете и проверяете логом. Заливать вслепую — это то, из-за чего существует спрос на модуль 14.
Практическое задание#
- На донорском ЭБУ: прочитайте прошивку 3 раза. Сравните все три дампа. Совпали? Теперь специально ухудшите контакт (пошевелите разъём) и прочитайте снова — увидите ли вы разницу?
- Найдите контрольную сумму в вашем учебном ROM. Подсказка: возьмите две версии одной прошивки, сделайте дифф, посмотрите на изменившиеся байты вне карт.
- Напишите себе чек-лист записи на бумаге и повесьте над рабочим местом. Серьёзно. Он окупится в первый же месяц.
Следующий модуль: 08. Поиск карт в бинарнике