Удаление Whitelist в bios ноутбуков на примере Lenovo X230

Недавно понадобилось поставить новую wifi карточку стандарта ac в свой ноутбук Lenovo x230, в котором есть whitelist для wlan карточек. Ниже опишу свои изыскания по отключению whitelist'а.



Для начала нам надо слить дамп нашего биоса, сделать это можно с помощью утилиты FPT
fpt -d bios.rom -BIOS
Далее нам понадобится утилита PhoenixTool 2.52. Запускаем её, выбираем наш bios.rom и ждём, пока она его распакует, далее в поле Manufacturer выбираем Lenovo и жмём кнопку Advanced, там ставим галочки «Allow user to modify other modules» и «No SLIC»



Нажимаем «Done» и «Go», когда откроется окошко

ничего не нажимаем и идём в папку DUMP, куда распакован наш биос. Далее нужно найти файл отвечающий за whitelist. Ищем просто по тексту ошибки (в кодировке UTF-16), которая выводится на экран при вставленном модуле не из вайтлиста «1802: Unauthorized network card is plugged in»



Находим файл 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_2207.ROM — это модуль биоса для вайтлиста.
Далее грузим его в IDA, смотрим код и ищем нашу строку «1802: Unauthorized network card is plugged in»



К этой строке идёт обращение в процедуре Sub_A0C. Т.е. процедура Sub_A0C предположительно занимается выводом ошибки на экран, смотрим откуда она вызывается (кликаем по имени процедуры и нажимем клавишу X на клавиатуре)



Видим что это процедура Sub_B20. Идём в эту процедуру и нажимаем пробел для перехода к схематичному представления кода.



Видим что процедура Sub_A0C вызывается из блока кода на метке Loc_BDD. Далее можно проследить условные переходы к этой метке и т.д. Но я решил, чтобы лучше понять код работы этой процедуры, пройти код от начала процедуры.
Итак, первое условное ветвление проверяет регистр edx на ноль
test edx, edx
jz Loc_C6E

т.к. регистр edx выше в этой процедуре нигде не инициализируется, то понятно, что ему должно присваиваться значение перед вызовом процедуры Sub_B20. Это можно увидеть в коде
и
Что означает значение в регистре edx я не понял, поэтому пройдёмся по обоим веткам ветвления.
Пойдём для начала по правой веке, на Loc_C6E



В eax кладётся адрес данных qword_270, двойным щелчком по qword_270 переходим к просмотру этой записи, далее переходим на вкладку Hex View-A. Это и есть наш whitelist, он идёт с адреса 270h до 3FFh. С форматом тоже всё просто, каждая запись длинной в 16 байт (4 слова по 32bit) соответствует одному устройству: первое слово — какой-то флаг, принимающий значение 0, 1, 5 или 6, второе слово — это system id, третье — subsystem id, четвёртое — ещё один флаг, имеющий значение 0 или 1. Предполагаю что первый флаг определяет тип устройства: 0 — wifi карточка, 1 — модем, 5 — ?, 6 — конец списка.



Вернёмся к коду. Сравниваем eax с шестёркой, а шестёрка у нас — это конец вайтлиста, т.е. если вайтлист получается пустой, то идём сразу на Loc_BDD, которая у нас вызывает ошибку. Это условие нам не интересно, т.к. вайтлист у нас не пустой, и условие не выполнится. Далее кладём адрес qword_270 в регистр rdx, проверяем eax (первый флаг записи в вайтлисте) на ноль, если флаг отличный от нуля, переходим к ошибке. Это условие нас тоже не интересует. Это же условие является началом цикла обхода вайтлиста.
Дальше командами
movzx   ecx, word ptr [r8+rdx+6]
movzx   eax, word ptr [r8+rdx+4]
shl     ecx, 10h
or      ecx, eax

Помещаем system id из вайтлиста в регистр ecx. Регистр r8 здесь выступает в роли инкремента в цикле, изначально он равен нулю.
Далее сравниваем ecx (system id из вайтлиста) и значение в памяти по адресу в регистре rdi.
cmp     [rdi], ecx

Несложно догадаться, что по адресу в регистре rdi у нас лежит идентификатор нашей вставленной wifi карточки, а в начале процедуры в регистр rdi мы кладём r8, т.е. процедуре Sub_B20 в качестве параметра использется регистр r8, где должен лежать адрес ячейки памяли с идентификатором нашей карточки.
Если идентификатор не совпал, то идём на Loc_CBA, там мы увеличиваем инкрементный регистр r8 на 10h (для этого в регистре r13w у нас заранее должна лежать единица)
loc_CBA:
add     r9w, r13w
movzx   r8d, r9w
shl     r8, 4

и проверяем, не в конце ли мы вайтлиста
mov     eax, [r8+rdx]
cmp     eax, 6
jz      loc_BDD

Если в конце, то выходим из цикла и выдаём ошибку, если не в конце, то идём в начало цикла.
Понятно, что для обхода вайлиста, нам надо убрать условный переход при сравнении system id, т.е. заменить jnz short loc_CBA на jmp $+2.
Далее, если system id совпал, идёт аналогичный код для сравнения subsystem id
movzx   ecx, word ptr [r8+rdx+0Ah]
movzx   eax, word ptr [r8+rdx+8]
shl     ecx, 10h
or      ecx, eax
cmp     [rdi+4], ecx
jz      short loc_CD5

Если subsystem id не совпал, то перебираем по циклу идентификаторы дальше. Тут нам тоже необходимо поправить условные переход на безусловный jz short loc_CD5 на jmp short loc_CD5.
Дальше по коду уже нет переходов на ошибку, но есть интересный код, проверяющий второй флаг в записи вайтлиста, про который я писал ранее, он сравнивается с регистром r13d, и если совпадает, то выполняется некий дополнительный кусок кода. Что делает этот код понять трудно, по анализу вайтлиста можно заметить, что этот флаг стоит только у карточек фирмы Intel.

Так, с правой веткой разобрались, теперь пройдёмся по левой ветке.Там у нас код работы с вайтлистом начинается с метки Loc_C18. Аналогично проверяется, не пустой ли whitelist:
loc_C18:
mov     eax, dword ptr cs:qword_270
xor     r9w, r9w
cmp     eax, 6
jz      short loc_BDD

Далее сравнивается eax (первый флаг) и r13d (что за параметр лежит в r13d я так и не разобрался, в начале процедуры него кладётся значение по адресу [rbx+1]), далее в зависимости от выполнения этого условия, попадаем сразу на код проверки system id, либо выполняем интересное сравнение
cmp     eax, 5
jnz     short loc_C54

Проверяем первый флаг в записи вайтлиста на 5, если условие выполняется, то пропускаем эту запись вайтлиста (т.е. игнорируем wifi карточку) и идём далее по циклу проверки.
Чтобы понять что же это за такой интересный флаг, надо понимать, что передаётся в процедуру Sub_B20. Если помните, в правой ветке кода, если этот флаг был отличный от нуля, то выдавалась ошибка о неподдерживаемой карте. Т.е. чтобы карточка с флагом 5 загрузилась, должны выполниться следующие условия вызова процедуры Sub_B20: регистр edx должен быть отличным от нуля, а регистр r13d не должен быть равен пяти (cmp eax, r13d, а в eax у нас лежит наш флаг равный пяти). Можно лишь догадаться, что для запуска карточки с таким флагом, требуется ещё какое-то условие, кроме нахождения её в вайтлисте. Дальше выполнять анализ для меня было довольно сложно, поэтому, что же это за условие, узнать не удалось.

Далее по коду, мы аналогично правой ветке, проверяем в цикле system id
loc_C3B:
movzx   ecx, word ptr [r8+rdx+6]
movzx   eax, word ptr [r8+rdx+4]
shl     ecx, 10h
or      ecx, eax
cmp     [rdi], ecx
jz      loc_DF3

Здесь нам надо также заменить условный переход jz loc_DF3 на безусловный jmp loc_DF3.
Что интересно, далее в левой ветке нет проверки subsystem id, т.е. достаточно совпадения system id. Из вышеизложенного можно предположить, что правая ветка — проверка wifi карточек, а левая проверка модемов. А в регистре edx при вызове функции содержится тип устройства: 0 — wifi, 1 — модем. Но тут тоже непонятка, т.к. каточка 0087:8086 с флагом 5 — это wifi+wimax, а не модем, да и в edx может быть больше единицы, т.к. из edx вычитается r13d, а потом сравнивается с четвёркой:
sub     edx, r13d
jz      short loc_B4F
cmp     edx, 4
jz      short loc_B4F

Собственно на этом анализ можно заканчивать. Нужные места для патча мы нашли.
Переводим команды в опкоды и делаем замены в hex редакторе, в итоге получаем такой патч:
C4E:	0F84->90E9 (jz to jmp)
CA3:	16->00 (jnz loc_CBA to jnz $+2)
CB8:	74->EB (jnz to jmp)

Сохраняем пропатченый файл 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_2207.ROM и нажимеам в окне PhoenixTool кнопку Ok.
PhoenixTool соберёт новый биос с именем bios_SLIC.rom.

Осталось дело за малым, необходимо прошить новый биос. В свежих ноутбуках Lenovo, включая мой x230, изменённый bios нельзя прошить программно, поэтому шьём его программатором. Фото процесса прошивки через программатор к сожалению не делал. Биос находится в микросхеме MX25L3206E рядом с разъёмом ExpressCard. Эта микросхема представляет из себя обычный SPI EEPROM 25ой серии, простой программатор для которой стоит 300р.

На этом всё, наслаждаемся работой новой wifi карточки.

Использовались материалы с форума bios-mods.com
www.bios-mods.com/forum/Thread-TUTORIAL-Lenovo-X230-Tablet-BIOS-Whitelist-Removal-Hardware-Flash
www.bios-mods.com/forum/Thread-REQUEST-Whitelist-wifi-removal-for-T430-got-hardware-flash-programmer?page=4
Share post

Comments 55

    –1
    «No SLIC»

    А процедура не помешает процедуре активации Windows?
      +1
      Эта настройка означает «не добалять SLIC специально», удалять существующую таблицу PhoenixTool не будет.
      Я бы посоветовал попробовать UEFITool в качестве альтернативы, чтобы не искать строки Total Commander'ом, но это дело вкуса, конечно.
        +3
        Эта опция говорит что не надо вшивать новый slic (основное назначение phoenixtool — вшивать slic в биос), родной slic остаётся. Бинарник биоса разобранный и собранный назад с этими параметрами идентичен оригиналу до последнего байта.
        +4
        Вместо PhoenixTool советую попробовать UefiTool — открытую и кроссплатформенную утилиту на Qt/C++
          0
          Поправьте, не проще ли заменить в листе Vid и Pid одной из разрешенных к использованию карточек на Vid и Pid устанавливаемой?
          Ну, и про CRC не забыть — он где-то проверяется?
            0
            Можно и так, иногда так проще, чем искать и патчить переходы, но это полумера.
            Поле CRC в PE-файлах UEFI не используется, а остальные контрольные суммы поправит PhoenixTool при сборке модифицированного образа.
          0
          Мне в Леново поменяли мат. плату, теперь не определяется синий зуб. Причем на железном уровне. Тоже биос?
            0
            Возможно, просто забыли переставить модуль со старой платы, они нынче мелкие.
              0
              и что делать? С момента ремонта прошло 2-3 месяца
                0
                Разобрать, проверить наличие модуля. Если есть — попробовать переподключить, если нет — купить и поставить.
                  –1
                  Разобрал и в помине не нашел даже коннектор для синего зуба. Как так? Может он впаян? И в биосе на аппаратном уровне в черном списке?
                  Если что, устройство Lenovo E430

                    0
                    В hardware maintainace manual его нет, поэтому он либо был впаян в старую плату, либо был встроен в WLAN-карту. Уверены, что вам ее не поменяли вместе с материнской платой? В BIOS может быть также отключен BT, в Security -> IO Port Access.
                    0
                    Почему-то с первого разу не прикрепилось изображение
                    habrastorage.org/files/053/66a/279/05366a2793324a9ebf355190221f6887.jpg
                      +2
                      На нижнем краю платы справа от разъема, в который подключены динамики, имеется нераспаяный разъем JBT1, в который и должен вставляться модуль BT. На вашей плате его нет.
                      P.S.: схема платы.
                  0
                  А у меня это была опция при покупке — ноут был БЕЗ синего зуба.
                  А потом вот, захотелось… Нашёл partid, заказал на amazon, разобрал ноут… а там, оказывается, этот модуль уже есть!
                  Т.е. опция «нет bluetooth» на самом деле реализована как-то программно.
                    +1
                    вот интересно где эти тайные рычаги, если в стандартном меню биосе такого и в помине нету( Прикольно то, что он бы, а теперть нет. Если модуля и не было, а был встроен в вай-фай модуль, то почему сейчас биосом не определяется.
                      0
                      в стандартном меню // на нескольких материнках Gigabyte до нажатия определенного сочетани клавиш половина явно «оверклокерских» пунктов меню недоступна, например.
                        0
                        Ctrl+F1
                        Работает абсолютно на всех (даже самых дешёвых) материках от GA начиная годна с 2002.
                • UFO just landed and posted this here
                • UFO just landed and posted this here
                    +2
                    Во всех современных UEFI реализована защита от прошивки неподписанных или модифицированных образов. Её пока еще можно обойти разными достаточно нетривиальными способами, но использование программатора — самый безопасный из них. Особенно на ноутбуках, где микросхему просто так не заменишь и индивидуальные для ноутбука данные (серийные номера, ключи для Windows 8, SLIC и т.п.) просто так не восстановишь.
                      0
                      А нельзя также пропатчить проверку подписи один раз и после этого уже прошиваться программно?
                        +2
                        Можно, но здесь возникает проблема курицы и яйца.
                        Изменить можно, остается прошить измененно в микросхему, а для этого нужен программатор.
                        А если программатор уже есть, в снятии защиты нет почти никакого смысла.
                        Да и защита эта установлена не просто так, а для того, чтобы вредоносное ПО не смогло прошить себя в BIOS просто получив рута.
                      0
                      Можно (за исключением ноутбуков — там свои сложности), например, используя утилиту flashrom.
                      +1
                      А я то думал что UEFI как раз нужна для того чтобы больше не пришлось самому патчить Firmware :(
                        0
                        За белые списки нужно сказать «спасибо» OEMам, а не разработчикам UEFI.
                        Самые известные любители списков — Lenovo и HP.
                        0
                        В своё время пытался пойти противоположным путём: шил в сетевуху Vid и Pid от разрешённого устройства. Но не смог подружить с драйвером тогда.
                          0
                          Спасибо за дельный пост! Новая wi-fi карточка — это хорошо.

                          А как на счет замены дисплея на fullhd(например от x240)?
                          Теоретически это возможно, нужен eDP/LVDS адаптер и модификация edid и bios.
                            +2
                            В свое время столкнулся с аналогичной проблемой: пытался подружить Thinkpad X61s и Intel PRO Wireless 3945ABG, решилось установкой wifi-адаптера в другой слот, вместо, кажется, Wimax. Пришлось еще у этого адаптера заклеить один контакт, чтобы включить wifi. Подробно описано тут. Конечно, ни в какое сравнение с Вашим опытом дизассемблирования биоса мои экзерсисы с бумажками не идут :) но на том ноуте еще месяц гоняли тесты беспроводной сети и все прекрасно работало.
                              +3
                              Ну вот, ожидал что наконец-то придумали удобный способ сломать проверку возможности залить модифицированный биос, а оказалось всё как и раньше — ищи где-то программатор и учись прошивать :)

                              Возможно стоило бы рассказать, как пользоваться программатором? А то получается, что самый важный этап пропущен.
                                0
                                Не знаю, какая модель у автора поста, но в большинстве случаев в комплекте с программатором есть программа, и последовательность действий такая: подключить микросхему, нажать «Check», чтобы она определилась, выбрать файл, залить.
                                0
                                Какую карточку поставили, если не секрет?
                                  0
                                  BCM4352, но она ещё пока в пути ко мне
                                  +4
                                  Впервые услышал про вайтлист o_O Может кто перечислить, кто кроме Lenovo еще такую [redacted] делает?

                                  Заставить бы жить в условиях вайтлиста на все действия в жизни тех, кто это придумал
                                    +2
                                    Lenovo, HP, Acer. У остальных производителей тоже проскакивают модели с вайтлистами, но намного реже, чем у вышеперечисленных.
                                    +1
                                    Не разу еще не нарывался на эти белые списки. Скажите, а в чем смысл производителю устанавливать эти списки и ограничивать пользователя?
                                      +3
                                      Жадность. Чтобы покупали оригинальные комплектующие в 2 раза дороже в авторизованных С/Ц и там же устанавливали также за денежку (взамен вышедших из строя после гарантии или доустановка отсутствующих модулей в модели с простой конфигурацией в серии). Ну и собственно сам апгрейд на модули нового поколения тоже ограничить так можно. Нужна более новая и быстрая фай-фай карта? Да и железно ноутбук с ней совместим. Вы уже радуетесь, но позиция производителя: Что вы! Никакого е-бея! Велком в магазин за новым ноутбуком.
                                      +7
                                      Не сталкивался с такими списками, но мне они уже активно не нравятся.
                                        0
                                        Тоже модифицировал БИОС для отключения white-list у Lenovo V560. Там прошить БИОС можно было и без программатора, но все равно пришлось сильно повозиться: во-первых, нужна была рабочая утилита для прошивки, я ее еле нашел; во-вторых, .rom не шьются, пришлось добавлять в конец байты от оригинального .wph и переименовывать файл; в-третьих, я все пытался использовать стандартный метод Lenovo с Fn+R, но он не заработал, пришлось делать загрузочную флешку.
                                        Вот такие пироги у Lenovo с white-list'ами.
                                          0
                                          Подскажите, а что вообще содержится в этих белых листах? Какие железки кроме вайфай карт? Я собираюсь у себя на thinkpad s430 поменять память и поставить ssd, мне для этого надо тоже заморачиваться и выбирать что-то совместимое или перепрошивать биос?
                                            0
                                            Whitelist только для mini-pcie устройств
                                              0
                                              Не только. Но конкретно на ThinkPad'ах с несовместимостью памяти и/или SSD я не сталкивался. Хотя теоретически всё возможно.
                                                0
                                                с несовместимостью памяти и/или SSD я не сталкивался
                                                C mSATA тоже проблем не встречали?
                                            0
                                            А где в биосе Lenovo, в частности t430u хранятся данные о том, с какими LCD матрицами работает данный ноут?
                                              0
                                              вот тут описан способ прошивки без програматора, рабочий ли он? Столкнулся с точно такой же проблемой на x230, думаю как решать.
                                                0
                                                Правда в комментариях ни одного успешного результата.
                                                0
                                                WWAN плата в слоте WiFi определается, не родная wifi плата в слоте wwan не стопит загрузку, но и никак не определяется в системе, замена плат местами успехом пока не увенчалась, пишут что можно 20 ногу заизолировать, чтобы wifi плата завелась, но на x230 это вроде не помогает.
                                                  0
                                                  Дык wifi работает по pci-e, а в wwan слоте только USB и Sata. Неудивительно что не работает.
                                                    0
                                                    а WWAN плата по чему работает?
                                                      0
                                                      По USB
                                                        0
                                                        Почему она тогда работает в слоте wifi?
                                                          0
                                                          Потому что в слоте WiFI тоже есть контакты USB.
                                                            0
                                                            Угу, это пошло со времен комбинированных модулей wifi + wimax. Где wifi работал по pci-e, а wimax по USB
                                                  0
                                                  Первая ссылка, мертвая, можно перезалить?

                                                  Only users with full accounts can post comments. Log in, please.