Сказ о том, как я ставил неподдерживаемую Wimax/Wifi карту в Lenovo X201

Сказ о том, как я ставил неподдерживаемую Wimax/Wifi карту в Lenovo X201

Попался мне как-то в руки в личное пользование ноутбук 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. Отключение проверки white-list
  2. Вписание VEN/DEV/SUBSYS от моей карточки в white-list в замен какой-нибудь ненужной карты
  3. Изменение VEN/DEV/SUBSYS в моей карте на те, которые уже есть в white-list.

Решать какой способ выбрать вам. Способ 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. Внесение изменений в основной модуль биоса, путём сравнения исходной и патченой версии модуля.
1. Скачивание, распаковка, декомпоновка по модулям.

Первое что нужно сделать — надо получить собственно сам файл с BIOS для дальнейшей работы. Сделать это можно двумя способами: * Сделать бекап текущего биоса и с ним работать. Этим способом я почему-то решил не пользоваться и ничего по поводу него я рассказать не могу. * Скачать с официального сайта файл с прошивкой, распаковать.

Интересующий файл $01C2100.FL1 будет лежать по адресу \DRIVERS\FLASH\6quj08us\6QET52WW Данный файл является сжатым образом системного биоса. Все остальные файлы (отличные от FL1) относятся к каким-то другим частям системы, которыми я не интересовался и не знаю для чего они предназначены — в дальнейшем они не особо нужны.

После того, как интересующий файл будет найден, необходимо будет его распаковать. Для этого необходимо ввести команду: phcomp /D $01C2100.FL1 Затем необходимо полученный файл распотрошить на модули с помощью команды phnxsplit.exe $01C2100.FLh (для работы phnxsplit.exe необходима библиотека cygwin1.dll) Думаю, тут стоит обратить внимание на то, что бОльшая часть файлов, была распакована по алгоритму lzint и чтоб вернуть всё обратно — надо исправленный файл запаковать обратно — но об этом позже.

2. Поиск функций проверки (для WAN — одна функция, для WWAN — другая)

После выполнения команды, вы получите кучу файлов с расширением *.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-а. Что я понял — смещение указано там, поскольку при работе все модули находятся в одной области памяти и указатели на функции в модуле ссылаются с учётом смещения.

3. Организация обхода функций проверки

На практике оказалось, что в интересующей нас части кода, все 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-карт.

4. Подгонка запакованной версии файла под размер исходной версии

Изменение было внесено в файл, после файл был обратно запакован. Стоит отметить, что запаковка файла производится не командой 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 (оригинальный) одинакового размера.

5. Внесение изменений в основной модуль биоса, путём сравнения исходной и патченой версии модуля.

Последним шагом на пути к готовому патченому биосу является подмена модуля в компонованном основном файле биоса $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

В заключении хочу ещё раз напомнить, что всё, что вы делаете с BIOS — очень ответственно и серъёзно. Если возникает неуверенность в чём-то — лучше сто раз перепроверить и убедиться, что вы всё делаете правильно. При перепрошивке — обязательно выключите все программы и приложения (если вы прошиваетесь из windows), а лучше — прошиваться с загрузочного CD или флешки. Так же, лучше использовать уже патченные и проверенные версии BIOS (можно попробовать найти по ссылке (7), чем делать их самостоятельно, а если уж и делать — прочитать как можно больше информации, кроме этой статьи как минимум по ссылкам, указанным выше.

ps. Спасибо kmeaw за помощь в правке ASM-кода и наставлению на путь истинный.

📎📎📎📎📎📎📎📎📎📎