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

Стряпаем MBR

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

Хакер, номер #079, стр. 079-114-4


JZ LOAD_LBA_EXT ; это Расширенная Таблица Разделов в LBA-формате

ADD SI, 10h ; переходим на следующую partition

CMP SI, 1EEh

JNA read_all_partitions; читаем все партиции одну за другой

…

buf rb 512 ; буфер на 512 байт

Запись сектора в CHS-режиме происходит практически так же, только регистр AH равен не 02h, а 03h. С LBA-режимом же разобраться намного сложнее, однако мы, как настоящие хакеры, осилим и его. Чтение сектора в нем осуществляется функцией 42h (AH = 42h). В регистр DL, как и прежде, заносится номер привода, а вот регистровая пара DS:SI здесь указывает на адресный пакет (disk address packet), представляющий собой продвинутую структуру формата, указанного в таблице 4. На асме чтение сектора в LBA выглядит так:

[чтение сектора с диска в LBA-режиме]

MOV DI, 1BEh ; на первый partition

MOV AX, CS ; настраиваем…

MOV buf_seg ; …сегмент

MOV EAX, [DI+08h] ; смещение partition относительно начала раздела

ADD EAX, EDI ; EDI должен содержать номер сектора текущего MBR

MOV [X_SEC] ;

…

read_all_partitions:

MOV AH, 42h ; читать сектор в LBA-режиме

MOV DL, 80h ; читать с первого диска

MOV SI, dap ; смещение адресного пакета

INT 13h

JC error ; ошибка чтения

…

dap:

packet_size db 10h ; размер пакета 10h байт

reserved db 00h ; заначка для будущих расширений

N_SEC dw 01h ; читаем один сектор

buf_seg dw 00h ; сюда будет занесен сегмент буфера-приемника

buf_off dw buf ; смещение буфера-приемника

X_SEC dd 0 ; сюда будет занесен номер сектора для чтения

dd 0 ; реально неиспользуемый хвост 64-битного адреса

buf rb 512 ; буфер на 512 байт

Запись осуществляется аналогично, только регистр AH содержит не 42h, а 43h. Регистр AL определяет режим: если нулевой бит равен 1, BIOS выполняет не запись, а ее эмуляцию. Второй бит, будучи взведенным, задействует запись с проверкой. Если AL весь равен 0, выполняется обыкновенная запись по умолчанию. Не очень сложно, правда?

Теперь, вроде бы освоившись с дисковыми прерываниями, перейдем к обсуждению остальных аспектов программирования MBR.

[как пишут загрузчики]

С точки зрения ассемблера загрузчик представляет собой обыкновенный двоичный файл, предельно допустимый объем которого составляет 1BBh (443) байт. Немного? Не будем спешить с выводами. Всякий раздел всегда начинается с начала цилиндра, а это значит, что между концом MBR и началом раздела имеется, по меньшей мере, sector per track свободных секторов. Практически все современные винчестеры имеют по 64 секторов в треке, что дает нам: 443 + 63*512 == 32,699 байт, то есть около 32 Кбайт. Да в этот объем можно уместить даже графический интерфейс с мышью и голой красавицей на обоях. Но мы не будем! Настоящие хакеры работают в текстовом режиме с командной строкой, а красавиц лучше трахать, а не рассматривать.

Как уже говорилось, BIOS загружает MBR по адресу 7C00h, поэтому в начале ассемблерного кода должна стоять директива ORG 7C00h, а еще USE16: загрузчик выполняется в 16-разрядном реальном режиме. Позже, при твоем желании, он может перейти в защищенный режим, но это уже дебри.

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