# Как продолжить и повторить исследование

## Исходные материалы

Основной файл — `C:\dump\fw_128k.bin`, 128 КиБ. Ожидаемый SHA-256:

```text
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:

```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:

```sh
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`. Воспроизведение в **новом** проекте (не перезаписывать сохранённый анализ):

```powershell
$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-проект. История чата не является единственным носителем результатов.
