Как написать резидентную программу

При разработке резидентной программы необходимо решить несколько связанных инженерных задач.

Резидентная программа обычно состоит из двух связанных частей — нерезидентной части и резидентной части.

Нерезидентная часть получает управление при запуске программы, при необходимости — анализирует параметры запуска и настраивает резидентную часть на конкретные условия работы, выполняет перехват и настройку необходимых векторов прерываний, и обычно с помощью системной функции 31h прерывания 21h оставляет резидентную часть в памяти, возвращая управление операционной системе.

Резидентная часть отвечает за реализацию полезного функционала резидентной программы. Для разрабатываемой программы это управление индикаторами клавиатуры Num Lock, Caps Lock, Scroll Lock. Поскольку управление индикаторами в соответствии с заданием требуется делать с клавиатуры ПК, то резидентная часть должна содержать обработчик прерывания клавиатуры 09h.

В соответствии с заданием требуется реализовать защиту от повторной загрузки резидентной программы. Это можно реализовать с помощью использование специального прерывания — 2Fh — называемого также мультиплексным, специально предназначенного для организации взаимодействия с резидентными программами. Проверка нахождения в памяти резидентной части осуществляется по схеме «запрос-отклик»: нерезидентная часть заполняет регистр AX (в регистр AH помещается номер функции, причем номера 00h-0BFh зарезервированы для MS DOS, а номера 0C0h-0FFh предоставляются для прикладных программ; в регистр AL помещается номер подфункции) и вызывает прерывание 2Fh. Если резидентная часть уже установлена и ее повторная установка не требуется, необходимо вернуть в регистре AL сигнальное значение 0FFh. Таким образом, резидентная часть должна в своем составе иметь также обработчик прерывания 2Fh, а нерезидентная часть должна для проверки наличия резидентной программы в памяти вызывать это прерывание и анализировать результат.

Как сделать резидентские прокси своими руками за 2 минуты при помощи iProxy.online и BlueStacks

Кроме этого, для реализации требования о включении и выключении резидентной программы, наиболее целесообразным является введение в области данных резидентной части программы специального байт-маркера «активности» резидентной части. При «неактивном» состоянии программы она не оказывает никакого влияния на работу компьютера, а при «активном» состоянии выполняет заданный функционал.

Поскольку резидентная программа должна занимать минимум памяти, выбрано решение, при котором программа компилируется в COM файл.

Общая структура программы приведена на рисунке.

Разработка алгоритма резидентной программы

В приложении А представлена блок-схема работы инициализирующей части программы. В приложении Б — блок-схема работы прерывания 2FH. В приложении В — блок-схема работы прерывания 09H.

При запуске программы управление передается нерезидентной части программы. Нерезидентная часть выполняет инициализацию программы следующим образом:

КАРЬЕРА ХАКЕРА. Книга 1 — Основы MASM32. Глава 4 — Резидентная программа

1. Проверяет, не установлена ли уже резидентная программа, помещая в регистр AX «магическое значение» 0CDBAh (функция 0CDh, подфункция 0BAh), выполняя программное прерывание 2Fh и проверяя возврат — если программа уже установлена, в регистре AL при возврате из прерывания должно оказаться сигнальное значение 0FFh;

Читайте также:
Программа которая закрывает рекламу

2. Если программа уже установлена, то производится вывод сообщения «Программа уже установлена!» и немедленное завершение программы без оставления резидентной части в памяти;

3. Если программа еще не установлена (значение в регистре AL отличается от 0FFh), производится перехват используемых векторов прерываний 09h и 2Fh с сохранением «старых» значений этих векторов в области данных резидентной части программы;

4. Производится вывод сообщения об успешной установке резидентной части и резидентное завершение программы вызовом функции 31h системного прерывания 21h. Для того, чтобы резидентная часть программы занимала в памяти как можно меньше места, производится вычисление минимального необходимого объема памяти, занимаемого только резидентной частью. Память, занимаемая нерезидентной частью (инициализирующий код), для работы резидентной части не нужна и возвращается системе.

Резидентная часть программы получает управление посредством программных или аппаратных прерываний. Используются два прерывания — 09h и 2Fh.

Обработчик мультиплексного прерывания 2Fh резидентной части программы выполняет следующие действия:

1. Проверяет значение в регистре AX на соответствие значению 0CDBAh. Если значение совпало, это свидетельствует о том, что выполнен еще один запуск программы, и инициализирующая часть проверяет, не установлена ли уже резидентная программа. В этом случае следует в регистр AL записать сигнальное значение 0FFh и немедленно завершить обработку прерывания и вернуть управление вызывающей программе. В противном случае, следует передать управление дальше «по цепочке», используя сохраненный обработчик этого прерывания.

Обработчик прерывания 09h (клавиатуры) получает управление при каждом нажатии клавиши на клавиатуре. Особенностью этого обработчика является то, что он получает управление дважды: первый раз при нажатии клавиши, второй раз — при отпускании клавиши. Для правильной обработки нажатий клавиш в программе организован специальный байт-маркер — «флажок», который «взводится» при нажатии клавиши и «сбрасывается» при отпускании клавиши. Состояние этого флажка позволяет различить нажатия и отпускания клавиш. Обработчик прерывания 09h выполняет следующие действия:

1. Проверяет состояние «активности» резидентной части. Если резидентная часть не активна (выключена), управление передается сохраненному обработчику прерывания 09h для «обычной» обработки нажатий клавиатуры.

2. Если резидентная часть «активна», производится проверка — нажата клавиша или отпущена. Если клавиша нажата, производится сдвиг горящей лампочки клавиатуры на 1 (по кольцу) и установка состояния лампочек. Сдвиг лампочки и установка состояния лампочек организованы как отдельные подпрограммы (процедуры).

3. Затем управление передается сохраненному обработчику прерывания 09h клавиатуры — это позволяет всем прикладным программам нормально получать и обрабатывать нажатия клавиш. Вызов прерывания эмулируется последовательностью инструкций pushf и call.

4. В конце обработчика анализируется факт одновременного нажатия «горячих клавиш» Left Ctrl + Left Shift и включается или отключается «активность» резидентной части программы. При неактивной (выключенной) резидентной части она не оказывает влияния на работу компьютера.

Читайте также:
Как работает программа cinema

Источник: studbooks.net

Как написать резидентную программу

Написать резидентную программу для вывода текущего времени, после второго запуска — выгружается из памяти

Давайте слепим программу (Есть всё что надо)
Так как я в ассемблере не очень, прошу помощи слепить эту инфу (написана ниже) в одну программу. Я б и денежку заплатил, но меня уже 2 раза кинули за месяц с этой прогой. Жду помощи понимающих людей.

Вот задание:
Написать резидентную программу, которая после первого запуска становится резидентной и выводит текущее время, а после второго — выгружаем резидентную часть из памяти

Нашел я как вивести текущее время (системное прерывание, мне надо такое):

out_h proc ;Выводит на экран текущий час. mov al,ch call OutInt ret out_h endp out_m proc ;Выводит текущие минуты. mov al,cl call OutInt ret out_m endp out_s proc ;Выводит секунды. mov al,dh call OutInt ret out_s endp out_cln proc ;Выводит двоеточие. mov ah,2 mov dl,’:’ int 21h ret out_cln endp
Вот шаблон резидентной программы:
%Title “Шаблон COM — резидента” Ideal Model tiny Codeseg Org 100h ;Установим IP на адрес после PSP Proc resident jmp init ;Переход на секцию инициализации ;Данные резидентной секции программы … Entry: ;Начало программного кода резидента (точка входа после активизации резидента) … Endp resident ;Секция инициализации резидента Proc init … mov ah,27h ;Можно опустить lea dx,[cs:init] ;DX — адрес первого байта за резидентной частью программы, ;CS – на начало PSP Int 27h ;Оставить резидентной Endp init End resident ;Конец программы/точка входа

И собственно выгpузка чеpез int 21h/ah=49h.
Разумна в случае, если pезидент выгpужается из повтоpно
запускаемой его копии. Восстанавливаются вектоpы, затем
освобождается блок памяти, где обитает pезидент.

—————- ID dw 1234h Old_08h dd ? . Unload: mov ax,3508h ; пyсть это бyдет вектоp 8 int 21h cmp word ptr es:[offset ID],1234 jne Fuk ; вектоp 8 пеpехвачен дpyгим ; TSR mov dx,word ptr es:[offset Old_08h] mov ds,word ptr es:[offset Old_08h+2] mov ax,2508h int 21h ; восстановим стаpый вектоp mov ah,49h ; и освободим память, int 21h ; занимаемyю pезидентом. . Fuk: ; выгpyзка обычным способом ; невозможна

______________
1) Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.

2) Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Читайте также:
Как называется программа для часов фитнес браслета

Последний раз редактировалось Serge_Bliznykov; 31.12.2012 в 19:48 .

Источник: www.programmersforum.ru

ПРИМЕРЫ РЕЗИДЕНТНЫХ ПРОГРАММ

Написать резидентную программу, которая перехватывает прерывание int 5 (Print Screen) и вместо распечатки экрана на каждое нажатие клавиши PrtSc изменяет цвет рамки экрана. Рамка должна принимать циклически один из 16 цветов. Программа не должна позволять загрузить себя повторно. При попытке повторной загрузки программа должна выводить предупреждающее сообщение.

· Передавать управление старому обработчику прерывания не надо.

· Для окрашивания рамки экрана следует использовать подфункцию 01h функции 10h прерывания 10h (ax = 1001h, bx = цвет).

· В начале программы следует не забыть записать в DS значение CS.

· Для проверки наличия резидентной программы в памяти использовать функцию FFh прерывания 2Fh.

Assume CS: Code, DS: Code

resprog proc far

msg db ‘Драйвер уже установлен$’

; Новый обработчик прерывания 2Fh

new_int2Fh proc far

jmp dword ptr cs:old_int2Fh_off

installed: mov ax,0ffh

; Новый обработчик прерывания 5

new_int5 proc far

ressize equ $-resprog ; Размер в байтах резидентной части

; Проверка раличия резидентной программы в памяти

jnz first_start ; Не установлена

lea dx,msg ; Вывод сообщения о том,

mov ah,9 ; что драйвер уже загружен

first_start: mov ax,2505h ; Функция 25h, вектор 5

int 21h ; Запись нового вектора 5

mov ax,352fh ; Сохранение старого вектора прерывания 2Fh

lea dx,new_int2Fh ; Запись нового вектора прерывания 2Fh

; Завершение программы с оставлением резидентной части в памяти

Написать резидентную программу, записывающую содержимое экрана в символьном режиме в файл. Программа должна анализировать флаг активности DOS и не должна допускать повторной загрузки в память. По ключу /u программа должна выгружаться из памяти с освобождением занимаемого ей места. Замечание: приведенная ниже программа нормально работает лишь под DOS до версии 5.0, так как в более поздних версиях иначе происходит работа с клавиатурой.

Assume CS: Code, DS: Code

resprog proc far

mov ds,ax ; DS = CS

jmp init ; Переход на инициализирующую секцию

num dw 0 ; Количество сброшенных экранов

old_int8_off dw ? ; Адрес старого обработчика

old_int8_seg dw ? ; прерывания таймера 8h

old_int5_off dw ? ; Адрес старого обработчика

old_int5_seg dw ? ; прерывания 5h

old_int2F_off dw ? ; Адрес старого обработчика

old_int2F_seg dw ? ; мультиплексного прерывания 2Fh

adr_psp dw ? ; Адрес PSP

vbuf dw 0b000h ; Сегментный адрес видеобуфера

handle dw ? ; Дескриптор файла

buf db 2050 dup(0) ; Буфер для данных экрана

mes db ‘Disk error$’

filename db ‘filescr Спецификация вых. файла

iniflag db 0 ; Флаг запроса на вывод экрана в файл

outflag db 0 ; Флаг начала вывода в файл

_crit dd ? ; Указатель на флаг активности DOS

; Новый обработчик прерывания 2Fh

new_int2F proc far

jmp dword ptr cs:old_int2F_off ; Переход на старый обработчик 2Fh

installed: mov ax,0ffh ; «Программа в памяти»

; Новый обработчик прерывания 1ch

Источник: megaobuchalka.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru