Робота зроблена в 2000 році

Захист резидентної програми від повторної установки - Курсовий Проект, розділ Програмування - 2000 рік - Системи програмування та операційні системи Захист Резидентної Програми Від Повторної Установки. Як правило, У Секції Ін.

Захист резидентної програми від повторного встановлення. Як правило, в секції ініціалізації завантажуються вектори переривань, через які активізуватиметься програма. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми із залишенням у пам'яті її резидентної частини.

Якщо програму запустити з клавіатури повторно, у пам'ять буде завантажено і залишиться резидентною її друга копія. Це погано не тільки тому, що марно витрачається пам'ять, неприємнішим є вторинний перехоплення тих же векторів. Якщо резидентна програма після її активізації не звертається до старого вмісту перехоплених нею векторів, друга копія повністю позбавить першу працездатності, і тоді повторне завантаження призведе тільки до витрачання пам'яті.

У багатьох випадках таке повторне виконання порушить правильну роботу програми. Тому обов'язковим елементом будь-якої резидентної програми є процедура захисту від повторного завантаження, або, як кажуть, установки. Найбільш поширеним методом захисту резидентної програми від повторної установки є використання переривання 2Fh спеціально призначеного для зв'язку з резидентними програмами. При виклику цього переривання у регістрі АН задається номер функції від 00h до FFh, а регістрі AL - номер підфункції у тому діапазоні. 00h - 7Fh зарезервовано для DOSWindows 0B8h - 0BFh зарезервовано для мережевих функцій 0C0h - 0FFh відводиться для програм.

Для того щобрезидентна програма могла відгукнутися виклик переривання int 2Fh, у ній повинен бути обробник цього переривання. Фактично всі резидентні програми, як системні, так і прикладні, мають такі обробники, через які здійснюється не тільки перевірка на повторну установку, а й взагалі зв'язок з резидентною програмою зміна режиму її роботи або отримання не в транзитну програму якихось параметрів.

Завдання дії, яке належить виконати обробнику переривання 2Fh конкретної резидентної програми, здійснюється за допомогою номера підфункції, що поміщається перед викликом переривання в регістр AL Таким чином, обробник переривання 2Fh резидентної програми повинен, перш за все, перевірити номер функції в регістрі АН при виявленні своєї функції обробник аналізує вміст регістру AL і виконує затребувані дії, після чого командою iret передасть управління програмі, що викликала його.

Звичайно, для комунікації з резидентною програмою має бути встановлений певний інтерфейс. Зазвичай при перевірці на повторне встановлення резидентна програма, якщо вона вже знаходиться в пам'яті, повертає в регістрі AL значення FFh, яке є ознакою заборони вторинного завантаження. Іноді для більшої надійності ідентифікації своєї функції резидентна програма, крім значення FFh у регістрі AL, повертає ще якісь заздалегідь обумовлені коди в інших регістрах.

Часто через додаткові регістри нададуть символьну інформацію, наприклад, ім'я програми. У цьому випадку, якщо програма, що викликала, з ім'ям DUMP.COM тобто. друга копія резидентної програми, яка з'ясовує, чи можна їй залишитися резидентною в пам'яті отримує після виклику int 2Fh в регістрі AL значення FFh, а в регістрах СХ і DX символьні коди DU і МР, вона може бути впевнена,що її перша копія вже знаходиться у пам'яті.

Якщо ж у регістрі AL повернувся код FFh, а регістрах СХ і DX -коди, наприклад, ОК і RB, це, швидше за все, означає, що закріплена за нашою програмою функція мультиплексного переривання вусі використовується іншою резидентною програмою. І тут варто змінити функцію, ніж порушувати конфліктних ситуацій. До резидентної частини слід включити обробник переривання 2Fh. Його розташування в межах тексту програми не має особливого значення, ми помістили його на початку резидентної частини.

Секція ініціалізації зазнала великих змін. Вона повинна починатися з виклику переривання 2Fh з відповідних функцій для перевірки повторної установки. Якщо перша копія програми вже завантажена, поточну програму слід завершити не функцією 3th завершити та залишити у пам'яті, а звичайною функцією завершення 4Ch. Якщо нашої програми в пам'яті немає, то секції ініціалізації, крім заповнення її робочого вектора, у разі 03h, слід також встановити наш обробник мультиплексного переривання.

Серед функцій мультиплексного переривання, призначених для прикладних програм, ми довільно вибрали для нашої програми функцію F1h, а для перевірки повторного встановлення підфункцію 00h. Резидентний обробник переривання 2Fh, включений до нашої програми, перевіряє номери функції та підфункції і при виявленні будь-яких інших кодів передає керування наступному обробнику цього переривання. Якщо ж викликана функція F1h з підфункцією 00h, обробник встановлює в регістрі AL значення FFh я вже завантажений і повертає управління в програму, що викликала, командою iret. Секція ініціалізації починається з перевірки на повторне встановлення. Після завантаження в регістр АН номера функції F1h, а регістр AL - номерапідфункції 00h викликається переривання 2Fh. Після повернення з переривання аналізується вміст регістру AL Якщо обробник повернув значення FFh, програма повинна завершитись без залишення в пам'яті.

Ці дії виконуються за міткою installed.

Якщо повернено інше значення, ініціалізація продовжується для надійності варто перевірити, чи повернуто саме 0. Зберігається старий вміст вектора 2Fh, встановлюється наш обробник цього переривання, після чого виконуються всі дії по установці, передбачені в старому варіанті програми динамічного дампа. При переході на позначку installed на екран виводиться повідомлення про неможливість повторної установки та виконується функція завершення 4Сh з кодом повернення 01h. Останнє, звісно, ​​має символічний характер, оскільки цей код надалі не аналізується. 2.3.