Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

Жесткий кодинг

Крис Касперски

Хакер, номер #093, стр. 093-136-4


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

Фрагмент прошивки AMI-BIOS

seg010:DB6D 55 push bp

seg010:DB6E 8B EC mov bp, sp

seg010:DB70 83 EC 08 sub sp, 8

seg010:DB73 C6 45 F8 41 mov byte ptr [di-8], 'A'

seg010:DB77 C6 45 F9 4D mov byte ptr [di-7], 'M'

seg010:DB7B C6 45 FA 49 mov byte ptr [di-6], 'I'

seg010:DB7F C6 45 FB 42 mov byte ptr [di-5], 'B'

seg010:DB83 C6 45 FC 49 mov byte ptr [di-4], 'I'

seg010:DB87 C6 45 FD 4F mov byte ptr [di-3], 'O'

seg010:DB8B C6 45 FE 53 mov byte ptr [di-2], 'S'

seg010:DB8F C6 45 FF 43 mov byte ptr [di-1], 'C'

seg010:DB93 53 push bx

seg010:DB94 56 push si

seg010:DB95 33 F6 xor si, si

seg010:DB97 8B 45 08 mov ax, [di+8]

seg010:DB9A 8B 50 20 mov dx, [bx+si+20h]

seg010:DB9D 85 D2 test dx, dx

seg010:DB9F 74 3A jz short loc_A9BDB

В конечном счете мы создадим свой boot-блок, ассемблируем и, воткнув в программатор FLASH-BIOS, зальем туда свое творение (предварительно сохранив оригинальную прошивку). Не стоит надеяться, что материнская плата "проглотит" его с первого раза. Будет только черный экран, не реагирующий на клавиатуру и все. Даже курсора не будет. Попробуй угадай, в каком месте сидит ошибка!!! Но ведь только так из юноши программисты становятся настоящими мужчинами. В смысле хакерами. После недели-другой непрекращающихся мытарств мы, наверное, сможем оценить какого приходилось нашим предкам, дырявящим перфокарты и совсем незнакомым с понятием интерактивной отладки.

Порядок инициализации оборудования

Порядок инициализации оборудования не высечен на камне и допускает довольно большие вольности, однако, определенные традиции и нормы приличия все-таки нужно соблюдать.

Материнские платы от EPOX выгодно отличаются тем, что имеют 2х разрядный сегментный индикатор, отображающий ход загрузки, что облегчает диагностику поломки (если таковая есть) и упрощает дизассемблирование BIOS, поскольку… код, отображаемый на индикаторе, в листинге присутствует в виде константы, расшифровку значения которой можно найти в руководстве в приложении E. Лучших комментарий к листингу, пожалуй, и не придумаешь!

На остальных материнских платах порядок инициализации оборудования не сильно отличается от EPOX'а и все происходит приблизительно следующим образом:

* тест CMOS на чтение/запись;

* отключение теневой RAM;

* инициализация базовых регистров чипсета;

* чтение информации из SPD и инициализация DRAM-контроллера;

* распаковка сжатого BIOS в оперативную память;

* копирование BIOS в теневую RAM в сегменты E000h и F000h;

* инициализация интерфейса 8042 (интегрированного в южный мост);

* запуск самотестирования 8042;

* детектирование микросхемы FLASH-ROM;

* загрузка процедуры "прожига" FLASH в сегмент F000h (для поддержки DMI & ESCD);

Назад на стр. 093-136-3  Содержание  Вперед на стр. 093-136-5