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-сектора] |