Попался мне как-то в руки в личное пользование ноутбук Lenovo X201 — отличная рабочая машинка.
Всё в нём вроде хорошо и всё вроде есть, но как обычно хочется большего — захотелось встроенный WiMax иметь (3G модем уже в нём есть и довольно хорошо работает).
Для WiMax была приобретена карта Intel WiMax/Wifi Link 5150 PCIe Mini Card.
После установки выяснилось, что оказывается большинство современных ноутбуков (в частности Lenovo) имеют White-list устройств, которые они поддерживают. Сделано это видимо для того, чтоб пользователи покупали только фирменные устройства в фирменных магазинах. Честно говоря я бы рад купить такое устройство, если бы у нас они свободно продавались (поправьте меня, если это так, может я не достаточно хорошо искал).
В частности мой ноутбук расстроился, увидев, что карточки, которую я ему подсунул нет в White-list и выдал мессагу:
1802: Unauthorized network card is plugged in - Power off and remove the miniPCI network card.
В случае установки неподдерживаемого 3G модема, вы получите сообщение:
1804: Unauthorized WAN card is plugged in - Power off and remove the WAN card.
Сразу хочу обратить внимание на одну особенность, для тех кто не знает. Фактически WiFi и WiMax будучи на одной плате, подключены по двум разным каналам — один PCIe, второй USB соответственно.
Может это кого-то удивит (как, например, меня ранее) — WiMax подключен именно через USB-шину, хотя оба устройства находятся на одной плате. Такое подключение не очевидно и самое главное — наличие распайки USB на PCIe разъёме не является обязательным (на чём я и накололся в ноутбуке Lenovo x61s) — надо проверять или тестером или читать внутренние доки.
Немного информации о USB на разъёме mini-PCIe есть на Википедии — выводы 36, 38.
И кстати такая гибридная карточка (по крайней мере моя) не может работать в двух режимах сразу. Т.е. или wifi или wimax, переключение программное. Это в теории может вызвать проблемы, связанные с включением подачи питания на карту. Проблемы, судя по форумам решаемые, но такое ощущение что без паяльника не обойтись. У меня к счастью — обошлось.
Так что если вдруг эта статья кого-то сподвигнет на покупку Wifi/Wimax карты — надо бы сначала убедиться в том, что в PCIe разъёме действительно есть USB иначе придётся довольно капитально погемороиться.
Несмотря на отсутствие USB, некоторые умельцы всё же умудрялись развести USB на MiniPCI — для этого всего лишь нужно желание, руки, провода, паяльник и схема, но это имхо уже экстрим.
Началось исследование проблемы с форума:
(1) forum.thinkpads.com/viewtopic.php?t=55837
а в последствии
(2) www.thinkwiki.org/wiki/Problem_with_unauthorized_MiniPCI_network_card
(3) http://web.dodds.net/~vorlon/wiki/blog/Upgrading_a_ThinkPad_BIOS.html
(5) www.endeer.cz/bios.tools/bios.html
(7) www.endeer.cz/bios.tools/modz.html?machine=ALL
У меня оказался довольно сложный случай — BIOS новой модификации и способы типа правки пары байт в CMOS уже не работали, а так же не было готового BIOS для моей модели по ссылке (7). В моём случае имелось 3 способа решить проблему:
1) Отключение проверки white-list
2) Вписание VEN/DEV/SUBSYS от моей карточки в white-list в замен какой-нибудь ненужной карты
3) Изменение VEN/DEV/SUBSYS в моей карте на те, которые уже есть в white-list.
Третий способ выглядел как-то не красиво и грозил возникновением проблем с дровами.
Второй способ был соблазнительным и казался проще — т.к. не надо заморачиваться с поиском ASM-кода и изготовлением патча, но всё же я нацелился на первый способ — т.к. он более универсальный и красивый.
Решать какой способ выбрать вам. Способ 3 описан по ссылке (2).
Способ 2 — тупо замена последовательности байт на интересующие. Контрольная сумма биоса, как я понял, особо нигде не проверяется, по крайней мере для моей версии. Возможно, есть какие-нибудь ловушки, но т.к. я не пробовал пойти этим путём — я о них не знаю.
Почитав ссылки (4), (5) я вроде вдохнивился идеей самостоятельно сделать патченый биос, но спустя несколько часов работы с инструментами по 4-ой ссылке + IDA немного устал и вообще подумывал забить на эту идею.
Однако строчка, увиденная по ссылке (3) вдруг открыла второе дыхание
Я ещё раз более внимательно прочитал содержимое ссылок (4) и (5) и потихоньку начал ковырять BIOS. Я не буду переводить то, что там написано, т.к. к сожалению у автора этих страниц по моему мнению не очень всё хорошо с доступностью изложения и вообще доступностью информации (хотя статьи грамотные), да и я не совсем понял часть статьи, касающейся собственно поиску кода и продумывания замены. Наверное, будучи заядлым знатоком IDA и ассемблера можно понять, что он пишет — но в вопросах биоса я бы лучше несколько раз отмерил, чем один раз неудачно отрезал (был печальный опыт). Так же есть ощущения, что информация в статье немного устарела. Знания ассемблера, конечно, у меня небольшие были, но их явно не достаточно, чтоб понять, что нужно сделать.
В общем мои изыскания ни к чему понятному не привели, но к счастью в нужный момент, когда я уже почти опустил во второй раз руки, мне помог хороший знакомый kmeaw — и довольно быстро нашёл функцию проверки на White-list в нужном файле и подправил несколько байт. На этом лирическую часть я, наверное, закончу и приступлю к описанию моих действий.
Небольшое предупреждение.
Работа с BIOS (особенно если вы всё делаете самостоятельно) очень ответственный и опасный процесс.
Все описанные ниже действия относятся к BIOS v1.22 для Lenovo X201 и могут отличатся от действий, необходимых для других ноутбуков, хотя я и постараюсь описать общий принцип.
Все утилиты для работы с BIOS можно найти по ссылке в конце статьи.
Хак биоса состоит из нескольких этапов:
1) Скачивание, распаковка, декомпановка по модулям.
2) Поиск функций проверки (для WAN — одна функция, для WWAN — другая)
3) Организация обхода функций проверки
4) Подгонка запакованной версии файла под размер исходной версии (размер должен совпадать)
5) Внесение изменений в основной модуль биоса, путём сравненис исходной и патченой версии модуля.
Начнём.
Первое что нужно сделать — надо получить собственно сам файл с BIOS для дальнейшей работы. Сделать это можно двумя способами:
* Сделать бекап текущего биоса и с ним работать. Этим способом я почему-то решил не пользоваться и ничего по поводу него я рассказать не могу.
* Скачать с официального сайта файл с прошивкой, распаковать.
Интересующий файл $01C2100.FL1 будет лежать по адресу \DRIVERS\FLASH\6quj08us\6QET52WW
Данный файл является сжатым образом системного биоса. Все остальные файлы (отличные от FL1) относятся к каким-то другим частям системы, которыми я не интересовался и не знаю для чего они предназначены — в дальнейшем они не особо нужны.
После того, как интересующий файл будет найден, необходимо будет его распаковать.
Для этого необходимо ввести команду:
phcomp /D $01C2100.FL1
Затем необходимо полученный файл распотрошить на модули с помощью команды
phnxsplit.exe $01C2100.FLh
(для работы phnxsplit.exe необходима библиотека cygwin1.dll)
Думаю, тут стоит обратить внимание на то, что бОльшая часть файлов, была распакована по алгоритму lzint и чтоб вернуть всё обратно — надо исправленный файл запаковать обратно — но об этом позже.
После выполнения команды, вы получите кучу файлов с расширением *.rom. Среди этого безобразия, нужно найти нужный файл, над которым мы будем в дальнейшем издеваться. В первую очередь, нужно найти устройство, которое 100% есть в while-list. Для этого нужно (далее будет описан способ для XP, если у вас другая ОС — попробуйте найти способ узнать данные самостоятельно) зайти в
«диспетчер устройств\(wifi устройство или 3g модем)\сведения\код экземпляра устройства»
Пусть, например, это будет:
Intel Wifi Link 1000BGN, PCI\VEN_8086&DEV_0084&SUBSYS_13158086&REV_00
Интересующие данные это:
VEN_8086&DEV_0084&SUBSYS_13158086
Из этого получается такая строка для поиска:
0x8680840086801513
В случае для 3G модема
0xc6050592
Думаю понятно, как это получилось (обратный порядок байтов для каждой части записи).
Можете воспользоваться прям этой строчкой из примера, думаю она должна быть в вашем биосе.
После получения такой строчки, нужно как-то поискать во всех распакованных файлах. Скорее всего это будет один файл BIOSCODEXX.rom
Я лично это сделал с помощью FAR (Alt+F7, искать 16-ричный код).
В моём случае файлом с интересующей функцией проверки оказался файл BIOSCODE06.rom
Тут начинается самое интересное.
Открыв его через IDA я довольно долго пытался понять то, что говорится по ссылке (5). Кстати открывать файл с биосом нужно предварительно переименовав исходный файл в файл с расширением .hex.
Файл состоит из 27-байтового заголовка и тела бинарного 16-ричного приложения. В заголовке имеется указание на смещение, относительно основного BIOS-а. Что я понял — смещение указано там, поскольку при работе все модули находятся в одной области памяти и указатели на функции в модуле ссылаются с учётом смещения.
На практике оказалось, что в интересующей нас части кода, все jmp на функции — относительные и смещение не играет никакого значения.
Попытки разобраться в модуле самостоятельно ни к чему не привели — из-за отсутствия даже минимального опыта в вопросах дизассемблирования, не смотря на небольшие знания ассемблера, поэтому пришлось обратиться к знакомому за советом.
Спустя 10 минут он прислал мне такой скриншот
Скриншот собственно содержал то, что нужно поправить.
Увидев скриншот, я решил воспользоваться в дальнейшем hiew 6.50 (который можно найти в архиве) для редактирования файла, т.к. он оказался проще чем IDM.
Небольшая справка по использованию HIEW:
F4 - Изменение режима (Text, Hex, Decode)------ Изменения удобней вносить в режиме Hex
------ Анализировать работу кода - в режиме Decode
------ В режиме Hex доступна комбинация Ctrl+F5
Ctrl+F5 - Установка смещений. На скриншоте указаны адреса без учёта 27-байтового заголовка. Для установки таких же смещений, необходимо указать смещение -1B
F5 - Переход на смещение (указывается в hex)
F3 - Редактирование
F9 - Сохранение.
Правка, изображённая на скриншоте, довольно понятная и простая, после того, как была найдена функция проверки white-list.
Функция вызывается только из одного места, имеет чёткие границы. Изменение заключается в том, что в начале работы функции происходит jmp на конец функции. Выходные данные при этом выглядят как будто карта успешно прошла проверку.
Вроде функцию проверки убили, казалось бы всё, но нет — функция отвечала только за карты Wifi/Wimax (ошибка 1802). Есть ещё одна функция — для проверки WAN (ошибка 1804). На её поиск ушло не много времени — принцип оказался идентичным, зато изготовление патча заняло значительное время, поскольку после правки, модуль в сжатом виде никак не хотел становиться нужного размера (того же размера, что и был до внесения изменений).
Одинаковый размер необходим из-за того, что утилита phnxmod.exe, которая в дальнейшем производит подмену модуля в файле $01C2100.FLh, не может работать с файлами, если новый отличается от старого хотя бы на байт.
Собственно для того, чтоб внести необходимое изменение и подогнать размер, пришлось много что поправить и затереть кусок функции проверки (благо после добавления jmp, она больше не требовалась).
Результат на картинке:
Верхний скриншот — обход для функции проверки WAN-карт.
Нижний скриншот — обход для функций проверки Wfi/Wimax-карт.
Изменение было внесено в файл, после файл был обратно запакован.
Стоит отметить, что запаковка файла производится не командой phcomp, как можно подумать. А набором команд из комплекта к BIOS.
Для старых это - prepare.exe------ файл обычно есть в комплекте с скачанным биосом, для упаковки, нужно создать файл-скрипт.
------ Пример скрипта можно найти так же в комплекте с биосом, называется logo.scr. В файле нужно
------ заменить "LOGO logo.." на "BIOSCODE file.rom"
Для новых это - fi.exe, fp.exe, ceimain.bin, rom2mod.exe
------ файлы обычно есть в комплекте с скачанным биосом, для упаковки, нужно создать файл-скрипт.
------ Пример скрипта можно найти так же в комплекте с биосом, называется logo.scr. В файле нужно
------ заменить"LOGO logo.." на "BIOSCODE file.rom"
------ Пример скрипта для linux с использованием wine можно взять тут
Определить старый от нового — вы сможете по тому, что идёт в комплекте с биосом, в папке \DRIVERS\FLASH\6quj08us
В общем я с этим довольно долго провозился, пока понял. В конце статьи есть готовый набор утилит для упаковки патченного файла в частности для моего BIOS-а с bat-ником (на основе logo.bat).
Так же, необходимо упаковать исходный файл, который у меня назывался BIOSCODE06.rom
В итоге получилось два файла BIOSCODE06.rom-lz (патченный), BIOSCODE06.rom-orig-lz (оригинальный) одинакового размера.
Последним шагом на пути к готовому патченому биосу является подмена модуля в компанованном основном файле биоса $01C2100.FLh
Для этого, необходимо воспользоваться командой:
phnxmod.exe 01C2100.FLh BIOSCODE06.ro2 BIOSCODE06.ro2.patched
Синтаксис такой:
phnxmod.exe (распакованная версия $01C2100.FL1) (оригинальный запакованный модуль) (модифицированный запакованный модуль).
После выполнения команды, вы должны увидеть примерно такое сообщение:
Okay, all files open.ROM size 200000h, old module 7B66h+1Bh, new module 7B66h+1Bh.
Loading data...Old module (without header) found at 1EA565h. Replaced.
Writing modified ROM back... Done.
---------------- WARNING! ----------------
If you don't know what you're doing there's a very high risk of rendering your
computer unusable by flashing a modified BIOS. This is not a safe playground.
---------------- WARNING! ----------------
Это последний этап хака.
Полученный патченный файл $01C2100.FLh можно использовать для перепрошивки с помощью WinPhlash.
Я для этого взял архив с ссылки (6), подправил rom-файл и конфиг и перепрошил свой ноут.
После перепрошивки я успешно запустил неподдерживаемую Wimax/wifi карту на своём ноуте, проверил подключение к Wifi, Wimax (Комстар, Yota) — всё отлично.
Так же был проверен 3G-модуль Sierra MC8775, который не должен поддерживаться на этой модели. Ноутбук успешно загрузился. После установки драйверов удалось успешно подключиться к 3G сети.
Файлы:
1. Готовый архив с патченым BIOS 1.22 для Lenovo X201 (no white-list) bypass 1802/1804 error
Инструкция по установке:Запустить WinPhlash.exe из архива. Открыть "Advanced Settings" и проверить соответствие чек-боксов и параметров обновления:
("Flags" Tab):
[ ] Verify BIOS part number
[ ] Flash only if BIOS version is different
[ ] Flash only if BIOS version is newer
[ ] Verify BIOS image size
[ ] Verify BIOS checksum
[ ] Zero block before erasing
[x] Verify block after programming
[x] Disable Axx swaping automatic detection (if present)
[ ] Clear CMOS Checksum
("DMI" tab)
"Update": Select "Update the BIOS and not DMI"
2. Патченный файл BIOSCODE06.rom ($01C2100.FLh в архиве уже патченый)
3. Набор утилит для работы с BIOS
4. Утилиты для упаковки модуля
В заключении хочу ещё раз напомнить, что всё, что вы делаете с BIOS — очень ответственно и серъёзно. Если возникает неуверенность в чём-то — лучше сто раз перепроверить и убедиться, что вы всё делаете правильно. При перепрошивке — обязательно выключите все программы и приложения (если вы прошиваетесь из windows), а лучше — прошиваться с загрузочного CD или флешки. Так же, лучше использовать уже патченные и проверенные версии BIOS (можно попробовать найти по ссылке (7), чем делать их самостоятельно, а если уж и делать — прочитать как можно больше информации, кроме этой статьи как минимум по ссылкам, указанным выше.
upd: Как проделать подобное из linux.