Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TSR - защита удаления файлов, проблема с обработчиком прерывания 
:(
    Опции темы
bugmenot1
Дата 31.5.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



Здравствуйте.
Необходимо написать резидент, запрещающий удаление файлов определённого расширения. Программа должна быть написана под 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 точно работоспособна. Обработчик установлен верно.
PM MAIL   Вверх
iff
Дата 31.5.2011, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Дайте код всей программы.

Добавлено @ 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:42


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
iff
Дата 31.5.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



или так. Так даже кода меньше.
Код

.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:


Это сообщение отредактировал(а) iff - 31.5.2011, 12:47


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
bugmenot1
Дата 31.5.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



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

new_21h     proc

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

Т.е. удаление в DOS строчкой "del e:\test.txt" происходит не посредством функции 41h
PM MAIL   Вверх
AeroHk
Дата 12.5.2012, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.5.2012

Репутация: нет
Всего: нет



Пишу курсач, точно такая же проблема..
PM MAIL   Вверх
LeonidPr
Дата 4.6.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Ну во-первых хорошо бы подготовить окружение, соответствующее "чистой" DOS. Попросту, найдите дистриб DOS 6.22, поставьте куда-нибудь на Bochs или VMWare или любой удобный для вас эмулятор. Или, если уж совсем хочется, сделайте загрузочную дискету и грузаните комп с неё. И вот уже оттуда запускайте свою программу. Только вот еще что, (знатоки DOS, поправьте меня, если не прав) ИМХО, нужно отрубить всякие EMM386, HIMEM и т.п. Вот если и так не заработает, тогда уже разбираться, что к чему?
--------------------
pkunzip.zip
PM MAIL   Вверх
500mhz
Дата 5.6.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Было бы не плохо увидеть код установки хука.


--------------------

PM MAIL ICQ   Вверх
LeonidPr
Дата 5.6.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



Вот, еще что вспомнил. Когда-то курсач по ОС писал, нужно было переключалку нескольких процессов сделать. Я тогда там то же int 21h перехватывал. Так вот, столкнутся тогда с проблемой, что функция 25h (установка вектора прерывания) не хотела работать для прерывания 21h (если мне память не изменяет, вроде как завис был глухой). Долго бился тогда, в результате сделал нагло через таблицу векторов. Препод тогда мне сказал, что это от того, что DOS нереентерабельна.
--------------------
pkunzip.zip
PM MAIL   Вверх
500mhz
Дата 6.6.2012, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



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



--------------------

PM MAIL ICQ   Вверх
LeonidPr
Дата 7.6.2012, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

Репутация: нет
Всего: 1



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

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

Я поэтому и говорил, что нужен "чистый" дос, на эмуляторе (только не DosBox) или вживую, неважно. Винда может на 21h прерывание делать шлюз прерывания, через который управление передается куда-то глубоко в систему. Поэтому да, перехват его я думаю будет затруднителен.
--------------------
pkunzip.zip
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.