Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29216

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

Часть III. Файловая оболочка, вирус, резидент 

94 

 
;Выводим сообщение об удачном завершении 
mov ah,9 
mov dx,offset Mess_ok 
int 21h 
ret 
 
;Если файл с указанным именем не нашли (File_name db 'Prog09.com',0), 
;то выдаем звуковой сигнал и выходим 
Error_file: 
mov ah,2 
mov dl,7 
int 21h 
ret 
 

;Процедуры 

;Процедура открытия файла для чтения 
Open_file proc 
cmp Handle,0FFFFh     ;Выясняем, открыт ли файл 
jne Quit_open         ;И если не открыт — открываем его 
mov ax,3D00h 
int 21h 
mov Handle,ax 
ret 
Quit_open: 
stc       ;Устанавливаем флаг переноса в 1, необходимый 
ret       ;для подтверждения факта открытия файла (для jc) 
 
Handle dw 0FFFFh 
Open_file endp 
 

;Процедура закрытия файла 
Close_file proc 
mov ah,3Eh 
mov bx,Handle 
int 21h 
ret 
Close_file endp 
 
File_name db 'prog09.com',0 
 
;0Ah,0Dh — переход в начало следующей строки 


background image

Глава 10. Введение в вирусологию. Обработчик прерываний 

95 

Mess_ok db 'Все нормально!',0Ah,0Dh,'$' 
 
Finish equ $          ;Признак (адрес) конца кода программы 
 
CSEG ends 
end Begin 

На рис. 10.1 приведен фрагмент кода в отладчике CodeView перед тем, как про-

грамма прочитает себя в память. Здесь следует обратить внимание на пару регист-
ров 

ds:dx

, которые указывают функции 

3Fh

, в какое место памяти следует читать 

данные из файла. 

 

Рис. 10.1. Перечитывание программы поверх себя 

Дополнительно  следует  особо  отметить  действие  команды 

ret

  в  следующих 

строках: 

... 
mov ah,9 
mov dx,offset Mess_ok 
int 21h 
ret       ;Что делает ret здесь?  
... 

В  данном  случае  все  просто.  Полагаем,  вы  наверняка  заметили,  что  отладчик 

переходит  по  адресу 

cs:0000h

  на  команду 

int  20h

,  которая  и  завершает  работу 

(рис. 10.2 и 10.3). 

Использование  инструкции 

ret

  для  завершения  программы  предпочтительней, 

т. к. мы экономим один байт. Однако это работает только в том случае, если про-
граммист перед выполнением финальной инструкции 

ret

 выровнял стек, т. е. вер-

нул в исходное состояние регистры 

ss:sp

, если они изменялись. 


background image

 

Часть III. Файловая оболочка, вирус, резидент 

96 

 

Рис. 10.2. Перед выполнением последней инструкции ret 

 

Рис. 10.3. Инструкция int 20h — выход в DOS 

Вы,  конечно,  помните,  что  при  загрузке  COM-программы  вершина  стека  уста-

навливается на предпоследний байт нашего сегмента, т. е. 

sp=0FFFEh

. При выпол-

нении  команды  "ближний  call" 

sp

  уменьшается  на  2,  т. е.  становится  равным 

0FFFCh

. Это свидетельствует о том, что при вызове подпрограммы процессор зано-

сит  в  стек  адрес  возврата.  Поэтому  и  не  происходит  путаницы  при  работе:  выхо-
дить ли в DOS или вернуться из процедуры. Так или иначе, выход в DOS командой 

ret

  в  COM-программах  происходит  только  в  том  случае,  если 

sp=0FFFEh

,  и  про-

грамма сама не затерла первые 2 байта по смещению 

0000h

 (т. е. команду 

int 20h

того сегмента, куда она загрузилась изначально.  


background image

Глава 10. Введение в вирусологию. Обработчик прерываний 

97 

10.2. Вирус 

Вирус —  это  обычная  программа,  написанная  на  ассемблере,  Pascal,  С,  Visual 

Basic и прочих языках программирования. Эта программа может сама размножать-
ся, заражая другие программы без участия программиста, написавшего этот вирус. 

Писать вирус на ассемблере — милое дело. Компьютерные вирусы подобны на-

стоящим вирусам. Как больной человек может заразить другого, так и компьютер-
ный вирус способен заражать "здоровые" файлы. Зараженный файл может заразить 
другой  и  т. д.  Если  вовремя  не  "вызвать  доктора",  то  вирус  заразит  все  файлы,  
а также может уничтожить часть или всю информацию на жестком диске (все зави-
сит от того, что и при каких условиях выполняет программа-вирус). 

Прежде чем перейти к изучению структуры вируса, мы хотели бы предупредить 

вас об уголовной ответственности за распространение вирусоподобных программ. 

К

Т О   П И Ш Е Т   В И Р У С Ы

?  

 

Прежде всего, это программисты, которые только-только изучили ассемблер, и не 
видят иной возможности применить свои знания, кроме как написать какой-нибудь 
вирус и тайно передать его своему соседу. 

 

Представим  ситуацию:  у  фирмы  X  есть  конкурент —  фирма  Y.  Как  сделать  так, 
чтобы на время фирме Y доставить хлопот? А почему бы их компьютеры не зара-
зить вирусом "собственного производства", который такого-то числа или при таких-
то  обстоятельствах  удалял  бы  всю  информацию  на  винчестере?  Пишется  вирус 
сотрудником  фирмы  X,  а  затем  заносится  в  компьютер  к  конкуренту.  И  все!  Как 
правило, заражаются компьютеры не только фирмы Y, но и другие (сотрудник пе-
реписал  зараженный  файл  и  принес  к  себе  домой;  этот  же  файл  переписал  его 
знакомый, файл распространился по Интернету и т. д.). 

 

Вирусы могут написать также люди, желающие завладеть секретной информацией 
пользователей.  Например,  клавиатурный  шпион,  перехватывающий  нажатие  кла-
виш пользователем и отправляющий эту информацию по указанному адресу. Что 
это может быть за информация? Логин и пароль от кошелька Yandex.Деньги, реги-
страционные данные электронной почты, сайтов и т. д. В этом случае автор вируса 
получает несанкционированный доступ к необходимой ему информации посетите-
лей Интернета. 

Последнее время появилось множество вирусов, написанных на языках высоко-

го уровня и работающих под управлением интерпретатора. К таким языкам можно 
отнести, в частности, Visual Basic for Applications (VBA). Такие вирусы пишутся за 
считанные  минуты  и  могут  быть легко обнаружены пользователем и удалены без 
помощи  антивирусных  программ.  Безусловно,  они  не  идут  ни  в  какое  сравнение  
с вирусами, написанными на ассемблере. В этой книге под словом "вирус" мы бу-
дем подразумевать только вирусы, которые написаны на чистом ассемблере. 

Естественно,  существуют  антивирусы  (DrWeb,  NOD32, Norton Antivirus, Анти-

вирус  Касперского  и пр.).  Однако  они  способны  вылечить  файл,  который  знаком 
автору  того  или  иного  антивируса.  Если,  допустим,  мы  напишем  свой  вирус,  то 
уверяю вас, что ни один антивирус его не обнаружит. Максимум — антивирус на-
пишет сообщение о возможном (!) заражении файла, но вылечить его не сможет. 


background image

 

Часть III. Файловая оболочка, вирус, резидент 

98 

10.2.1. Структура и принцип работы вируса 

Что должен делать вирус? 

Прежде всего — определить, загружен ли он вместе с каким-нибудь файлом или 

это его первая загрузка. Затем найти первый попавшийся файл, проверить, не зара-
жен ли уже файл этим вирусом. Если заражен, то искать следующий файл, а если 
нет — то заразить его. Все это происходит очень быстро и для пользователя прак-
тически незаметно. 

Какой объем памяти занимает вирус? 

Все зависит от фантазии программиста, от того, что он хочет сделать с компью-

тером/файлами,  его  профессионализма  и языка, на котором пишется вирус. Сред-
ний размер вируса — 500—600 байт. Хотя есть умельцы, у которых вирус занимает 
100—150 байт, а есть и такие, у которых простейший вирус занимает 1,5—3 и бо-
лее килобайт. 

Что может вирус? 

Все,  что  угодно.  Например,  удалить  всю  информацию  с  винчестера  за  0,5—

1 секунду по принципу работы программы FDISK, т. е. очистить таблицу разделов 
жесткого  диска,  обнулить  таблицу  размещения  файлов  (FAT —  File  Allocation 
Table), физически испортить винчестер и монитор! Все зависит от фантазии и про-
фессионализма программиста. 

Какой вирус мы будем изучать? 

Мы  будем  рассматривать  нерезидентный  вирус,  заражающий  COM-файлы  (са-

мый простой). 

Что будет делать вирус? 

Ничего, кроме размножения. 

Как оформляется вирус? 

Точно так же, как обычные COM-файлы, созданные нами ранее (листинг 10.2). 

Листинг 10.2. Структура вируса 

CSEG segment 
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG 
org 100h 
 
Start: 
 
... 

;Здесь находится тело вируса. 

 
CSEG ends 
end Start