Материал: 1

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Тепер про те, що повинно відбуватися після оплати. Тут знову ж таки є дві дороги: "статичні" паролі і генератор ключів.

У першому випадку програма "розблоковується" при введенні пароля, відповідного деяким критеріям. При цьому сам пароль не є індивідуальним. Я думаю, що вже ні для кого не є секретом, як це зробила компанія 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, не кажучи вже про високу кваліфікацію).

Источник: https://files.student-it.ru/previewfile/7000