Модуль 08. Поиск карт в бинарнике#
Перед вами 2 МБ чисел. Где-то там лежит карта УОЗ. Этот модуль — про то, как её найти. Шесть методов, от самого дешёвого к самому трудоёмкому. Пробуйте по порядку: почти всегда останавливаетесь на 1–3.
Метод 1. Готовое описание (5 минут)#
Ищем в порядке доступности:
| Что искать | Где | Формат |
|---|---|---|
| DAMOS / A2L | Сообщества калибровщиков, платные базы, поставщики файлов | .dam, .a2l, .paf |
| OLS-проект | Обмен между тюнерами | .ols, .kp |
| XDF | Открытые сообщества TunerPro | .xdf |
| ECU definitions | RomRaider (Subaru) | .xml |
| Mappack / скрины адресов | Форумы (mhhauto, ecuedit, chiptuner) | текст/картинки |
| Драйвер ECM Titanium | База Alientech | внутри софта |
Как искать грамотно: ключ поиска — это не «Golf 2.0 TDI», а
идентификатор ПО: например 03L906018AB 1037390425, или
0281015029, или Denso 275800-8340. Ищите точный номер, потом
близкие ревизии — карты обычно на тех же смещениях внутри семейства.
Если нашли описание от соседней прошивки (та же платформа, другая ревизия) — это уже 90 % работы. Адреса сдвинуты, но структура та же. В WinOLS есть «применить проект к другому файлу» с автоподбором сдвига.
Метод 2. Автопоиск в WinOLS (15 минут)#
WinOLS сканирует файл на области, похожие на таблицы, по признакам: - монотонность/гладкость по строкам и столбцам; - разумный диапазон значений; - рядом лежащая возрастающая последовательность (кандидат в ось).
Порядок работы: 1. Задать корректный тип процессора / порядок байт (иначе всё будет мусором). 2. Задать разрядность (8/16 бит) и знаковость. 3. Запустить автопоиск, получить сотни кандидатов. 4. Отсеять по форме: смотреть в 3D-виде, оставлять «правдоподобные». 5. Опознавать по справочнику форм из модуля 04.
Сильный приём: сначала найдите оси. Их проще всего опознать: это короткие возрастающие последовательности с осмысленным шагом. Найдя ось оборотов, вы найдёте все карты, которые её используют — и это сразу отсекает 95 % ложных кандидатов.
Типовые оси и как их узнать:
| Ось | Как выглядит raw | Множитель |
|---|---|---|
| Обороты | 20, 30, 40, 50, 60, 80, 100, 120, 140, 160 | ×40 → 800…6400 |
| Обороты (16 бит) | 0x0320, 0x04B0, 0x0640… | ×1 → 800, 1200, 1600 |
| Нагрузка/наполнение | 10, 20, 30, …, 190 | ×0.01 или ×0.75 |
| MAP кПа | 20, 40, 60, 80, 100, 150, 200, 250 | ×1 или ×2 |
| Температура | 0x28, 0x50, 0x78, … | ×0.75 − 48 (Bosch) |
| TPS/педаль % | 0, 26, 51, 77, 102, 128, 153, 179, 204, 230, 255 | ×100/255 |
| Напряжение MAF | 0, 51, 102, …, 255 | ×5/255 |
| IQ дизеля мг | 0, 5, 10, 20, 30, 40, 50, 60, 80 | ×1 или ×0.01 |
Метод 3. Дифференциальный анализ (30 минут) — самый недооценённый#
Если у вас есть две прошивки, отличающиеся известным образом, дифф моментально показывает, где лежат нужные карты.
Пары, которые стоит искать:
| Пара | Что покажет дифф |
|---|---|
| Сток vs любой чужой тюнинг этого же ЭБУ | Карты, которые правят тюнеры: наддув, IQ, УОЗ, лимиты |
| 150 л.с. vs 190 л.с. одного мотора | Все карты, отвечающие за мощность |
| Версия для 95-го vs для 98-го бензина | Карты УОЗ и защиты по детонации |
| Версия с DPF vs без DPF (для рынков без требований) | Всё, что относится к DPF |
| МКПП vs АКПП | Ограничители момента, интерфейс с TCU |
| Разные годы одной модели | Изменения стратегий |
Практика:
1. Загрузить оба файла в WinOLS → Compare
2. Или бинарный дифф: изменённые байты группируются в «острова»
3. Каждый «остров» — это карта. Смотрим размеры и формы
4. Сопоставляем с известными изменениями
Ключевой момент: дифф даёт вам расположение, но не смысл. Смысл подтверждается только логом с машины (метод 6).
Метод 4. Поиск по известным величинам (20 минут)#
Вы знаете, что отсечка 6500 об/мин. Ищите:
| Величина | Что искать в hex |
|---|---|
| Отсечка 6500 | 0x1964 (6500 LE: 64 19), или 6500/40 = 162 = 0xA2 |
| Ограничение скорости 250 км/ч | 0xFA, 0x00FA, 250×... |
| Порог вентилятора 100 °C | По формуле Bosch: (100+48)/0.75 = 197 = 0xC5 |
| Целевое давление рампы 1800 бар | 0x0708 (при ×1) или другие масштабы |
| Атмосферное 1013 мбар | 0x03F5 |
| Максимальный наддув 2500 мбар | 0x09C4 |
Метод грубый, но для скаляров (1D) он работает отлично — а именно скаляры чаще всего и нужны быстро (отсечка, скорость, лимиты).
Улучшение: изменяйте параметр в машине штатными средствами (если можно), сравнивайте дампы — увидите точный адрес.
Метод 5. Реверс кода в Ghidra (часы–дни)#
Когда данных нет вообще. Подробно — модуль 09. Короткая идея:
- Найти функцию интерполяции (у всех ЭБУ одного производителя она одна и та же, вызывается сотни раз).
- Найти все вызовы этой функции.
- У каждого вызова первый аргумент — указатель на карту.
- Получить полный список карт с адресами за один проход.
- Опознать назначение по тому, что делает код дальше с результатом.
Это единственный метод, дающий исчерпывающий список карт, включая те, которые автопоиск не увидел (маленькие, ступенчатые, «некрасивые»).
Метод 6. Верификация на машине — обязательный финал любого метода#
Ни один из методов 1–5 не даёт уверенности. Уверенность даёт только это:
1. Взять карту-кандидат
2. Изменить ОДНО заметное значение на явно другое
(например, УОЗ в одной ячейке: было 20°, ставим 5°)
3. Записать
4. Вывести машину в режим, попадающий в эту ячейку
5. Смотреть live-data
→ УОЗ упал на 15° ровно в этой точке = карта опознана,
множитель подтверждён, ось подтверждена
→ Ничего не изменилось = не та карта, или её перебивает
коррекция/ограничитель, или вы не попали в ячейку
6. Вернуть значение
Это и есть «сопоставление карт с реальными данными из авто». Без этого шага вы работаете на вере.
Приёмы для верификации: - Меняйте значение в ячейке, куда легко попасть (ХХ, круиз на 2000). - Меняйте на большую величину, чтобы отличить от шума. - Меняйте «полосой» (весь столбец), чтобы гарантированно попасть. - Для карт целей (наддув, λ) смотрите не результат, а именно параметр «цель» в live-data — он реагирует мгновенно и без влияния регулятора.
08.1 Практический воркфлоу «нет документации»#
┌─ Определить процессор и endianness ──────────────────────┐
│ • по маркировке MCU на плате (фото!) │
│ • по «сигнатуре» файла (векторы прерываний в начале) │
│ • по базам: какой MCU в каком блоке │
└──────────────────────────┬───────────────────────────────┘
▼
┌─ Определить базовый адрес загрузки ──────────────────────┐
│ Файл может начинаться не с адреса 0. Ищем таблицу │
│ векторов: массив похожих значений вида 0x800xxxxx — │
│ это адреса. Их старшая часть = база │
└──────────────────────────┬───────────────────────────────┘
▼
┌─ Найти границу CODE / DATA ──────────────────────────────┐
│ Код выглядит как «шум» с повторяющимися паттернами │
│ инструкций. Данные — гладкие последовательности. │
│ Часто есть явная граница и «пустая» зона 0xFF │
└──────────────────────────┬───────────────────────────────┘
▼
┌─ Найти оси ──────────────────────────────────────────────┐
│ Короткие монотонно возрастающие последовательности │
│ с осмысленными значениями. Отметить все. │
└──────────────────────────┬───────────────────────────────┘
▼
┌─ Автопоиск карт + ручная фильтрация по форме ────────────┐
└──────────────────────────┬───────────────────────────────┘
▼
┌─ Приоритизировать: искать не всё, а нужное ──────────────┐
│ Для Stage 1 бензин турбо надо ~8 карт, а не 400. │
│ Список — в модуле 11. │
└──────────────────────────┬───────────────────────────────┘
▼
┌─ Верифицировать каждую правкой на машине ────────────────┐
└──────────────────────────────────────────────────────────┘
08.2 Как отличить карту от «не карты»#
Ложные срабатывания автопоиска — главная проблема. Признаки настоящей калибровочной карты:
✅ Размеры — «круглые»: 8×8, 16×16, 12×8, 16×10, 10×6. Редко простые числа. ✅ Значения монотонны хотя бы по одной оси. ✅ Рядом (или по общему указателю) есть возрастающая последовательность-ось. ✅ При смене типа данных карта «разваливается» — значит тип угадан верно. ✅ В 3D-виде — гладкая поверхность без иголок.
❌ Строки текста (VIN, номер ПО, отладочные строки) — читаются в ASCII. ❌ Таблицы переходов кода (jump tables) — значения похожи на адреса (одинаковая старшая часть). ❌ Таблицы DTC — повторяющиеся структуры фиксированной длины с «кодами» P0xxx. ❌ Константы фильтров/PID — короткие, не образуют поверхности. ❌ Область 0xFF/0x00 — незанятая флеш.
08.3 Приоритетный список карт для типовых задач#
Не ищите всё. Ищите то, что нужно для конкретной работы.
Бензин турбо, Stage 1 — 8 карт#
- Целевой наддув / целевое наполнение
- Упреждение (pre-control) клапана WG
- УОЗ основной
- Ограничение УОЗ / карта детонации
- Целевая λ на полной нагрузке (обогащение)
- Ограничители момента (все применимые)
- Порог overboost cut
- Ограничение по IAT / компонентная защита
Бензин атмо, Stage 1 — 4 карты#
- УОЗ основной
- Целевая λ на полной нагрузке
- VE или MAF-характеристика
- Отсечка + ограничители момента
Дизель CR, Stage 1 — 7 карт#
- Момент → IQ (основная карта количества топлива)
- Дымовой ограничитель (IQ по воздуху)
- Ограничитель IQ абсолютный / по оборотам
- Целевой наддув
- Целевое давление рампы
- SOI (момент впрыска)
- Ограничение по EGT
Диагностика чужой работы — 3 действия#
- Дифф со стоком → список того, что трогали
- Проверка ограничителей (часто «забыты» и режут результат)
- Проверка защит (часто отключены — вот где опасность)
08.4 Организация работы: делайте свою базу#
Каждый разобранный ЭБУ — актив. Заведите структуру:
/knowledge/{производитель ЭБУ}/{семейство}/{номер ПО}/
original.bin
project.ols или definitions.xdf
notes.md ← адреса, множители, что проверено, чем
verified_maps.csv ← карта | адрес | размер | тип | factor | offset | ПОДТВЕРЖДЕНО?
diff_vs_{другая}.txt
Через год у вас будет то, за что коллеги платят деньги. Через три — вы будете работать быстрее всех в городе, потому что 80 % машин повторяются.
Практическое задание#
- Возьмите открытый Subaru ROM с определениями RomRaider. Закройте определения. Попробуйте найти карту УОЗ методами 2 и 4 самостоятельно. Затем откройте определения и проверьте себя. Это упражнение — главное в модуле.
- Найдите две версии одной прошивки (сток и любой тюнинг). Сделайте дифф. Составьте список «островов» с адресами и размерами. Сколько из них вы можете опознать по форме?
- Найдите в вашем ROM: отсечку по оборотам методом 4. Проверьте правкой на машине (метод 6). Если не машина — на донорском ЭБУ через live-data.
Следующий модуль: 09. Ghidra + ИИ