Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Bochka
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 2
#1

Запрет на удаление файла - Assembler

26.05.2013, 23:55. Просмотров 695. Ответов 3
Метки нет (Все метки)

Задача: Резидентная программа по горячей клавише выводит окно, в котором с помощью клавиш 'стрелка вверх' и 'стрелка вниз' выбирается режим работы с файлами, т.е. тип файлов, которые нельзя удалять. В случае попытки удалить файл с выбранным расширением, программа выдает сообщение. Предусмотреть возможность выгрузки программы и защиту от повторной загрузки.

Состоит из двух программ: основной и дополнительной программы-удалялки
Использую TASM, запускаю через dosbox
http://www.cyberforum.ru/assembler/thread57605.html
Код должен быть рабочим, но при компиляции выдает ошибку...
Возможно делаю что-то принципиально неправильно.
Пожалуйста, помогите разобраться и правильно запустить программу..

Основной код:
Assembler
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
org 100h
 
code_seg segment
      ASSUME  CS:CODE_SEG,DS:code_seg,ES:code_seg
      org 100h
start:
      jmp begin
;----------------------------------------------------------------------------
old_09h        DD ?               ;старый обработчик клавиатуры
old_21h        DD ?               ;старый обработчик
int_2Fh_vector DD ?               ;адрес мультиплексного прерывания
 
menu  DB  '===================================|'  ;меню с расширениями файлов
      DB  '===========================>  .ASM   |'
      DB  '===========================>  .OBJ     |'
      DB  '===========================>  .EXE    |'
      DB  '===========================>  .COM   |'
      DB  '===========================>  .TXT     |'
      DB  '===========================>  .DOC    |'
      DB  '===========================>  .DAT    |'
      DB  '===========================>  .CPP     |'
      DB  '===========================>  .SYS     |'
      DB  '===========================>  .CPI      |'
      DB  '===================================|'
 
flag      DB 0                   ;флаг состояния окна, выведено или нет
position  DB 0                    ;текущее нестираемое расширение
stringlen DW 36                    ;длина строки меню                          
 
s21h DB '41e n catched'
s21eh DB '41 n extended catched'
s13h DB '13e n catched'
 
;строка с расширениями файлов для проверки
string    DB 'asmobjexecomtxtdocdatcppsyscpi'     
 
;=================== новый обработчик клавиатуры =======================
new_09h proc far                
    push AX
 
 
testkey:
   in      AL,60h                ;Введем scan-code
   cmp     AL,58h                ;Это скен-код <F12>
   je      hotkey                ;Yes
    
   mov     AH,cs:flag             ;окно выведено или нет?
   cmp     AH,0;
   je      exit_old_09h
   cmp     AL,48h                ;Это скен-код <up>
  je      hotkey                ;Yes
  cmp     AL,50h                ;Это скен-код <down>
   je      hotkey                ;Yes
   cmp     AL,1ch                ;Это скен-код <Enter>
   je      hotkey                ;Yes
 
 
 
exit_old_09h:
    pop     ax
    jmp CS:old_09h                ;вызов старого обработчика
 
hotkey:                       ;обработка горячей клавиши
    push ax
    in      AL,61h                ;Введем содержимое порта B
    or      AL,80h                ;Установим старший бит
    out     61h,AL                ;и вернем в порт B.
    and     AL,7Fh                ;Снова разрешим работу клавиатуры,
    out     61h,AL                ;сбросив старший бит порта B.
    Pop ax
 
    cmp     AL,58h                ;Это скен-код <F12>
    je      New_Window            ;Yes
 
    cmp     AL,48h                ;Это скен-код <up>
    je      up_kl                 ;Yes
 
   cmp     AL,50h                ;Это скен-код <down>
   je      down_kl                ;Yes
 
   cmp     AL,1ch                ;Это скен-код <Enter>
   je      Enter_kl               ;Yes
 
    ;cmp AL, 57h                    ; выгрузка программы из памяти
    ;je out_kl
 
New_Window:
    Mov al,cs:flag                ;флаг установлен?
    Cmp al,0
    Jne exi                       ;да, идем на выход
    call window 
    ;call clear                 ;иначе выводим окно
    mov cs:flag,1                 ;устанавливаем флаг и выходим
    jmp exi                       
 
up_kl:
    mov al,cs:position            ;текущая позиция самая верхняя?
    cmp al,0            
    je exi                        ;да, ничего не делаем и выходим
    dec al                        ;иначе смещаемся вверх на одну позицию
    mov cs:position,al            ;и запоминаем ее
    call window                   ;обновляем окно и выходим
    jmp exi
 
down_kl:
    mov al,cs:position            ;текущая позиция самая нижняя?
    cmp al,9
    je exi                        ;да, ничего не делаем и выходим 
    inc al                        ;иначе смещаемся вниз на одну позицию 
    mov cs:position,al            ;и запоминаем ее 
    call window                   ;обновляем окно и выходим 
    jmp exi
 
Enter_kl:
    call clear;                   ;очищаем окно
    mov CS:flag,0;                ;сбрасываем флаг
 
exi:
    ;cli                           
    mov AL, 20h             ;Пошлем
    out 20h,AL              ;приказ EOI
    pop AX
iret
 
 
new_09h     endp
 
 ;==================== новый обработчик прерывания 21h ====================
 
new_21h proc far                  
 cmp AH, 41h                        ;если это функция удаления файла
je check_of_extension                ;то проверяем расширение файла,                                   ; не совпадает ли оно с запрещенным
 
;call clear    
    
cmp AX, 7141h               ;функция удаления файла с длинным именем
je check_of_extension
; call clear__
    
    
cmp AH, 13h                 ; альтернативный способ удаления - 13h прерывание
je check_of_extension       
 
;call clear__    
jmp old21h                        ;если нет, то уходим в стандартный обработчик
 
check_of_extension:               ;проверка расширения
;     cli
     push DI                      ;сохранение регистров
     push SI
     push AX
     push BX
     push CX
     push ES
     push CS
 
    ;call clear__
 
     mov SI,DX                    ;копируем DX в SI, теперь в DS:SI содержится
                                  ;адрес ASCIIZ-строки с именем файла
     nextsymbol:                  ;ищем конец имени удаляемого файла
          inc SI
          mov AL,DS:SI
          cmp AL,0                ;это нулевой байт 
          jne nextsymbol          ;если нет, то переходим к следующему символу
     dec SI                       ;теперь в DS:SI содержит адрес последнего 
                                  ;символа расширения файла
    
     pop ES                       ;ищем в строке расширений то, которое
                                  ;соответствует запрещенному для удаления
     xor AX, AX 
     mov AL, ES:position           
     mov BL, 3
     mul BL
     add AL, 2
     add AX, offset string
     mov DI, AX                    ;теперь ES:DI содержит адрес конца требуемого 
                                   ;расширения
     mov CX,3
     std                           ;установим флаг направления DF=1
     repe cmpsb                    ;сравниваем расширения
     jnz delete_file
;       call clear__                ;расширения не совпадают,флаг ZF=0
 
not_delete_file:                   ;расширения совпали, файл нельзя удалить
     pop es                        ;восстанавливаем регистры
     pop cx                  
     pop bx
     pop ax 
     pop si
     pop di
     push dx
     mov ah, 09h
     mov dx, offset cantDel
        int 21h
        pop dx
     push ax                              
     mov AL,20h                   ; пошлем в контроллер 
     out 20h,AL                   ;прикз EOI? end of interrupt и выйдем
     pop ax
     mov al, 0ffh   
     iret
 
delete_file:
     pop es
     pop cx
     pop bx
     pop ax
     pop si                       ;восстановление регистров
     pop di
 
old21h:                     ;возвращаемся в старый обработчик
     jmp cs:old_21h
iret
 
new_21h endp
 
window proc                       ;вывод меню
     push AX
     push BX                      ;сохраняем регистры
     push CX
     push DX
     push SI
     push DI
     push DS
     push ES
     
     call clear
 
     push CS                      ;настраиваем DS на наш сегмент команд
     pop DS                       
     mov AX, 0B800h          
     mov ES,AX                  
     mov CX, 12                   
 
     mov DI, 80*2*1+1*2           ;DI=адрес приёмника,выводим с первой строки
                                  ;второго столбца
     mov SI, offset menu          ;SI на адрес источника,выводим меню
     mov AH,17h                   
     
     loopstring:                  ;Выводим на экран меню    
          push CX
          mov CX, stringlen       ;CX-число пересылаемых битов,
          cld                     ;сброс DF-двигаемся вперед
          loopsymbol:             ;выводим на экран строку меню
               lodsb              ;сохраним байт в AL
                                  ;AL<-DS:[SI],SI+=1
               stosw              ;восстановим байт на экран из АL 
                                  ;ES:[DI]<-AL,DI+=1
               loop loopsymbol
      
          add DI,160-72           ;сдвигаемся в следующую позицию вывода
          pop CX
          loop loopstring         ;выведем следующую строку
 
 
      mov DI, 80*2*2+3*2          ;установим первоначальное положение ползунка
      xor AH, AH 
      mov AL, position             ;поместим ползунок в строку с расширением
      mov BL, 160                  ;запрещенным для удаления
      mul BL
      add DI, AX
      mov AL, 16                   ;ползунок 
      mov ES:[DI], AL
 
      pop ES                      
      pop DS
      pop DI
      pop SI
      pop DX               
      pop CX
      pop BX
      pop AX
      ret
 
window endp
 
clear proc                        ;очистка экрана под меню
     push BX
     push CX
     push DX                      
     
     mov AX,0600h                 ;вывод окна без прокрутки
     mov BH,07h                   ;атрибут символов белый по черному
     mov CH,0                     ;координаты 
     mov CL,0                     ;окна
     mov DH,25       
     mov DL,80     
     int 10h
 
     pop DX                       ;восстановление регистров
     pop CX
     pop BX
     ret
 
clear endp
 
;=============== обработка мультиплексного прерывания =====================
int_2Fh proc far                
    cmp     AH, 0C7h              ;проверка номера
    jne     Pass_2Fh              
    cmp     AL,00h                ;проверка на повторную установку
    je      inst                 
    cmp     AL,01h                ;Подфункция выгрузки
    je      unins                
    jmp     short Pass_2Fh        ;Неизвестная подфункция - на выход
 
inst:
    mov     AL, 0FFh               ;Сообщим о невозможности повторной установки
    iret
Pass_2Fh:
    jmp dword PTR CS:[int_2Fh_vector]
 
; =============Проверка - возможна ли выгрузка программы из памяти ?==========
unins:
    push    BX
    push    CX
    push    DX
    push    ES
 
    mov     CX, CS                 
                                  
    mov     AX,3509h              ;Проверить вектор 09h
    int     21h                   ;Функция 35h в AL - номер прерывания. 
                                  ;Возврат-вектор в ES:BX
 
    mov     DX, ES
    cmp     CX, DX
    jne     Not_remove
    cmp     BX, offset CS:new_09h
    jne     Not_remove
 
    mov     CX,CS
 
    mov     AX,3521h              ;Проверить вектор 21h
    int     21h                   ;Функция 35h в AL - номер прерывания.
                                  ;Возврат-вектор в ES:BX
 
    mov     DX, ES
 
    mov     AX, 352Fh              ;Проверить вектор 2Fh
    int     21h                    ;Функция 35h в AL - номер прерывания.
                                   ;Возврат-вектор в ES:BX
    mov     DX,ES
    cmp     CX,DX
    jne     Not_remove
    cmp     BX, offset CS:int_2Fh
    jne     Not_remove
    
; ==============Выгрузка программы из памяти ======================
 
    push    DS
 
    lds     DX, CS:old_09h        ;загрузка DS и DX из поля памяти
    mov     AX, 2509h              ;заполнение вектора старым содержимым
    int     21h
 
    lds     DX, CS:old_21h        ;загрузка DS и DX из поля памяти
    mov     AX, 2521h              ;заполнение вектора старым содержимым
    int     21h
 
    lds     DX, CS:int_2Fh_vector ;загрузка DS и DX из поля памяти
    mov     AX, 252Fh              ;заполнение вектора старым содержимым 
    int     21h
 
    pop     DS
 
    mov     ES, CS:2Ch             ;ES -> окружение
    mov     AH, 49h               ;Функция освобождения блока памяти
    int     21h
 
    mov     AX, CS
    mov     ES, AX                ;ES -> PSP выгрузим саму программу
    mov     AH, 49h               ;Функция освобождения блока памяти
    int     21h 
 
    mov     AL, 0Fh                ;Признак успешной выгрузки
    jmp     short pop_ret
Not_remove:
    mov     AL, 0F0h               ;Признак - выгружать нельзя
pop_ret:
    pop     ES
    pop     DX
    pop     CX
    pop     BX
 
    iret
int_2Fh endp
 
begin:
    mov CL,ES:80h               ;Длина хвоста в PSP
    cmp CL,0                    
    je  check_install           ;запущена без параметров,
                                
    xor CH, CH                   ;CX=CL=длина хвоста
    cld                         ;DF=0 - флаг направления вперед
    mov DI, 81h                 ;ES:DI-> начало хвоста в PSP
    mov SI, offset key           ;DS:SI-> поле key
    mov AL,' '                  ;Уберем пробелы из начала хвоста
repe    scasb                     ;Сканируем хвост пока пробелы
                              ;AL - (ES:DI) -> флаги процессора
                                ;повторять пока элементы равны
    dec DI                      ;DI-> на первый символ после пробелов
    mov CX, 4                   ;ожидаемая длина команды
repe    cmpsb                     ;Сравниваем введенный хвост с ожидаемым
                              ;(DS:SI)-(ES:DI) -> флаги процессора
    jne check_install           ;Неизвестная команда - попробуем установить
    inc flag_off
                                  ;Проверим, не установлена ли уже эта программа
check_install:
    mov AX,0C700h               ;AH=0C7h номер процесса C7h
                            ;AL=00h -дать статус установки процесса
    int 2Fh                     ;мультиплексное прерывание
    cmp AL,0FFh
    je  already_ins             ;возвращает AL=0FFh если установлена
 
    cmp flag_off, 1
    jne nnext
    jmp unknown_err
nnext:
 
    mov AX, 352Fh                   ;получить вектор прерывания  2Fh 
    int 21h                           
    mov word ptr int_2Fh_vector,BX  ;ES:BX - вектор
    mov word ptr int_2Fh_vector+2,ES  
 
    mov DX,offset int_2Fh          ;получить смещение точки входа в новый
                                   ;обработчик на DX
    mov AX,252Fh                   ;функция установки прерывания
                                   ;изменить вектор 2Fh
    int 21h                        ;AL - номер прерыв. 
                                   ;DS:DX - указатель программы обработки прер.
 
    mov AX,3509h                   ;получить вектор прерывания  09h 
    int 21h                             
    mov word ptr old_09h,BX        ;ES:BX - вектор
    mov word ptr old_09h+2,ES  
    mov DX,offset new_09h          ;получить смещение точки входа в новый
                                   ;обработчик на DX
    mov AX,2509h                   ;функция установки прерывания
                                   ;изменить вектор 09h
    int 21h                        ;AL - номер прерыв. 
                                   ;DS:DX - указатель программы обработки прер.
 
    mov AX,3521h                   ;получить вектор прерывания  21h 
    int 21h                             
    mov word ptr old_21h,BX        ;ES:BX - вектор
    mov word ptr old_21h+2,ES  
    mov DX,offset new_21h          ;получить смещение точки входа в новый
                                   ;обработчик на DX
    mov AX,2521h                   ;функция установки прерывани
                                   ;изменить вектор 21h
    int 21h                        ;AL - номер прерыв. 
                                   ;DS:DX - указатель программы обработки прер.
 
    mov DX,offset msg1             ;Сообщение об установке
    call    print
 
    mov DX,offset   begin           ;   оставить программу ...
    int 27h                         ;   ... резидентной и выйти
 
already_ins:
    ;jmp unins
    cmp flag_off, 1                ;Запрос на выгрузку установлен?
    je  uninstall                 ;Да, на выгрузку
    lea DX, msg                    ;Вывод на экран сообщения:already installed!
    call   print
    int 20h
; ============ Выгрузка ==========================================
 uninstall:
    mov AX,0C701h                  ;AH=0C7h номер процесса C7h,
                                   ;подфункция 01h-выгрузка
    int 2Fh                        ; мультиплексное прерывание
    cmp AL,0F0h
    je  not_sucsess
    cmp AL,0Fh
    jne not_sucsess
    mov DX, offset msg2             ;Сообщение о выгрузке
    call    print
    int 20h
not_sucsess:
    mov DX,offset msg3             ;Сообщение, что выгрузка невозможна
    call    print
    int 20h
unknown_err:
    mov DX,offset msg4              ;При нормальной работе программы
    call    print                   ;не должны попасть на эту метку. 
    int 20h             ;обработка исключения 
;----------------------------------------------------------------------------
key         DB  '/off'
flag_off    DB  0
msg         DB  'already '
msg1        DB  'installed',13,10,'$'
msg4        DB  'just '
msg3        DB  'not '
msg2        DB  'uninstalled',13,10,'$'
cantDel     DB  'Permission denied',13,10,'$'
;===================================================================
PRINT       PROC NEAR
    MOV AH, 09H
    INT 21H
    RET
PRINT       ENDP
;;===================================================================
code_seg ends
     end start
ret
Код дополнительной программы-удалялки:
Assembler
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
.286
C_SEG SEGMENT   PARA 'CODE'
ORG 100H
ASSUME CS:C_SEG, DS:C_SEG, SS:C_SEG
START:          JMP GO
 
GO:
    mov bx, 80h
    mov bx, ds:[bx]
 
    cmp bl, 1
    jle ex
 
    push ax
 
    mov si, 81h           
    lea di, filename      
    cld                   
space:
    lodsb                
    cmp al, ' '           
    je space              
next:
    jb cmdEnd             
    stosb                 
    lodsb                 
    cmp al, ' '           
    jne next              
cmdEnd:
    mov al, 0
    stosb
    
    mov ah, 41h
    mov dx, offset filename
    int 21h
    pop ax
 
ex:
ret
 
filename db 0,127 dup (?) ;name
C_SEG ENDS
END START
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2013, 23:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запрет на удаление файла (Assembler):

удаление файла
Необходимо удалить файл. То есть. Нужно щёлкнуть правой кнопкой мыши по файлу и...

Удаление файла
Напишите пожалуйста код удаления файла по указанному пути

Удаление файла, введённого в командной строке (Ассемблер)
Товарищи! Помогите пожалуйста решить задачу. Текст задачи: Написать...

Запрет на переименование/удаление запущенного файла
Привет! Как сделать, чтобы было запрещено переименовать/удалять Прикол в том,...

Как обойти запрет на удаление файла?
array&lt;Process^&gt;^ processes = Process::GetProcessesByName(&quot;Program&quot;); // Массив...

3
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
27.05.2013, 06:29 #2
198-199 строки. зачем досевому прерыванию слать EOI? разве эта шняга отправляется не только для прерываний от внешних устройств?
0
Bochka
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 2
27.05.2013, 10:28 #3
Все равно в 163-й строчке ошибку показывает...
0
sh2ezo
1126 / 260 / 9
Регистрация: 11.06.2010
Сообщений: 1,050
27.05.2013, 18:36 #4
Bochka,

код
Assembler
1
2
inc si
mov al, ds:[si]
можно заменить на

Assembler
1
lodsb
а перед началом цикла надо поставить будет cld. ругаться точно не будет О_о
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2013, 18:36
Привет! Вот еще темы с решениями:

Запрет на удаление записей
Здравствуйте! Подскажите, как в форме Режим таблицы сделать запрет на удаление...

Запрет на удаление папки
Доброго! Может кто подскажет как в Windows 7 сделать полный доступ к папке и...

Запрет на удаление Attach
Имеется карточка документа, в ней в RichText-поле крепится Attach - pdf, docx и...

Запрет на удаление файлов
Здравствуйте. Стоит такая задача- есть два пользователя Admin и User, нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru