Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29216
Скачиваний: 1689
Часть 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 — переход в начало следующей строки
Глава 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
, если они изменялись.
Часть 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
)
того сегмента, куда она загрузилась изначально.
Глава 10. Введение в вирусологию. Обработчик прерываний
97
10.2. Вирус
Вирус — это обычная программа, написанная на ассемблере, Pascal, С, Visual
Basic и прочих языках программирования. Эта программа может сама размножать-
ся, заражая другие программы без участия программиста, написавшего этот вирус.
Писать вирус на ассемблере — милое дело. Компьютерные вирусы подобны на-
стоящим вирусам. Как больной человек может заразить другого, так и компьютер-
ный вирус способен заражать "здоровые" файлы. Зараженный файл может заразить
другой и т. д. Если вовремя не "вызвать доктора", то вирус заразит все файлы,
а также может уничтожить часть или всю информацию на жестком диске (все зави-
сит от того, что и при каких условиях выполняет программа-вирус).
Прежде чем перейти к изучению структуры вируса, мы хотели бы предупредить
вас об уголовной ответственности за распространение вирусоподобных программ.
К
Т О П И Ш Е Т В И Р У С Ы
?
Прежде всего, это программисты, которые только-только изучили ассемблер, и не
видят иной возможности применить свои знания, кроме как написать какой-нибудь
вирус и тайно передать его своему соседу.
Представим ситуацию: у фирмы X есть конкурент — фирма Y. Как сделать так,
чтобы на время фирме Y доставить хлопот? А почему бы их компьютеры не зара-
зить вирусом "собственного производства", который такого-то числа или при таких-
то обстоятельствах удалял бы всю информацию на винчестере? Пишется вирус
сотрудником фирмы X, а затем заносится в компьютер к конкуренту. И все! Как
правило, заражаются компьютеры не только фирмы Y, но и другие (сотрудник пе-
реписал зараженный файл и принес к себе домой; этот же файл переписал его
знакомый, файл распространился по Интернету и т. д.).
Вирусы могут написать также люди, желающие завладеть секретной информацией
пользователей. Например, клавиатурный шпион, перехватывающий нажатие кла-
виш пользователем и отправляющий эту информацию по указанному адресу. Что
это может быть за информация? Логин и пароль от кошелька Yandex.Деньги, реги-
страционные данные электронной почты, сайтов и т. д. В этом случае автор вируса
получает несанкционированный доступ к необходимой ему информации посетите-
лей Интернета.
Последнее время появилось множество вирусов, написанных на языках высоко-
го уровня и работающих под управлением интерпретатора. К таким языкам можно
отнести, в частности, Visual Basic for Applications (VBA). Такие вирусы пишутся за
считанные минуты и могут быть легко обнаружены пользователем и удалены без
помощи антивирусных программ. Безусловно, они не идут ни в какое сравнение
с вирусами, написанными на ассемблере. В этой книге под словом "вирус" мы бу-
дем подразумевать только вирусы, которые написаны на чистом ассемблере.
Естественно, существуют антивирусы (DrWeb, NOD32, Norton Antivirus, Анти-
вирус Касперского и пр.). Однако они способны вылечить файл, который знаком
автору того или иного антивируса. Если, допустим, мы напишем свой вирус, то
уверяю вас, что ни один антивирус его не обнаружит. Максимум — антивирус на-
пишет сообщение о возможном (!) заражении файла, но вылечить его не сможет.
Часть 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