Вопрос № 175115: Доброго времени суток уважаемые эксперты. С целью ознакомления решил написать резидентную программу ОС MS-DOS, которая запрещала создавать файл с определенным именем. Написал резидентную часть программы перехватывающее прерывание 21h функции 3Ch — С...
Вопрос № 175115:
Доброго времени суток уважаемые эксперты. С целью ознакомления решил написать резидентную программу ОС MS-DOS, которая запрещала создавать файл с определенным именем. Написал резидентную часть программы перехватывающее прерывание 21h функции 3Ch — Создание файла(резидент приведен в приложении). Функция DOS 3Ch — Создать файл
Ввод: AX = 3Ch СХ = атрибут файла бит 7: файл можно открывать разным процессам в Novell Netware бит 6: не используется бит 5: архивный бит (1, если файл не сохранялся) бит
4: каталог (должен быть 0 для функции 3Ch) бит 3: метка тома (игнорируется функцией 3Ch) бит 2: системный файл бит 1: скрытый файл бит 0: файл только для чтения DS:DX = адрес ASCIZ-строки с полным именем файла (ASCIZ-строка ASCII-символов, оканчивающаяся нулем) Вывод: CF = 0 и АХ = идентификатор файла, если не произошла ошибка CF = 1 и АХ = 03h, если путь не найден CF = 1 и АХ = 04h, если слишком много открытых файлов CF = 1 и АХ
= 05h, если доступ запрещен
Следовательно, для достижения цели нам нужно при перехвате прерывания функции создания нового файла: 1)Сравнить имя создаваемых с именем запрещенным 2) Если совпадают вызвать ошибку(как я понял флаг CF в 1 и любой код ошибки в AX) 3) Если нет вернуть управление.
Возникшие вопросы: 1) При создании имя файла храниться DS:DX, при перехвате прерывания где будет храниться название создаваемого файла 2) Как можно будет сравнить имена файлов? Циклом посимвольно
или есть другой способ? 3) Вызвать ошибку будет достаточно установить флаг CF в 1 и любой код ошибки в AX и вернуть управление или я ошибаюсь? 4) Я не много не уверен в правельности вектора прерывания в моей резиденте...
Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Земцов Дмитрий Анатольевич. Всегда приятно не делать за кого-то, а помочь разобраться... Итак: 1) Совершенно верно, при создании имя файла хранится в DS:DX, т.е. используются длинные указатели. Поэтому при прехвате там его надо и искать. 2) Сравнивать две строки лучше всего следующим образом
Код:
mov si, dx ;DS:SI - адрес имени создаваемого файла les di,TestName ;загрузка ES:DI адресом строки с тестовым именем mov cx,TestNameLen ;длина тестового имени с завершающим нулем repe cmpsb ;сравниваем, пока равно je Equal ;делаем выводы NotEqual:
Не забываем о том, что работаем в прерывании, поэтому сохраняем все используемые регистры 3) В принципе, верно: устанавливаем CF=1 и даем код ошибки в AX. Толь
ко код надо давать не любой, а соответствующий. Лучше всего, пожалуй, подойдет 5 (Access denied) 4) Код вполне рабочий, за исключением: Меняем вектор прерывания 21h, а не 3Ch, поэтому надо писать MOV AX,3521h и, соответственно, MOV AX,2521h Только код же ничего не делает :) Надо же, хотя бы, проверять на номер перехватываемой функции... 5) Файл можно еще создать при помощи функции 16h 6) Желательно принимать меры, чтобы резидент не устанавливался повторно и/или имел возможность выгрузиться Удачи! В
приложении исправленная Ваша программа
Приложение:
----- Удачи!
Ответ отправил: Лысков Игорь Витальевич, Модератор
Ответ отправлен: 11.12.2009, 09:49 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov
Оценка ответа: 5 Комментарий к оценке: Спасибо огромное за советы, а так же за помощь в изучении работы с флагами и сравнение строки в асм
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 257602
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
В дополнение ответа Игоря Витальевича, в приложении код, который: - устанавливает свой обработчик; - контролирует повторный запуск; - контролирует функцию создания файла 3С и подменяет её; - возвращает стандартную ошибку. Приблизительно так это работает:
Контроль повторного запуска, приведен в учебных целях, как возможный вариант,
но он не дает полной гарантии, т.к. вполне возможен перехват другим резидентом. Но он показывает способ сравнения строк.
В регистрах DS:DX хранится адрес памяти с именем файла, но тамже может хранится дополнительно ещё и путь к нему, т.е. приблизительно в таком виде D:\_CAT\_LANG\my_LIB\check.txt. Если путь к файлу не указан, то файл создается в текущем каталоге, иначе в указаном. Этот момент тоже нужно учитывать при анализе имени файла.
Удачи
!
Приложение:
----- Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч
Ответ отправил: Зенченко Константин Николаевич, Модератор
Ответ отправлен: 11.12.2009, 15:32 Украина, Киев Тел.: +38-097-953-66-19 Адрес: Украина, Киев
Оценка ответа: 5 Комментарий к оценке: Спасибо огромное за советы, а так же за детальный пример разидентной программы прерыванием 21h функции 3Ch
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 257608
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.