Общий алгоритм работы вируса 


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



ЗНАЕТЕ ЛИ ВЫ?

Общий алгоритм работы вируса



Теперь настало время создать алгоритм работы нашего вируса, чем мы и займемся. Как и прежде, попав при начальной загрузке машины в память по адресу 0000:7C00h, вирус должен выполнить такие действия:

  1. Установить регистры SS и SP на собственный стек
  2. "Отрезать" у системы несколько килобайтов памяти (вы уже догадываетесь, что "несколько" - это два?).
  3. Переписать свой код в полученную область памяти
  4. Передать управление следующей секции своего кода, уже расположенной в конце основной памяти.

Эта секция, в свою очередь, должна:

  1. Переопределить вектор прерывания Int 16h на вирусный код.
  2. Считать настоящий загрузочный сектор в память по адресу 0000:7C00h.
  3. Проверить, заражен - ли винчестер. Если нет, то заразить его MBR.
  4. Передать управление настоящему загрузочному сектору, находящемуся по адресу 0000:7C00h.

Далее выполняется загрузка операционной системы. Вирусный обработчик Int 16h,как было сказано выше, следит за состоянием обработчика Int 21h, и перехватывает это прерывание,если по какой - либо причине вирусная процедура обработки Int 21h не активна. Алгоритм его работы подробно описан в предыдущем пункте.

Как вы уже знаете," заразные " функции мы возложим на обработчик прерывания Int 21h. О том, как это будет реализовано, тоже было рассказано выше.

Полный текст созданного вируса

Как ни жалко, но остается только одно - "слепить" все части нашей заразной разработки в одно целое и привести полученный результат:

Скачать boot2.asm (20Kb)

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

Испытание вируса

С методикой испытания загрузочного вируса вы уже знакомы. Поэтому можно сразу переходить к самому приятному этапу в творчестве любого создателя вирусов. Модель примерно такая: из - под WINDOWS запустите VC, NC, Turbo Pascal или что - нибудь похожее. После чего попробуйте несколько раз установить текущим один из дисководов. Понаблюдайте, как вирус заражает дискеты и при каких условиях. Заражение должно происходить обязательно. Наша предыдущая программа такими возможностями явно не обладала.

Теперь выйдите из оболочки обратно в WINDOWS и запустите, например, FAR. Вы увидите, что в FARе наш вирус не активизируется. Не активизируется он и в WORDе и EXCELе. Объясняется это просто: Эти программы являются 32-х разрядными WINDOWS - приложениями, и поэтому не могут вызывать DOSовские прерывания! Вместо этого для смены диска, например, вызывается SetCurrentDisk. Об этом мне поведал Eugene Roshal, разработчик FARа. Хотя то, чего мы добились - уже большой шаг вперед по сравнению с прошлой разработкой.

Вместо комментария

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

Определенные надежды вселяет описанная выше возможность использовать для активизации вируса прерывание Int 16h. В самом деле, почему бы не заражать диски, например, при каждом десятом нажатии на клавишу " ALT ", " SHIFT " и т.п.? Правда, этот метод имеет и свои недостатки, которые делают его похожим на обычное ламерство. Зато его очень просто реализовать, и работать он будет в любом WINDOWS - приложении...

Единственное, чего делать точно не следует - это огорчаться по поводу не совсем достигнутой цели. Думаю, это дело недалекого будущего. Как сказал Мао Цзедун, "Наш путь труден, но перспективы - светлые!".

Заключение

Эта книга задумывалась и писалась лишь для того, чтобы приоткрыть завесу таинственности и секретности, которой окутана почти не овещаемая в литературе тема компьютерных вирусов. Автор ни в коем случае не ставил своей целью обучить пользователей ЭВМ разработке всевозможных "вредных" программных средств, а просто хотел поделиться своими знаниями и результатами экспериментов с широкой общественностью. Наверняка найдется немало людей - специалистов и любителей, которых интересует затронутая в данной работе тема. И если кто - то из них пожелает ознакомиться с предлагаемой книгой, я буду считать, что потратил время не зря. Разработка действующих компьютерных вирусов - захватывающее и сложное дело, требующее немалого опыта и определенной теоретической базы. Надеюсь, эта книга сможет оказать вам некоторую помощь.

К сожалению, изложение не рассчитано на начинающих, поэтому автору не удалось приблизить стиль книги к научно - популярному. Хотя это трудно отнести к недостаткам.

До встречи!

г. Житомир, 18.08.1998 И. Коваль

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

ПИШИТЕ ВИРУСЫ, КАК ЗАВЕЩАЛ ВЕЛИКИЙ ЛЕНИН, КАК УЧИТ НАС КОММУНИСТИЧЕСКАЯ ПАРТИЯ!!!

Украина г. Житомир ул. Большая Бердичевская, д. 83, кв. 25 Коваль Игорь Михайлович тел. 8 (0412) 343427 8 (0412) 204218 Индекс: 262002

Литература

  1. Финогенов К. Г. "Самоучитель по системным функциям MS DOS ", М.:Малип, 1993
  2. П. Абель "Язык ассемблера для IBM PC и программирования ", М.:Высшая школа, 1991
  3. Хижняк П. Л. "Пишем вирус... и антивирус!", М.:Инфо, 1991
  4. Касаткин А. И. "Профессиональное программирование на языке СИ. Управление ресурсами ", Минск, Вышейшая школа, 1992
  5. Самофалов К. Г., Викторов О. В. "Микропроцессоры",М.:Библиотека инженера, 1990

Приложение 1. Краткий справочник по функциям MS DOS и BIOS

Справочные материалы по функциям MS DOS и BIOS с незначительными изменениями заимствованы из [1], за что автор приносит К. Г. Финогенову свои извинения.

Функция 09h

Вывод строки на экран. Последним символом строки должен быть "$".Управляющие коды: 07h - звонок, 08h - шаг назад, 0Ah - перевод строки, 0Dh - возврат каретки.

Вызов:

AH = 09h

DS: DX = адрес строки.

Функция 0Eh

Выбор диска. Предназначена для смены текущего диска. Также возвращает количество логических дисков.

Вызов:

AH = 0Eh

AL = код дисковода (0 = A, 1 = B, 80h = C и т.п.)

Возврат:

AL = количество дисководов в системе.

Функция 19h

Получение текущего диска.

Вызов:

AH = 19h

Возврат:

AL = код текущего диска (0 = A, 1 = B, 80h = C и т.п.).

Функция 1Ah

Установка адреса области передачи данных (DTA). Устанавливает заданный адрес DTA.

Вызов:

AH = 1Ah

DS: DX = адрес DTA.

Функция 25h

Установка вектора прерывания. Записывает адрес программы обработки заданного прерывания в таблицу векторов.

Вызов:

AH = 25h

AL = номер вектора прерывания

DS: DX = адрес программы обработки прерывания.

Функция 19h

Получение даты.

Вызов:

AH = 2Ah

Возврат:

CX = год

DH = месяц

DL = день

AL = день недели (0 = воскресенье, 6 - суббота).

Функция 2Fh

Получение адреса области передачи данных (DTA). Возвращает текущий адрес DTA.

Вызов:

AH = 2Fh

Возврат:

ES: DX = адрес DTA.

Функция 35h

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

Вызов:

AH = 35h

AL = номер вектора прерывания

Возврат:

ES: BX = адрес программы обработки прерывания.

Функция 3Bh

Смена каталога.Предназначена для выбора текущего каталога.

Вызов:

AH = 3Bh

DS: DX = полное имя каталога (например, C:\TASM\VIRUS\

При ошибке:

CF = 1

AX = код ошибки.

Функция 3Dh

Открытие файла. Открывает файл с заданным именем и возвращает дескриптор, выделенный этому файлу системой. Указатель устанавливается на начало файла.

Вызов:

AH = 3Dh

AL = режим доступа: 0 - для чтения, 1 - для записи, 2 - для чтения и записи

DS: DX = полное имя файла (например, C:\TASM\VIRUS\EXE_VIR.COM)

Возврат:

AX = дескриптор

При ошибке:

CF = 1

AX = код ошибки.

Функция 3Eh

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

Вызов:

AH = 3Eh

DX = дескриптор

При ошибке:

CF = 1

AX = код ошибки.

Функция 3Fh

Чтение из файла или устройства. Считывает данные из файла или устройства и модифицирует указатель. При чтении читается строка указанной длины. При чтении из символьного устройства чтение прекращается, если встретился символ возврата каретки (например,при вводе с клавиатуры).

Вызов:

AH = 3Fh

BX = дескриптор

CX = количество передаваемых символов

DS: DX = адрес буфера, в который помещаются данные

Возврат:

AX = число переданных байт

При ошибке:

CF = 1

AX = код ошибки.

Функция 40h

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

Вызов:

AH = 40h

BX = дескриптор

CX = количество передаваемых символов

DS: DX = адрес буфера, в который помещаются данные

Возврат:

AX = число переданных байт

При ошибке:

CF = 1

AX = код ошибки.

Функция 42h

Установка указателя в файле. Предназначена для установки указателя на требуемый байт в файле.

Вызов:

AH = 42h

BX = дескриптор

AL = режим установки указателя:

  • 0 - смещение от начала файла
  • 1 - смещение от текущего положения указателя
  • 2 - смещение от конца файла

CX = старшая часть смещения

DX = младшая часть смещения

Возврат:

CX = старшая часть возвращенного указателя

DX = младшая часть возвращенного указателя.

Функция 48h

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

Вызов:

AH = 48h

BX = Размер блока памяти в параграфах

Возврат:

AX = сегментный адрес выделенного системой блока

При ошибке:

CF = 1

AX = код ошибки.

BX = размер наибольшего доступного в данный момент блока.

Функция 49h

Освобождение блока памяти.

Вызов:

AH = 49h

ES = сегментный адрес блока,который следует освободить

При ошибке:

CF = 1

AX = код ошибки.

Функция 4Ah

Изменение размера блока памяти, который был выделен программе.

Вызов:

AH = 4Ah

BX = новый размер блока в параграфах.

ES = сегментный адрес блока, размер которого следует изменить

При ошибке:

CF = 1

AX = код ошибки.

BX = размер наибольшего доступного в данный момент блока.

Функция 4Ch

Завершение процесса с кодом возврата. Завершает текущую задачу и передает код завершения родительскому процессу. Освобождает выделенную программе память, сбрасывает на диск буферы, закрывает дескрипторы, восстанавливает из PSP вектора прерываний INT 22h, INT 23h и INT 24h. Далее управление передается родительскому процессу.

Вызов:

AH = 4Ch

AL = код возврата.

AL = 00h обычно соответствует нормальному завершению программы.

Функция 4Eh

Поиск первого файла. Производит поиск в заданном каталоге первого файла, соответствующего заданной маске и имеющего указанные атрибуты.

Вызов:

AH = 4Eh

CX = атрибуты файла (могут комбинироваться):

  • 1 - только читаемый (read only)
  • 2 - скрытый (hidden)
  • 4 - системный (system)
  • 8 - метка тома
  • 20h - архивный (archive)

DS: DX = адрес маски для поиска

Возврат:

имя найденного файла и его расширение записывается в DTA в байты 1Eh - 2Ah. За последним символом расширения всегда следует точка: "."

При ошибке:

CF = 1

AX = код ошибки.

Функция 4Fh

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

Вызов:

AH = 4Fh

Возврат:

имя найденного файла и его расширение записывается в DTA в байты 1Eh - 2Ah. За последним символом расширения всегда следует точка: "."

При ошибке:

CF = 1

AX = код ошибки.



Поделиться:


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

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