Стряпаем 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-разрядном реальном режиме. Позже, при твоем желании, он может перейти в защищенный режим, но это уже дебри. |