Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1442
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1371
∙ повысить рейтинг »
vladisslav
Статус: 5-й класс
Рейтинг: 1073
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Assembler (Ассемблер)

Номер выпуска:1293
Дата выхода:16.12.2009, 22:30
Администратор рассылки:Лысков Игорь Витальевич, Модератор
Подписчиков / экспертов:440 / 67
Вопросов / ответов:1 / 2
IRC-канал по теме:#assembler

Вопрос № 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) Я не много не уверен в правельности вектора прерывания в моей резиденте...

Отправлен: 10.12.2009, 22:31
Вопрос задал: Земцов Дмитрий Анатольевич, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Земцов Дмитрий Анатольевич.
Всегда приятно не делать за кого-то, а помочь разобраться... Итак:
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 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Зенченко Константин Николаевич, Модератор :
    Здравствуйте, Земцов Дмитрий Анатольевич.

    В дополнение ответа Игоря Витальевича, в приложении код, который:
    - устанавливает свой обработчик;
    - контролирует повторный запуск;
    - контролирует функцию создания файла 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 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.12 от 30.11.2009

    В избранное