Попробуйте скопировать загрузочный сектор типа Windows 98, переименовать его в COM-файл и запустить из коммандной строки ДОС.
Я попробовал - и по экрану поползли ЖУКИ !!!
Не верите - попробуйте сами!
Я таких ни в одной гребаной интернациональной ASCII - кодировке не видел. Даже в Windings! Интересно - мелкомягкие знают?
***> ТАК КАК ЖЕ ЗАПУСТИТЬ ЭТОТ БУТСЕКТОР НА ЗАГРУЗКУ???? <***
Что именно делать то : ну там типа ES=DI, DS=SS, jmp [?:?]... или как???
Совсем не прикол, вот пример его трассировки...02.11.01 13:49 Автор: Chingachguk <Chingachguk> Статус: Member
> Попробуйте скопировать загрузочный сектор типа Windows 98, ...
> Я попробовал - и по экрану поползли ЖУКИ !!!
Дело в том, что родной mbr грузится биосом по адресу 0000:07c00h -
- всегда. И он себя перемещает куда-нибудь ниже ; Чтобы загрузить на свое место boot-сектор винта.
Ниже пример трассировщика mbr винчестера:
Написал Chingachguk ;)
.286
text segment byte public
assume cs:text,ds:text
org 100h
begin:
; Open file with MBR
mov ax,3d02h
mov dx,offset MbrName
int 21h
jnc @@FileOpen
mov dx,offset ErrMess
call @@Message
jmp @@Exit
@@FileOpen:
mov bx,ax ; Save descriptor
; Make New Address After Our Segment (after cs:/ds:/ss:/es:)
push cs
pop ax ; Get current segment to ax
add ax,1000h ; ax:=ax+64K/16
mov ds,ax
mov dx,07c00h ; ds:dx = to next segment (cs+64K:07c00h)
mov ah,3fh
mov cx,512
int 21h ; Read MBR from file
jnc @@MbrReaded
mov dx,offset ErrMess
push cs
pop ds
call @@Message
jmp @@Exit
@@MbrReaded:
mov ah,3eh
int 21h ; Close MBR file
mov si,dx ; si = 07c00h -> to begin of MBR
mov ax,word ptr es:[@@BeginMbr]
cmp ds:[si],ax
jnz @@NoStandMbr
mov ax,ds ; nop nop replace to xor ax,ax, ax=ds
mov word ptr ds:[si],9090h
@@NoStandMbr:
push ds
push dx
retf ; Execute MBR !
@@Exit:
mov ax,4C00h
int 21H ; BACK TO DOS
@@Message:
mov ah,09h
int 21h
retn
@@BeginMbr:
xor ax,ax ; Begin of standart MBR ?...
ErrMess db 'Error !','$'
MbrName db 'saveboot.dat',0
DiskBuffer db 512 dup(?)
Text Ends
end begin
Совсем не прикол, вот пример его трассировки...06.11.01 09:44 Автор: dron <Ivanov Andrey> Статус: Member
года 4 назад я тоже ради интереса писал загрузчик, который спрашивал пароль, делал сом файл и потом дискедитом вставлял его в мбр. Почему то строка запроса пароля не хотела выводиться полностью на экран, выводились, насколько я помню, только 3 буквы, причем я пробовал по-разному как биосовской функцией вывода на экран, так и прямым выводом символов в видеобуфер. результат один и тот же. Подскажите, может я чего ни учел.
Подробнее, если можно...06.11.01 11:22 Автор: Chingachguk <Chingachguk> Статус: Member
> года 4 назад я тоже ради интереса писал загрузчик, который > спрашивал пароль, делал сом файл и потом дискедитом > вставлял его в мбр. Почему то строка запроса пароля не > хотела выводиться полностью на экран, выводились, насколько > я помню, только 3 буквы, причем я пробовал по-разному как > биосовской функцией вывода на экран, так и прямым выводом > символов в видеобуфер. результат один и тот же. Подскажите, > может я чего ни учел.
Надо б код глянуть ... А так не совсем понятно, как именно ты его(com) написал и можно ли его было в таком виде в mbr ложить ... Куда ты старый mbr деваешь ? Написал ты com с org 7c00 или еще как ...
код07.11.01 13:10 Автор: dron <Ivanov Andrey> Статус: Member
> Надо б код глянуть ... А так не совсем понятно, как именно > ты его(com) написал и можно ли его было в таком виде в mbr > ложить ... Куда ты старый mbr деваешь ? Написал ты com с > org 7c00 или еще как ... А старый мбр ручками переносится в 13 сектор, и моя прога грузит его из этого сектора, и потом скачет на него
;mov ah,13h
;mov al,1
;mov bh,0
;mov bl,17h
;mov cx,16
;mov dh,22
;mov dl,5
;mov bp,12
;int 10h
mov dl,'h'
mov ah,00h
int 16h
cmp al,dl
jne nach
mov dl,'a'
mov ah,00h
int 16h
cmp al,dl
jne nach
mov dl,'c'
mov ah,00h
int 16h
cmp al,dl
jne nach
mov dl,'k'
mov ah,00h
int 16h
cmp al,dl
jne nach
pop es
pop ds
mov dh,0
mov dl,80h
mov cl,13
mov ch,0
mov al,1
mov ah,02h
mov bx,0
mov es,bx
mov bx,7c00h
int 13h
db 0eah
dw 7c00h
dw 0000h
endp boot
ends cods
end boot
код07.11.01 13:47 Автор: Chingachguk <Chingachguk> Статус: Member
Посмотрел я твою программу. Вот что я хочу сказать по ней:
Проверил я вывод твой. На трассировщике, который я в этой нитке человеку высылал, котрый про жуков грил ;) Все работает. Выводит
строку "Password:" Но !
1. Перед выводом на экран, а ты неявно пользуешься режимом 03h
экрана (текстовой, 80x25), я б этот режим устанавливал. (mov ax,0003h, int 10h). Возможно, ты пишешь в видеопамять, не подготовившись. Но вероятность этого, на мой взгляд, ~5%.
2. Но вот главный баг вроде вот в чем:
> А старый мбр ручками переносится в 13 сектор, и моя прога > грузит его из этого сектора, и потом скачет на него >...
; Вот ты решил пердать управление родному mbr, котрый вроде как
; должен быть в секторе 13...
> mov dh,0 / mov dl,80h / mov cl,13 / mov ch,0 > mov al,1 / mov ah,02h / mov bx,0 / mov es,bx / mov bx,7c00h ; Все зашибато, кроме одного: твой код сейчас как раз сидит
; именно в 0000:07c00h, и ты поверх себя ...
> int 13h ; ... записываешь настоящий mbr
; И теперича здесь уже не эти команды:
> db 0eah / dw 7c00h / dw 0000h ; А какой-то кусок родного mbr. Последствия плачевны ;).
Вот как в таких случаях поступает настоящий mbr (98 или NT):
Сразу при старте копирует себя из 0000:07c00 в 0000:06xxh,
те ниже в памяти, что-то там делает и грузит boot сектор найденного
раздела винта на свое старое место, те в 0000:07с00h, и вот потом
делает jmp far или retf на эту точку...
Есть и другие варианты ;)
> Вот как в таких случаях поступает настоящий mbr (98 или > NT): > > Сразу при старте копирует себя из 0000:07c00 в 0000:06xxh, > те ниже в памяти, что-то там делает и грузит boot сектор > найденного > раздела винта на свое старое место, те в 0000:07с00h, и вот > потом > делает jmp far или retf на эту точку... > Есть и другие варианты ;) > конечно красивее поставить CD 13 EA 00 7С 00 00 в видеопамять
а если чуть-чуть усложнить то и обработка ошибок будет...
код08.11.01 09:38 Автор: Chingachguk <Chingachguk> Статус: Member
> конечно красивее поставить CD 13 EA 00 7С 00 00 в > видеопамять > а если чуть-чуть усложнить то и обработка ошибок будет...
Для вышеприведенного случая (dron), на мой взгляд, можно и вот так :
; Заготовим регистры для вызова
mov ax,0201h
mov bx,07c00h
mov cx,0001h
mov dx,0080h
push 0h
pop es
; Готовимся к переходу
pushf
push es
push bx
; Переходим в биос.
jmp dword ptr es:[13h*4]
OK08.11.01 18:43 Автор: dron <Ivanov Andrey> Статус: Member
Прикол то в том, что именно ЖУКИ ! Это надо же, пишешь загрузчик,
а получается чуть ли не DEMO! Это как криптографические алгоритмы (некоторые) - 100 различных ключей примененных к одному файлу дают 100 различных ОСМЫСЛЕННЫХ вариантов - поди выбери, что тебе нужно было...
А прога-то работает! Спасибо огромнейшее! Очень редко нынче встречаются проги, работающие без доладки... И написано на удивление руками, а не как у некоторых уродов (где даже построчная трассировка не помогает - сам видел... )