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 ; функция чтения символа с клавы |