ЗАБЕЗПЕЧЕННЯ ЕКСПЛУАТАЦІЙНОЇ БЕЗПЕКИ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
2.1. МЕТОДИ І ЗАСОБИ ЗАХИСТУ ПРОГРАМ ВІД КОМП'ЮТЕРНИХ ВІРУСІВ
2.1.1. Загальна характеристика і класифікація комп'ютерних вірусів
Під комп'ютерним вірусом (або просто вірусом) розуміється автономно функціонуюча програма, що володіє здібністю до самостійного впровадження в тіла інших програм і подальшого самовідтворення і саморозповсюдження в інформаційно-обчислювальних мережах і окремих ЕОМ. Попередниками вірусів прийнято вважати так звані троянські програми, тіла яких містять приховані послідовності команд (модулі), що виконують дії, що завдають шкоди користувачам. Найбільш поширеним різновидом троянських програм є широко відомі програми масового застосування (редактори, ігри, транслятори і т.д.), в які вбудовані так звані "логічні бомби", що спрацьовують після настання деякої події. Слід зазначити, що троянські програми не є такими, що саморозмножуються.
Принципова відмінність вірусу від троянської програми полягає в тому, що вірус після його активізації існує самостійно (автономно) і в процесі свого функціонування заражає (інфікує) програми шляхом включення (імплантації) в них свого тексту. Таким чином, комп'ютерний вірус можна розглядати як своєрідний "генератор троянських програм". Програми, заражені вірусом, називаються вірусоносіями.
Зараження програми, як правило, виконується таким чином, щоб вірус отримав управління раніше самої програми. Для цього він або вбудовується в початок програми, або імплантується в її тіло так, що першою командою зараженої програми є безумовний перехід на комп'ютерний вірус, текст якої закінчується аналогічною командою безумовного переходу на команду вірусоносія, що була першою до зараження. Отримавши управління, вірус вибирає наступний файл, заражає його, можливо, виконує які-небудь інші дії, після чого віддає управління вірусоносію.
"Первинне" зараження відбувається в процесі надходження інфікованих програм з пам'яті однієї машини в пам'ять іншої, причому як засіб переміщення цих програм можуть використовуватися як магнітні носії (дискети), так і канали обчислювальних мереж. Віруси, що використовують для розмноження мережеві засоби, прийнято називати мережевими. Цикл життя вірусу зазвичай включає наступні періоди: впровадження, інкубаційний, реплікації (саморозмноження) і прояву. Протягом інкубаційного періоду вірус пасивний, що ускладнює задачу його пошуку і нейтралізації. На етапі прояву вірус виконує властиві йому цільові функції, наприклад незворотну корекцію інформації в комп'ютері або на магнітних носіях.
Фізична структура комп'ютерного вірусу достатньо проста. Він складається з голови і, можливо, хвоста. Під головою вірусу розуміється його компонента, що одержує управління першою. Хвіст - це частина вірусу, розташована в тексті зараженої програми окремо від голови. Віруси, що складаються з однієї голови, називають несегментованими, тоді як віруси, що містять голову і хвіст, - сегментованими.
Найбільш істотні ознаки комп'ютерних вірусів дозволяють провести наступну їх класифікацію.
По режиму функціонування:
резидентні віруси - віруси, які після активізації постійно знаходяться в оперативній пам'яті ком'ютера і контролюють доступ до його ресурсів;
транзитні віруси - віруси, які виконуються тільки у момент запуску зараженої програми.
По об'єкту впровадження:
файлові віруси - віруси, що заражають файли з програмами;
завантажувальні (бутові) віруси - віруси, що заражають програми, які зберігаються в системних областях дисків.
У свою чергу файлові віруси діляться на віруси, що заражають:
виконувані файли;
командні файли і файли конфігурації;
файли, створені на макромовах програмування, або файли, що містять макроси (макровіруси);
файли з драйверами пристроїв;
файли з бібліотеками вихідних, об'єктних, завантажувальних і оверлейних модулів, бібліотеками динамічної компоновки і т.п.
Завантажувальні віруси діляться на віруси, що заражають:
системний завантажувач, розташований в завантажувальному секторі дискет і логічних дисків;
позасистемний завантажувач, розташований в завантажувальному секторі жорстких дисків.
По ступеню і способу маскування:
віруси, що не використовують засобів маскування;
stealth-віруси - віруси, що намагаються бути невидимими на основі контролю доступу до заражених елементів даних;
віруси-мутанти (MtE-віруси) - віруси, що містять в собі алгоритми шифрування, що забезпечують відмінність різних копій вірусу.
MtE-віруси діляться на:
звичайні віруси-мутанти, в різних копіях яких розрізняються тільки зашифровані тіла, а дешифровщики співпадають;
поліморфні віруси, в різних копіях яких розрізняються не тільки зашифровані тіла, але і їх дешифровщики.
Найбільш поширені типи вірусів характеризуються наступними основними особливостями.
Файловий транзитний вірус цілком розміщується у виконуваному файлі, у зв'язку з чим він активізується тільки у разі активізації вірусоносія, а після виконання необхідних дій повертає управління самій програмі. При цьому вибір чергового файлу для зараження здійснюється вірусом за допомогою пошуку за каталогом. Файловий резидентний вірус відрізняється від нерезидентного логічною структурою і загальним алгоритмом функціонування. Резидентний вірус складається з так званого інсталятора та програм обробки переривань. Інсталятор отримує управління при активізації вірусоносія та інфікує оперативну пам'ять шляхом розміщення в ній керуючої частини вірусу і заміни адрес в елементах вектора переривань на адреси своїх програм, що оброблюють ці переривання. На так званій фазі стеження, наступній за описаною фазою інсталяції, при виникненні якого-небудь переривання управління отримує відповідна підпрограма вірусу. У зв'язку з істотно більш універсальною в порівнянні з нерезидентними вірусами загальною схемою функціонування, резідентні віруси можуть реалізовувати різноманітні способи інфікування.
Найбільш поширеними способами є інфікування програм, що запускаються, а також файлів при їх відкритті або читанні. Відмінною особливістю останніх є інфікування завантажувального сектора (бут-сектора) магнітного носія. Голова бутового вірусу завжди знаходиться в бут-секторі (єдиному для гнучких дисків і одному з двох - для жорстких), а хвіст - в будь-якій іншій області носія. Найбільш безпечним для вірусу способом вважається розміщення хвоста в так званих псевдозбійних кластерах, логічно виключених з числа доступних для використання.
Істотно, що хвіст бутового вірусу завжди містить копію оригінального (вихідного) бут-сектора. Механізм інфікування, що реалізовується бутовими вірусами, наприклад, при завантаженні MS DOS, такий. При завантаженні операційної системи з інфікованого диска вірус, завдяки своєму положенню на ньому (незалежно від того, з дискети або з вінчестера здійснюється завантаження), отримує управління і копіює себе в оперативну пам'ять. Потім він модифікує вектор переривань так чином, щоби переривання, які стосуються звертання до диска оброблялися власним обробником переривань вірусу, і запускає завантажувач операційної системи. Завдяки перехопленню переривань бутові віруси можуть реалізовувати такий же широкий набір способів інфікування і цільових функцій, як і файлові резидентні віруси.
Stealth-віруси користуються слабкою захищеністю деяких операційних систем і замінюють деякі їх компоненти (драйвери дисків, переривання) таким чином, що вірус стає невидимим (прозорим) для інших програм. Для цього замінюються функції DOS таким чином, що для зараженого файлу підставляються його оригінальна копія і зміст, яким вони були до зараження.
Поліморфні віруси містять алгоритм породження дешифровщиків (з розміром породжуваних дешифровщиків від 0 до 512 байтів) несхожих один на одного. При цьому в дешифровщиках можуть зустрічатися практично всі команди процесора Intel і навіть використовуватися деякі специфічні особливості його реального режими функціонування.
Макровіруси розповсюджуються під управлінням прикладних програм, що робить їх незалежними від операційної системи. Переважне число макровірусів функціонують під управлінням системи Microsoft Word for Windows. В той же час, відомі макровіруси, що працюють під управлінням таких прикладних програм як Microsoft Exel for Windows, Lotus Ami Pro, Lotus 1-2-3, Lotus Notes, в операційних системах фірм Microsoft і Apple.
Мережеві віруси, які також називають автономними реплікативними програмами, або, скорочено, реплікаторами, використовують для розмноження засоби мережевих операційних систем. Найпростіше реалізується розмноження в тих випадках, коли мережевими протоколами передбачено обмін програмами. Проте, розмноження можливе і в тих випадках, коли вказані протоколи орієнтовані тільки на обмін повідомленнями. Класичним прикладом реалізації процесу розмноження з використанням тільки стандартних засобів електронної пошти є реплікатор Моріса. Текст реплікатора передається від однієї ЕОМ до іншої як звичайне повідомлення, що поступово заповнює буфер, виділений в оперативній пам'яті ЕОМ-адресата. В результаті переповнення буфера, ініційованого передачею, адреса повернення в програму, що викликала програму прийому повідомлення, заміщається на адресу самого буфера, де в момент повернення вже знаходиться текст вірусу.
Тим самим вірус отримує управління і починає функціонувати на ЕОМ-адресаті.
"Лазівки", подібні описаній вище й обумовлені особливостями реалізації тих або інших функцій в програмному забезпеченні, є об'єктивною передумовою для створення і впровадження реплікаторів зловмисниками.
Ефекти, що викликаються вірусами в процесі реалізації ними цільових функцій, прийнято ділити на наступні групи:
спотворення інформації у файлах або таблиці розміщення файлів (FAT-таблиці), яке може призвести до руйнування файлової системи в цілому;
імітація збоїв апаратних засобів;
створення звукових і візуальних ефектів, включаючи, наприклад, відображення повідомлень, що вводять оператора в оману або утрудняють його роботу;
ініціація помилок в програмах користувачів або операційної системи.
Можливе також створення "вірусних черв'яків" - руйнуючих програм, які непомітно переміщуються між вузлами обчислювальної мережі, не завдаючи ніякої шкоди доти, доки не дістануться до цільового вузла. У ньому програма розташовується і перестає розмножуватися.
Оскільки в майбутньому слід чекати появи все більш і більш прихованих форм комп'ютерних вірусів, знищення осередків інфекції в локальних і глобальних мережах не стане простіше. Час комп'ютерних вірусів "загального призначення" йде в минуле.
2.1.2. Загальна характеристика засобів нейтралізації комп'ютерних вірусів
Найбільш поширеним засобом нейтралізації комп'ютерних вірусів є антивірусні програми (антивіруси). Антивіруси, виходячи з реалізованого в них підходу до виявлення і нейтралізації вірусів, прийнято ділити на наступні групи:
детектори;
фаги;
вакцини;
щеплення;
ревізори;
монітори.
Детектори забезпечують виявлення вірусів за допомогою перегляду виконуваних файлів і пошуку так званих сигнатур - стійких послідовностей байтів, наявних в тілах відомих вірусів. Наявність сигнатури в якому-небудь файлі свідчить про його зараження відповідним вірусом. Антивірус, що забезпечує можливість пошуку різних сигнатур, називають полідетектором.
Фаги виконують функції, властиві детекторам, але, крім того, "виліковують" інфіковані програми за допомогою "викушування" вірусів з їх тіл. За аналогією з полідетекторами, фаги, орієнтовані на нейтралізацію різних вірусів, називають поліфагамі.
На відміну від детекторів і фагів, вакцини за своїм принципом дії подібні до вірусів. Вакцина імплантується в програму, що захищається, і запам'ятовує ряд кількісних і структурних характеристик останньої. Якщо вакцинована програма не була до моменту вакцинації інфікованою, то при першому ж після зараження запуску відбудеться наступне. Активізація вірусоносія призведе до отримання управління вірусом, який, виконавши свої цільові функції, передасть управління вакцинованій програмі. У останній, у свою чергу, спочатку управління отримає вакцина, яка виконає перевірку відповідності характеристик, які вона запам'ятала, аналогічним характеристикам, отриманим на поточний момент. Якщо вказані набори характеристик не співпадають, то робиться висновок про зміну тексту вакцинованої програми вірусом. Характеристиками, використовуваними вакцинами, можуть бути довжина програми, її контрольна сума тощо.
Принцип дії щеплень заснований на врахуванні тієї обставини, що будь-який вірус, як правило, позначає програми, що інфікуються, якою-небудь ознакою з тим, щоб не виконувати їх повторне зараження. У іншому випадку мало б місце багатократне інфікування, що супроводжується істотним і тому таким, що легко виявляється збільшенням об'єму заражених програм. Щеплення, не вносячи ніяких інших змін в текст програми, що захищається, позначає її тією ж ознакою, що і вірус, який, таким чином, після активізації і перевірки наявності вказаної ознаки, вважає її інфікованою і "залишає у спокої".
Ревізори забезпечують стеження за станом файлової системи, використовуючи для цього підхід, аналогічний реалізованому у вакцинах. Програма-ревізор в процесі свого функціонування виконує стосовно кожного виконуваного файлу порівняння його поточних характеристик з аналогічними характеристиками, отриманими при попереднього перегляду файлів. Якщо при цьому виявляється, що, згідно наявної системної інформації, файл з моменту попереднього перегляду не оновлювався користувачем, а порівнювані набори характеристик не співпадають, то файл вважається інфікованим. Характеристики виконуваних файлів, що отримуються в ході чергового перегляду, запам'ятовуються в окремому файлі (файлах), у зв'язку з чим збільшення довжин виконуваних файлів, що має місце при вакцинації, в даному випадку не відбувається. Інша відмінність ревізорів від вакцин полягає в тому, що кожен перегляд виконуваних файлів ревізором вимагає його повторного запуску.
Монітор є резидентною програмою, що забезпечує перехоплення потенційно небезпечних переривань, характерних для вірусів із наступним запрошенням у користувача підтвердження на виконання операцій, наступних за перериванням. У разі заборони або відсутності підтвердження монітор блокує виконання програми користувача.
Антивіруси розглянутих типів істотно підвищують вірусозахищеність окремих ЕОМ і обчислювальних мереж в цілому, проте, у зв'язку з властивими їм обмеженнями, природно, не є панацеєю. У роботі приведені основні недоліки при використанні антивірусів.
У зв'язку з цим необхідна реалізація альтернативних підходів до нейтралізації вірусів: створення операційних систем, що володіють високою вірусозахищенністю в порівнянні з відомими, розробка апаратних засобів захисту від вірусів і дотримання технології захисту від вірусів.
2.1.3. Класифікація методів захисту від комп'ютерних вірусів
Проблему захисту від вірусів необхідно розглядати в загальному контексті проблеми захисту інформації від несанкціонованого доступу і технологічної і експлуатаційної безпеки ПЗ в цілому. Основний принцип, який повинен бути покладений в основу розробки технології захисту від вірусів, полягає в створенні багаторівневої розподіленої системи захисту, що включає:
регламентацію проведення робіт на ПЕОМ;
застосування програмних засобів;
використання спеціальних апаратних засобів.
При цьому кількість рівнів захисту залежить від цінності інформації, яка обробляється на ПЕОМ. Для захисту від комп'ютерних вірусів в даний час використовуються наступні методи.
Архівація. Полягає в копіюванні системних областей магнітних дисків і щоденному веденні архівів змінених файлів. Архівація є одним з основних методів захисту від вірусів. Решта методів захисту доповнює його, але не може замінити повністю.
Вхідний контроль. Перевірка всіх програм, що поступають, детекторами, а також перевірка довжин і контрольних сум програм, що поступають, на відповідність значенням, вказаним в документації. Більшість відомих файлових і бутових вірусів можна виявити на етапі вхідного контролю. Для цієї мети використовується батарея (декілька програм, що послідовно запускаються) детекторів. Набір детекторів достатньо широкий, і постійно поповнюється у міру появи нових вірусів. Проте при цьому можуть бути виявлені не всі віруси, а тільки розпізнавані детектором. Наступним елементом вхідного контролю є контекстний пошук у файлах слів і повідомлень, які можуть належати вірусу (наприклад, Virus, COMMAND.COM, Kill і т.д.). Підозрілою є відсутність в останніх 2-3 кілобайтах файлу текстових рядків - це може бути ознакою вірусу, який шифрує своє тіло.
Розглянутий контроль може бути виконаний за допомогою спеціальної програми, яка працює з базою даних "підозрілих" слів і повідомлень, і формує список файлів для подальшого аналізу. Після проведеного аналізу нові програми рекомендується декілька днів експлуатувати в карантинному режимі. При цьому доцільно використовувати прискорення календаря, тобто змінювати поточну дату при повторних запусках програми. Це дозволяє виявити віруси, що спрацьовують в певні дні тижня (п'ятниця, 13 число місяця, неділя і т.д.).
Профілактика. Для профілактики зараження необхідно організувати роздільне зберігання (на різних магнітних чи інших носіях) як програм, що надходять вперше так і програм,що експлуатувалися раніше, мінімізацію періодів доступності дискет для запису та мінімізацію розділення загальних магнітних носіїв між конкретними користувачами.
Ревізія. Аналіз знов отриманих програм спеціальними засобами (детекторами), контроль цілісності перед прочитуванням інформації, а також періодичний контроль стану системних файлів.
Карантин. Кожна нова програма перевіряється на відомі типи вірусів протягом певного проміжку часу. Для цих цілей доцільно виділити спеціальну ПЕОМ, на якій не проводяться інші роботи. У разі неможливості виділення ПЕОМ для карантину програмного забезпечення, для цієї мети використовується машина, що відключена від локальної мережі і не містить особливо цінної інформації.
Сегментація. Полягає у розбитті магнітного диска на ряд логічних томів (розділів), частина з яких має статус READ_ONLY (тільки читання). У даних розділах зберігаються виконувані програми і системні файли. Бази даних повинні зберігається в інших розділах, окремо від виконуваних програм. Важливим профілактичним засобом в боротьбі з файловими вірусами є виключення значної частини завантажувальних модулів з сфери їх досяжності. Цей метод називається сегментацією і заснований на розділенні магнітного диска (вінчестера) на окремі логічні томи, що мають атрибут READ_ONLY (тільки читання), а також на схемах парольного доступу. При цьому в захищені від запису розділи диска поміщаються виконувані програми і системні утиліти, а також системи управління базами даних і транслятори, тобто компоненти ПЗ, найбільш схильні до небезпеки зараження. Кількість логічних томів і їх розміри залежать від вирішуваних задач і об'єму вінчестера. Рекомендується використовувати 3 - 4 логічних томи, причому на системному диску, з якого виконується завантаження, слід залишити мінімальну кількість файлів (наприклад, системні файли, програми-пастки).
Фільтрація. Полягає у використанні програм-сторожів, для виявлення спроб виконати несанкціоновані дії.
Вакцинація. Спеціальна обробка файлів і дисків, що імітує поєднання умов, які використовуються деяким типом вірусу для визначення, заражена вже програма чи ні.
Автоконтроль цілісності. Полягає у використанні спеціальних алгоритмів, що дозволяють після запуску програми визначити, чи були внесені зміни в її файли.
Терапія. Передбачає дезактивацію конкретного вірусу в заражених програмах спеціальними програмами (фагами). Програми фаги "викушують" вірус із зараженої програми і намагаються відновити її код в початковий стан (стан до моменту зараження).
У загальному випадку технологічна схема захисту може складатися з наступних етапів:
вхідний контроль нових програм;
сегментація інформації на магнітному носії;
захист операційної системи від зараження;
систематичний контроль цілісності інформації.
Необхідно відзначити, що не слід прагнути забезпечити глобальний захист всіх файлів, що є на диску. Це істотно утруднює роботу, знижує продуктивність системи і, кінець кінцем, погіршує захист внаслідок частої роботи у відкритому режимі. Аналіз показує, що тільки 20-30% файлів повинні бути захищені від запису.
Аналіз розглянутих методів і засобів захисту показує, що ефективний захист може бути забезпечений при комплексному використанні різних засобів в рамках єдиного операційного середовища. Для цього необхідно розробити інтегрований програмний комплекс, що підтримує розглянуту технологію захисту.
2.2. МЕТОДИ ЗАХИСТУ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ВІД ВПРОВАДЖЕННЯ НА ЕТАПІ ЙОГО ЕКСПЛУАТАЦІЇ І СУПРОВОДУ ПРОГРАМНИХ ЗАКЛАДОК
2.2.1. Класифікація засобів дослідження програм
У цьому підрозділі ми виходитимемо з припущення, що на етапі розробки програмна закладка була виявлена і усунена, або її взагалі не було. Для того, щоб привнести програмні закладки в цьому випадку необхідно узяти готовий виконуваний модуль, дизасемблювати його і після внесення закладки піддати повторній компіляції. Інший спосіб полягає в незаконному отриманні текстів початкових програм, їх аналізі, внесенні програмних дефектів і подальшій заміні оригінальних програм на програми з придбаними закладками. І, нарешті, може здійснюватися повна заміна прикладної виконуваної програми на виконувану програму порушника, що втім, вимагає від останнього необхідність мати точні і повні знання цільового призначення і кінцевих результатів прикладної програми.
Всі засоби дослідження ПЗ можна розбити на 2 класи: статичні і динамічні. Перші оперують початковим кодом програми як даними і будують її алгоритм без виконання, другі ж вивчають програму, інтерпретуючи її в реальному або віртуальному обчислювальному середовищі. Звідси витікає, що перші є більш універсальними в тому сенсі, що теоретично можуть отримати алгоритм всієї програми, у тому числі і тих блоків, які ніколи не отримають управління. Динамічні засоби можуть будувати алгоритм програми тільки на підставі конкретної її траси, отриманої при певних вхідних даних. Тому завдання отримання повного алгоритму програми в цьому випадку еквівалентне побудові вичерпного набору тестів для підтвердження правильності програми, що практично неможливо, і взагалі, при динамічному дослідженні можна говорити тільки про побудову деякої частини алгоритму.
Два найбільш відомих типа програм, призначених для дослідження ПЗ, якраз і відносяться до різних класів: це відлагоджувач (динамічний засіб) і дизасемблер (засіб статистичного дослідження). Якщо перший широко застосовується користувачем для відлагодження власних програм і задачі побудови алгоритму для нього вторинні і реалізуються самим користувачем, то другий призначений виключно для їх вирішення і формує на виході асемблерний текст алгоритму.
Крім цих двох основних інструментів дослідження, можна використовувати:
"дизкомпілятори" ("декомпілятори"), програми, що генерують з виконуваного коду програму на мові високого рівня;
"трасувальники", що спочатку запам'ятовують кожну інструкцію, що проходить через процесор, а потім переводять набір інструкцій у форму, зручну для статичного дослідження, автоматично виділяючи цикли, підпрограми і т.п.;
"слідкуючі системи", що запам'ятовують і аналізують трасу вже не інструкцій, а інших характеристик, наприклад, викликаних програмою переривань.
2.2.2. Методи захисту програм від дослідження
Для захисту програми від дослідження необхідно застосовувати методи захисту від дослідження файлу з її виконуваним кодом, що зберігається на зовнішньому носієві, а також методи захисту виконуваного коду, що завантажується в оперативну пам'ять для виконання цієї програми.
У першому випадку захист може бути заснований на шифруванні секретної частини програми, а в другому - на блокуванні доступу до виконуваного коду програми в оперативній пам'яті з боку відладчиків. Крім того, перед завершенням роботи програми, що захищається, повинен знищуватися (наприклад, обнулятися) весь її код в оперативній пам'яті. Це запобігає можливості несанкціонованого копіювання з оперативної пам'яті дешифрованого виконуваного коду після виконання програми, що захищається.
Таким чином, програма, що захищається від дослідження, повинна включати наступні компоненти:
ініціалізатор;
зашифровану секретну частину;
деструктор (деініціализатор).
Ініціалізатор повинен забезпечувати виконання наступних функцій:
збереження параметрів операційного середовища функціонування (векторів переривань, вмісту регістрів процесора і т.д.);
заборона всіх внутрішніх і зовнішніх переривань, обробка яких не може бути запротокольована в програмі, що захищається;
завантаження в оперативну пам'ять і дешифрування коду секретної частини програми;
передача управління секретній частині програми.
Секретна частина програми призначена для виконання основних цільових функцій програми і захищається шифруванням для попередження внесення до неї програмної закладки.
Деструктор після виконання секретної частини програми повинен виконати наступні дії:
обнулення секретного коду програми в оперативній пам'яті;
відновлення параметрів операційної системи (векторів переривань, вмісту регістрів процесора і т.д.), які були встановлені до заборони неконтрольованих переривань;
виконання операцій, які неможливо було виконати при забороні неконтрольованих переривань;
звільнення всіх незадіяних ресурсів комп'ютера і завершення роботи програми;
Для більшої надійності ініціалізатор може бути частково зашифрований і у міру виконання може дешифрувати сам себе. Дешифруватися у міру виконання може і секретна частина програми. Таке дешифрування називається динамічним дешифруванням виконуваного коду. В цьому випадку чергові ділянки програм перед безпосереднім виконанням розшифровуються, а після виконання відразу знищуються.
Для підвищення ефективності захисту програм від дослідження необхідне внесення до програми додаткових функцій безпеки, направлених на захист від трасування. До таких функцій можна віднести:
періодичний підрахунок контрольної суми області оперативної пам'яті, яка зайнята початковим кодом, що захищається; порівняння поточної контрольної суми із заздалегідь сформованою еталонною і вживання необхідних заходів у разі неспівпадання;
перевірку кількості займаною програмою оперативної пам'яті, що захищається; порівняння з об'ємом, до якого програма адаптована, і вживання необхідних заходів у разі невідповідності;
контроль часу виконання окремих частин програми;
блокування клавіатури на час відпрацювання особливо секретних алгоритмів.
Для захисту програм від дослідження за допомогою дизасемблерів можна використовувати і такий спосіб, як ускладнення структури самої програми з метою заплутування зловмисника, який дизасемблює цю програму. Наприклад, можна використовувати різні сегменти адреси для звернення до однієї і тієї ж області пам'яті. В цьому випадку зловмисникові буде важко здогадатися, що насправді програма працює з однією і тією ж областю пам'яті.
2.2.3. Аналіз програм на етапі їх експлуатації
У даному розділі будуть розглянуті методи пошуку і нейтралізації РПЗ за допомогою дизасемблерів і відлагожувачів на етапі експлуатації програм. Тобто завдання захисту на відміну від завдань захисту в попередньому розділі тут вирішується "з точністю до навпаки".
Основна схема аналізу виконуваного коду, в даному випадку, може виглядати таким чином:
виділення чистого коду, тобто видалення коду, що відповідає за захист цієї програми від несанкціонованого запуску, копіювання і т.п. і перетворення решти коду в стандартний, що правильно інтерпретується дизассемблером;
лексичний аналіз;
дизасемблювання;
семантичний аналіз;
перевід в форму, зручну для наступного етапу (в тому числі и переклад на мову високого рівня);
синтаксичний аналіз.
Після зняття захисту здійснюється пошук сигнатур (лексем) РПЗ. Закінчення етапу дизасемблювання передує синтаксичному аналізу, тобто процесу ототожнення лексем, знайдених у вхідному ланцюжку, одній з мовних конструкцій, що задаються граматикою мови, тобто синтаксичний аналіз виконуваного коду програм полягає в ототожненні сигнатур, знайдених на етапі лексичного аналізу, одному з видів РПЗ.
При синтаксичному аналізі можуть зустрітися наступні труднощі:
можуть бути не розпізнані деякі лексеми. Це випливає з того, що макроасемблерні конструкції можуть бути представлені нескінченним числом регулярних асемблерних виразів;
порядок слідування лексем може бути відомим з деякою вірогідністю або взагалі не відомим;
граматика мови може поповнюватися, оскільки можуть виникати нові типи РПЗ або механізми їх роботи.
Таким чином, остаточний висновок про відсутність або наявність РПЗ можна дати тільки на етапі семантичного аналізу, а завдання цього етапу можна конкретизувати як згортку термінальних символів в нетермінали якомога вищого рівня там, де вхідний ланцюжок заданий строго.
Оскільки семантичний аналіз зручніше вести на мові високого рівня далі проводиться етап перекладу асемблерного тексту в текст на мові вищого рівня, наприклад, на спеціалізованій мові макроасемблера, який націлений на виділення макроконструкцій, використовуваних в РПЗ.
На етапі семантичного аналізу дається остаточна відповідь на питання про те, чи містить вхідний виконуваний код РПЗ, і якщо так, то якого типу. При цьому використовується вся інформація, отримана на всіх попередніх етапах. Крім того, необхідно враховувати, що ця інформація може вважатися правильною лише з деякою вірогідністю, причому не виключені взагалі помилкові факти, або висновки дослідників. В цілому, завдання семантичного аналізу є складним і ресурсоємним і скоріше за все не може бути повністю автоматизованим.
2.3. ОСНОВНІ ПІДХОДИ ДО ЗАХИСТУ ПРОГРАМ ВІД НЕСАНКЦІОНОВАНОГО КОПІЮВАННЯ
2.3.1. Основні функції засобів захисту від копіювання
При захисті програм від несанкціонованого копіювання застосовуються методи, які дозволяють привносити в програму, що захищається, функції прив'язки процесу виконання коду програми тільки до тих ЕОМ, на які вони були інстальовані. Інстальована програма для захисту від копіювання при кожному запуску повинна виконувати наступні дії:
аналіз апаратно-програмного середовища комп'ютера, на якому вона запущена, формування на основі цього аналізу поточних характеристик свого середовища виконання;
перевірка достовірності середовища виконання шляхом порівняння його поточних характеристик з еталонними, що зберігаються на вінчестері;
блокування подальшої роботи програми при неспівпадінні поточних характеристик з еталонними.
Етап перевірки достовірності середовища є одним з самих уразливих з погляду захисту. Можна детально не розбиратися з логікою захисту, а трохи "підправити" результат порівняння, і захист буде знятий.
При виконанні процесу перевірки достовірності середовища можливі три варіанти: з використанням множини операторів порівняння того, що є, з тим, що повинно бути, з використанням механізму генерації виконуваних команд залежно від результатів роботи захисного механізму і з використанням арифметичних операцій. При використанні механізму генерації виконуваних команд в першому байті зберігається початкова ключова контрольна сума BIOS, в другий байт записується підрахована контрольна сума в процесі виконання завдання. Потім здійснюється віднімання із значення першого байта значення другого байта, а отриманий результат додається до кожного елементу оперативної пам'яті в області операційної системи. Зрозуміло, що якщо суми не співпадуть, то операційна система функціонувати не буде. При використанні арифметичних операцій здійснюється перетворення над даними арифметичного характеру залежно від результатів роботи захисного механізму.
Для зняття захисту від копіювання застосовують два основні методи: статичний і динамічний.
Статичні методи передбачають аналіз текстів захищених програм в природному або перетвореному вигляді. Динамічні методи передбачають стеження за виконанням програми за допомогою спеціальних засобів зняття захисту від копіювання.
2.3.2. Основні методи захисту від копіювання
Перераховані нижче методи, в основному направлені на протидію статичним способам зняття захисту від копіювання. У наступному підрозділі розглянемо методи протидії динамічним способам зняття захисту.
Криптографічні методи
Для захисту програми, що інсталюється, від копіювання за допомогою криптографічних методів інсталятор програми повинен виконати наступні функції:
аналіз апаратно-програмного середовища комп'ютера, на якому повинна буде виконуватися програма, що інсталюється, і формування на основі цього аналізу еталонних характеристик середовища виконання програми;
запис криптографічно перетворених еталонних характеристик апаратно-програмного середовища комп'ютера на вінчестер.
Перетворені еталонні характеристики апаратно-програмного середовища можуть бути занесені в наступні області жорсткого диска:
у будь-які місця області даних (у створений для цього окремий файл, в окремі кластери, які повинні позначатися потім в FAT як зарезервовані під операційну систему або дефектні);
у зарезервовані сектори системної області вінчестера;
безпосередньо у файли розташування програмної системи, що захищається, наприклад, у файл настроювання її параметрів функціонування.
Можна виділити два основні методи захисту від копіювання з використанням криптографічних прийомів:
з використанням односторонньої функції;
з використанням шифрування.
Одностороння функція це функція, для якої при будь-якому x з області визначення легко обчислити f(x), проте майже для всіх у з її області значень, знайти x, таке, щоби виконувалося y=f(x), обчислювально важко.
Якщо еталонні характеристики програмно-апаратного середовища представити у вигляді аргументу односторонньої функції x, то у - є "образ" цих характеристик, який зберігається на вінчестері і по значенню якого обчислювально неможливо отримати самі характеристики. Прикладом такої односторонньої функції може служити функція дискретного піднесення до степеня, описана в розділах 2.1 і 3.3 з розмірністю операндів не меншого 512 бітів.
При шифруванні еталонні характеристики шифруються по ключу, що збігається з цими поточними характеристиками, а поточні характеристики середовища виконання програми для порівняння з еталонними також шифруються, але по ключу, що збігається з цими поточними характеристиками. Таким чином, при порівнянні еталонні і поточні характеристики знаходяться в зашифрованому вигляді і співпадатимуть тільки в тому випадку, якщо початкові еталонні характеристики співпадають з початковими поточними.
Метод прив'язки до ідентифікатора
У випадку якщо характеристики апаратно-програмного середовища відсутні в явному вигляді або їх визначення значно уповільнює запуск програм або знижує зручність їх використання, то для захисту програм від несанкціонованого копіювання можна використовувати методи прив'язки до ідентифікатора, що формується інсталятором. Суть даного методу полягає в тому, що на вінчестері при інсталяції програми, що захищається від копіювання, формується унікальний ідентифікатор, наявність якого потім перевіряється інстальованою програмою при кожному її запуску. За відсутності або неспівпадінні цього ідентифікатора програма блокує своє подальше виконання.
Основною вимогою до записаного на вінчестер унікального ідентифікатора є вимога, згідно з якою даний ідентифікатор не повинен копіюватися стандартним способом. Для цього ідентифікатор доцільно записувати в наступні області жорсткого диска:
у окремі кластери області даних, які повинні позначатися потім в FAT як зарезервовані під операційну систему або як дефектні;
у зарезервовані сектори системної області вінчестера.
Некопійований стандартним чином ідентифікатор може розташовуватися на дискеті, до якої повинна буде звертатися при кожному своєму запуску програма. Таку дискету називають ключовою. Крім того, програма, що захищається від копіювання, може бути прив'язана і до унікальних характеристик ключової дискети. Слід враховувати, що при використанні ключової дискети значно збільшується незручність для користувача, оскільки він завжди повинен вставляти в дисковод цю дискету перед запуском програми, що захищається від копіювання.
Методи, засновані на робота з переходами і стеком
Дані методи засновані на включення в тіло програми переходів за адресами і перериваннями, що динамічно змінюються, а також команд, що самогенеруються (наприклад, команд, отриманих за допомогою додавання і віднімання). Крім того, замість команди безумовного переходу (JMP) може використовуватися повернення з підпрограми (RET). Заздалегідь в стек записується адреса переходу, який в процесі роботи програми модифікується безпосередньо в стеку.
При роботі із стеком, стек визначається безпосередньо в області виконуваних команд, що приводить до затирання при роботі із стеком. Цей спосіб застосовується, коли не потрібне повторного виконання коду програми. Таким же способом можна генерувати виконувані команди до початку обчислювального процесу.
Маніпуляції з кодом програми
Можна навести два наступні способи маніпуляцій з кодом програми:
включення в тіло програми "порожніх" модулів;
зміна програми, що захищається
Перший спосіб полягає у включенні в тіло програми модулів, на які імітується передача управління, але реально ніколи не здійснюється. Ці модулі містять велику кількість команд, що не мають ніякого відношення до логіки роботи програми. Але "непотрібність" цих програм не повинна бути очевидна потенційному зловмисникові.
Другий спосіб полягає в зміні початку програми, що захищається, так, щоб стандартний дизасемблер не зміг її правильно дизасемблювати. Наприклад, такі програми, як Nota і Copylock, упроваджуючи захисний механізм у файл, що захищається, повністю модифікують початковий заголовок EXE-файлу.
2.3.3. Методи протидії динамічним способам зняття захисту програм від копіювання
Набір методів протидії динамічним способам зняття захисту програм від копіювання включає:
Періодичний підрахунок контрольної суми області оперативної пам'яті, яка зайнята образом завдання, в процесі його виконання. Це дозволяє:
помітити зміни, внесені до завантажувального модуля;
у випадку, якщо програму намагаються "роздягнути", виявити контрольні точки, встановлені відлагоджувачем.
Перевірка кількості вільної пам'яті і порівняння ії з тим об'ємом, до якого завдання "звикло" або "привчене". Ці дії дозволяють застрахуватися від дуже грубого стеження за програмою за допомогою резидентних модулів.
Перевірка вмісту незадіяних для програми, що захищається, областей пам'яті, які не потрапляють під загальний розподіл оперативної пам'яті, доступної для програміста. Це дозволяє добитися "монопольного" режиму роботи програми.
Перевірка вмісту векторів переривань (особливо 13h і 21h) на наявність тих значень, до яких завдання "привчене". Іноді буває корисним порівняння перших команд операційної системи, що відпрацьовуються цими перериваннями, з тими командами, які там повинні бути. Разом з попереднім очищенням оперативної пам'яті перевірка векторів переривань і їх примусове відновлення дозволяє позбавитися від більшості присутніх в пам'яті резидентних програм.
Переустановлення векторів переривань. Вміст деяких векторів переривань (наприклад, 13h і 21h) копіюється в область вільних векторів. Відповідно змінюються і звернення до переривань. При цьому стеження за відомими векторами не дасть бажаного результату. Наприклад, найпершими виконуваними командами програми копіюється вміст вектора 21h (4 байти) у вектор 60h, а замість команд int 21h в програмі скрізь записується команда int 60h. В результаті в явному вигляді в тексті програми немає жодної команди роботи з перериванням 21h.
Постійне чергування команд дозволу і заборони переривання, що утрудняє установку відлагоджувачем контрольних точок.
Контроль часу виконання окремих частин програми, що дозволяє виявити призупинення роботи ("останови") в тілі виконуваного модуля.
Багато перерахованих захисних засобів можуть бути реалізовані виключно мовою Асемблер. Одна з основних особливостей цієї мови полягає в тому, що для неї не існує обмежень в області роботи із стеком, регістрами, пам'яттю, портами введення/виведення і т.п.
Захист мобільних програм
Історія виникнення мобільних вірусів ...