Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Привет, Хабр!
Достался мне почти бесплатно dv6-2135er с отвалом видеочипа и без wi-fi карты. С чипом справился быстро, а вот с wi-fi не ожидал подвоха. Конечно я знал, что HP блокируют установку левых карт, но до этого карты были в комплекте и проблем не возникало. Можно было купить подходящую карту, но имея в запчастях другую, хотелось приспособить ее.
Инструменты и материалы
Обновление биос с сайта производителя sp47531.exe. Из него будем доставать дамп биос
Total Commander. Для поиска нужных блоков кода по содержанию файлов
IDA Pro. Для анализа кода и его правки
PhoenixTool. С помощью этой программы будем распаковывать биос на модули и обратную сборку
Шаг 1. Извлечение дампа из обновления и разборка на модули.
Запускаем файл sp47531.exe и указываем место, куда распаковать. В результате получаем файл WinFlash.exe. Чтобы добраться до бинарного дампа биос нужно открыть этот файл архиватором. Я использовал WinRar.
Файл 3635F13.FD является искомым дампом. Достаем его из архива.
Запускаем PhoenixTool и открываем только что добытый файл биос. В списке Manufacturer ставим Other. Пойдет распаковка биос на модули. В процессе всплывут два окна, нажимаем Ок в обоих.
PhoenixTool распакует дамп биос в папку DUMP. Теперь можно закрыть программу, вернемся к ней позднее, когда будем собирать биос.
Шаг 2. Локализуем файл с проверкой whitelist.
После нехитрых манипуляций мы получили материал для изучения. Прочитав много публикаций в том числе и на Хабре, я понял, что универсального решения нет и нужно импровизировать. В качестве отправной точки я решил выбрать вывод сообщения об ошибке на экран, при попытке подсунуть левую карту. Думаю это сильно сузит круг поисков, так как если опираться, например, на белый список, то в моем случае их оказалось несколько в разных модулях, с разными картами и кодом обработки. Но и сегмент с текстом ошибки оказался не один. Как же найти нужный? Я решил пронумеровать каждое сообщение в его тексте, прошить и посмотреть какое сообщение вылезет при запуске с не родной картой.
Итак. Ищем модули с текстом ошибки - "104 - Unsupported wireless network device detected. System halted. Remove device and restart." . В этом нам поможет Total Commander. Обязательно ставим галочку на кодировке UTF-16, иначе файлы не найдутся.
Текст ошибки встречается в двух файлах. Извлекаем их в отдельную папку для удобства и открываем в любом hex-редакторе. Теперь нам нужно найти все сегменты с текстом ошибки. В первом файле оказалось 4 вхождения с текстом ошибки, во втором 1.
Чтобы понять какой именно файл проверяет карты и выводит текст ошибки в случае неудачи пронумеруем в обоих файлах все вхождения текста ошибки прямо в самом тексте, заменив его часть. Не забываем, что указывать нужно utf-16 код символа, а не просто чило (1,2,3...)
Пронумеровав все участки с текстом ошибки я собрал биос (об этом речь дальше) , прошил и включил ноутбук. При инициализации получил сообщение об ошибке с номером, который до этого поставил в редакторе. Отлично, круг сужается. Таким образом я выявил, что искомый файл это A6F691AC-31C8-4444-854C-E2C1A6950F92_2_86.ROM. Теперь понятно где происходит проверка карт.
Шаг 3. Анализ и модификация кода модуля проверки карт.
Далее в дело вступает IDA Pro x64. Открываем в ней этот файл. У меня автоматически определился тип процессора и осталось только нажать Ок.
Скажу сразу, что с ассемблером я не знаком от слова совсем и программированием занимаюсь в качестве хобби (поэтому не судите строго). Исходя из этого я понимаю, что ковыряние во всем коде файла мне ничего не даст. Но есть предположение, что список разрешенных карт хранится где-то в сегменте данных в этом файле. Чтобы проверить провожу поиск в хекс-редакторе по VEN популярных производителей. У Broadcom это 14 E4, а у Intel 80 86. Но порядок следования в хекс файле обратный, поэтому меняем местами и получаем E4 14 и 86 80. Поиск по Интел ничего не дал, а вот по Broadcom обнаружился белый список по смещению 324C0 от начала файла.
Можно было на этом этапе подставить данные своей карты и, думаю, все бы заработало, но это костыльное решение и я решил пойти дальше и выпилить проверку в коде.
Теперь идем в IDA Pro и переходим по этому смещению (относительно начала файла!!! там много других вариантов) находим начало белого списка и поднимаемся выше до имени первой переменной - unk_180032490. Эта переменная используется для проверки карт. Ставим на нее курсор и нажимаем клавишу X. IDA Pro покажет где используется эта переменная.
.Двойным щелчком по функции во всплывающем окне переходим в код этой функции. Для дальнйшего анализа алгоритма удобнее схематичное представление. Поэтому нажимаем пробел и код становится представлен ввиде блоков и связей между ними. В коде просматривается цикл проверки. Так же стоит обратить внимание на то, что делается перед блоком с ret, то есть перед возвратом из функции.
А делается у нас следущее: устанавливается или снимается флаг в регистре al. При пройденной проверке в него пишется 1 через регистр bl (выделил синим), иначе (предполагаю, что если в этом порту нет оборудования) он сбрасывается (красный). Наша задача обойти цикл проверки и минуя его уйти на метку loc_18001D902: . Поднимаемся выше по коду и ищем удобное место, где это сделать. Я выбрал строку jz short loc_18001D8CE. Здесь нужно заменить условный переход на безусловный и прыгнуть сразу на установку флага al и на выход из процедуры. Ставим курсор на нужную строку и идем Edit->Patch Program->Assemble... Меняем строку на jmp short loc_18001D902
Чтобы сохранить изменения идем Edit->Patch Program->Apply Patches to input file
Теперь цикл проверки не задействован и программа идет сразу на установку флага и выход из процедуры.
Сохраняем файл и выходим из IDA, она больше не понадобиться. Но лучше еще раз открыть модифицированный файл и убедиться, что все так как задумано.
Шаг 4. Сборка модифицированного биос.
Полдела сделано. Теперь остается собрать биос с модифицированным файлом и прошить во флэш программатором. Так же можно попробовать прошить новый дамп через winFlash из под ОС, но этот вариант я не проверял. Удаляем из папки с разобранным дампом все, кроме папки с модифицированным модулем для удобства, так как PhoenixTool создает много мусора в папке с дампом.
Запускаем PhoenixTool, снова выбираем дамп с сайта производителя
Нажимаем Advanced->Ставим чекбоксы как на скрине->Done
Теперь самое важное. Нажимаем GO. Появится всплывающее окно You can now make... с кнопкой Ok.
НЕ НАЖИМАЕМ ОК!!!!
Снова появится папка DUMP с разобранным биос. Берем файл, который модифицировали и копируем в эту папку с заменой. Вот теперь
НАЖИМАЕМ OK
PhoenixTool пересоберет биос с нашими изменениями, пересчитает контрольные суммы и выплюнет файл с постфиксом _SLIC - это и есть долгожданный дамп, готовый для прошивки.
P.S. Забыл сказать, что при прошивке очень желательно перекинуть серийники со слитого из ноутбука дампа в новый, чтобы потом не заморачиваться и не делать это утилитами. Серийники лежат по адресам h20000-h200FF.
В заключение хочу сказать, что в ноутбук была установлена карта Intel 4965AGN MM2, которая успешно прошла POST и подхватилась системой. В ОС даже нашлись драйверы на нее. Wi-fi работает без нареканий. Так же вставлялась карта Broadcom BCM94313HMGB, которая успешно определилась системой, но в ОС не было драйверов, а искать было лень, поэтому работоспособность не проверялась.
Так же субъективно POST стал проходить гораздо быстрее, но это, возможно связано с заменой флэш на новую, ибо старая читалась и шилась с перебоями.
На этом все. Всем добра!
Файл заводского обновления, готового дампа и измененного модуля можно взять тут