bios_dm4_F17_NWL_hidden_RSA_VERIFY_BYPASS_v8_FINAL.bin

Нужно разобраться где происходит взаимодействие с ec embedded controller, и какие взаимодействия происходят между ними, что они посылают друг другу или чем обмениваются какими данными в каких случаях

Dr.Binary
run_sandbox
todo_write

Файл — это Intel serial flash (4 МБ), судя по сигнатуре дескриптора 0x0FF0A55A на смещении 0x10. Сначала разберу флеш-лейаут и вырежу регионы, чтобы понять, где лежит код EC и где BIOS.

run_sandbox

Дескриптор распарсился. Лейаут:

  • Region 0 (Descriptor): 0x000000–0x000FFF
  • Region 2: 0x001000–0x17FFFF (~1.5 МБ) — кандидат на EC-прошивку/блок до BIOS
  • Region 1 (BIOS): 0x180000–0x3FFFFF (2.5 МБ)

Вырежу регионы и посмотрю, что внутри.

run_sandbox

Это HP Pavilion dm4 (Insyde H2O, CNU1375FCG). Регион 2 начинается с $FPT (flash partition table) — похоже на выделенную область EC/данных. Разберу таблицу разделов и посмотрю содержимое.

run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox
run_sandbox
run_sandbox

Регион 2 — это, судя по строкам Intel ME («ME Wake in S3…», записи NV*, EFFS), регион Intel ME, а не EC. Значит, EC-код находится в BIOS-регионе (Insyde H2O). Разберу BIOS-регион: найду firmware volumes и модули.*

run_sandbox
write_file
run_sandbox
edit_file
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
edit_file
run_sandbox
run_sandbox
edit_file
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox

FVMAIN (DXE) сжат. Теперь посмотрю на «зазор» между DXE-FV и PEI-FV (bios-rel 0x1B1000–0x221000) — там часто лежит EC-прошивка, и доработаю парсер секций (LZMA-распаковка).

run_sandbox

В FVMAIN лежит LZMA-сжатый DXE-том (стандартный EFI COMPRESSION-секция: props 5D 00 00 80 00). Распакую его и получу список всех DXE-модулей.

write_file
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox

Теперь вытащу «свободные» (FREEFORM) файлы — среди них обычно лежит сама прошивка EC — и просканирую все модули на предмет EC-строк и портов.

run_sandbox
run_sandbox

Есть попадания по портам 0x62/0x66. Теперь сопоставлю их с конкретными FFS-модулями и найду EC-драйверы по строкам.

write_file
run_sandbox

Кандидаты найдены. Посмотрю содержимое FREEFORM-файлов с обращениями к портам 0x62/0x66 и ACPI-таблиц с EC0.

write_file
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox

Вариант с option ROM'ами отпадает (там VGA BIOS/UNDI/Computrace). Теперь найду «настоящие» EC-драйверы: поищу per-file EC-строки и идентифицирую модули по их строкам.

write_file
run_sandbox

DSDT найден (EC0-методы ECRG, ECMX, FANS и т.д.). Теперь идентифицирую DXE-драйверы с портами 0x62/0x66 и проверю PEIFV/bootblock/HP-bootblock области.

write_file
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
write_file
run_sandbox
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox

Индекс оборвался на 0x362000 — допрохожу остаток FV (там как раз может быть EC-драйвер).

run_sandbox
run_sandbox

Все DXE-модули перечислены. EC-функционал у HP реализован в модулях H19 (HP ODM) и через ACPI. Теперь просканирую PEIFV, bootblock и HP-bootblock область на обращения к портам EC.

run_sandbox

Модули внутри FVMAIN сжаты по-отдельности (GUID_DEFINED). Проверю, какой алгоритм сжатия используется, и распакую их.

run_sandbox

Все модули — Tiano-сжатые (FC1BCDB0-…). Нужен декомпрессор EFI/Tiano. Возьму эталонный декодер из EDK2 и портирую его.

web_fetch
web_search
web_fetch

Алгоритм есть. Осталось взять константы из заголовка internals:

web_fetch

Все константы получены (NC=510, NPT=31, BITBUFSIZ=32, Tiano: mPBit=5). Пишу Python-порт декомпрессора Tiano и распаковываю все модули.

write_file
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
write_file
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox
run_sandbox
run_sandbox

OOM — проверю заголовки потоков (OrigSize) и добавлю ограничение.

run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox

Похоже, данные в этих секциях лежат несжатыми (заголовки секций видны в открытом виде). Проверю гипотезу: 4 байта перед секциями — контрольная сумма, а секции — raw.

run_sandbox

Разгадка: в «Tiano»-секциях Insyde данные лежат несжатыми — перед ними CRC32 (d[0x18:0x1C] = LE CRC32 от d[0x1C:]), совпадает! Значит можно парсить все секции напрямую. Извлекаю все модули и ищу EC-код.

write_file
run_sandbox
run_sandbox

Все секции подтвердились. Теперь сканирую реальные PE-модули на обращения к портам 0x62/0x66/0x64/0x60 и EC-строки.

write_file
run_sandbox
run_sandbox
run_sandbox

Есть структурные попадания. Дизассемблирую H19ODMServiceDriver (обращение к порту 0x62) и SetupUtility (порт 0x66).

run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
write_file
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox

Это x64-код. Переключаю дизассемблер в 64-bit и смотрю EC-функции.

run_sandbox

Ручной разбор долгий — подключу Ghidra-декомпиляцию для ключевых модулей. Параллельно вытащу и просканирую PEIFV и bootblock.

run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox
run_sandbox

Найдена строка «ITE851LSx» — это ITE IT851L EC, и здесь же лежит его прошивка! Локализую точнее.

run_sandbox

EC-прошивка найдена: ITE IT851L, 8051-код в блоках ~0x391000–0x3A1000 (в дампе видны опкоды 90 xx xx (mov DPTR), e0/f0 (movx) — обращение к внутренним регистрам хост-интерфейса). Теперь распарсю DSDT/SSDT с EC0.

run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox

Таблицы ACPI извлечены (DSDT 60 КБ). Теперь декомпилирую H19-модули (HP ODM EC-сервисы) через Ghidra.

dump_data
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox

Дизассемблирую ключевые места: SetupUtility (порт 0x66/0x62) и H19DxeServiceBody (0x62/0x64).

run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
run_sandbox

Прямых mov edx,0x66 нет — значит EC-доступ идёт через CpuIo-обёртки (константа порта передаётся аргументом). Ищу паттерны аргументов: push 0x66 / mov e?x, 0x66.

run_sandbox
run_sandbox

Теперь всё встало на места: общий EcLib (in/out 0x66/0x62) статически вшит в модули SmmPlatform, H19*, Bds, OemServices, и в PEIM'ы PEIFV. Дизассемблирую саму EC-библиотеку.*

run_sandbox

EC-библиотека декодирована: 0x80 = чтение EC-RAM (индекс→значение), 0x81 = запись EC-RAM (индекс+значение), через ожидание IBF/OBF. Смотрю соседние функции.

run_sandbox

Декомпилирую параллельно DSDT (EC0) и запущу Ghidra на ключевых модулях. Сначала — AML-сканер для EC0.

write_file
run_sandbox
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox

Опкод OpRegion — это 86, а не 5B 85. Правлю сканер.

write_file
run_sandbox
run_sandbox
run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox

EC-устройство — \_SB.PCI0.LPCB.H_EC (+ BAT0, AC__, LID0, FAN0, WMID, ACEL). Разбираю его AML: OpRegion, поля, методы.__

write_file
run_sandbox
run_sandbox
run_sandbox

Разбираю Field-список EC-опрегиона корректно (имя региона + FieldFlags=0x11).

run_sandbox
Error calling tool 'run_sandbox': Failed to create sandbox: Function 'create' exceeded timeout of 30.0 seconds.
run_sandbox
run_sandbox
[stopped: the account is out of credit]
Out of credits — this response was cut short.