Спасибо за пояснения! Картина стала чуть более ясная, но все равно еще много темных мест.
Про ПЗУ да, я был не прав, не правильно выразился, очевидно там есть некий ROM (у них это MASKROM), я подразумевал перезаписываемую постоянную память (flash какой нибудь).
https://github.com/Jieli-Tech/fw-Bootlo … m_stubs.ld вот тут вот нашел кусок линкер скрипта, в котором как раз указано то, что есть в maskrom`е.
Все как вы предсказывали (FreeRTOS, lz4 и reset проца). Вероятно указано не все, а только то что может быть переиспользовано.
Попробовал утилиту для генерации ключа:
Ожидаемо каждый раз она выдает разные данные для одних и тех же входных данных, т.к. kc_key = AES.get_random_bytes(8) * 2 (https://github.com/kagaimiq/jl-misctool … 8C1-L28C37)
Если AES ключ может меняться, то наверное именно им ничего кроме данных в этом кейфайле и не шифруется.
Я пока не нашел какой-то документ от вендора, где было бы расписано адресное пространство процессора, я предполагаю что там какая-то фон неймоновская архитектура с memory mapped io.
Пока что я понял, что в maskrom`е расположен стартовый адрес. куда проц переходит на poweron, который проверяет на пинах магическую последовательность и либо прыгает куда-то на адрес spi флешки (0x00 флешки вероятно) или
включает некий UBOOT1.00, который поддерживает вот эти команды.
Далее через эти команды туда в ОЗУ загружается обычно некий лоадер (вот тут есть исходники какой-то версии https://github.com/Jieli-Tech/fw-Bootloader), который уже может работать с флешкой и понимает более интересные команды.
С помощью него и происходит прошивка.
Если в самом maskrom`е нет никакой проверки efuse (я кстати пока нигде в документах и исходниках от jl не видел упоминания), а все это лежит на флешке, то вероятно исключив этот код из содержимого флешки не станет и защиты.
https://forumstatic.ru/files/001b/ca/8a/26161.pdf вот тут есть документ, как я понимаю за авторством кого-то отсюда, где предлагается заменить первые 512 байт образа прошивки, для отключения ключа.
Эта область обозначена как загрузчик, но пока не очень понятно это какой-то код или просто данные, которые ожидает увидеть загрузчик в MASKROM`е.
Могу где-то ошибаться, надо еще почитать код, посмотреть линкер скрипты, попробовать понять что и где лежит и провести какие-то эксперименты руками. Тогда будет понятнее.
В любом случае спасибо за информацию (если что-то еще расскажите и спасете время на дополнительный ресерч будет здорово), без этих начальных данных было бы все намного сложнее.
kagaimiq написал(а):key-файл состоит из 72 буквоцифр, в котором хранятся те самые 16 бит chipkey, которые потом зашифрованы при помощи AES (причём в файле хранятся как сам шифротекст, так и ключ к нему, оба 16 байт).
Вот здесь есть примеры key-файлов (они тут все сгенерированы моей утилитой, но сути это не меняет)
Не, там ПЗУ всё таки есть, иначе как чип бы переводился донглом в UBOOT1.00 (хотя конечно можно USB загрузчик и по ISP загрузить в ОЗУ, но тут совсем не этот случай), также он отвечает за саму загрузку с флешки, ну и за минимальную инициализацию чипа.
Ещё в относительно новых чипах туда ещё добавляют всякий код и библиотеки, которые через stub-ы экспортированы наружу, например куски от libc, всякие функции вроде "перезагрузить чип", "сбросить watchdog", и т.п. Иногда туда даже добавляют например FreeRTOS, или lz4. (впрочем последний используется для распаковки uboot, если он сжат тем самым lz4)
При загрузке чип считывает оттуда загрузчик "uboot" в ОЗУ, и потом он уже настраивает XIP с дешифрацией по ключу считанному из efuse (тот самый chipkey), и исполняет основную программу уже по XIP.
Эта дешифрация также есть у самого SPI интерфейса (SPI0), которая происходит при передачи данных через его DMA, поэтому заголовок прошивки тоже зашифрован, но с фиксированным ключём 0xFFFF.
Ключ находится в efuse, поэтому его можно только "дописать", в обратную сторону никак.
Это AC6369A, скорее всего. (ставить сюда его аудио-версию AC6969A думаю бессмыслено)