Анимация
JavaScript
|
Главная Библионтека Ассемблер в задачах sauiTbiuHcopMaiu Приложение 2. Резидентный блокировщик доступа к директории 5( o21h: n21h: crop ah, 3Ch n21h ah, 3Dh n21h ah, 41h n21h ah, 43h n21h ah, 4Bh n21h ah, 4Eh n21h функция DOS CREATE ; Да, на новый обработчик функция DOS OPEN ? . , ; Да, на новый обработчик функция DOS DELETE ? ; Да, на новый обработчик Фунюдая DOS CHMOD ? ; Да, на новый обработчик ; Функция DOS EXEC ? ; Да, на новый обработчик ; Функция DOS FIND FIRST ? ; Да, на новый обработчик eld pusha push push push pop mov mov cmp jz mov int mov inc add mov stosw mov push push pop xchg int pop xchg mov xor mov repne scasb dec cmp jz mov stosb ГЧ- old 21h ; Переход на старый обработчик 21h cs. oia ;iii r yjggggjjj на путь ; Сохраним регистры es ds cs es di, OFFSET curpath si, dx BYTE PTR ds: [si+1], : ; Проверим, указана ли спецификация диска в пути (полный путь) Получим текущий диск fullpath ah, 19h 21h dl, al dl al, A ah, : Сохраним спецификацию диска ; Б строке полного пути Добавим текущий каталог ; в строку полного пути fullpath; lodsb stosb or ah, 47h ds cs ds si, di si, di di, OFFSET curpath ; Установим указатель на конец ах, ах ; строки полного пути сх, 67 BYTE PTR ds: {sij, \ ; Проверим, содержит ли неполный путь fullpath; начальный \ al, \ ; Добавим \ в конец строки ; полного пути ; Добавим путь, указанный в параметре, ; в конец строки полного пути al, al еер fullpath push repe popa push Сравиним строку полного пути со строкой параметров в PSP si, OFFSET curpath di, 82h cx, cx cl, cs: 180h] cx cmpsb ds o21h ax, 3 bp bp, sp iret old 2fh DD old 21h DD crights DB usemsg msmsg reiimsg curpath DB ; Строки не равны - на старый обработчик ; Установим код ошибки - путь не найден ; Скорректируем флаг CF, сохраненный в ; стеке, для индикации ошибки WORD PTR ss: [bp+6], 1 ; при выполнении прерывания Directory Locker, ODh, OAh DB DB DB DB 67 DUP (0) END begin (c) Oleg V. Burdaev, 2000 ODh, OAh, $ Usage: dirlock.com <directory full path>, ODh, OAh $ ~ ~ Installed, ODh, OAh, $ Removed, ODh, OAh, $ eep: Сразу после запуска происходит проверка наличия резидентной части программы в памяти путем вызова функции E8h мультиплексного прерывания 2Fh. В обработчике прерывания происходит проверка на вызываемую функцию, и при совпадении выполняется процедура выгрузки программы из памяти. При отсутствии резидентной части профаммы в памяти (код возврата из прерывания 2Fh не равен FFh) проверяется наличие параметров командной строки, и при их отсутствии происходит выход из программы с предварительным выводом сообщения об использовании DIRLOCK.COM. При наличии параметра происходит перевод его символов в верхний Регистр. Затем происходят сохранение "старых" и установка "новых" векторов прерываний 2РЬ и 2lh. Профамма завершается выводом сообщения об успешной установке и выходом "о прерыванию 27h с оставлением резидентной части в памяти. Обработчик прерывания 21h осуществляет проверку на вызываемую функцию и при "овпадении с перехватываемой функцией переходит на прикладную обработку прерыва-""и 21h, в противном случае происходит передача управления старому обработчику пре-Р*вания. Новый обработчик осуществляет проверку на присутствие символа ":" во вто-позиции строки пути. Если символ найден, то параметром является полный путь, происходит переход на выборку параметра в строку пути; если же символ не найден, то строка пути сначала заполняется названием диска и текущим путем, а потом уже относи-тельным путем, указанным в параметре. Далее осуществляется посимвольное сравнение строки пути в PSP и строки сформированного полного пути, по которому происходит обращение. При совпадении начала строки полного пути со строкой пути в PSP происходит присвоения кода возврата 3 (путь не найден) и корректируется значение флага CF в стеке для индикации ошибки. Таким образом защищается не только директория, ука-занная при запуске в командной строке, но и все ее поддиректории. Если результат сравнения отрицательный, происходит переход на старый обработчик прерываний 21h и доступ предоставляется. Приложение 3 Реализация алгоритма I шифрования RC4 rc4.asni - программа шифрования по алгоритму RC4. Ьаилов ======== Входные параметры - имена входного и выходного файлов. ========= Требует обязательного указания ключа ========= шифрования в шестнадцатеричном представлении. state begin: . 286 . MODEL tiny . CODE ORG lOOh EQU OFFSET space EQU OFFSET space+256 EQU OFFSET space+512 ; Адрес массива состояния Адрес массива ключа Адрес буфера mov dx, OFFSET msgcpy call strout xor bx, bx mov bl, ds: [80h] mov cx, bx inc cx mov di, 81h mov BYTE PTR [bx+81h], 20h xor si, si mov al, 20h
; Разбор командной строки ; Получим длину "хвоста" команды ; Пробел в конец строки Найдем в командной строке адреса первых трех параметров Третий параметр "/к" ? Меньше трех параметров, либо третий параметр не "/к" - на выход deckey: hexbyte: mov mov add di, si, si. key txtkey 3 notalph: endkey: lodsb or jz cmp jbe sub and shl or loop stosb cx, 2 al, al endkey al, 39h notalph al, 07h al, dl, dl. OFh 4 hexbyte al, dl keylen deckey cmp keylen, 0 jnz keyok mov dx, OFFSET msgkey call strout jmp exit keyok: ; Заполнение массива состояний и развертывание ключа Ключ нулевой - на выход gens: modkey: mov mov mov xor xor mov mov raov inc cmp jnz xor inc jnz di, state si, key dx, keylen bx, bx bp, bp [di+bx [si+bx bp bp, dx modkey bp, bp gens [si+bp] bl al Преобразование массива состояний по ключу mov mov xor xor xor modstate: add mov add mov xchg di, bp, cx, bx, cl, al, cl, bp, al. key state bp cx bx [si+bx] [di+bx] al cx [di+bp] mov [di+bx], al inc bl inz modstate •откроем файл-источник • ° mov ax, 3D00h mov dx, infile int 21h jnc nooper raov dx, OFFSET msgoper . ошибка открытия - на выход call strout jmp exit nooper: . mov mhndl, ax ; Создадим файл-приемник mov ah, 3Ch xor cx, cx mov dx, outfile int 21h jc crer raov outhndl, ax ; Цикл шифрования encode: Ошибка создания - на выход
Прочитаем 16Кб в буфер Ошибка чтения - на выход Конец файла - шифрование окончено loopenc: inc mov add mov xchg xchg add xchg mov xor inc cmp jnz mov mov bl ah, cl, al, cx, ah, al, cx. [si+bx] ah ah bx [si+bx] ah bx [si+bx], ah [di+bp], al bp bp, dx loopenc X, bl y, cl Сохраним зашифрованный буфер paramsok: ; Преобразование ключа в последовательность байт 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 |