Содержание статьи
Нас повсюду окружают электронные цифровые устройства. Многие телевизоры, автомагнитолы, мониторы, маршрутизаторы, материнские платы компьютеров и ноутбуков хранят свои управляющие программы в микросхемах памяти SPI Flash. Иногда для ремонта или расширения функциональности таких устройств требуется перепрошивка. А может, ты задумываешься о надежном хранении небольших объемов ценной для тебя информации? Тогда читай о том, как можно использовать для этой цели SPI Flash!
Вещь в себе
Однажды мне в руки попал SOHO-маршрутизатор Ethernet/Wi-Fi, который на поверку оказался одним из брендированных вариантов ZTE H118N. Он включался, работал, но был практически бесполезен без контракта с интернет‑провайдером. Настройки в веб‑интерфейсе оказались заблокированными, сетевые службы — отключенными, а поиск в интернете показал, что превратить его во что‑то более‑менее пригодное можно лишь путем замены firmware — программного обеспечения, хранящегося в микросхеме постоянного запоминающего устройства. Изготовитель маршрутизатора позаботился о том, чтобы пресечь программный способ замены содержимого постоянной памяти. Но путь «перепрошивки» с помощью программатора остался открытым.
info
Если ты думаешь, что против отвертки и паяльника бессильно любое электронное устройство, то спешу тебя разочаровать. Некоторые компоненты информационных систем финансового сектора, например платежные терминалы и банкоматы, помимо программной защиты, имеют защиту физическую. При попытке вскрыть корпус таких устройств хранящиеся в них данные могут быть безвозвратно утрачены из‑за отключения поддерживающего электропитания или физически разрушится носитель информации, например подачей электрического импульса от предусмотрительно установленной батарейки. В последнем случае возможны даже шумо‑дымовые эффекты.
Продолжив изучать вопрос, я узнал, что на некоторые маршрутизаторы подобного класса можно установить операционную систему OpenWrt на основе Linux, значительно расширяющую их возможности. Заодно не без интереса почитал на форумах дискуссии, посвященные восстановлению маршрутизаторов, «окирпиченных» (не подающих признаков жизни) неудачными попытками такой установки. В особо тяжелых случаях эта процедура сводится к загрузке «дампов» (образов firmware) с помощью программатора. К тому же оказалось, что маршрутизаторы разных производителей, построенные на одной или схожей аппаратной платформе, могут функционировать под управлением программного обеспечения конкурентов. В общем, вся информационная среда подталкивала к тому, чтобы провести над имеющимся у меня устройством смелые эксперименты.
Что мы будем делать?
Увы, мои надежды получить компактное универсальное Linux-устройство разбились о суровую действительность. Сняв крышку корпуса, я увидел микропроцессор RTL8676S, о котором очень мало технической информации в свободном доступе, а интерес к нему со стороны сообщества OpenWrt пропорционален объему этой информации. Но почему бы не дать этому маршрутизатору шанс, заменив его прошивку стандартной, использующейся на аналогичных устройствах?

У края платы нетрудно заметить 8-выводную микросхему постоянного запоминающего устройства W25Q128FVSG, вокруг которой будут развиваться дальнейшие события. Из спецификации мы можем узнать, что она представляет собой память, реализованную по технологии NOR Flash, доступ к которой выполняется с помощью последовательного интерфейса SPI. Информационная емкость микросхемы составляет 128 Мбит (16 Мбайт), и работает она в диапазоне напряжения от 2,7 до 3,6 В.
www
Спецификация микросхемы Winbond 25Q128FVSG доступна на сайте производителя.
Широко используемое для программирования подобных «микросхем 25-й серии» приспособление — недорогой USB-программатор на конвертере CH341A. Для внутрисхемного программирования (то есть без снятия микросхемы с платы) он комплектуется специальным зажимом‑прищепкой, который обхватывает микросхему памяти и обеспечивает необходимый контакт. В моем арсенале такого чудесного инструмента не оказалось, зато нашелся клон Arduino UNO. Для него есть скетч frser-duino, превращающий его в UNO-программатор, с которым умеет работать утилита flashrom.
info
Как ты знаешь, Arduino — это проект по разработке «дружественных» к пользователю наборов электронных компонентов, спецификации которых публикуются под открытой лицензией. Одним из самых успешных изделий стала плата UNO, на которой «центральный» микроконтроллер ATMega328P, дополненный необходимой для функционирования обвязкой и удобными контактными линейками, оснащен «соконтроллером» ATMega8U2 (версии R1 и R2) или ATMega16U2 (версия R3), реализующим функцию конвертера USB-serial, что упрощает загрузку программ в устройство. Кстати, программные проекты для Arduino и скомпилированный из них двоичный код называют скетчами (sketch).
Благодаря открытой лицензии и большому числу поклонников Arduino UNO другие производители освоили выпуск аналогичных устройств, внося в оригинальную схему некоторые изменения. В частности, для снижения стоимости изделий сопряжение USB-serial часто реализуется не универсальным программируемым «соконтроллером», а специализированным интерфейсным чипом CH340G.
Чтобы перепрограммировать наш подопытный маршрутизатор, придется выполнить следующие шаги.
- Подготовить рабочую среду на персональном компьютере.
- Собрать в рабочей среде скетч frser-duino из исходных текстов.
- Записать скетч frser-duino в клон Arduino UNO — получится UNO-программатор.
- Подключить микросхему SPI Flash к UNO-программатору.
- Записать firmware из файла образа в SPI Flash.
Подготовка рабочей среды
Работу над программным обеспечением я выполнял в привычной мне среде Bodhi Linux 4.5 64 бит, базирующейся на Ubuntu 16.04. Так что описанные действия должны подойти для любых более‑менее современных дистрибутивов Linux, производных от Ubuntu. Понадобится только установить следующие пакеты:
- build-essential — средства для сборки программного обеспечения из исходных текстов;
- arduino-core — метапакет, содержащий кросс‑компилятор gcc-avr для микроконтроллеров AVR и утилиту для их программирования avrdude;
- flashrom — утилита для управления программаторами микросхем памяти.
Установка перечисленных инструментов из репозитория выполняется командой
sudo apt install build-essential arduino-core flashrom
Подключение платы клона Arduino к рабочему компьютеру с помощью USB-кабеля сопровождается созданием файла последовательного порта /
:
crw-rw---- 1 root dialout 188,0 ... /dev/ttyUSB0
Для проверки работы можно воспользоваться следующей командой:
avrdude -c arduino -p atmega328p -P /dev/ttyUSB0 -b 115200
В этой команде параметр -c
указывает тип программатора, -p
(строчная буква) — модель программируемого микроконтроллера, -P
(прописная буква) — файл последовательного порта программатора, -b
— скорость информационного обмена. На экране должна появиться следующая информация:
avrdude: AVR device initialized and ready to accept instructionsReading
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.
Если вместо этого ты видишь строку
avrdude: ser_open(): can't open device "/dev/ttyUSB0": permission denied
значит, у тебя нет прав на доступ к порту. Для их получения надо стать членом группы dialout
и повторно зайти в систему:
sudo usermod -aG dialout xakep && exit
Вместо xakep используй имя своего пользователя. Проверить членство в группах можешь командой groups
.
Получилось? Тогда перед тем, как двигаться дальше, сделай резервную копию флеш‑памяти твоего клона Arduino с находящимися там сейчас скетчем и загрузчиком:
avrdude -c arduino -p atmega328p -P /dev/ttyUSB0 -U flash:r:uno_backup.hex:i
На экран снова будет выведено несколько информационных строк, а в текущем каталоге появится файл uno_backup.
, содержащий образ флеш‑памяти в формате Intel HEX.
info
В последней команде я не указал параметр, задающий скорость обмена. Программа avrdude использует значение 115200 для программатора arduino по умолчанию. Но если по какой‑то причине ты получил серию сообщений о неправильной скорости обмена, вот таких:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x9f
то попробуй вернуть этот параметр в команду.
Сборка скетча для UNO-программатора
Чтобы превратить клон Arduino в UNO-программатор, надо записать в него машинный код скетча frser-duino, который мы прямо сейчас соберем из исходных текстов. Для получения исходников из интернет‑репозитория можно выполнить следующие команды:
wget -O frser-duino.zip https://github.com/urjaman/frser-duino/archive/refs/heads/master.zip
wget -O libfrser.zip https://github.com/urjaman/libfrser/archive/refs/heads/master.zip
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее