Апаратний захист програмного забезпечення
Допустимо, ви написали супер-круту програму. І хочете її продавати. І навіть існують люди, яким ваша програма потрібна позарізом. Але чомусь дуже мало бажаючих платити за вашу програму призначену вами ціну. І ось – програма розходиться по руках, викладається на сайтах у мережі Інтернет, з'являється на піратських компактах. Прикро? Та й витрачені на розробку сили і кошти хочеться виправдати - ви ж не благодійністю займаєтеся ...
І ось перед вами виникає питання захисту вашої програми від несанкціонованого використання. Що тут можна зробити?
На зорі комп'ютеризації в Україні найчастіше застосовували захист, заснований на нестандартному використанні носіїв інформації – переважно гнучких дисків (“хитре” форматування, запис у службові проміжки між секторами, перевірка спеціально зроблених дефектів носія тощо). Таким чином, зазвичай захищалася програма установки, а сама прикладна програма "прив'язувалася" до апаратних характеристик комп'ютера (типу материнської плати або процесора, розміру оперативної пам'яті, розміру жорсткого диска ...). При очевидній простоті та дешевизні, для користувача цей спосіб страшенно незручний: резервну копію софту зробити неможливо, на інший комп'ютер перенести – теж; а при псуванні дистрибутива доводилося знову звертатися до постачальника. Крім того, з часом з'явилися засоби "побітового" копіювання таких "захищених" носіїв інформації (наприклад, програма FDA), які звели всі зусилля розробників захисту нанівець.
Ще один варіант захисту – використання про “серійного номера”, тобто. сформованого за певним алгоритмом числа, що вказується під час встановлення програми. Програма установки (або сама прикладна програма) перевіряє введене значення навідповідність відомому їй алгоритму, і у разі успіху – продовжує працювати у штатному режимі. Таким чином захищаються, наприклад, операційні системи Windows, програмні пакети Corel Draw!, Adobe PhotoShop та багато інших. Варіант дуже зручний для кінцевого користувача: можна зробити скільки завгодно резервних копій, можна встановити програму на будь-яку кількість комп'ютерів ... Але саме це і не влаштовує розробників ПЗ: дійсно, маючи один "правильний" ключ, можна створити скільки завгодно "піратських" копій, які платити не обов'язково.
В результаті з'явився цілий напрямок у комп'ютерній індустрії, що займається забезпеченням захисту програмного забезпечення, що тиражується, від несанкціонованого використання. І сьогодні практично всі "коробкові" варіанти серйозного комерційного програмного забезпечення використовують програмно-апаратні комплекси захисту, більш відомі як "апаратні ключі захисту". В Україні їх розробкою займаються компанії "Актив" (www.novex.ru), "Aladdin Software Security R.D." (www.aladdin.ru) та деякі інші.
Чорний ящик
Якщо ви полізете в блок живлення з викруткою, він може вас вбити з метою самозахисту.
Апаратні ключі захисту складаються з власне ключа, що підключається до LPT або COM-порту комп'ютера (нещодавно анонсовані ключі, що підключаються до USB-шини), та програмного забезпечення (драйверів для різних операційних систем та модуля, що вбудовується в програму, що захищається).
Апаратна частина таких ключів виконана на мікросхемах FLASH-пам'яті, на PIC-котролерах або на замовних ASIC-чіпах. SLCT IN, -STROBE або одна зінформаційних шин для LPT-порту; DTR, RTS для COM-порту). Інформаційний обмін між ключем і комп'ютером відбувається, зазвичай, у послідовному вигляді, з використанням стробуючого сигналу, що формується драйвером. Як вихідні інформаційні та стробуючі лінії використовуються вищеперелічені висновки, а як вхідна лінія використовується сигнали –STROBE, -ACK, BUSY, PE, SLCT або ERROR для LPT-порту і DSR, CTS для COM-порту.
Звичайно, апаратні ключі, що підключаються до LPT- і COM-портів, повинні забезпечувати "прозорий" режим обміну стандартними для цих портів протоколами. Наприклад, обмін з ключами, що підключаються до LPT-порту, вестиметься лише при пасивному рівні сигналу –SLCT IN (тобто “принтер не обраний”), а обмін із ключами для COM-портів відбуватиметься лише за пасивного рівня DTR (“ Data terminal ready”). Втім, ці хитрощі все одно не допомагають уникнути конфліктів зі стандартними пристроями, призначеними для підключення до даних портів (останніми моделями принтерів та сканерів, які використовують двонаправлений обмін паралельним портом або з маніпуляторами типу "миша" і модемами, що підключаються до послідовного порту). Від подібних недоліків повинні бути вільні ключі, що підключаються до USB-шини, але поки що їх серійне виробництво тільки починається.
Отже, розглянемо апаратні реалізації ключів захисту. Найпростіший і найзламніший - ключ на основі FLASH-пам'яті. Основна його ідея в тому, щоб перед продажем програмного забезпечення, що захищається, записати в ключ деякі дані та/або частини програмного коду, а на етапі перевірки легальності використання ПЗ вважати ці дані з ключа. Ломається захист приблизно так: визначається алгоритм обміну інформацією між комп'ютером та ключем, зчитується інформація з FLASH-пам'яті ключа і пишеться відповідний емулятор (драйвер, який підміняє собою штатний драйвера електронного ключа і замість обміну з реальним пристроєм передає прикладній програмі заздалегідь підготовлені дані). Крім того, такі ключі мають найменший ступінь прозорості для стандартних протоколів обміну (т.к. дані, не призначені для ключа, теоретично можуть бути сприйняті ним як команда на читання або запис FLASH-пам'яті, що призведе або до псування інформації, що зберігається, або до порушення протоколу обміну з іншим пристроєм, підключеним до порту комп'ютера).
Ключі, зроблені на основі PIC або ASIC-чіпів, мають на порядок більшу стійкість до злому та прозорість для штатних протоколів обміну. Обидві ці мікросхеми являють собою контролери, що містять процесор, деяку кількість оперативної пам'яті, FLASH-пам'ять команд і пам'ять для зберігання мікропрограми. Мікропрограма та внутрішня пам'ять зазвичай захищається від зовнішнього зчитування, тому зробити апаратну копію ключа досить проблематично. Основна відмінність PIC-ключів від ASIC-ключів у тому, що PIC-чіпи програмуються розробником ключів (тобто він може відносно легко змінити алгоритми роботи), а ASIC-чіпи є рекомендованими мікросхемами (тобто алгоритми жорстко задаються на етапі виробництва мікросхем). Тому ASIC-ключі виходять дешевшими, ніж зібрані на основі PIC-чіпів, але з цієї ж причини захист на їх основі менш надійний (визначивши алгоритм обробки даних в одному з ASIC-чіпів, можна написати емулятор ключа для всієї партії, яка - силу особливостей виробництва - зазвичай досить великий). Широко відомий випадок, коли було визначено алгоритм роботи електронного ключа виробництва компанії "Aladdin Software Security R.D." (яквиявилося, дана функція може бути реалізована одним рядком мовою С), після чого з'явилася велика кількість емуляторів ключів цієї фірми. І розробники нічого не могли з цим вдіяти, оскільки зміни алгоритму їм довелося б замовляти виробництво нової партії мікросхем.
Завершуючи огляд апаратних реалізацій ключів захисту, відзначимо наявність у деяких ключах додаткових можливостей: енергонезалежних таймерів (для обмеження роботи програми, що захищається за часом), енергонезалежної пам'яті (для обмеження кількості інсталяцій або запусків програми), можливість використання одного і того ж ключа для захисту декількох пакетів прикладного програмного забезпечення (вибір алгоритму кодування даних в залежності від ідентифікатора програми, що захищається).