туплю с загрузчиком

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 4 Jan 2013.

  1. herfleisch

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

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Блин, не могу отверждать на 100%, но что-то мне подсказывает что реальный размер первичного загрузчика не должен превышать 440 байт, а остальные из 512 - это какая-то там информация о файловой системе вроде бы. Я боюсь сбить с толку, но что-то такое крутится в голове. Так вот если логично порассуждать, NTLDR как раз и говорит тебе что у него возникли какие-то непонятки с файловой системой.

    UPD. Вот цитата с педивикии:
    UPD2. Это все опять на тему того, что виндовый MBR может ожидать эти 72 байта по другому адресу.
     
    #21 herfleisch, 7 Jan 2013
    Last edited: 7 Jan 2013
  2. altblitz

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

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,146
    Reputations:
    236
    MS-DOS 5.1 файл-системa.
    herfleisch, для интереса, посмотри на первые 512 байтов с HDD.

    не просто так научился, и Вин и Линукс пользоваться одной партицией swap файла.
    изврат, но учит правильному подходу к загрузке MBR.

    да, и методу научил парень с PCFormat журнала. .UK
    ему в рот палец не клади - сначала постебётся и поглумится, и толково решит задачу, сцукан ))
     
  3. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    это все ***ня чуваки,потому что вот что у меня вышло:watch
    (извините за такое видио конечно) и у меня теперь несколько догадок почему не пашет.
    я тупо охуевший как оно заработало,я его наказал бля)))
     
  4. herfleisch

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

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Поздравляю :). То есть у тебя получилась такая же ситуация, которую я в личке описывал: в виртуалке не пашет, а на железе все заработало?
     
  5. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    ну оно на флопе запахало,а как на ж\д себя поведет еще не понятно.
    в этом пришлось указывать параметры boot сектора, такие как:
    кол-во байтов на сектор,кол-во секторов на кластер,кол-во секторов на трэк, OEM идентификатор и прочую ересь.а так по идее надо лишь запомнить младший байт dx где при старте указывается с какого устройства мы загрузились и pop-ить его в прерывании int 13. на своем компе так впадло это все вытворять)
    а да еще что забыл сказать:
    при добавлении или убирании кода который запускается в скопированном в участке памяти,меняется сегмент:смещение по которому прыжок происходит,и увидеть эту хрень сразу тяжеловато,по этому для 100% точности что мы попадаем в копию нашего кода в памяти -лучше всего смотреть в дебагер.хотя можно делать просто вычитание с 7c00h до нашего адреса куда копируемся а потом джампать.
     
    #25 DooD, 7 Jan 2013
    Last edited: 7 Jan 2013
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    DooD лично я записывал на 1 сектор флехи отформатированной в FAT не трогая таблицу секций и на виртуалке VMware ставил загрузку с флешки - в итоге он обрабатывал бут из флехи - там уже и игрался - для отладки использовал вывод символа через прерывания BIOS - мол если все нормально прошло и код сработал до нужного места вылезет символ.
     
    _________________________
  7. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    так то оно пашет,но надо с ж\д запиливать,чего вм,как я понял,не умеет
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Кстати, тока сейчас в голову пришло, винда реально может не грузится, ведь MBR это не BOOT.
    Вдруг какой-то код винды считывает повторно MBR и пытается там найти таблицу разделов?
     
  9. DooD

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

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

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    и так дело вроде тронулось с мертвой точки.как я и сказал все дело в заполнении BPB.
    теперь хотя бы резидентный код запускается:я вижу свое сообщение,жму клавишу и ...все-выскакивают какие то иероглифы..
    сравнивая первые 54h байтов с вендовым загрузчиком увидел лишь несколько не совпадений в байтах..дальше в ступоре почему не работает.
     
  11. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    короче я еще не плюнул на это все.
    значит так,я отладил код ровно до считывания сектора в борще,все выводится,но по нажатию клавиши просто мигает сообщение,вижу два варианта:либо не читается сектор,либо код самозатирается(хотя этого вроде нету).
    сейчас ломаю моск что бы запилить на борщ венду,как запилю буду дебажить в нем уже с сектором,там и разберемся что да как.
     
  12. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    итак вот что показал отладчик
    [​IMG]
    получается что по адресу старта все равно висит мой же код,какого черта не пойму.у кого какие идеи еще есть?читаю как видите CHS может попробовать LBA? хотя по идее что то ,что это должно работать.

    не большие поправки:
    там я затирал dx и не знал номер диска соответственно я прыгал сам на себя.-исправил путем записи номера диска в переменную,однако посмотрев содержание dl после стартапа увидел почему то 0x00...
    upd теперь вижу 0x80, но теперь когда отдаю управление на 0x7c00 вижу что там вообще пусто!

    upd upd/^ ес !! получилось,теперь я читаю сектор и прыгаю на него,но тут снова проблема)
     
    #32 DooD, 23 Jan 2013
    Last edited: 24 Jan 2013
  13. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    в общем то результат следующий, один диск как бы подразделяется на 2 ,как я понял логический и физический. winhex показал что 0-й сектор это 63 сектор на логическом(то есть они совпадают).я меняю 0-й на логическом на свой mbr, тут все читается и управление отдается,но вот выбивается такая вздрочь:NTLDR: Couldn't open drive multi(0)disk(0)rdisk(0)partition(1) ...
    короче кажется он раздел не может найти...давайте люди подскажите бо я уже совсем не соображаю)
     
  14. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    все получилосссссссссь!!! ЕЕЕЕЕЕЕЕЕЕЕ У кого большие яйца?у меня большие яйца :D!!!
    можно делл)
     
    1 person likes this.
  15. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    ну вот же был пример
    Code:
    ;регистр dl cодержит номер загрузочного диска!
    
    use16
    ;======== Копируем самого себя по адресу 0000:0600h ===================
        mov ax, 7C0h
        mov ds, ax
        xor si, si
    
        mov ax, 60h
        mov es, ax
        xor di, di
    
        mov cx, 0FFh ;в cx лежит число повторений функции копирования слов
    
        ;[DS:SI] => [ES:DI]; SI += 2; DI += 2;
        rep movsw
    
        ;Передаем управление на новое расположение кода
        jmp 0000:0618h
    
    ;======== Приветствуем пользователя ===================================
          mov ax, hello_msg_1
          call print
          mov ax, hello_msg_2
          call print
    
    ;======== Проверяем таблицу разделов ===================================
          mov si, [part_adr]
          mov bh, 80h
    
          mov cl, -1
    partitions_chek:
          cmp cl, 3			   ;если уже было проверено 4 записи, выходим из цикла и переходим к обработке записей
          je partition_select
    
          add si, 10h
          inc cl
    
          mov bl, [es:si]
          cmp bl, bh
          jne partitions_chek		   ;запись не является загрузочной
    
          call partitions_process	   ;запись загрузочная!
                           ;[es:si] содержит адрес записи в таблице разделов
                           ;cl - номер раздела
    
          jmp partitions_chek
    
    ;======== Подпрограмма вывода инофрмации об активном разделе =============================
    partitions_process:
          mov ax, boot_part_msg
          call print
    
          mov di, part_num
          add [ds:di], cl
          mov ax, part_num
          call print
          sub [ds:di], cl
    
          mov di, boot_flags
          mov ch, 0
          add di, cx
          mov byte[ds:di], 1
    
          ret;
    ;=======================================================================
    
    partition_select:
          ;Обрабатываем пользовательский ввод
          mov ax, select_part_msg
          call print
    
    choise:   mov di, boot_flags
          mov si, [part_adr]
    
          mov ah, 0
          int 16h
    
    p0:	  cmp al, 48
          jne p1
          add si, 10h
          jmp disk
    
    p1:	  cmp al, 49
          jne p2
          add si, 20h
          jmp disk
    
    p2:	  cmp al, 50
          jne p3
          add si, 30h
          jmp disk
    
    p3:	  add si, 40h
          cmp al, 51
          je disk
    
    wrong_choise:
          mov ax, wrong_input_msg
          call print
          jmp choise
    
    disk:	  mov ah, 0
          sub al, 48		      ; сначала проверка, выбрал ли пользователь действительно загрузочный раздел
          add di, ax
          cmp byte [ds:di], 0
          je wrong_choise
                          ; по [es:si] содержится запись таблицы разделов
                          ; о выбранном загрузочном диске
    
          mov ah, 41h		      ; проверка поддержки диском расширенного режима (> 8 GB)
                          ; dl содержит номер диска
          mov bx, 55AAh
          int 13h
          jc  ext_not_present_error
          shr  cx, 1
          jnb  ext_not_present_error
          cmp  bx, 0AA55h
          je   read_boot_sect
    
    ext_not_present_error:
          mov ax, ext_not_pres_msg
          call print
          int 18h
    
    read_boot_sect:
          mov ah, 42h
          mov di, DAP_structure
          add di, 8
          add si, 8
          mov ebx, [ds:si]
          mov [ds:di], ebx
          mov si, DAP_structure
          int 13h
          jc  ext_not_present_error
    
          jmp 0000:7C00h
    ;======== Подпрограмма вывода сообщений ================================
    print:
          push si
          push bx
    
          mov bx, ax
          xor si, si
          mov ah, 0Eh
    
    p:	  mov al, [bx + si]
          cmp al, 0Ah
          int 10h
    
          je end_print
    
          inc si
          jmp p
    
    end_print:
          pop bx
          pop si
          ret
    
    ;=======================================================================
    hello_msg_1	 db '************************', 0Dh, 0Ah
    hello_msg_2	 db '*       LOADER             *', 0Dh, 0Ah
    boot_part_msg	 db 'Find bootable partitions:', 0Dh, 0Ah
    select_part_msg  db 'Select part to boot from (press 0 ... 3)', 0Dh, 0Ah
    wrong_input_msg  db 'Wrong choise. Try again', 0Dh, 0Ah
    ext_not_pres_msg db 'a disk read error occured', 0Dh, 0Ah
    part_num	 db '0', 0Dh, 0Ah
    part_adr	 dw 1AEh
    boot_flags	 db 4 dup (0)
    DAP_structure	 db 10h, 0, 1, 0, 0, 7Ch, 0, 0, 8 dup (0)
    и можно посмотреть что у тебя получилось?
     
  16. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    не заработает это.попзже все оформлю и можно будет.
    даю подсказку пока,суть кроется в разделении диска на физич.\логич.
     
    1 person likes this.
  17. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    апаю последний раз,если интересно читаем что получилось
    http://bydood.blogspot.com/2013/02/2013.html
    + отладка