Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Чемпионы рейтинга экспертов в этой рассылке Номер выпуска: | 1362 | Дата выхода: | 19.06.2010, 04:00 | Администратор рассылки: | Лысков Игорь Витальевич, Старший модератор | Подписчиков / экспертов: | 236 / 63 | Вопросов / ответов: | 1 / 1 | IRC-канал по теме: | #assembler | Вопрос № 179075: Уважаемые эксперты! Требуется написать программу(с комментариями).Разработать резидентную программу для ОС MSDOS в соответствии со своим вариантом. Программа может быть выполнена в виде exe или com файла.При попытке пользователя удалить файл программ... Вопрос № 179075: Уважаемые эксперты! Требуется написать программу(с комментариями).Разработать резидентную программу для ОС MSDOS в соответствии со своим вариантом. Программа может быть выполнена в виде exe или com файла.При попытке пользователя удалить файл программа перемещает его в специальную директорию. Ассемблер TASM. Желательно выполнить задание до 11 вечера сегодняшнего дня. Благодарность гарантирована за таку срочность. Нужно сегодня очень. Отправлен: 13.06.2010, 10:45 Вопрос задал: Филимонов Алексей Викторович, 1-й класс Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич, Старший модератор : Здравствуйте, Филимонов Алексей Викторович. Вот программа:
Код: .model tiny .code .startup
FCB struc ;блок FCB _drv db ? _name db 8 dup (?) _ext db 3 dup (?) _curBlk dw ? _rSize dw ? _fSize dw ?,? _date dw ? _time dw ? _reserv dw 8 dup (?) FCB ends
jmp init ;на инициализацию sAlready db 'Program already installed',0dh,0ah,'$' sInstalled db 'Program installed',0dh,0ah,'$' DName db 'c:\test',0 ;каталог, куда перенесем файл FName db '_1.dat',0 ;имя файла fcb1 FCB <> ;блок FCB для контроля удаления по FCB Old21h dw 0, 0 ;старый вектор 21h
New21h : cmp ax, 0fefeh ;проверка на инсталяцию jne OurVector mov ax, 0efefh ;вернем признак, что уже инсталлирована iret OurVector: ;проверяем интересующие функции cmp ah, 41h ;удаление по имени je fun41h cmp ah, 13h ;удаление по FCB je fun13h OldVector: jmp dword ptr cs:[Old21h] ;все остальное - на старый вектор
fun13h: ;удаление по FCB, DS:DX = адрес FCB push ds es si di dx ax ;сохраним регистры mov si, dx ;адрес FCB
lea si, [si]._name ;на начало имени файла push cs pop es ;es=cs lea di, fcb1._name ;es:di - заранее подготовленный FCB для интересующего файла mov cx, _curBlk-1 ;длина имени+расширения repe cmpsb ;сравниваем jne NotOurFile ;не равно - не наш файл jmp OurFile ;на перенос файла в директорию
fun41h: ;удаление по имени, DS:DX = имя файла push ds es si di dx ax mov si, dx ;смещение имени файла, который хотят удалить
push cs p op es lea di,FName ;ES:DI = адрес контролируемого имени cmpLoop: ;сравниваем до нулей cmpsb jne NotOurFile ;не наш файл mov al, [si-1] ;проверим на 0 or al, es:[di-1] jnz cmpLoop ;если не 0, то продолжаем OurFile: ;дошли до 0 - имена одинаковые - переносим push cs ;сначала создадим подкаталог pop ds lea dx, DName ;DS:DX - адрес подкаталога mov ah, 39h ;MakeDir pushf call dword ptr [Old21h] ;если уже есть, то даст ошибку, но это неважно
mov byte ptr [FName-1], '\' ;сформируем полный путь с именем заменой 0 на '\' lea dx, FName lea di, DName mov ah, 56h ;перемещаем DS:DX в ES:DI pushf call dword ptr cs:[Old21h] xor ax, ax ;пометим, что ок mov byte ptr cs:[FName-1], al ;и вернем 0 в конце имени поддиректории NotOurFile: pop ax dx di si es ds ;восстановим регистрвы jnz OldVector ;если придем сюда после несовпадения после сравнения, ; то уйдем на стандартное удаление iret ;если после переноса в поддиректорию, то выходим из прерывания
;Инициализация резидента Init: mov ax, 0fefeh ;проверим на повтор int 21h cmp ax, 0efefh ;не равно - инсталлируем jne Continue
lea dx, sAlready ;иначе - сообщение mov ah, 9 int 21h
mov ax, 4c00h ;и завершаемся int 21h
Continue: lea di, fcb1 ;подготовим FCB для нинтересующего файла lea si, FName mov ax, 2900h ;заполним структуру int 21h
push es ;прочитаем старый вектор 21h mov ax, 3521h int 21h mov cs:Old21h, bx mov cs:Old21h+2, es pop es
lea dx, New21h ;установим новый вектор mov ax, 2521h int 21h mov es, word ptr cs:[2Ch] ;Получим сегмент окружения DOS. mov ah, 49h ;Функция освобождения памяти. int 21h ;Освобождаем память...
lea dx, sInstalled ;сообщение mov ah, 9 int 21h
lea dx, Init ;адрес послед него байта резидента int 27h ;оставляем резидентом и завершаемся
end
Программа перехватывает удаление ф айла _1.dat в текущей директории по функции 41h (по имени) и 13h (по FCB) К сожалению, команда del _1.dat отрабатывается программой cmd.exe, которая является консольной Windows-программой. Действие которой перехватить из досовской программы невозможно... Но можно, например, перехватить удаление command /c del _1.dat ----- Удачи! Ответ отправил: Лысков Игорь Витальевич, Старший модератор Ответ отправлен: 14.06.2010, 01:15 Номер ответа: 262092 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov
Оценка ответа: 5 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 262092 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий