Хакер - Запретный апгрейд. Взламываем UEFI ноутбука Lenovo, чтобы поменять адаптер Wi-Fi
hacker_freiCandidum
Содержание статьи
- Тренируемся на кошках
- Вайтлист и вендорлок
- От теории к практике
Есть категория людей, которые считают, что из техники нужно выжимать все 100% ее потенциала, то есть она должна работать до тех пор, пока окончательно не истлеет. Сегодняшняя статья — именно для них. Мы проапгрейдим Wi-Fi в ноутбуке Lenovo G710 и отключим white list, даже не воспользовавшись ассемблером.
Все началось с того, что я приобрел себе ноут Dell Vostro 5301. И вот в один прекрасный день, гоняя по локалке очередной десяток гигабайт, я подумал, что, имея роутер с Wi-Fi 5 и ноут с его поддержкой, глупо его не использовать на всю катушку. Я включил на роутере Wi-Fi 5, попробовал, и мне понравилось.
ТРЕНИРУЕМСЯ НА КОШКАХ
Но возникла одна проблема: остальные ноуты в моей сети не умели Wi-Fi 5, поэтому, посидев и подумав, я решил, что пришла пора апгрейда. Обновить предстояло два аппарата: огрызок ASUS X553MA, который трудится у меня файлопомойкой, и Lenovo G710, которым пользуется жена. Это как раз тот случай, когда из коробки нет драйверов, их пришлось тянуть с AUR, благо проводной адаптер на ноутбуке завелся.
Памятуя о проблемах с родной вайфайкой Lenovo G710, я решил выбрать заведомо беспроблемный адаптер Intel Wireless 7260, для которого в ядре Linux есть драйверы. Также я заранее учел, что в Lenovo G710 и ASUS X553MA разные разъемы PCI Express для подключения адаптеров и что со сменой адаптера в ASUS придется поменять еще и антенну. Смена антенны необходима из‑за разных разъемов на родном и новом адаптерах. Кроме того, в X553MA установлена лишь одна антенна main (экономия, однако), а новый адаптер предусматривает подключение двух антенн, основной и вспомогательной. Благо стоят они недорого и устанавливаются элементарно. Вот так это добро выглядит.
Пришло время все это дело установить и подключить. Первым на очереди был ASUS X553MA, и с ним, к моему удивлению, все прошло гладко: адаптер встал, заработал, и система его сразу же подхватила, пришлось только имя адаптера в юните wpa_supplicant
и dhcpcd
поменять.
ВАЙТЛИСТ И ВЕНДОРЛОК
А вот с Lenovo G710 получилось гораздо веселее: там в биосе есть вендорлок. При начальной загрузке UEFI определяет установленный адаптер и ищет его в white list’е, зашитом производителем. Стоит ли говорить, что Intel Wireless 7260 там не оказалось и ноутбук встретил меня радостным сообщением.
В принципе, я к этому был готов еще на этапе планирования апгрейда, но успех с ASUS вселил в меня надежду, что замена адаптера может прокатить. Не прокатило…
Поиск в гугле показал, что проблема в целом известная и лечится перепрошивкой биоса пропатченной версией, которую можно поискать в интернете. К несчастью, биоса для моей модели не нашлось, остался последний вариант: ковырять UEFI самостоятельно.
В сети в целом есть ряд неплохих мануалов на тему обхода white list’а, например на Хабре (изображение экрана я взял оттуда, поскольку мое не сохранилось), и там нет ничего запредельно сложного. Надо распаковать UEFI, найти там участок с текстом ошибки, посмотреть, какая функция на него ссылается, и заменить один из условных переходов другим условным переходом — или безусловным переходом, тут есть некоторая вариативность. Смущали меня во всем этом две вещи: во‑первых, большинство мануалов заточены под виндовый софт, во‑вторых, с ассемблером я, мягко говоря, на вы.
Несколько углубившись в тему, я узнал про замечательную программу UEFITool и нашел пару примеров по работе с ней: часть 1 и часть 2. Это приблизило меня к решению проблемы, однако рекомендации во всех приведенных выше источниках носили скорее общий характер. И вот тут я наткнулся на отличную статью автора под ником p0358, описывающую в подробностях, как он ковырял UEFI своего Lenovo G510, решая ту же проблему, что и я.
После ее прочтения становится понятно, как найти заветное место, в котором нужно исправить jz
на jmp
, чтобы обойти white list. От себя могу добавить, что приседания автора с использованием двух версий UEFITool излишни, вполне можно обойтись и актуальной версией. Кроме того, в настоящее время бесплатная версия декомпилятора IDA Free умеет работать с UEFI-бинарниками, так что без IDA Pro тоже можно обойтись. Но главная фича этой статьи заключается в том, что автор обнаружил в коде UEFI Lenovo G510 переменные, которые отключают white list вовсе, и это очень упрощает все мероприятие.
Конечно, Lenovo G510 — это не G710, однако они ровесники и, считай, из одной линейки, поэтому я понадеялся, что их прошивки не должны заметно отличаться и пропатчить биос удастся малой кровью. Забегая вперед, скажу, что так все и получилось.
WARNING
Модификация UEFI ноутбука, как, впрочем, и ковыряние в его потрохах шаловливыми ручонками, легко могут окирпичить устройство. А при удачном стечении обстоятельств — физически вывести его из строя. Поэтому все нижеописанные манипуляции ты производишь на свой страх и риск. Правовой статус данных манипуляций тоже сомнительный.
ОТ ТЕОРИИ К ПРАКТИКЕ
Итак, чтобы модифицировать прошивку, ее нужно сначала извлечь с флешки UEFI. Это можно сделать сугубо программными методами, хотя у меня с наскока этот финт не вышел. Тем не менее в любом случае надо держать под рукой программатор, так как вероятность накосячить здесь ненулевая, а оживить окирпиченный ноут без программатора уже не выйдет. Я использовал программатор на CH341: дешево и сердито, кроме того, он совместим с удобной утилитой flashrom.
На представленном изображении легко заметить прищепку для малоинвазивного подключения к микросхеме flash-памяти и переходник для подключения прищепки. Разумеется, надежнее и в некотором смысле правильнее отпаять микросхему, прошить и запаять обратно, однако я человек ленивый и предпочитаю сначала испробовать вариант попроще. Применение прищепки именно такой вариант: она, конечно, несколько капризна и не всегда дает надежный контакт, но раза со второго‑третьего все обычно получается.
WARNING
Используя прищепку, очень внимательно следи за правильностью подключения микросхемы к программатору (особенно вывод Vcc), ошибка может привести к переполюсовке питания с весьма печальными последствиями. Так что тут лучше трижды все проверить перед включением программатора. Сожженная до снятия дампа микросхема flash — это epic fail.
С программатором разобрались, теперь надо добраться до самой флешки. У Lenovo G710 это не очень приятный процесс: потребуется почти полная разборка аппарата. Самое смешное, что у этого ноута снизу удобно снимаемая крышка, ее удаление позволяет легко почистить систему охлаждения, заменить память, хард и даже проц при желании (да, он там не распаянный), а вот флешка UEFI расположена с другой стороны платы, под клавиатурой. Поэтому верхнюю панель и клавиатуру придется снять. Расположение флешки UEFI показано на фотографии.
Теперь можно подключить к ней прищепку и все еще раз проверить.
Если все сделано правильно, включаем программатор и снимаем дамп с флешки. Программатор, конечно, верифицирует считанный дамп, но я для полного душевного спокойствия считал его дважды и сравнил результаты с помощью diff
. Прописывать тип флешки нет особой нужды: flashrom и сам ее прекрасно определяет.
sudo flashrom --programmer ch341a_spi -r down_g710-1.bin
sudo flashrom --programmer ch341a_spi -r down_g710-2.bin
diff down_g710-1.bin down_g710-2.bin
Если вдруг со считыванием возникли проблемы, надо пошевелить прищепку: скорее всего, виноват плохой контакт.
Итак, дамп у нас есть, теперь запускаем UEFITool и открываем дамп в этом приложении.
uefitool down_g710-1.bin
Вызываем окно поиска и ищем нашу любимую строку Unauthorized Wireless network card is plugged in.
Видим, что строка нашлась, жмем на результат, открывается нужная нам секция.
Для найденной секции в контекстном меню выбираем «Extract body…» и сохраняем файл.
Теперь нам понадобится hex-редактор. Я, не мудрствуя лукаво, воспользовался встроенным в mc
. Открываем для просмотра сохраненный файл и переключаемся в режим HEX. Можно воспользоваться поиском, однако это не обязательно: файл небольшой, нужный участок располагается в самом его конце и легко находится «глазами».
Переключаемся в режим редактора, изменяем значения указанных байтов с 01
на 00
и сохраняем результат.
Теперь возвращаемся в UEFITool и с помощью контекстного меню заменяем экстрагированную ранее секцию (пункт в меню «Replace body...») отредактированной нами.
Старая секция помечается на удаление, новая на замену, а весь фрагмент — на пересборку. Чтобы изменения вступили в силу, осталось сохранить пропатченный дамп. Все, дело сделано, нужно только залить обновленный образ обратно на флешку. Для этого снова подключаем программатор и вызываем flashrom.
sudo flashrom --programmer ch341a_spi -w down_g710_no_white_list.bin
Теперь ноут можно собирать и включать, новая карта Wi-Fi определилась и завелась сразу. Самое смешное, что мне не потребовалось даже менять имя карты в юните wpa_supplicant
: к моему удивлению, оно осталось прежним. Так что даже сеть поднялась с ходу. Приятным бонусом к апгрейду стало сокращение времени, требующегося на первичную инициализацию ноутбука, что дало ускорение загрузки на три‑четыре секунды. На этом аппарате это почти двукратное увеличение скорости, он теперь включается быстрее чем за пять секунд — недурно для девятилетнего ноута.
Да, там стоит SSD и используется EFISTUB. Есть все основания полагать, что ноут послужит верой и правдой еще несколько лет.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei