FPV CLUB

● Продвинутая практика ExpressLRS

HEX‑правка firmware.bin ExpressLRS 4.x

Практический маршрут для ESP‑устройств: найти начало дописанного конфигурационного блока, проверить смещения, заменить байты без сдвига файла, сравнить результат и подготовить возврат к исходной прошивке.

Граница урока: правим только дописанный unified‑блок уже совместимой прошивки. Машинный код, bootloader, partitions, RF‑калибровки и бинарники чужой модели здесь не патчим.

Что вы получите

Найдёте BASE

Локальный анализатор повторяет алгоритм ExpressLRS и показывает точный адрес блока.

Поймёте границы

Увидите четыре фиксированных слота и не затронете соседние данные.

Соберёте копию

Тренажёр меняет только два текстовых поля и сохраняет новый файл, не трогая исходник.

Карта unified‑блока

В ExpressLRS 4.1.0 функция appendToFirmware() находит конец ESP‑образа, выравнивает адрес и записывает поля последовательно. Смещения ниже считаются от найденного BASE.

СмещениеРазмерПолеКак править
BASE + 0x000128 байтproduct_nameASCII/UTF‑8, остаток заполнить 00
BASE + 0x08016 байтlua_name / имя устройстваЛучше ASCII; не превышать 16 байт
BASE + 0x090512 байтFirmware Options JSONЭкспертно: до 511 байт + завершающий 00
BASE + 0x2902048 байтHardware Layout JSONЭкспертно: до 2047 байт + завершающий 00
BASE + 0xA90переменнологотип / legacy‑маркер targetНе трогать
Точная побайтовая карта для тега ExpressLRS 4.1.0. В другой версии сверяйте файл UnifiedConfiguration.py именно выбранного тега.

Почему нельзя просто искать строку: одно имя может встретиться в коде, веб‑интерфейсе и конфигурации. Править нужно только копию в пределах вычисленного слота после BASE.

HEX‑лаборатория firmware.bin

Загрузите рабочую копию: инструмент найдёт BASE, покажет поля и сможет создать копию с новым product/Lua‑именем.

локальная обработка

Файл не загружается на fpv-club.ru и не отправляется во внешние сервисы. Options показываются только списком ключей, без Wi‑Fi‑пароля и UID.

Жду uncompressed firmware.bin с первым байтом E9.
Платформа
BASE
SHA‑256 исходника
ПолеАбсолютный адресИспользованоПрочитано
product_name
lua_name
options JSON
hardware JSON

Безопасная учебная правка двух строк

Инструмент очищает весь фиксированный слот нулями и записывает новое значение с его начала. Размер файла не меняется.

Изменения ещё не рассчитаны.
Что лаборатория намеренно не правит
  • Firmware Options: поле может содержать UID и данные Wi‑Fi; используйте Configurator/Web UI.
  • Hardware Layout: ошибка GPIO, PA/LNA или RF‑switch способна повредить устройство.
  • Данные после BASE + 0xA90, машинный код до BASE, bootloader и partition table.

Пошаговая HEX‑правка вручную

Подойдёт HxD, ImHex или другой редактор, который умеет переходить к абсолютному адресу и работать в режиме Overwrite/OVR.

  1. Подготовьте комплект возврата. Сохраните исходный firmware.bin, точный target, версию ELRS, модель и ревизию устройства. Посчитайте SHA‑256 исходника.
  2. Работайте только с копией uncompressed .bin. Не открывайте для этой процедуры .bin.gz, .elrs, полный дамп flash или файл из чужого архива.
  3. Найдите BASE лабораторией. Запишите абсолютные адреса нужных полей. Поиск строки используйте только как дополнительную проверку, не как источник адреса.
  4. Перейдите к адресу через Go to / Ctrl+G. Убедитесь, что редактор показывает абсолютное смещение и включён режим Overwrite. Режим Insert запрещён: один вставленный байт сдвинет хвост файла.
  5. Очистите весь слот значением 00. Для product name выделите ровно 128 байт, для Lua name — ровно 16. Затем, не меняя длину файла, впишите новое ASCII‑имя с начала слота.
  6. Сохраните под новым именем. Размер копии обязан совпасть с исходником байт в байт. Повторно загрузите копию в лабораторию и проверьте прочитанные значения.
  7. Сравните два файла. Все изменённые байты должны находиться только внутри выбранного слота. Изменение до BASE или после конца слота — причина не прошивать файл.

Кириллица: размер поля считается в байтах UTF‑8, а не в символах. Для совместимости дисплеев и Lua‑меню используйте ASCII; особенно в 16‑байтовом lua_name.

Экспертные поля: JSON

Как технически заменить Firmware Options JSON

Слот начинается по адресу BASE + 0x090 и занимает 512 байт. Подготовьте минифицированный JSON в UTF‑8 без BOM и комментариев; безопасный предел — 511 байт, чтобы остался завершающий 00. Очистите все 512 байт нулями и запишите JSON с начала слота в режиме Overwrite.

Практически лучше использовать ExpressLRS Configurator или Web UI: поле способно содержать UID, SSID и пароль Wi‑Fi. Не публикуйте его содержимое и Build Log с секретами.

Как технически заменить Hardware Layout JSON

Слот начинается по адресу BASE + 0x290 и занимает 2048 байт. Безопасный предел — 2047 байт плюс завершающий 00. Сначала очистите весь слот, затем запишите минифицированный JSON. Любой ключ GPIO, radio_*, power_*, PA/LNA или RF‑switch должен быть подтверждён схемой именно этой ревизии.

Для реального устройства предпочтительнее Web UI → Hardware Layout: там файл можно загрузить, перезагрузить устройство и скачать обратно для сравнения. Подробный маршрут есть в связанном материале ниже.

Нужно ли пересчитывать checksum?

Для описанных четырёх полей — нет: ExpressLRS сам дописывает их после конца ESP application image. Правка внутри уже выделенного слота не меняет ESP‑сегменты и их checksum. Это утверждение не относится к машинному коду до BASE, bootloader, partition table, сжатому .gz, подписанному образу или контейнеру производителя.

Проверка перед прошивкой

Проверка файла

  • размер совпадает с исходником;
  • лаборатория снова читает все поля;
  • diff ограничен нужным слотом;
  • target и major‑версия не менялись.

Проверка стенда

  • пропеллеры сняты;
  • антенна подключена;
  • мощность минимальная;
  • контролируются температура, UART/CRSF и телеметрия.

Загружайте копию только штатным способом, который подходит выбранному target. Для Wi‑Fi‑обновления используйте страницу Update устройства и дождитесь штатной перезагрузки. Если Web UI предупреждает о несовпадении target, не выбирайте «Flash Anyway» без отдельного подтверждения аппаратной совместимости.

Лестница восстановления

  1. Web UI доступен: загрузите сохранённый исходный firmware.bin того же target и дождитесь перезагрузки.
  2. Wi‑Fi не запускается: переходите к официальной процедуре ExpressLRS Unbricking через UART/boot‑pad для конкретного устройства.
  3. Неизвестен target: остановитесь. Сначала определите MCU, RF‑чип, диапазон, модель и ревизию платы.
  4. Есть нагрев или нестабильный RF: немедленно отключите питание; не повышайте мощность и не выполняйте дальностный тест.
Самопроверка: четыре вопроса перед записью
  1. Можно ли вставить один байт в середину файла? Нет, только Overwrite.
  2. Достаточно ли того, что размер не изменился? Нет, diff должен находиться только в разрешённом слоте.
  3. Можно ли править firmware.bin.gz напрямую? Нет, это сжатый поток.
  4. Можно ли взять .bin похожей модели? Нет, совпадение диапазона или корпуса не подтверждает target.

Связанный маршрут

Официальные источники

Проверено 10.08.2026 для ExpressLRS 4.1.0. Для другой версии сначала откройте UnifiedConfiguration.py соответствующего release tag и сверьте алгоритм и размеры слотов.

Прокрутить вверх
Напишите нам