[СП - ДЗ] 4 - Исходный текст программ программного продукта (КП - блокировка дисковода)
Описание файла
Файл "[СП - ДЗ] 4 - Исходный текст программ программного продукта" внутри архива находится в следующих папках: КП - блокировка дисковода, [СП] Курсовой [20 вариант], документация. Документ из архива "КП - блокировка дисковода", который расположен в категории "". Всё это находится в предмете "системное программирование" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "системное программирование" в общих файлах.
Онлайн просмотр документа "[СП - ДЗ] 4 - Исходный текст программ программного продукта"
Текст из документа "[СП - ДЗ] 4 - Исходный текст программ программного продукта"
_______________________________________________________________________
Московский государственный технический университет им. Н.Э.Баумана
_______________________________________________________________________
Утверждаю: | |
Большаков С.А. | "__"_____________2010 г. |
Курсовая работа по курсу Системное программирование
“Защита дисков от несанкционированного доступа”
Вариант № 20
Исходный текст программного продукта
(вид документа)
писчая бумага
(вид носителя)
16
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-59 | |
Сидякин А.А. | "02" декабря 2010 г. |
Москва - 2010
____________________________________________________________________
Turbo Assembler Version 2.0 02/12/10 17:29:26 Page 1
kp.ASM
1 ; Курсовая работа
2 ;===============================================================================
3
4 ; Защита гибких дисков от несанкционированного доступа. Программа предназначена
5 ; для защиты гибких дисков от несанкционированного доступа. Во время работы
6 ; программы по нажатию на заданную клавишу F5 происходит блокировка гибких
7 ; дисков от чтения и записи. По повторному нажатию защита снимается
8
9 ; -----------------------------------------------------------------------------
10 0000 prgr segment
11
12 assume CS:prgr,DS:prgr ; соответствие сегментных регистров
13 org 100h ; для PSP
14 ; -----------------------------------------------------------------------------
15 0100 E9 011C begin: jmp init
16 0103 00000000 old_09h dd 0 ; хранение старого обработчика 09h
17 0107 00000000 old_2Fh dd 0 ; хранение старого обработчика 2Fh
18 010B 00000000 old_13h dd 0 ; хранение старого обработчика 13h
19 010F 00000000 old_0Eh dd 0 ; хранение старого обработчика 0Eh
20 0113 00 secur db 0 ; переменная-флаг состояния защиты
21 0114 42 6C 6F 63 6B 20 69+ block db 'Block is ON$'
22 73 20 4F 4E 24
23 0120 42 6C 6F 63 6B 20 69+ unblock db 'Block is OFF$'
24 73 20 4F 46 46 24
25
26 012D new_09h proc ; новый обработчик прерывания 09h
27 012D 50 push AX
28 012E 06 push ES
29 012F 1E push DS
30 0130 0E push CS
31 0131 1F pop DS
32 0132 50 push AX
33 0133 53 push BX
34 0134 51 push CX
35 0135 9C pushf ; для вызова старого обработчика
36 0136 2E: FF 1E 0103r CALL CS:old_09h ; вызов старого обработчика
37 013B B4 01 mov AH,1 ; функция проверка готовности символа
38 013D CD 16 int 16h ; прерывания клавиатуры
39 013F 74 0D jz nread ; если не готов, то на выход
40 0141 3C 00 CMP AL,0 ; проверка наличия расширенного кода ASCII
41 0143 74 0F je enh ; если да, то пойдём проверять дальше
42 0145 80 FC 1D cmp AH,1DH ; не нажата ли Ctrl
43 0148 75 04 jne nread ; если нет, то на выход
44 014A B4 00 mov AH,0 ; функция ожидания нажатия
45 014C CD 16 int 16h ; из прерывания клавиатуры
46 014E 59 nread: pop CX
47 014F 5B pop BX
48 0150 58 pop AX
49 0151 EB 49 90 jmp done
50 0154 80 FC 3F enh: cmp AH,3Fh ; нажата ли F5
51 0157 74 0D je prnt ; если да, то выведем сообщение
52 0159 B4 00 mov AH,00h
53 015B CD 16 int 16h
54 015D 07 pop ES
55 015E 5A pop DX
56 015F 59 pop CX
57 0160 5B pop BX
Turbo Assembler Version 2.0 16/12/10 17:29:26 Page 2
kp.ASM
58 0161 58 pop AX
59 0162 1F pop DS
60 0163 07 pop ES
61 0164 58 pop AX
62 0165 CF IRET
63
64 0166 2E: 80 36 0113r 01 prnt: xor CS:secur,1 ; включим/выключим защиту
65 016C 2E: 80 3E 0113r 01 cmp CS:secur,1 ; включена ли сейчас
66 0172 74 0B je on ; если да, то скажем об этом
67 0174 06 push ES ; если нет, то и об этом скажем
68 0175 BA 0120r mov DX,offset unblock
69 0178 E8 01B2 CALL print
70 017B 07 pop ES
71 017C EB 09 90 jmp off
72 017F 06 on: push ES
73 0180 BA 0114r mov DX,offset block
74 0183 E8 01A7 CALL print
75 0186 07 pop ES
76 0187 FA off: CLI ; запрещаем прерывания, пример с cyberguru
77 ;sub AX,AX ; обнуляем регистр
78 ;mov ES,AX ; добавочный сегмент - с начала памяти
79 ;mov AL,ES:[41AH] ; берем указатель на голову буфера
80 ;mov ES:[41CH],AL ; посылаем его в указатель хвоста
81
82 0188 06 push ES ; пример из методички
83 0189 B8 0040 mov AX,40h
84 018C 8E C0 mov ES,AX
85 018E 26: 8B 1E 001A mov BX,ES:1Ah
86 0193 26: 89 1E 001C mov ES:1Ch,BX
87 0198 07 pop ES
88 0199 FB STI ; разрешаем прерывания
89 019A EB B2 jmp nread
90 019C 1F done: pop DS
91 019D 07 pop ES
92 019E 58 pop AX
93 019F CF IRET
94 01A0 new_09h endp
95
96 ; можно заблокировать обращения к дисководу, а можно вообще дисковый ввод/вывод
97 ; если дисковод, то 0Eh, если дисковый ввод/вывод, то 13h
98
99 ; выбрав какое-либо, второе можно закомментировать, включая перехват
100 ; обработчика этого прерывания и его восстановление. Здесь оставлены оба
101
102 01A0 new_13h proc ; прерывание дискового ввода/вывода
103 01A0 2E: 80 3E 0113r 01 cmp CS:secur,1 ; включена ли сейчас
104 01A6 75 04 jne unblck ; если нет, то доступ по старому 13h
105 01A8 F9 STC ; флаг CF устанавливается в 1
106 01A9 B4 03 mov AH,03h ; что означает ошибку, 3 - её код
107 01AB C3 RET ; "попытка чтения защищённой дискеты"
108 01AC 2E: FF 2E 010Br unblck: jmp CS:old_13h
109 01B1 new_13h endp
110
111 01B1 new_0Eh proc ; прерывание работы с дискетой
112 01B1 2E: 80 3E 0113r 01 cmp CS:secur,1 ; включена ли сейчас
113 01B7 75 04 jne unbl ; если нет, то доступ по старому 13h
114 01B9 F9 STC ; тут всё так же, используем его
Turbo Assembler Version 2.0 16/12/10 17:29:26 Page 3
kp.ASM
115 01BA B4 03 mov AH,03h ; для подстраховки, достаточно и 13h
116 01BC C3 RET ; IRET поднимет флаги, нам это не надо
117 01BD 2E: FF 2E 010Fr unbl: jmp CS:old_0Eh
118 01C2 new_0Eh endp
119
120 01C2 new_2Fh proc
121 01C2 80 FC C8 cmp AH,0C8h ; обратились к нашему резиденту?
122 01C5 75 08 jne out_2Fh ; нет - дальше по цепочке в 2Fh
123 01C7 3C 00 cmp AL,00h ; да - а зачем? Просто проверить?
124 01C9 74 09 je iamhr ; отрапортуем о присутствии
125 01CB 3C 01 cmp AL,01h ; выгрузиться?
126 01CD 74 08 je uninst ; пойдём выгружаться
127 01CF 2E: FF 2E 0107r out_2Fh: jmp CS:old_2Fh ; в старый обработчик без возврата
128 01D4 B0 FF iamhr: mov AL,0FFh ; отзовёмся условленным ответом
129 01D6 CF IRET
130 01D7 06 uninst: push ES
131 01D8 52 push DX
132 01D9 50 push AX
133 01DA B8 2509 mov AX,2509h ; функция записи в вектор прерываний
134 01DD 2E: C5 16 0103r lds DX,CS:old_09h ; адреса изначального обработчика
135 01E2 CD 21 int 21h ; и так со всеми перехваченными
136 01E4 B8 252F mov AX,252Fh
137 01E7 2E: C5 16 0107r lds DX,CS:old_2Fh
138 01EC CD 21 int 21h
139 01EE B8 2513 mov AX,2513h
140 01F1 2E: C5 16 010Br lds DX,CS:old_13h
141 01F6 CD 21 int 21h
142 01F8 B8 250E mov AX,250Eh
143 01FB 2E: C5 16 010Fr lds DX,CS:old_0Eh
144 0200 CD 21 int 21h
145 0202 2E: 8E 06 002C mov ES,CS:2CH ; сегмент окружения из PSP
146 0207 B4 49 mov AH,49h ; функция освобождения блока памяти
147 0209 CD 21 int 21h
148 020B 0E push CS ; скопируем CS в ES
149 020C 07 pop ES ; ES указывает на начало программы
150 020D B4 49 mov AH,49h ; и тоже освободим
151 020F CD 21 int 21h
152 0211 58 pop AX
153 0212 5A pop DX
154 0213 07 pop ES
155 0214 B0 99 mov AL,99h ; код удачной выгpузки
156 0216 50 push AX
157 0217 B4 00 mov AH,00h ; очистим экран
158 0219 B0 03 mov AL,03h
159 021B CD 10 int 10h
160 021D 58 pop AX
161 021E CF IRET
162 021F new_2Fh endp
163 ; -----------------------------------------------------------------------------
164 021F init proc
165 021F BE 0080 mov SI,80h ; а DS указывает на PSP, и вот мы берём 80h от PSP
166 0222 BF 0511r mov DI,offset dest ; помещаем строку-приёмник dest в ES:DI
167 0225 8A 0C mov CL,[SI] ; получаем длину строки параметров
168 0227 80 F9 00 cmp CL,0 ; проверяем, есть ли они вообще
169 022A 74 60 je wtop ; если нету, то пойдём в метку wtop
170 022C 46 inc SI ; перешагнули с длины строки на пробел (81h)
171 022D 46 inc SI ; перешагнули с пробела на первый символ (82h)
Turbo Assembler Version 2.0 16/12/10 17:29:26 Page 4
kp.ASM
172 022E FC cld ; направление - восток
173 022F F3> A4 rep movsb ; копировать из DS:SI в ES:DI, побайтово CL раз
174 0231 06 push ES ; скинули ES
175 0232 1F pop DS ; подняли DS, теперь они оба указывают на data
176 0233 BF 0511r mov DI,offset dest ; теперь в DI кладём эталон
177 0236 BE 0525r mov SI,offset par ; а в SI - полученный параметр
178 0239 B1 02 mov CL,2 ; устанавливаем CL на 2 символа
179 023B F3> A6 repe cmpsb ; и сравниваем их посимвольно, до расхождения ; +
180 если не совпадают, то пошли ещё проверим
181 023D 75 4D jne wtop
182 023F B8 0002 mov AX,02h ; очистим экран
183 0242 CD 10 int 10h
184 0244 B4 09 mov AH,09h ; приветственное слово и инструкции
185 0246 BA 035Fr mov DX,offset greet
186 0249 CD 21 int 21h
187 024B E8 00D4 CALL CLRF
188 024E E8 00D1 CALL CLRF
189 0251 B4 09 mov AH,09h
190 0253 BA 03A9r mov DX,offset help1
191 0256 CD 21 int 21h
192 0258 E8 00C7 CALL CLRF
193 025B E8 00C4 CALL CLRF
194 025E B4 09 mov AH,09h
195 0260 BA 03CFr mov DX,offset help2
196 0263 CD 21 int 21h
197 0265 E8 00BA CALL CLRF
198 0268 B4 09 mov AH,09h
199 026A BA 0402r mov DX,offset help3
200 026D CD 21 int 21h
201 026F E8 00B0 CALL CLRF
202 0272 E8 00AD CALL CLRF
203 0275 B4 09 mov AH,09h
204 0277 BA 0438r mov DX,offset help4
205 027A CD 21 int 21h
206 027C E8 00A3 CALL CLRF
207 027F E8 00A0 CALL CLRF
208 0282 B4 09 mov AH,09h
209 0284 BA 0464r mov DX,offset help5
210 0287 CD 21 int 21h
211 0289 EB 11 90 jmp qui
212 028C B8 C800 wtop: mov AX,0C800h ; будем использовать эту функцию
213 028F CD 2F int 2Fh ; мультиплексного прерывания
214 0291 3C FF cmp AL,0FFh ; отозвался ли наш резидент
215 0293 75 0C jne inst ; нет - значит, надо его загрузить
216 0295 B4 09 mov AH,09h ; да - скажем об этом
217 0297 BA 04BFr mov DX,offset alrinst
218 029A CD 21 int 21h
219 029C B8 4C00 qui: mov AX,4C00h ; и закроемся
220 029F CD 21 int 21h
221 02A1 B8 0002 inst: mov AX,02h ; очистим экран
222 02A4 CD 10 int 10h
223 02A6 B4 09 mov AH,09h
224 02A8 BA 0492r mov DX,offset info1
225 02AB CD 21 int 21h
226 02AD B4 09 mov AH,09h
227 02AF BA 04BAr mov DX,offset info2
228 02B2 CD 21 int 21h
Turbo Assembler Version 2.0 16/12/10 17:29:26 Page 5
kp.ASM
229 02B4 E8 006B CALL CLRF
230 02B7 B8 3509 mov AX,3509h ; функция получения адреса обработчика
231 02BA CD 21 int 21h ; из вектора прерываний и их сохранение
232 02BC 2E: 89 1E 0103r mov word ptr CS:old_09h,BX ; перехватывать будем 2Fh, 09h, 13h и 0Eh
233 02C1 2E: 8C 06 0105r mov word ptr CS:old_09h+2,ES ; 2Fh - мультиплексное, для резидента
234 02C6 B8 352F mov AX,352Fh ; 09h - клавиатура
235 02C9 CD 21 int 21h ; 13h - доступ к дискам
236 02CB 2E: 89 1E 0107r mov word ptr CS:old_2Fh,BX ; 0Eh - дисковод
237 02D0 2E: 8C 06 0109r mov word ptr CS:old_2Fh+2,ES
238 02D5 B8 3513 mov AX,3513h
239 02D8 CD 21 int 21h
240 02DA 2E: 89 1E 010Br mov word ptr CS:old_13h,BX
241 02DF 2E: 8C 06 010Dr mov word ptr CS:old_13h+2,ES
242 02E4 B8 350E mov AX,350Eh
243 02E7 CD 21 int 21h
244 02E9 2E: 89 1E 010Fr mov word ptr CS:old_0Eh,BX
245 02EE 2E: 8C 06 0111r mov word ptr CS:old_0Eh+2,ES
246 02F3 B8 2509 mov AX,2509h ; записываем в вектор прерываний
247 02F6 BA 012Dr mov DX,offset new_09h ; адреса наших новых обработчиков
248 02F9 CD 21 int 21h
249 02FB B8 252F mov AX,252Fh
250 02FE BA 01C2r mov DX,offset new_2Fh