Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Как вы уже знаете,резидентная программа должна находиться в памяти в течение сеанса работы компьютера. Поэтому секция инициализации должна "попросить" 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.




Поделиться с друзьями:


Дата добавления: 2014-11-20; Просмотров: 478; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.