0 / 0 / 0
Регистрация: 01.03.2018
Сообщений: 3
|
||||||
1 | ||||||
Распечатать те TSR-программы, у которых не освобождена память Environment (TSR)01.03.2018, 12:55. Показов 1438. Ответов 13
Здравствуйте! Мне необходимо написать такую программу: TSR -программа должна распечатывать те TSR -программы, у которых не освобождена память Environment. Программа должна обладать защитой от повторной загрузки и уметь выгружаться.
В основном код взят из лекций преподавателя, но программа вроде бы выгружается и защищена от повторной загрузки. Пока мне нужно написать часть кода, в котором программа отслеживала бы 27 прерывание. То есть, если до запуска моей программы, какая-то программа стала резидентной, моя программа вывела любое сообщение. Как это сделать? Вот, что есть на данном этапе:
0
|
01.03.2018, 12:55 | |
Ответы с готовыми решениями:
13
TSR, которая записывает в файл журнал статистику обо всех удаленных файлах в процессе работы данной TSR программы (TSR) После нажатия F12 вывести имя последней запущенной программы и количество нажатых клавиш во время её работы TSR программа TSR программа |
Эксперт Hardware
|
|
01.03.2018, 16:22 | 2 |
..не понял, как твоя программа до запуска может отследить 27-ой инт??? Или ты пишешь 2 программы?
Есть вариант, когда твоя прога может протестить память на присутствие резидентов. Для этого нужно просканировать цепочку записей MCB (Memory Control Block). Первую запись MCB возвращает в ES:BX функция DOS AH=52h. В BX-2 будет лежать сегмент начала цепочки.
1
|
0 / 0 / 0
Регистрация: 01.03.2018
Сообщений: 3
|
|
02.03.2018, 09:42 [ТС] | 3 |
Со слов преподавателя, программа должна перехватить int 27h.
Можете подсказать, пожалуйста, как при сканировании MCB определить, что есть резидентные программы
0
|
Заблокирован
|
|
02.03.2018, 10:46 | 4 |
honeyshi,
просто предположение, сразу после запуска DOS посмотри, ЧТО находится по адресу 00:9Ch (27h*4), наверное, нули? Установи какую-нибудь программу резидентом и снова посмотри содержимое 00:9Ch ─ Изменилось ли оно?
0
|
Эксперт Hardware
|
||||||
02.03.2018, 12:07 | 5 | |||||
..неувязочка! Ты уж определись с условием.
Если со-слов препода, то твоя программа будет отслеживать только те резиденты, которые запускаются после тебя, а не до... Если-же тебе нужно отслеживать присутствие резидентов в памяти ДО твоего запуска, то задача усложняется в разы. По сути, нужно будет написать маленький антивирь, который будет сканить занятые блоки памяти через MCB (фишка не документирована). Вот небольшая вводная часть на эту тему... --------------------------------- Теперь скачай отладчик (лучше "AVPUtil"), и прогони под ним такой код.. Он сканирует цепочку MCB, пока не встретит пустой блок с маркером(Z). Переходи в окно дампа памяти по [F6], и выставляй там значение регистра(ES). Увидишь много инфы, от которой и будешь отталкиваться в своей программе.
С поиском именно резидентов в памяти дела обстоят чуть сложней... Нужно выделить какую-нибудь сигнатуру и искать её в заданном промежутке памяти (адрес и размер у тебя есть в записях MCB). Это может быть последовательность INT-2Fh [CD 2F], IRET или другая часто/встречающаяся в резидентах сигнатура. Перехват прерываний не может служить сигнатурой, т.к. остаётся в нерезидентной части программы. А вот восстановление векторов - вполне возможно (если резидент писал не нуб, и предусмотрел в нём выгрузку из памяти). Но и в этом случае нет никакой гарантии, что ты нарвёшься именно на резидент, а не на обычную программу. Можешь пошариться в исходниках досовских вирей, или антивирей. Но что-то мне подсказывает, что тебе нужно просто отследить перехват 27-го инта, и тупо блокировать запуск резидентов, запущенных после тебя. Какого курса это задачка???
3
|
0 / 0 / 0
Регистрация: 01.03.2018
Сообщений: 3
|
|
02.03.2018, 19:32 [ТС] | 6 |
Скорее всего, именно это, потому что то, что вы написали, выглядит слишком сложным, а мне сказали, что задача простая. Несколько раз уточняла условие задачи, мне то одно говорили, то другое. Наверное, только int 27h отследить, но все равно не знаю как это делать.
Первого
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
02.03.2018, 22:22 | 7 |
Открою небольшой секрет: программа может стать резидентной не только через
int 27h . Есть ещё как минимум ah=31h/int 21h , а ещё можно и через int 20h /ah=4Ch/int 21h /ah=0/int 21h умудриться стать резидентным (пример раз, пример два).Вообще, если задача звучит как: "TSR -программа должна распечатывать те TSR -программы, у которых не освобождена память Environment", то можно сделать так. [Сразу скажу, что это не самый банальный способ...] Никаких int 27h и пр. не перехватывать, а тупо висеть на таймере (int 1Ch ) и каждый раз сканировать память (MCB-блоки, см. пост R71MT).А теперь, внимание, фокус! Нам же нужно найти Environment-блок, верно? Значит, прочёсывая MCB-блоки, мы берём во внимание только те, которые содержат слово по смещению [1] (в MCB-блоке), где записано PSP владельца, значение больше 8 (т.е. свободные блоки нас не интересуют, DOS, т.е. значения 6, 7, 8 – тоже). Это значение сохраняем (оно нам ещё будет нужно). В начале следующего параграфа (т.е. не в самом MCB-блоке, а уже в реально выделенной памяти... ну или по смещению MCB:[10h]) ищем строку COMSPEC= . Если находим, то берём сохранённый чуть выше PSP-сегмент владельца. Читаем из этого сегмента слово по смещению [2Ch] (т.е. PSP:[2Ch]). Если он совпадает с сегментом, в котором была найдена строка COMSPEC= (т.е. равно MCB+1), значит это прога-владелец.Теперь как понять – резидент это или нет? ИМХО, всё, что не является текущей запущенной прогой и его предком – резидент PSP текущей проги можно получить функцией ah=62h/int 21h (результат в BX), при этом InDOS-флаг можно не проверять, о чём говорит как минимум RBIL. Далее читаем слово по адресу BX:[16h] – это PSP родителя. И ищём по кругу (снова читаем BX:[16h]), пока BX не перестанет изменяться (у корневого предка PSP родителя = своему PSP).Т.е. можно сначала составлять (в обработчике таймера int 1Ch ) список запущенных прог (цепочку PSP-сегментов), зарезервировав под это изначально, скажем, 128 байт (больше 64 прог, запускающих друг друга, вряд ли вы встретите когда-либо в жизни), а потом находя владельца Environment-блока (это тот цикл, где я писал про COMSPEC= ), искать его в этом списке. Не нашли – значит резидент, не освободивший Environment Этот метод, конечно, не найдёт владельца "бесхозных" Environment'ов (хотя я тут вообще вариантов не знаю), но на этапе поиска строки COMSPEC= , если мы не нашли прогу-владельца (т.е. слово по адресу PSP:[2Ch] не равно сегменту этой строки), значит это с большой вероятностью чей-то бесхозный блок, о чём тоже можно сообщать. Кстати, в самом Environment'е хранится путь к проге-владельцу. Да и в MCB тоже есть область, где пишется название проги.Добавлено через 5 минут Да, и самое главное: так мы будем находить ВСЕ резиденты, а не только запущенные после нашей проги
2
|
Эксперт Hardware
|
|
03.03.2018, 13:27 | 8 |
Если так, то нужно будет перехватить 2-прерывания: 27h и 0Ch (таймер).
Защиту от повторной загрузки можно организовать через флаг, который нужно будет сохранить или где-нибудь в системной области, или-же в каком-нибудь порту. Хранить хлаг внутри своей памяти нельзя, т.к. при сл.запуске система может выделить другой блок памяти. INT-2Fh не подходит, в силу громоздкости организации. Выгрузку своего тела из памяти организуем через правку записи в MCB (нуль в поле PID ).
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||
03.03.2018, 14:32 | 9 | |||||
Ой, да ладно, чего там громоздкого?
Это ненадёжный вариант...
1
|
Эксперт Hardware
|
|
03.03.2018, 17:26 | 10 |
попробуй - не работает. Проще флаг установить, что и делают вирусы
что делает int-2fh??? точно это-же, сохраняет флаг по адресу 200h, и потом проверяет его... Ручками сделать проще, и освободить память через MCB. Лень шоркаться, ато-бы можно было накатать вирь. Ну дефачки помочь сам Бог велел помочь, (если она девачка)
1
|
Эксперт Hardware
|
|
04.03.2018, 01:16 | 12 |
Jin X, пишешь флаг в компорт, он будет там хранится, пока не перезапишешь.
При сл.запуске проверяешь порт, если есть запись, значит ты в памяти -- для резидентов самое то.., без прерываний. Добавлено через 3 минуты кстати, присутствие порта не обязательно
1
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||||||
04.03.2018, 04:32 | 13 | |||||
R71MT, я не знаю чего вы так мучаетесь (как первый раз прям), я всегда делаю резиденты вот таким вот нехитрым способом:
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
04.03.2018, 08:09 | 14 |
Kukuxumushu, ага, а потом кто-нибудь перехватывает то же прерывание, и твой резидент сам себя уже не найдёт.
2
|
04.03.2018, 08:09 | |
04.03.2018, 08:09 | |
Помогаю со студенческими работами здесь
14
Часы в псевдографике (TSR) Последний запущенный процесс (TSR) TSR, количество нажатий на клавиши TSR - запрет удаления файлов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |