СОДЕРЖАНИЕ
Лекція 1. Вступ. Категорії інформаційної безпеки. Захист програм.
Абстрактні моделі захисту інформації
Основні положення по розробці ПО
Помилки, що призводять до можливості атак на інформацію
Короткий огляд технології RAID
Переваги і недоліки основних рівнів RAID
1.3 Симетричні криптоалгоритмы
Загальні відомості про блокові шифри
Основи побудови захисту - крок за кроком
Крок 1. Відключення автоматичного запуску CD
Крок 2. Автоматичне оновлення системи
Крок 3. Відключення непотрібних сервісів
Крок 6. Теорія складання паролів
Тепер про те, що повинно відбуватися після оплати. Тут знову ж таки є дві дороги: "статичні" паролі і генератор ключів.
У першому випадку програма "розблоковується" при введенні пароля, відповідного деяким критеріям. При цьому сам пароль не є індивідуальним. Я думаю, що вже ні для кого не є секретом, як це зробила компанія Microsoft зі своїми CD - keys: сума цифр повинна ділитися на 7. Простіше нікуди. Природно, ви можете придумати що-небудь поскладніше, наприклад, робити деякі обчислення, які повинні призводити до певного результату. Як варіант - можна зберігати усі правильні ключі усередині самої програми.
Оскільки кожному користувачеві ви посилатимете свій пароль (хоча і не пов'язаний з його даними), то у разі, якщо один з них буде опублікований для "широкого використання", вам неважко буде вичислити кривдника.
Що стосується генератора ключів, то це елегантніший спосіб: знаючи ім'я користувача, ви можете шляхом яких-небудь перетворень згенерувати з нього деякий ключ. Тут вже включайте свою фантазію: краще всього, якщо перетворення буде одностороннім і досить заплутаним.
Не можна не згадати і ще про один спосіб захисту - за допомогою апаратних ключів, що підключаються до паралельного порту комп'ютера (типу HASP). Звичайно, для програми вартістю п'ять доларів це не дуже підходить (занадто дорого; не усі люблять; з деякими пристроями не досягається повна сумісність і т. д.), але проте. Можете спробувати.
Маленький сюрприз
Якщо ваша програма дійсно хороша, то через два-три дня після її випуску вас чекає сюрприз: в Інтернеті з'явиться "халявный" реєстраційний код, або crack, або patch, або зламана версія. До речі, якщо вам не знайомі ці терміни, то от як їх можна визначити (узято з news: alt.cracks) : "Crack: Any method used to defeat protection applied to a software program to allow its full unencumbered use without paying the author for it. Patch: An executable software program that, when aimed at another software program, modifies the target program for some specific purpose". Загалом, ідея ясна: вашою програмою тепер можуть користуватися усі охочі, причому платити для цього зовсім не обов'язково.
Звичайно, ви можете про це і не дізнатися, якщо звикли економити на доступі до Інтернету і/або якщо не знаєте, де шукати, але я вас запевняю - якщо програма цікава не лише вам і вашим друзям, то її обов'язково зламають. Сто відсотків.
Повинен вас засмутити (чи обрадувати?) : 99% відсотків защит, вживаних в shareware -программах, ламаються за 10-15 хвилин. Для цього навіть не потрібно бути хакером. Усе, що вимагається, - це декілька програм: потужний відладчик типу SoftICE, дизасемблер типу IDA плюс пара утиліт типу FileMon, RegMon, VxdMon. Іноді навіть цього багато. Ну і ще, звичайно, хоч би базове знання асемблера.
Я тут не поглиблюватимуся в деталі "злому" - в Інтернеті існує безліч прекрасно написаних посібників як для "початківців", так і для "просунутих" хакерів. Зупинюся лише на найзагальніших принципах (повинен відразу обмовитися, що сам я зломом ніколи не займався і займатися не збираюся - окрім як для розваги; якщо програма мені подобається, я реєструю її легальним способом). Дуже сподіваюся, що борці з піратством не розцінять це як "курс молодого бійця" для охочих спробувати свої сили.
Отже. Зазвичай реєстрація виглядає таким чином: користувач натискає на кнопку "Зареєструвати"! (чи звертається до відповідного пункту меню)і перед ним з'являється віконце з пропозицією ввести реєстраційний ключ. При закритті цього віконця (після введення ключа) відбувається верифікація. Верифікація може бути жахлива складною і заплутаною, але врешті-решт вона приходить до закономірного результату, а саме операції порівняння (введеного ключа з правильним або вичисленого значення з деяким зразком) або запису в стек (чи регістр) результату верифікації.
Усе до геніальності просто: усі операції роботи з рядками (якщо ви пишете мовою високого рівня) використовують виклики відповідних функцій (API) ядра Windows (kernel) або звернення до Run - Time Library. І ті і інші легко відстежуються відладчиком, а частенько і розпізнаються дизасемблером. Якщо ж ви використовували генератор ключів, то рано чи пізно в пам'яті з'явиться "правильний" рядок - тобто та, яка має бути, якщо користувач чесно сплатив нелегку працю програміста. Тому найчастіше хакер має можливість зареєструвати програму "На себе" і роздати пароль таким, що усім бажає (так, наприклад, було зроблено з прекрасним антивірусом AVP від дуже шанованого мною Євгенія Касперского).
Хто такий (точніше, такі) PhrozenCrew, ви, напевно, знаєте, а якщо (поки) не знаєте, то двома словами: це найбільша (хоча і не найстаріша) "крэкерская" група, що займається зломом shareware -программ (на їх рахунку більше трьох тисяч "постраждалих" авторів); налічує близько сорока активних членів, включаючи засновника (The Keyboard Caper, родом з Південної Африки), президента і віце-президента (Archimede і TeRaPhY, відповідно), власне "крэкеров", кур'єрів, тестувальників і ін. Втім, це вже тема для окремої статті.
У разі, якщо підібрати пароль неможливо ("шароварщики" все-таки теж не ликом шиті і зазвичай мають поняття про асемблер), використовується інший підхід: повертане перевірочною функцією значення просто замінюється на протилежне (і усього делов-то - замінити безумовний перехід на умовний або навпаки). А далі пишеться малюсінька програма, яка робить те ж саме, але вже не в пам'яті, а безпосередньо в EXE -файле вашої улюбленої програми.
Якщо ваша програма - time - limited, то тут все ще простіше (ну прямо як в старому анекдоті про невдачливого єврея - або акула попадеться глуха, або свисток для відлякування будезламаний :). Річ у тому, що час першого запуску потрібно десь зберігати (при цьому залишаючи незмінним при переинсталляциях). Зберігати можна тільки в двох місцях: в Registry або у файлі на диску (варіанти типу невживаних доріжок я з обуренням відмітаю - хлопці, це ж вам не DOS, самі ж намучитеся, а то і кінцевому користувачеві диск споганите). За допомогою згаданих вище програм (деякі з яких абсолютно безкоштовні) будь-який охочий з легкістю може побачити, які саме ключі Registry ви пишете або читаєте і до яких файлів звертаєтеся. Далі, знайти відповідні виклики в самій програмі - справа техніки, на те відладчики/дизасемблери і існують. Усі відомі мені shareware -программы із захистом цього класу (наприклад, Bounds Checker Professional) вже давно розкриті.
Навіть при використанні апаратних ключів успіх не гарантований. Ідея сама по собі непогана, але усі перевірки відбуваються все-таки в самій програмі (чи в бібліотеках, що поставляються з цими ключами), а значить, від прикрощів ви не застраховані - вищезгадані способи злому можуть бути з успіхом застосовані і тут.
""Джентльменський набір" хакера
На першому місці коштує, природно, дизасемблер. Він значно простіше в зверненні, ніж відладчик, і часто його буває більш ніж достатньо, щоб "розколоти" програму середнього рівня захисту.
З усіх відомих мені дизасемблерів найпотужнішим є IDA (Interactive DisAssembler), см www.datarescue.com/ida.htm; він далеко не безкоштовний (149 доларів), але, повірте, вкладені в нього гроші окупляться з лишком. До речі, ця програма написана нашими співвітчизниками. Однією з її відмінних рис є "многоплатформность" - він "розуміє" безліч форматів файлів, включаючи DOS COM/EXE, NE (New Executable), LE (Linear Executable, PE (Portable Executable), COFF (Common Object File Format), NLM (NetWare Loadable Modules), LIB, AR і навіть Java -классы. Спектр підтримуваних процесорів теж дуже широкий: Intel (від 8080 - пам'ятаєте такий? - до Pentium Pro і Pentium MMX, і навіть i860), а також Motorola 68xxx, ARM, TMS і багато інших. Причому користувачі можуть розширювати цей список, додаючи підтримку інших процесорів самостійно.
Є у IDA і багато інших чудових можливостей, частина з яких дійсно унікальні. Наприклад, FLIRT (Fast Library Identification and Recognition Technology); за допомогою цієї технології дизасемблер здатний розпізнавати виклики бібліотечних функцій (наприклад, для мови C - printf, strcmp і т. д.), включаючи ті, які ви написали самі. Мало того, IDA ще і уміє ідентифікувати звернення до масивів і структур, роблячи асемблерний текст значно більш читаним. Не можу не згадати і про "autocommenting" - результуючий текст виходить добре закоментованим! І остання маленька, але важлива деталь: в IDA ви можете "підправити" текст програми (замінюючи початкові інструкції асемблера на свої власні) і зберегти результуючий EXE -файл, так що навіть patch робити не доведеться.
Якщо все ж IDA вас чим-небудь не влаштовує, сходите за адресою www.csee.uq.edu.au/csm/decompilation/disasm.html, - там зібрана ціла колекція посилань на різні дизасемблери. Рекомендую також відвідати www.eccentrica.org/Mammon/disasm.html, де окрім дизасемблерів є ще і посилання на утиліти для редагування бінарних файлів - теж згодяться.
Далі - хороший відладчик. Забудьте про Borland Turbo Debugger і Microsoft WinDbg! Ці програми хороші тільки для "лову бліх", тобто помилок. Кращий вибір - SoftICE від NuMega (www.numega.com/products/sys/sys.htm). З його допомогою ви можете робити буквально усе! Власне, головне його призначення - це все-таки пошук помилок, але і як хакреський інструмент він просто незамінний.
Не обійтися і без вже згаданих утиліт FileMon, RegMon і (можливо) VxDMon, написаних Марком Руссиновичем, відомим експертом в області низькорівневого програмування для Windows (саме він розповів всьому світу про те, що різниця між Windows NT Workstation і Windows NT Server - це усього лише декілька додаткових програм і значення одного ключа в Registry). FileMon показує детальну інформацію про усі звернення до файлової системи; є можливість встановлювати різні фільтри і навіть відстежувати роботу з swap -файлом.
RegMon (як ви вже, напевно, здогадалися) робить приблизно те ж саме, але не з файловою системою, а з Registry.
VxDMon, відповідно, здійснює моніторинг викликів різних сервісів VxD, що в деяких випадках теж може виявитися корисним.
FileMon і RegMon існують у версіях для Windows 95 і Windows NT (у тому числі і для процесора Alpha); VxDMon, природно, працює тільки під Windows 95. Усі три утиліти можна завантажити з вузла "NT Internals" (www.ntinternals.com), причому разом з початковими текстами на C.
Якщо вам раптом знадобиться щось ще або просто стане цікаво, якими іншими інструментами користуються хакери, заходите на www.nettaxi.com/citizens/caligo/cracking.htm - там зібрана велика колекція посилань на усілякі корисні (не лише для розтину) програми.
Як не потрібно робити
Одна з найпримітивніших і ненадійних защит - прив'язка до комп'ютера. Будь-який програміст знає, як отримати деякі унікальні для цього комп'ютера характеристики - наприклад, серійний номер вінчестера, і (здавалося б) - ось воно! Навіть якщо користувач, що реєструється, передасть свій ключ комусь іншому, працювати програма не буде. Якщо ви коли-небудь встановлювали "Лексикон", то знаєте, про що йде мова.
Схема, наприклад, може бути наступною: програма обчислює згадані унікальні дані і показує їх користувачеві; він посилає їх авторові, який (при підтвердженні оплати) обчислює на їх основі відповідний пароль і посилає його назад. У програмі "прошитий" той же самий алгоритм, і робиться звіряння ключів - введеного з правильним.
Рекомендую відмовитися від цієї ідеї. Нічого, окрім незручностей для легальних користувачів, вона вам не принесе. Що, якщо користувач поміняє комп'ютер? Чи хоч би жорсткий диск? У наш час поголовній модернізації таке трапляється часто-густо. Сломать-то такий захист - як два байти переслати, а ось у вас головного болю буде на порядок більше.
Якщо ви використовуєте статичні ключі, то хоч би постарайтеся, щоб їх не було видно "неозброєним" поглядом при перегляді EXE -файла. Не потрібно робити таких "подарунків". Навіть якщо ви зберігатимете коди "задом наперед" і/або "зашифруєте" їх "потужною" функцією XOR (особливо на C або Паскале), то це не допоможе. Асемблер - краща мова! Як мовиться, "закордон нам допоможе" - читайте документацію по процесорах Intel (причому не лише на сервері Intel - www.intel.com; не полінуєтеся зайти також на сайт "Intel Secrets" : www.x 86.org). Один із законів Мерфи свідчить: "Якщо нічого не виходить - прочитайте, нарешті, інструкцію". Алгоритмів шифрування в природі багато, і ви навіть можете придумати свій власний (природно, навряд чи ви скажете нове слово в математиці, але така мета і не ставиться).
Якщо ж вас притягнув кодогенератор, то зробити його потрібно як можна складніше, щоб любителям "халяви" життя медом не здавалося. Більшість бачених мною защит, побудованих на подібному принципі, "колються" в два рахунки - можна просто "вирізувати" частину коду із захищеної програми (сам алгоритм генерації ключів) і зробити програмку, яка працюватиме за тим же принципом, але вже як окреме застосування, даючи таким чином не дуже чесним користувачам можливість згенерувати правильний код абсолютно безкоштовно.
До речі, якщо/коли ви (у програмі) визначили, що вона працює з-під відладчика або що хтось вже нацькував на неї patch (так, що файл змінився, - детальніше про це див. нижче), то не варто кричати про це на усю Івановську: упіймав, упіймав! Це найбезглуздіше, що ви можете зробити, - ця перевірка тут же буде локалізована і знищена.
А як потрібно?
Кінцева мета - зробити абсолютно "непробивний" захист - на жаль, недосяжна, але ви повинні до цього прагнути. Програма-мінімум - це забезпечити неможливість підбору пароля (реєстраційного ключа). Якщо у хакерів не буде іншого виходу, окрім як написати crack (patch), то це вже дуже непогано: з випуском чергової версії їм знову доведеться напружуватися. Скажімо, до поштової програми The Bat! (www.ritlabs.com/the bat/) crack є, а ось кодогенератор зробити не вдалося.
Повторюся ще раз: вивчите, нарешті, асемблер. Усі ці новомодні RAD -средства хороші тільки для малювання віконець, кнопочок і інших "фенечек", але ніяк не для потужного захисту. Повірте, знання асемблера не заважало ще нікому.
Хороша ідея - використання сильних засобів шифрування з відкритим ключем. Алгоритмів можна знайти множину, і навіть вільно поширювані початкові тексти в мережі є. Не полінуєтеся, проведіть днинку в Інтернеті і вивчите літературу з цієї тематики, - навіть якщо не згодиться для захисту, то вже, у будь-якому випадку, кругозір розширите.
До речі, рекомендую вам спробувати стискувати свою програму яким-небудь пакувальником. Пам'ятаєте старий добрий PkLite? Так от, подібних програм для Win32 вже досить багато. Майже для усіх з них існують ті, що "розпаковують", але проте застосування цього способу декілька утруднить злом.
З'явилися і "інтелектуальні" пакувальники, які серйозно можуть допомогти вам захистити вашу програму. Наприклад, Shrinker (www.blickinc.com) - для нього (поки) того, що розпаковує не існує, і я не упевнений, що такий може бути написаний взагалі (упакований ці пакетом EXE -файл розпаковується динамічно невеликими блоками, причому використовуваний алгоритм досить складний; крім того, використовуються і деякі методи захисту від проходження коду відладчиком).
Не зайвим буде і код, що розпізнає активність відладчика, причому робити це потрібно на "ранній" стадії, а не безпосередньо перед перевіркою введеного пароля. Пустите вашу програму по "помилковому шляху", здійснюючи дії, відмінні від тих, які виконуються при нормальній роботі. Чи встановите який-небудь прапорець, який може бути використаний пізніше (звичайно, використовуючи hardware breakpoints, його рано чи пізно відловвлять, але це у будь-якому випадку ще одне очко на вашу користь).
Якщо у вас є досвід програмування драйверів, то можна "зашити" захист і у віртуальний драйвер. Порпатися в драйвері набагато складніше, ніж в звичайному виконуваному файлі, і далеко не кожен хакер на це здатний. Відлагоджувати драйвер під Windows NT - взагалі суща морока (для цього потрібний другий комп'ютер з debug -версией NT, або хоч би другий монітор, або наворочений відладчик типу SoftICE, не кажучи вже про високу кваліфікацію).