Анимация
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

Ассемблер в задачах 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

dx,3

Params:

repe

scasb

[infile+si], di

repne

WORD PTR [infile+si]

scasb

BYTE PTR [di-l],0

si, 2

params

bx, txtkey

WORD PTR [bx], k/

paramsok

usage

; Разбор командной строки

; Получим длину "хвоста" команды

; Пробел в конец строки

Найдем в командной строке адреса первых трех параметров

Третий параметр "/к" ?

Меньше трех параметров, либо третий параметр не "/к" - на выход



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:

Ошибка создания - на выход

ah, 3Fh

bx, inhndl

cx, 4000h

dx, buf

rder

ax, ax

endenc

si, state

di, buf

dx, ax

bx, bx

cx, cx

bl, X

cl, у

bp, bp

Прочитаем 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