Что-то не стыкуется... OneHalf ведь тоже подставляет незараженный MBR.
Для проверки я написал 2 проги, обе перехватывают Int 13h. Мой обработчик при считыании сектора 0/0/1 заменяет первые 4 байта этого сектора нулями.
Первая прога перехватывает Int 13h до загрузки ДОС (запускается из MBR, как бут-вирус)
Вторая - после (обычная TSR, запускается из autoexec.bat)
1) Ставим в MBR первую прогу, загружаем Win95 OSR2, читаем первый сектор DiskEdit'ом - первые 4 байта оригинальные, т.е. система не вызвала мой обработчик, а считала сектор с помощью своих драйверов.
Загружаемся в Safe Mode или Command Prompt only, читаем первый сектор - в нем первые 4 байта - нули (т.е. обработчик-то действует :-)
2) Ставим в autoexec.bat вторую прогу, загружаем Win95 OSR2, читаем первый сектор DiskEdit'ом - первые 4 байта - нули.
Получается, что алгоритм не совсем такой, как описал z0.
Или это только у меня так ? :))
; Первая прога - компилить в .com и назвать newmbr.i13
.386
CODE SEGMENT USE16
ASSUME CS:CODE, DS:CODE, ES:CODE
ORG 100H
Start:
xor ax, ax
mov si, 7C00h
cli
mov sp, si
mov ss, ax
sti
mov ds, ax
push ax
push si
sub word ptr ds:[413h], 4
int 12h ; Put (memory size)/1K in ax
shl ax, 6
mov es, ax
mov di, offset Start
push es
push offset Cont_Boot
cld
mov cx, 200h / 4
rep movsd
retf
Cont_Boot:
mov ax, 201h
pop bx
pop es
push es
push bx
mov cx, 3
mov dx, 80h
int 13h ; Disk dl=drive 0 ah=func 02h
; read sectors to memory es:bx
; al=#,ch=cyl,cl=sectr,dh=head
mov ax, cs
shl eax, 16
mov es, ax ; ES = 0
mov ax, offset New_13h
cli
xchg eax, es:[13h*4]
mov cs:Old_13h, eax
sti
retf
New_13h proc far
pushf
cmp ah,2
jne Sys_13h
cmp cx, 1
jne Sys_13h
cmp dx, 80h
jne Sys_13h
popf
push es
push bx
pushf
call cs:Old_13h
pop bx
pop es
mov dword ptr es:[bx], 0
retf 2
Sys_13h:
popf
db 0EAh
Old_13h dd 0
New_13h endp
CODE ENDS
END Start
// ------------------------------------------------
// Инсталляция в MBR
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <bios.h>
void main()
{
int filedes;
char buffer[512];
biosdisk(_DISK_READ, 0x80, 0, 0, 1, 1, buffer);
biosdisk(_DISK_WRITE, 0x80, 0, 0, 3, 1, buffer);
filedes = open("newmbr.i13", O_BINARY | O_RDONLY);
if (filedes == -1)
{
printf("ERROR: Failed to open file 'newmbr.i13'\n");
return;
}
long fl = filelength(filedes);
if (fl > 0x100)
{
printf("ERROR: newmbr.i13 size is too big\n");
return;
}
read(filedes, buffer, fl);
close (filedes);
biosdisk(_DISK_WRITE, 0x80, 0, 0, 1, 1, buffer);
}
// ------------------------------------------------
// Деинсталляция из MBR
#include <bios.h>
void main()
{
char buffer[512];
biosdisk(_DISK_READ, 0x80, 0, 0, 3, 1, buffer);
biosdisk(_DISK_WRITE, 0x80, 0, 0, 1, 1, buffer);
}
;--------------------------------------------------
; Вторая прога (tsrint13.asm)
.386
CODE SEGMENT USE16
ASSUME CS:CODE, DS:CODE, ES:CODE
ORG 100H
Start:
mov ax, cs
shl eax, 16
mov es, ax ; ES = 0
mov ax, offset New_13h
cli
xchg eax, es:[13h*4]
mov Old_13h, eax
sti
lea dx, VeryEnd+1
int 27h
New_13h proc far
pushf
cmp ah,2
jne Sys_13h
cmp cx, 1
jne Sys_13h
cmp dx, 80h
jne Sys_13h
popf
push es
push bx
pushf
call cs:Old_13h
pop bx
pop es
mov dword ptr es:[bx], 0
retf 2
Sys_13h:
popf
db 0EAh
Old_13h dd 0
New_13h endp
VeryEnd:
CODE ENDS
END Start
---
|