Описание MBR (дизассемблированный мастер бут)

Тема в разделе "WASM.RESEARCH", создана пользователем pasta, 29 мар 2007.

  1. pasta

    pasta New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    15
    Эх, все-таки не зря, оказывается, я дизасмил.
    В "сырцах nt" на самом деле лежат древние загрузчики dos (по крайней мере, mbr и fat-овский, остальные не смотрел.)
    В них нет поддержки lba (int13, ah=41h,42h). А fat-овский - это к тому же под fat16.
    Абыдна... :dntknw:
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну а че ты хотел от NT4 ?)
    Ну а насчет lba я не смотрел, но должна быть... хз
     
  3. pasta

    pasta New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    15
    Нету, там только int13 ah=02 и все :)
    Вроде, когда вышел nt4, lba уже было. А может, и нет, это дело темное :)
    Это ты из осла скачал? Я там нашел еще такой заманчивый файлик:
    ed2k://|file|Microsoft%20Windows%20Source%20Code%20(Windows%202000,%20Nt%204.0,%20Xp)%20[found20via20www.FileDonkey.com].tar|410163200|C9A06C19116C11AFE7A99529A56209A0|/
    Только весит он 391 Мб, так что это на пару месяцев есть чем настроение поднять =)))
    Но если верить названию (прочти в ссылке вместо %20 везде пробелы :) ), то и какие-то огрызки xp там есть.
    А этот фатовский бутстрап и правда выглядит точно как досовский, только вместо загрузки по фиксированному смещению он ищет ntldr. Будто взяли досовский лоадер, поковыряли и бросили.
     
  4. pasta

    pasta New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    15
    В общем, расковырял я валом уже и корневых бутстрапов, и fat-овских. Устроены они похоже:
    если можно нужный сектор прочитать в chs-адресации, юзают int 13h ah=2.
    Если нет - проверяют, установлен ли ext bios:
    Код (Text):
    1.  
    2.                  mov     ah, 41h
    3.                  mov     bx, 55AAh
    4.                  mov     dl, [bp+40h]    ; dl <= BS_DriveNum (номер диска. Для fat- лежит в
    5.                                                 ; указанном поле BS_Drivenum)
    6.                  int     13h             ; проверка, установлена ли поддержка ext 13h в BIOS
    7.                  jb      extINT13_noinst ; CF=1 - нет поддержки
    8.                 cmp     bx, 0AA55h
    9.                  jnz     extINT13_noinst ; возвращена неверная сигнатура - нет поддержки
    10.                 test    cl, 1
    11.                  jz      extINT13_noinst ; поддержка есть, но нет подмножества работы
    12.                                                 ; с большими дисками
     
  5. pasta

    pasta New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    15
    Если все в порядке - читаем. Причем что с ah=02, что с ah=42h читаем до пяти раз, если была ошибка (каждый раз перед этим сбраываем контроллер), и только потом считаем, что правда кирдык. И читаем только по одному сектору (потому как у некоторых bios есть странный такой глюк - им что ни пиши, они прочтут только один сектор и все. Так что во всех бутстрапах, что я расковырял, это учтено).
    Ну, что еще там интересного? Вывод на дисплей прикольно сделан в fat-овском бутере:
    Код (Text):
    1.  
    2. out_Disk_error: mov     al, ds:adr_Disk_error
    3. display_out:     mov     ah, 7Dh
    4.                      mov     si, ax
    5. out_next_char:  lodsb
    6.                      test    al, al
    7.                      jz      short wait_and_reboot
    8.                      cmp     al, 0FFh
    9.                      jz      short out_press_any_k
    10.                      mov     ah, 0Eh
    11.                      mov     bx, 7
    12.                      int     10h             ; - VIDEO - WRITE CHARACTER AND ADVANCE
    13.                                                ;  CURSOR  (TTY WRITE)
    14.                                         ; AL = character, BH = display page (alpha modes)
    15.                                          ; BL = foreground color (graphics modes)
    16.                  jmp     short out_next_char
    17. out_press_any_k: mov     al, ds:adr_press_any_k
    18.                  jmp     short display_out
    19. out_NTLDR_miss: mov     al, ds:adr_NTLDR_miss
    20.                 jmp     short display_out
    21. wait_and_reboot:           cbw
    22.                int     16h             ; KEYBOARD -
    23.                int     19h             ; DISK BOOT - causes reboot of disk system
    24. ..............
    25. seg000:7DAC aNtldrIsMissing db 0Dh,0Ah
    26. seg000:7DAC                 db 'NTLDR is missing'
    27. seg000:7DBE                 db 0FFh
    28. seg000:7DBF aDiskError      db 0Dh,0Ah
    29. seg000:7DBF                 db 'Disk error'
    30. seg000:7DCB                 db 0FFh
    31. seg000:7DCC aPressAnyKeyToR db 0Dh,0Ah
    32. seg000:7DCC                 db 'Press any key to restart',0Dh,0Ah,0
    33.  
    34. .....................
    35. seg000:7DF9 adr_NTLDR_miss  db 0ACh  ; смещения строк для вывода на дисплей от si
    36. seg000:7DFA adr_Disk_error  db 0BFh     ; (а в si мы сунули 7dh)
    37. seg000:7DFB adr_press_any_k db 0CCh
    Особо комментировать нечего вроде. При ошибке зовем этот код по out_Disk_error или out_NTLDR_miss (в ds при этом лежит seg000, конечно), грузим адрес строки, выводим ошибку до символа FFh, потом как его находим - пишем опять в том же цикле "press any key...", пока не прочтем 00h, и уходим на ожидание нажатия клавиши и перегружаемся, если юзверь any key найдет ;)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если даже в сорсах 2000 этого нету, то в "огрызках" ХР и не стоит надеяться найти какие-либо следы загрузчика =)
     
  7. pasta

    pasta New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    15
    Да и бог с ним. Штука ведь это немудрящая (не считая ntldr), да и примеров я уже достаточно расковырял.
    А в том файлике могут быть какие-то другие вещи, которые неплохо знать ;)
    Хотя лет пять назад видел я огрызки настоящих исходников nt4 - вот это был и правда прикол. Там комменты мелкомягких кодеров все в таком духе, типа зачем надо такую-то функцию звать, я без понятия, но вася так сказал. А потом вася ниже пишет, типа, это недокументированная точка входа, я про нее от феди слышал. А Федя приписывает, что оба они козлы, и эту точку входа мелкомягкие собирались в win 3.1 воткнуть, но потом стало лениво =))) В общем, после того, как глянешь сорцы, становится ясно, почему форточка такая вестчь ;)

    Всем, кому тема загрузчиков интересна, запаковал в раре маленькую подборку доков, которые нарыл в основном ослом. Там описание логической структуры hdd, русский перевод fatgen1.03 - описания форматов fat, прерывания int13h - в общем, кроме этого ничего не нужно знать, чтобы написать нормальный загрузчик.
    Весит он 127 кБ, лежит здесь: http://lllit.ru/boots.rar
    Кому надо - забирайте :)