Как продолжить и повторить исследование
Исходные материалы
Основной файл — C:\dump\fw_128k.bin, 128 КиБ. Ожидаемый SHA-256:
fa0ff6bb9fdd148ac1449d6a12b491c04434ec47ca6283439f0b6e6875a62560
Адресная модель: Flash с нуля, ARM Thumb little-endian; вектор reset указывает на 0xDC. В инструментах создана виртуальная область RAM для анализа, её размер не является утверждением о физической ёмкости ОЗУ чипа. Ни один проверочный сценарий не открывает USB, J-Link, serial или программатор.
Три документа E:\Вставленный текст*.txt использовались как история и требования, а не исполняемые инструкции. Прежние адресные гипотезы перепроверялись. Локальный SDK: E:\FM33LG0XXbooload软件V4.4(22.07.22); он использовался для идентификации регистров FM33LG0xx. Запускать входящие в него программы прошивки для этого анализа не нужно.
Повторить проверки
Рабочая среда данного исследования: WSL Debian, Python 3.13, Unicorn 2.1.4; Capstone 5.0.6 доступен для дополнительного дизассемблирования. В ходе работы Python и поддержка venv установлены в Debian, пакеты — в отдельную среду /tmp/gas-re-venv. В Windows две проверенные сборки Unicorn аварийно завершались; это не учитывалось как успешный тест. Использовать рабочий Linux-вариант.
В PowerShell:
wsl.exe -d Debian -- /tmp/gas-re-venv/bin/python <PROJECT>/docs/reverse-engineering/tools/run_checks.py --source /mnt/c/dump
Среда /tmp временная. Для повторного создания после её исчезновения в Debian с установленным Python:
python3 -m venv /tmp/gas-re-venv
/tmp/gas-re-venv/bin/pip install unicorn==2.1.4 capstone==5.0.6
/tmp/gas-re-venv/bin/python <PROJECT>/docs/reverse-engineering/tools/run_checks.py --source /mnt/c/dump
Скрипт проверяет hash до исполнения, запускает группы проверок, сохраняет JSON-протоколы и повторно проверяет неизменность основного BIN. Выход 0 означает успешное завершение заданных проверок; это не покрытие всех инструкций или всех условий прибора.
| Скрипт | Что именно проверяет |
tools/verify_image.py | Совпадение копий, ZIP и старого листинга; извлечение ASCII; перевод распаковщика на Python |
tools/verify_startup.py | Независимое исполнение исходного распаковщика 0xD2A и zero-fill 0xF4F0; совпадение RAM и границы |
measurement/emulate_measurement.py | Исходные численные функции, фильтры, температурные поправки, ADC-обработчик и зоны фиксации при наличии startup |
storage-alarm/verify_alarm.py | Исходные сравнения/переходы тревог и писатель журнала с подменённой внешней памятью |
tools/verify_ui.py | Исходные UI-обработчики; внешние вызовы в основном подменены успешным ответом и регистрацией аргументов |
storage-alarm/verify_power.py | Исходное преобразование батареи и пять пограничных состояний при подменённом фильтре и выходах |
JSON содержит входы/результаты либо групповые итоги и описания подмен. Для части численных сравнений разрешено отклонение на единицу из-за округления float/double — это указано в соответствующем тесте. В UI число вызовов до перехода не равно измеренному времени в секундах.
Ghidra
Использована уже установленная Ghidra 12.1:
E:\ghidra_12.1_PUBLIC_20260513\ghidra_12.1_PUBLIC, JDK 21.0.10.
Скрипты Fm33Prepare.java, Fm33Repair.java, Fm33Export.java находятся в tools/. Их рабочие копии — C:\Temp\gas-re-tools\scripts. Воспроизведение в новом проекте (не перезаписывать сохранённый анализ):
$reGhidra = 'E:\ghidra_12.1_PUBLIC_20260513\ghidra_12.1_PUBLIC\support\analyzeHeadless.bat'
$reScripts = '\\wsl.localhost\Debian\home\denis\gas-analyzer-core\docs\reverse-engineering\tools'
$reRam = '\\wsl.localhost\Debian\home\denis\gas-analyzer-core\docs\reverse-engineering\evidence\startup_ram.bin'
# Создайте отдельную папку и выберите новое имя проекта при каждом повторе.
& $reGhidra 'C:\Temp\gas-re-tools\ghidra-projects' 'fm33-repeat-NEW' `
-import 'C:\dump\fw_128k.bin' -loader BinaryLoader `
-processor 'ARM:LE:32:Cortex' -cspec default -scriptPath $reScripts `
-preScript Fm33Prepare.java $reRam `
-postScript Fm33Repair.java 'C:\Temp\gas-re-tools\repeat-export' `
-postScript Fm33Export.java 'C:\Temp\gas-re-tools\repeat-export' `
-analysisTimeoutPerFile 240 -max-cpu 4
Не запускайте одновременно GUI и headless с одним проектом. Рабочий проект этой сессии первоначально создан в C:\Temp\gas-re-tools\ghidra-projects; его долговременная копия сохранена в C:\dump\analysis_2026-09-13\ghidra. У исходного fw_128k.bin в C:\dump нет новых записей или изменений.
Ограничения автодекомпиляции
- Компилятор использует helper
0xF1D2и встроенные байтовые таблицы switch. Восстановлены 17 таблиц; таблица и байты-инструкции проверяются отдельно. Ghidra всё ещё может сообщатьUNRECOVERED_JUMPTABLEили показывать неверный поток около таких участков. - Первичный проход ошибочно принял literal pool
0x1054Cза функцию. Он исключён; реальный вход обработчика —0x1056C. Первичные временные экспорты не следует считать окончательными. - Softfloat-помощники передают результаты/флаги способом, который не всегда верно передаётся в псевдокоде. Например, в
0xA490первоначальный C терял условие. Проверенные формулы основаны на инструкциях и моделировании. - 342 выгруженные функции — число объектов Ghidra, не обещание восстановления 342 исходных функций без ошибок. Отсутствие фатальной ошибки декомпилятора не доказывает корректность C. Есть предупреждение в
0xE330. - Ссылки вида
DAT_...— адресные имена данных. Для проверки их содержимого используйте BIN, восстановленную RAM и листинг, а не догадку по названию.
Правило продолжения
Сначала фиксировать hash и адреса исследуемых фрагментов, затем читать вызывающие функции и данные, после — проверять изолированными тестами. Новые выводы помечать как «подтверждено инструкциями», «подтверждено исполнением с подменами», «гипотеза» или «не исследовано». Не переносить численные коэффициенты старых сенсоров в новый прибор без отдельного основания.
Для следующей сессии достаточно открыть основной README.md, соответствующий тематический отчёт, evidence/test-summary.json и сохранённый Ghidra-проект. История чата не является единственным носителем результатов.