Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как отловить программу вызвавшею определенное прерывание?

51K
11 октября 2009 года
Asad
7 / / 11.10.2009
Здраствуйте! Необходимо поймать программу вызывающую определенное прерывание(например int9h, int13h). Отследить хочется вплоть до места расположения на диске и в памяти. Как это сделать?
Зарание благодарен.
18K
12 октября 2009 года
logree
102 / / 27.09.2008
Я конечно может быть предложу способ не фантан, но будет работать, естественно при условие что все эти действия выполняются под DOS:

когда выполняется инструкция int в стеке сохраняются : регистр флагов, CS,IP

1. Сохраняем старый вектор прерывания
2. Заменяем его вектором который указывает на твой код
а) в твоём коде ты извлекаешь из стека значения CS,IP сохраняешь их где тебе нужно(это и будет адрес программы в памяти), и заталкиваешь обратно в стек.
б) Заталкиваешь в стек текущий регистр флагов
в) Делаешь call по старому(см 1) вектору прерыания.
И вуа-ля...

Для того чтобы узнать месторасположения программы на диске, я думаю существуют спец функции DOS, ну или не существуют.:D
252
12 октября 2009 года
koderAlex
1.4K / / 07.09.2005
укажите операционную систему .
в досе у каждой программы есть PSP (префикс программого сегмента) . в нём по адресу +80h находится командная строка .
51K
12 октября 2009 года
Asad
7 / / 11.10.2009
Цитата: koderAlex
укажите операционную систему .


ОС - DOS.

51K
12 октября 2009 года
Asad
7 / / 11.10.2009
Цитата: logree

когда выполняется инструкция int в стеке сохраняются : регистр флагов, CS,IP

1. Сохраняем старый вектор прерывания
2. Заменяем его вектором который указывает на твой код
а) в твоём коде ты извлекаешь из стека значения CS,IP сохраняешь их где тебе нужно(это и будет адрес программы в памяти), и заталкиваешь обратно в стек.
б) Заталкиваешь в стек текущий регистр флагов
в) Делаешь call по старому(см 1) вектору прерыания.
И вуа-ля...

Для того чтобы узнать месторасположения программы на диске, я думаю существуют спец функции DOS, ну или не существуют.:D


после срабатывания инструкции Int в CS, IP будет адрес какой-то команды программы, которая вызвала прерывание. Это понятно.
А как распознать эту программу? Написать нужно универсальную программу для процессоров 8086 и старше.
Спец. функций DOS под мою задачу вроде бы нет?

18K
12 октября 2009 года
logree
102 / / 27.09.2008
поправьте меня если я не прав, но разве DOS для каждой программы не выделяет новый сегмент?
Сегмент ты знаешь... программа начинается со смещения 100h... про расположение на диске тебе отписал koderAlex. По-моему всё? Что ты подразумеваешь под
Цитата:
как распознать эту программу?

?

1.9K
12 октября 2009 года
andriano
474 / / 10.01.2008
Вообще-то DOS - однозадачная ОС. Плюс драйвера и резиденты.

Кстати, если прерывание вызвано драйвером, к которому обращается запущенная в данный момент программа, как это считать?
349
12 октября 2009 года
Phantom-84
656 / / 27.10.2005
В DOS одна программа может вызывать другую, отдавая ей управление на время. Ну и "Плюс драйвера и резиденты". Со смещения 100h начинаются только com-программы. У exe-программ может быть множество сегментов. Однако память под отдельную программу фрагментируется редко. DOS при запуске программы выделяет для нее один непрерывный блок, перед которым присутствует структура Memory Control Block (вроде бы размером 16 байт), содержащая сигнатуру, идентификатор процесса-владельца и линк на соседний (или соседние) MCB. В PSP программы есть линк на копию блока переменных среды окружения для данного процесса, в конце которого хранится полное имя исполняемого файла, т.е. включая диск и путь. Это чисто из моих воспоминаний про счастливое детство. Это настолько старо, что и либы для DOS я уже давно не храню. Если очень надо, могу попробовать вспомнить что-то и более подробно. Смысл в том, что сначала из сегмента:смещения получаешь линейный адрес, потом определяешь владельца MCB, потом ищешь тот блок, принадлежащий тому же владельцу, где находится PSP, оттуда выуживаешь блок переменных среды, а там уже полное имя экзэшника.
51K
12 октября 2009 года
Asad
7 / / 11.10.2009
Цитата: Phantom-84
Смысл в том, что сначала из сегмента:смещения получаешь линейный адрес, потом определяешь владельца MCB, потом ищешь тот блок, принадлежащий тому же владельцу, где находится PSP, оттуда выуживаешь блок переменных среды, а там уже полное имя экзэшника.



Спасибо! пойду пробовать...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог