Защита на резидентна програма от повторно инсталиране

Извършена работа през 2000 г

Защита на резидентната програма от преинсталация - Курсов проект, секция Програмиране, - 2000 - Системи за програмиране и операционни системи Защита на резидентната програма от преинсталация. По правило в раздел In.

Защита на резидентната програма от повторно инсталиране. Като правило векторите за прекъсване се зареждат в секцията за инициализация, чрез която ще се активира програмата. Последните редове на секцията за инициализация извикват DOS функцията 31h, която прекратява програмата, като оставя нейната резидентна част в паметта.

Ако програмата се рестартира от клавиатурата, нейното второ копие ще бъде заредено в паметта и ще остане резидентно. Това не само е лошо, защото губи памет, но по-неприятно е вторичното прихващане на същите вектори. Ако резидентната програма след нейното активиране няма достъп до старото съдържание на прихванатите от нея вектори, тогава второто копие напълно ще лиши първото от неговата функционалност и след това презареждането само ще загуби памет.

В много случаи такова многократно изпълнение ще наруши правилната работа на програмата. Следователно задължителен елемент на всяка резидентна програма е процедурата за защита от презареждане или, както се казва, инсталиране. Най-често срещаният метод за защита на резидентна програма от повторно инсталиране е използването на прекъсване 2Fh, което е специално проектирано да комуникира с резидентни програми. Когато се извика това прекъсване, номерът на функцията от 00h до FFh се задава в регистъра AH, а номерът на подфункцията в същия диапазон се задава в регистъра AL. 00h - 7Fh запазено за DOSWindows 0B8h - 0BFh запазено за мрежови функции 0C0h - 0FFh запазено за програми.

За дарезидентната програма може да отговори на повикването за прекъсване int 2Fh, тя трябва да има манипулатор на прекъсване. Всъщност всички резидентни програми, както системни, така и приложни, имат такива манипулатори, чрез които се извършва не само проверка за преинсталиране, но и обща комуникация с резидентната програма, промяна на режима й на работа или получаване на някои параметри от не-транзитна програма.

Присвояването на действието, което трябва да се извърши от 2FH обработващия прекъсвач на определена резидентска програма, се извършва с помощта на номера на подфункцията, поставен в регистъра на AL, преди да извика прекъсването. По този начин, 2FH обработващият прекъсвач на програмата на резидента трябва първо да провери функционалния номер в регистъра на AH. Когато функцията му е намерена, обработващият анализи на командата за контрол на AL.

Естествено трябва да се инсталира някакъв интерфейс за комуникация с резидентната програма. Обикновено при проверка за преинсталация резидентната програма, ако вече е в паметта, връща стойността FFh в AL регистъра, което е знак, че вторичното зареждане е забранено. Понякога, за по-голяма надеждност на идентифициране на неговата функция, резидентната програма, в допълнение към стойността FFh в регистъра AL, връща някои други предварително определени кодове в други регистри.

Често символна информация, като името на програма, ще бъде предадена през допълнителни регистри. В този случай, ако извикващата програма с име DUMP.COM, т.е. второто копие на резидентната програма, което установява дали може да остане резидентно в паметта, получава стойността FFh в регистъра AL след извикване на int 2Fh и символните кодове DU и MP в регистрите CX и DX, може да бъде сигурно, чече първото му копие вече е в паметта.

Ако кодът FFh се връща в регистъра AL и кодовете, например OK и RB, се връщат в регистрите CX и DX, това най-вероятно означава, че функцията за прекъсване на мултиплексното ухо, присвоена на нашата програма, се използва от друга резидентна програма. В този случай си струва да промените функцията, за да не провокирате конфликтни ситуации. Обработчикът на прекъсване 2Fh трябва да бъде включен в резидентната част. Местоположението му в текста на програмата няма особено значение; ние сме го поставили в началото на резидентната част.

Разделът за инициализация претърпя големи промени. Трябва да започне с извикване на прекъсване 2Fh със съответната функция за проверка за нулиране. Ако първото копие на програмата вече е заредено, текущата програма не трябва да бъде прекратена с 3-ти край и оставена в паметта, а с нормалната 4Ch функция за край. Ако нашата програма не е в паметта, тогава в секцията за инициализация, в допълнение към попълването на нейния работен вектор, в този случай 03h, трябва да бъде инсталиран и нашият манипулатор на мултиплексни прекъсвания.

Сред функциите за мултиплексно прекъсване, предназначени за приложни програми, произволно сме избрали функцията F1h за нашата програма и подфункцията 00h за теста за нулиране. Резидентният манипулатор на прекъсване 2Fh, включен в нашата програма, проверява номерата на функциите и подфункциите и, ако бъдат намерени други кодове, прехвърля контрола на следващия манипулатор за това прекъсване. Ако функцията F1h се извика с подфункцията 00h, манипулаторът задава AL регистъра на стойността FFh i вече е зареден и връща контрола на извикващата програма с командата iret. Разделът за инициализация започва с проверка за преинсталиране. След зареждане на номера на функцията F1h в регистъра AH и числата в регистъра ALподфункция 00h, извиква се прекъсване 2Fh. След като прекъсването се върне, съдържанието на регистъра AL се анализира.Ако манипулаторът върне стойността FFh, програмата трябва да приключи, без да напуска паметта.

Тези действия се извършват върху инсталирания етикет.

Ако се върне различна стойност, инициализацията продължава да е безопасна, заслужаваше си да проверите дали е върната 0. Старото съдържание на вектора 2Fh се запазва, нашият манипулатор на прекъсвания е зададен и след това се изпълняват всички стъпки за настройка, предоставени в старата версия на програмата за изхвърляне на живо. Когато превключите към инсталирания етикет, на екрана се показва съобщение за невъзможност за преинсталиране и функцията за прекратяване на 4Сh се изпълнява с код за връщане 01h. Последното, разбира се, има символичен характер, тъй като този код не се анализира по-нататък. 2.3.