Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > TSR - защита удаления файлов


Автор: bugmenot1 31.5.2011, 10:12
Здравствуйте.
Необходимо написать резидент, запрещающий удаление файлов определённого расширения. Программа должна быть написана под DOS 16 бит.
Я предполагал это делать так - пишется свой собственный обработчик прерываний 21h, в нём проверяется нужная функция (41h - удаление файлов). Если не наша, уход в старый обработчик.
Так вот, почему-то при удалении файла через DOS (cmd.exe, command.com, DosBox, FAR, VC - всё пробовал), файлы всё равно удаляются, а функция 41h не отлавливается.
Вот код обработчика, немного недописанный.
Код

new_21h     proc

    cmp     AH, 41h             ;функция удаления
    je      work                ;работаем по нашей функции    
    cmp        AX, 7141h            ;функция удаления файла с длинным именем
    je        work
    jmp     exit_21h            ;иначе уход в старый обработчик без возврата
    
work:
    call    clear
    
    push    AX
    push    BX
    push    CX
    push    DI
    push    SI
    push    DS
    push    ES
    
    push    CS
    pop        ES
    
    mov        SI, DX                ;адрес имени удаляемого файла
    search_null:                ;перемещение на конец строки
        mov    AL, [SI]
        inc    SI
        cmp    AL, 0h
    jne    search_null    
    sub        SI, 2h                ;в SI содержится адрес последнего символа имени файла
    mov        BX, SI                ;копируем SI в BX - понадобится при поиске
    
    mov        AX, offset CS:extensions    ;адрес extensions
    add        AX, ex_len                    ;длина 
    
    std                                ;флаг DF = 1 - движение назад
    search_string:
        dec        AX                    ;на первой итерации AX и DI содержат адрес последнего символа в extensions
        mov        DI, AX                ;на последующих - продвижение на 1 символ назад
        cmp        DI, offset CS:extensions + 1    ;дошли до второго символа, а совпадений не найдено
        je        delete_file            ;файл можно удалять
        mov        CX, 3h                ;ожидаемая длина расширения
        repe    cmpsb                ;сравниваем содержимое SI - имя файла и DI - блокируемые расширения
        mov        SI, BX                ;возвращаем SI в предыдущее состояние
        cmp        CX, 0h                ;найдено совпадение
        je        found
    jmp        search_string
        
found:
        
not_delete_file:
    pop        ES
    pop        DS
    pop        SI
    pop        DI
    pop        CX
    pop        BX
    pop        AX
    
    push    BP
    mov        BP, SP                    ;BP <- SP
    
    ;[bp+0] bp
    ;[bp+2] ip
    ;[bp+4] cs
    ;[bp+6] flags
    
    or        [BP+6], 1h                ;ставим CF=1 - запрет доступа (бит 0)
    pop        BP
    mov        AX, 5h                    ;код ошибки - доступ запрещён
    iret
    
delete_file:
    pop        ES
    pop        DS
    pop        SI
    pop        DI
    pop        CX
    pop        BX
    pop        AX
    
exit_21h:
    jmp     DWPTR CS:[old_21h]
    
new_21h     endp


Процедура clear - очистка экрана, добавлена для отладки. Теоретически, при удалении файла должна вызываться функция 41h, программа идёт на метку work, очищает экран и работает. Но этого не происходит.
Процедура clear точно работоспособна. Обработчик установлен верно.

Автор: iff 31.5.2011, 12:24
Дайте код всей программы.

Добавлено @ 12:36
Скорей всего, ошибка в сравнении строк.
Вот отдельный пример.
Код

.data
str1 db 'c:\dir1\file.asd', 0
extensions db '.asd'
ex_len equ 4

.code
mov ax, @data
mov ds, ax
mov es, ax
cld   ;поиск конца строки
lea di, str1
xor ax, ax
mov cx, 128
repne scasb
jne err ;если почему-то нет нуля в конце
dec di
dec di
std ;сравнение
lea si, extensions[ex_len-1]
mov cx, ex_len
repe cmpsb
je not_delete_file
delete_file:

Автор: iff 31.5.2011, 12:46
или так. Так даже кода меньше.
Код

.data
str1 db 'c:\dir1\file.asd', 0
extensions db 'asd', 0
ex_len equ 4

.code
mov ax, @data
mov ds, ax
mov es, ax
cld   ;поиск точки
lea di, str1
mov al, '.'
mov cx, 128
repne scasb
jne err ;если почему-то нет точки
lea si, extensions ;сравнение
mov cx, ex_len
repe cmpsb
je not_delete_file
delete_file:

Автор: bugmenot1 31.5.2011, 13:15
Единственная проблема в том, что не срабатывает вот этот участок кода:
Код

new_21h     proc

    cmp     AH, 41h             ;функция удаления
    je      work                ;работаем по нашей функции    

Т.е. удаление в DOS строчкой "del e:\test.txt" происходит не посредством функции 41h

Автор: AeroHk 12.5.2012, 19:41
Пишу курсач, точно такая же проблема..

Автор: LeonidPr 4.6.2012, 13:30
Ну во-первых хорошо бы подготовить окружение, соответствующее "чистой" DOS. Попросту, найдите дистриб DOS 6.22, поставьте куда-нибудь на Bochs или VMWare или любой удобный для вас эмулятор. Или, если уж совсем хочется, сделайте загрузочную дискету и грузаните комп с неё. И вот уже оттуда запускайте свою программу. Только вот еще что, (знатоки DOS, поправьте меня, если не прав) ИМХО, нужно отрубить всякие EMM386, HIMEM и т.п. Вот если и так не заработает, тогда уже разбираться, что к чему?

Автор: 500mhz 5.6.2012, 09:04
Было бы не плохо увидеть код установки хука.

Автор: LeonidPr 5.6.2012, 11:58
Вот, еще что вспомнил. Когда-то курсач по ОС писал, нужно было переключалку нескольких процессов сделать. Я тогда там то же int 21h перехватывал. Так вот, столкнутся тогда с проблемой, что функция 25h (установка вектора прерывания) не хотела работать для прерывания 21h (если мне память не изменяет, вроде как завис был глухой). Долго бился тогда, в результате сделал нагло через таблицу векторов. Препод тогда мне сказал, что это от того, что DOS нереентерабельна.

Автор: 500mhz 6.6.2012, 09:18
Я не помню точно, но мне кажеться что в дос сессии (в винде имею ввиду) были какие то заморочки с установкой хуков.

Автор: LeonidPr 7.6.2012, 07:17
500mhz, что вы имеете в виду под "хуком"? Для меня это понятие напрочь связано с хуками самой винды, устанавливаемые SetWindowHookEx. Или вы так называете подмену обработчика прерывания своим?
Цитата

Я не помню точно, но мне кажеться что в дос сессии (в винде имею ввиду) были какие то заморочки с установкой хуков.

Я поэтому и говорил, что нужен "чистый" дос, на эмуляторе (только не DosBox) или вживую, неважно. Винда может на 21h прерывание делать шлюз прерывания, через который управление передается куда-то глубоко в систему. Поэтому да, перехват его я думаю будет затруднителен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)