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

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

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

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

Добавлен: 16.02.2019

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

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

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

Глава 20. Финальная версия вируса 

209 

В нашем примере мы устанавливаем на конец файла указатель, чтобы записать 

вирус в "хвост" "файла-жертвы" (листинг 20.2).  

Листинг 20.2. Установка указателя на конец файла 

... 

mov ax,4202h     ;Установим указатель чтения/записи на конец файла. 

mov bx,Handle 

xor cx,cx        ;Отсчитывать 0 байт от конца файла. 

xor dx,dx 

int 21h 

jc Error_infect 

... 

После того как указатель чтения/записи был установлен на конец файла, можно 

дописывать в заражаемый файл код нашего вируса, используя известную уже вам 
функцию 

40h

.  Обратите  особое  внимание  на  количество  записываемых  байтов 

(листинг 20.3).  

Листинг 20.3. Запись тела вируса 

... 

mov ah,40h             ;В bx уже есть номер файла. 

;Пишем в "хвост" "файла-жертвы" 

mov cx,offset Finish-100h-F_bytes 

mov dx,100h            ;Пишем тело вируса. 

int 21h 

jc Error_infect 

... 

После  того  как  мы  записали  тело  нашего  вируса  в  "хвост"  "файла-жертвы", 

можно сказать, что этот файл уже заражен. Его размер увеличился на длину нашего 
файла. 

Код вируса в "файл-жертву" мы записали, но наш вирус не получит управле-

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

Для  этого  необходимо  первые  байты  "файла-жертвы"  (начинающиеся  с  адреса 

100h

) заменить переходом на тело нашего вируса, а затем, когда вирус отработает, 

восстановить эти байты в памяти и "прыгнуть" по адресу 

100h

Следующий  шаг:  записываем  после  нашего  вируса  первые 6 байт, которые мы 

меняем (листинг 20.4). 


background image

 

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

210 

Листинг 20.4. Замена байт "файла-жертвы" 

... 
;После тела вируса дописываем первые настоящие 6 байт "файла-жертвы"... 
mov ah,40h 
mov cx,F_bytes 
mov dx,offset Finish 
int 21h 
... 

Теперь нам нужно сделать так, чтобы наш вирус, прежде чем получит управле-

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

Для  этого  необходимо  вместо  первых  6 байт,  которые  мы  записали  в  "хвост" 

файла  после  тела  вируса,  переместить  по  адресу,  по  которому  находится  метка 

Init

. При запуске файла наш вирус первым получит управление, отработает, вос-

становит в памяти первые 6 байт и передаст управление "файлу-жертве". 

Как  заменить  первые  6 байт  на  диске?  Вспомните,  каким  образом  мы  уже  вы-

числили  размер  файла  и  сохранили  его  в  регистре 

bp

  (см. примечания  в  файле-

приложении).  Передаем  управление  "файлу-жертве",  используя  нестандартный 
способ (листинг 20.5).  

Листинг 20.5. Передача управления "файлу-жертве" 

... 
push адрес перехода на метку Init 
ret 
... 

Если "файл-жертва" занимает, к примеру, 3000 байт, то после 

push

 будет нахо-

диться один адрес, а если, скажем, 5000 байт, то переход будет осуществлен, соот-
ветственно, на другой адрес.  

Все! Теперь файл заражен корректно. При его запуске первым получит управле-

ние  наш  вирус.  Осталось  восстановить  в  памяти  первые  6 байт  "файла-жертвы" 
(мы-то их сохранили после тела вируса!) и передать управление по адресу 

100h

20.1.3. Общая схема работы вируса 

Итак, чтобы корректно заразить файл, мы выполняем следующие шаги: 

1.  Ищем COM-файл. 
2.  Читаем первые 6 байт найденного файла.  
3.  Если  найденный  файл  больше  64 Кбайт,  то  начинаем  поиск  заново  (переходим  

к шагу 1). Если меньше — работаем дальше. 


background image

Глава 20. Финальная версия вируса 

211 

4.  Если в найденном файле по смещению +4 от начала находится 

1122h

, то начи-

наем поиск заново (переходим к шагу 1). Если нет — работаем дальше. 

5.  Пишем в "хвост" найденного файла тело нашего вируса. 
6.  Пишем после тела вируса первые 6 настоящих байт "файла-жертвы". 
7.  Закрываем файл. 
8.  Создаем искусственный переход на метку 

Init

 путем вычисления размера файла. 

9.  Открываем файл (указатель в этот момент находится на начале файла). 

10.  Пишем  первые  6 байт  перехода  на  тело  вируса  +

1122h

  для  опознавания  того, 

что файл уже заражен нашим вирусом. 

11.  Закрываем файл. 
12.  Восстановим  первые  6 реальных  байт  "файла-жертвы"  в  памяти,  которые  со-

хранены в "хвосте" "файла-жертвы" (см. шаг 6). 

13.  Передаем управление "файлу-жертве". 

Вам  осталось  только  внимательно  изучить  файл-приложение  и  комментарии  

к нему. 

Еще раз подчеркиваем: будьте предельно осторожны в экспериментах. Лучше все-

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

20.2. Резюме 

Уважаемые читатели! Поздравляем вас! Вы только что написали первый вирус. 

Что мы можем сказать в завершение?  

Прежде всего, хотелось бы, чтобы информация, полученная вами из настоящей 

главы, пошла во благо, а не во вред. 

Мне часто задавали вопрос: "Вы действительно уверены в том, что хотите обу-

чать людей написанию вирусов?" Да, уверен. Уверен просто потому, что знаю, изу-
чи вы ассемблер, первое, что придет большинству из вас в голову, — так это напи-
сать  вирус.  Я  также  уверен,  что,  изобретая  вирус  в  три  часа  ночи,  вы  вдруг 
поймете, как работает та или иная программа. Вы поймете многое. Через это про-
ходит большинство программистов. 

Вернемся немного в прошлое, когда тех, кто писал вирусы, считали "суперпро-

фессиональными" программистами. Когда вирусов боялись больше всего на свете. 

Вирус DIR в свое время наводил такой ужас в компьютерных центрах, что мно-

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

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

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

Поверьте: гораздо интереснее экспериментировать с резидентными программа-

ми и файловой системой. Безусловно, в своей жизни вы все равно напишете хоть 


background image

 

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

212 

один вирус. Нельзя сказать, что это плохо. Это нормально, даже хорошо, интерес-
но. Но хорошо в том случае, если ваш вирус не выходит во "внешний мир". Более 
того,  я  вынужден  повторно  предупредить  вас,  что  за  распространение  вирусопо-
добных программ вы попадаете под статью Уголовного кодекса Российской Феде-
рации. Так что, прежде чем нести ваш вирус кому-то, подумайте хорошо: а зачем 
это вообще нужно? Сколько раз вы в своей жизни страдали от того, что вирус, на-
писанный  каким-то  новичком-программистом,  форматировал  ваш  винчестер? 
Сколько  драгоценного  времени  вы  тратили  впустую,  восстанавливая  поврежден-
ные программы? Сколько полезного вы могли бы сделать за это время? 

"Зачем же тогда в этой книге мы подробно изучали работу вирусов и даже напи-

сали один, пусть даже самый простой и безобидный?" — спросите вы. 

На это можно ответить так: изучив ассемблер, вы все равно рано или поздно его 

бы  написали.  Дело  только  во  времени.  Целью  данной  главы  было  не  научить вас 
писать  вирусы,  а  дать  понять,  что  вирус —  это  не  так  страшно,  показать  на  кон-
кретном  примере  принцип  работы вирусов, а также научить вас бороться с ними. 
Очень хочется верить, что у многих страх перед "ужасными, злыми и беспощадны-
ми" вирусами развеялся. 

Мы написали элементарнейший нерезидентный вирус, заражающий COM-файлы 

в  текущем  каталоге.  Но  принцип  работы  у  всех  вирусов  одинаковый.  Запомните: 
любой серьезный вирус, заражающий файлы типа COM и EXE, обязательно хранит 
в  своем  теле первые байты зараженной COM-программы или изначальную струк-
туру  EXE-программы.  Первые  байты  могут  быть  как  в  закодированном  виде,  так  
и храниться в открытом виде (как в нашем примере). Вирусы могут быть резидент-
ными и нерезидентными. Но в теле любого вируса можно всегда найти те байты, 
которые  нужны  для  восстановления  зараженного  файла,  если,  конечно,  вирус  не 
разрушает напрочь программу, делая ее невосстановимой и, соответственно, нера-
ботоспособной. 

Именно  исследовав  принцип  работы  вируса,  вирусологи  пишут  антивирус,  ко-

торый восстанавливает изначальную структуру файла, вырезая из него тело вируса. 

Вот, собственно, и все! В главе 21 мы продолжим писать оболочку. 
 


background image

 

 

 

Глава 21 

 

Работа  
с блоками основной памяти 

21.1. Оболочка SuperShell 

21.1.1. Теория 

Если  вы  уже  запустили  нашу  "оболочку",  то  ничего  особенно  интересного  вы, 

скорее всего, не увидели. Она просто читает содержимое текущего каталога в па-
мять и выводит первые двадцать найденных файлов на экран. Однако, изучив файл-
приложение, вы поймете, что наша программа проделывает уйму работы. А именно: 

1.  Ищет первый файл. 
2.  Если это '.' 

1

, то переходит к поиску следующего файла (выполняет шаг 4). 

3.  Заносит в память имя найденного файла. 
4.  Ищет следующий файл. 
5.  Заносит имя найденного файла в память. 
6.  Проверяет, не закончились ли файлы. 
7.  Если нет, то продолжает поиск файлов (переход к шагу 4). 
8.  Если файлы закончились, то начинает их вывод на экран. 
9.  Если еще не выведено 20 файлов, то продолжает вывод (шаг 8). Если 20 файлов 

уже выведено, то переходит к выполнению шага 10. 

10.  Ждет от пользователя нажатия клавиши. 
11.  Если  пользователь  нажал  клавишу  <Esc>,  то  переходит  к  шагу 12.  Если  нет, 

то — к шагу 10. 

12.  Запрашивает пользователя: уверен ли он, что хочет выйти из программы. 
13.  Если  пользователь  нажал  все,  что  угодно,  кроме  <Y>  или  <y>,  то  переходит  

к шагу 10. 

14.  Если пользователь нажал <Y> или <y>, то выходим. 

Вот, собственно, и алгоритм работы нашей оболочки. 

                                                           

1

  В  любом  каталоге  первым  всегда  расположен  символ  точки.  Это  не  файл,  а  обозначение 

текущего каталога. Если в командной строке набрать 

'CD .'

, то каталог не изменится. Нам 

не  нужно  выводить  этот символ в оболочке. В отличие  от оболочек команда 

DIR

  выводит 

этот каталог на экран.