Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #78, ИЮНЬ 2005 г.

BIOS на блюдечке

Крис Касперски ака мыщъх

Хакер, номер #078, стр. 078-108-5


[боевое крещение]

Разобравшись с устройством BIOS'а, мы можем написать для него свое собственное расширение. Проще всего добавить к BIOS'у нестандартный ISA ROM модуль. Обычно такие модули используются для управления интегрированными ISA-контроллерами (например дополнительным COM-портом). Разумеется, никаких контроллеров у нас нет, ISA-слоты давно исчезли с материнских плат, но модули их по-прежнему поддерживаются BIOS'ом.

Загружаясь после того, как отработает основной код BIOS (original.tmp), ISA-модуль получает полный доступ ко всему оборудованию, в том числе и PCI-шине. В принципе, при желании можно добавить и PCI-модуль, однако это намного сложнее. Потребуется взвести регистр XROMBAR (Expansion ROM Base address) и подделать идентификатор PCI-устройства в заголовке модуля так, чтобы он совпадал с идентификатором реально существующего устройства. Нам ни к чему подобные удовольствия.

ISA-модуль представляет собой обычный двоичный файл с размером, кратным 200h байтам, всегда загружающийся по адресу xxxx:0000h. Часть оборудования (оперативная память, клавиатура, видеокарта) к моменту его вызова уже инициализирована, а часть (жесткие диски, к примеру) — еще нет. Прерывания INT 10h (видео) и INT 16h (клава) можно использовать не боясь, а вот с INT 13h (диски) просто так ничего не выйдет.

В начале ISA-модуля расположен стандартный 55 AA-заголовок, о котором мы уже говорили, а в последнем байте хранится контрольная сумма. Простейший ISA-ROM модуль, написанный на FASM'е, выглядит так:

[ISA-модуль]

; При загрузке компьютера модуль выводит приветствие на экран

; и ждет слова «мыщъх», набранного на латинской раскладке

; (ENTER — начать ввод заново). Что-то вроде дополнительной

; парольной защиты, которую без выдирания BIOS'а никто не взломает.

; ISAOEM.ASM

use16 ; ISA-модуль работает в 16-разрядном сегменте

DB 55h, 0Ah ; загрузочная сигнатура

DB 01h ; размер блока в 200h-байтовых секторах

jmp x_code ; передача управления нашему коду

x_code:

; подготовка регистров

; ––––––––––––––––––––

MOV DX, 101Dh ; куда выводить (DH - Y, DL - X)

MOV SI, text ; что выводить

XOR BX,BX ; начальный цвет символов — 1

MOV CX,1 ; выводим по одному символу

; вывод строки в цвете

; ––––––––––––––––––––

print_string:

MOV AH, 02h ; функция управления курсором

INT 10h ; позиционируем курсор

INC DL ; перемещаемся на следующую позицию

LODSB ; загружаем очередной символ

TEST AL,AL ; конец строки?

JZ input ; если конец, то выходим

MOV AH, 09h ; функция печати символа

INC BL ; перебираем все цвета

INT 10h ; печатаем символ

JMP print_string ;мотаем цикл

input: ; ожидание ввода пароля

; ––––––––––––––––––––-

XOR DX,DX ; контрольная сумма

enters:

XOR AX,AX ; функция чтения символа с клавы

Назад на стр. 078-108-4  Содержание  Вперед на стр. 078-108-6