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

BIOS на блюдечке

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

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


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

CMP AL,0Dh ; это ENTER?

JZ input ; если ENTER, начинаем ввод сначала

XOR AH,AH ; очистить скэн-код

ADD DX,AX ; считаем CRC

CMP DX, 'm' + 's' + 'o' + ']' + '['

JNZ enters ; если это не «мыщъх», продолжаем ввод

retf

text db "Matrix has you!",0

Пропустив исходный файл через транслятор (FASM ISAOEM.ASM), мы получим на выходе ISAOEM.BIN. Загружаем его в HIEW и дополняем нулями до размера, кратного 200h байтам, затем рассчитываем контрольную сумму: просто складываем все байты друг с другом и находим остаток от деления на 100h. То есть sum=(sum+next_byte)&0xFF. Контрольная сумма всего блока должна равняться нулю, следовательно, последний байт блока равен (100h–sum)&0xFF. Для расчета контрольной суммы я написал нехитрый скрипт для IDA:

auto a; auto b; b=0;

PatchByte(MaxEA()-1, 0);

for(a=MinEA();a<MaxEA();a++)

{

b = (b + Byte(a)) & 0xFF;

}

b = (0x100 - b) & 0xFF ; Message("\n%x\n",b);

PatchByte(MaxEA()-1, b);

Как вариант можно использовать Hex Workshop (Tools -> Generate Check sum -> 8 bit checksum). В нашем случае Hex Workshop сообщает CFh, следовательно, последний байт равен: 100h – CFh == 31h. Записываем его по смещению 1FFh и сваливаем из HIEW'а. Добавляем новый модуль в прошивку (CBROM.EXE 4PE83619.BIN /ISA ISAOEM.bin) и с замиранием сердца прожигаем BIOS утилитой UNIFLASH. Перезагружаем машину, и, если все было сделано правильно, экран должен быть похож на то, что ты видишь на скриншоте. Работает!

[работа с жестким диском]

Теперь поговорим о том, как написать что-нибудь, что работало бы из BIOS’а с жесткими дисками (например boot-вирус, который бы автоматически восстанавливался после форматирования). Прерывание INT 13h здесь не поможет, поскольку ISA-блок отрабатывает еще до инициализации дисков, так что приходится писать резидент (а еще говорят, что вирусы в BIOS'е не живут!).

Основной код BIOS'а всегда загружает boot/MBR-сектор по адресу 0000:7C000h и передает ему управление. Установив на этот адрес аппаратную точку останова (breakpoint), мы всплывем в тот момент, когда все оборудование уже инициализировано и работает как часы.

Весь вопрос в том, куда спрятать наш код. По умолчанию ISA-блок распаковывается в оперативную память, которая впоследствии злобно затирается всеми, кому не лень, а значит, в нем жить нельзя. Давным-давно, когда землей владели динозавры, а на компьютерах стояла MS-DOS, многие вирусы ухитрялись разместиться внутри таблицы прерываний, верхняя половина которой остается незадействованной и по сей день. От адреса 0000:01E0h до ~0000:0384h простилается ничейная область, в которой можно разместить почти 360 байт своего обработчика. Для наших целей этого вполне достаточно.

Следующий код устанавливает аппаратную точку останова и перехватывает прерывание INT 01h, которое генерируется при передаче управления на загрузочный сектор. Обработчик прерывания пусть каждый пишет самостоятельно. Фактически он представляет собой обыкновенный boot-вирус, образец которого легко найти в Сети.

[перехватчик, который передает управление нашему коду в момент загрузки boot-сектора]

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