Дата публикации статьи: 02.06.2004 17:39

Русаков Сергей
Описание приемов защиты от взлома программ на VB

  • Инструменты

  • Приемы

  • Заключение

  •     Каждый программист хотя бы иногда пытался писать ShareWare программы. В некоторых случаях получались довольно крупные проекты. Но как бы ни была хороша задумка, у вас программу не купят, если у нее будет плохая защита. В данной статье речь пойдет об известных мне способах защиты программы от взлома, которые я нашел в различных форумах, статьях и программах, а также пара советов из личного опыта. Все самое важное - в одном месте!

    Инструменты

        Каждый уважающий себя крэкер имеет SoftIce* и какой-нибудь дизассемблер, как минимум. (еще FileMon, RegMon и другие). Отсюда следует, что необходимо посмотреть, включен ли отладчик, и, если включен, выйти из программы. К сожалению, есть утилиты, которые "скрывают" SoftIce (например, FrogsIce). (Исключение составляет закрытие процессов FileMon'а и других), таким образом, этот способ защиты не дает должной эффективности и рассматриваться не будет.

    Приемы

        Итак, мы видим, что мы не можем сопротивляться крэку путем "уничтожения инструментов" (не сканировать же весь винчестер, в самом деле) Тогда попытаемся разобраться, как происходит взлом на "среднем" уровне. Обычно взломщик ставит breakpoint (точку останова) на какую-нибудь API (исключение составляют программы, написанные на Delphi). Чаще всего это бывает MessageBoxA или GetWindowTextA, GetWindowTextw, GetDlgItemTexta, GetDlgItemTextW. За что они отвечают? MessageBox вылезает, когда вы подаете сообщение "Вы ввели неправильный пароль" :), а остальные четыре могут вызываться, когда вы читаете содержимое TextBox'а или чего-нибудь еще. Есть еще варианты считывания времени, если программа - 30-дневка, например. Но сейчас не об этом... Итак, первые советы :)...

    1. Не следует выводить сообщение "Вы ввели неправильный пароль" или что-либо еще. Обычно на это ориентируется взломщик. Проще просто выйти из программы или вообще никак не отреагировать.

    2. Не следует проверять пароль сразу же после считывания из TextBox'а. Поставьте таймер.

    3. Еще лучше пароль считывать и сравнивать посимвольно, опять же через таймер.

    4. Разумеется, крайне нежелательно делать шифрование - Chr(ASC(symbol) + 1). Его просто раскроют.

    5. Кто сказал, что пользователю нужна немедленная реакция??? Считайте данные и скажите, что пароль проверится через несколько секунд, и пусть весь мир подождет :).

    6. Можно сделать на форме множество TextBox'ов и считывать из них информацию перед и после нужной (или считывать из одного, как удобнее). Тогда SoftIce будет часто "вылетать" и, возможно, у взломщика не хватит терпения :).

    7. Как вариант, можно считывать буквы сразу при их вводе, а затем считывать информацию просто "для отвода глаз". (Например, AlexChess написанная на VB).

      • сам процесс шифрования и дешифровки можно делать не сразу, а "кусками". Это предотвратит использование кода из вашей же программы для написания кейгена.

      • еще вариант - впихивать в прогу кучу любого ненужного "мусора".

      Список использованных функций можно посмотреть в дизассемблированном файле; чтобы этого не было видно: можно использовать вызов необъявленных API (где-то на VBStreets видел пример) Теперь посмотрим, как хранить информацию о том, зарегистрирован пользователь или нет. Если сделать в реестре пометку Registered=1, то понятно, к чему это приведет. Наилучший вариант - Писать данные пользователя в отдельный файл или ветку реестра (еще лучше туда и туда) и при каждом запуске проверять эту информацию. (так делает, например Voice Navigator). Можно также во время загрузки перед считыванием (и после) обращаться к "левым" веткам реестра и файлам. Это затруднит поиск.

    8. Проверяйте правильность данных не только во время запуска программы!!! Проверяйте их во всех случаях, когда это возможно. Если крэкер захочет пропатчить вашу программу, он просто замучается искать эти моменты. (и НИ в КОЕМ случае не делайте специальную процедуру для проверки правильности!!!! Пишите простым кодом. Это краеугольный камень данного метода) Так делает, например, переводчик Promt. Распространенная ошибка: люди думают, что если они запихнут информацию в какой-нибудь ключ CLSID, то его просто не найдут. Regmon все найдет!

    9. Если вы обнаружили, что программу пытаются взломать (неважно как обнаружили), можно сделать хитрый ход. То есть сказать "да, все хорошо, спасибо за регистрацию", а потом по немногу (или по многу) неправильно выполнять код программы. Но я его не люблю. НЕ по-честному это. Да и пользователь, скачавший программу и крэк, убедившись в ее глючности, не будет покупать ее версии никогда.

    10. Можно сделать несколько защит (например, 30-дневка и 30 запусков), но одну из них не афишировать. Тогда есть вероятность того, что крэкер, взломав одну из них, остановится на этом.

    11. Как защиту от патчинга можно посоветовать каждый раз проверять CRC своего приложения. Для этого есть готовые алгоритмы. И вставлять эту проверку простым кодом :). Шучу. Но проверять можно в нескольких местах программы. Хотя ее тоже можно обойти, но это лишняя трата времени крэкера. И не забывайте, что нельзя выдавать никаких сообщений!!!

    12. Если ваша программа работает с Интернетом, то появляется еще целая куча способов защиты. Думаю, что каких - понятно :). На сервере можно проверять правильность введенной информации и т.п., если вы, конечно, умеете это делать.

    13. И, наконец, можно использовать различные Пакеры и Протекторы (ASProtect, OriEn)*. Но опять же, для многих из них придуманы распаковщики. Несмотря на это, они могут обеспечить вполне приличный уровень защиты. Только если вы планируете располагать программу в Интернете, существуте одна проблема. "Умный" Касперский некоторые протекторы, имеющие защиту от SoftIce'а, принимает за вирусы (выдает предупреждение), в связи с чем закачка иногда бывает затруднена.

    Заключение

        Невозможно сделать защиту, которую невозможно взломать. Но есть возможность отбить охоту ее взламывать у "мелких" и "средних" крэкеров. Здесь приведены многие простые способы, которые могут значительно усложнить жизнь крэкеру. - для справки: говорят, что проги, написанные на VB ломаются сложнее*, чем написанные на Delphi. Неправда.
    Теперь, когда вы знаете все это, подумайте - стоит ли ваша программа таких усилий??? В России сложился такой склад ума у многих людей, что даже если ваша программа будет стоить 10 рублей, то у вас ее почти никто не купит, если она не "революционная" (или не написана под заказ), конечно. -Но Американцы наглеют с каждым днем. Простейшая прога, которую я бы сделал за 5 минут, стоит у них .... 20 баксов... Так что защищать программу или нет - решать вам, как говорится...

    To be continued...


    Примечания редактора:
    SoftIce - отладчик от NuMega. Один из самых мощных и удобных отладчиков реального времени.
    Пакеры (Packers) - программы для упаковки(сжатия) выполнимых файлов.
    Протекторы (Protectors) - программы для защиты уже скомпилированных приложений от дизассемблирования и/или отладки. Есть замечательный упаковщик PECompact
    поддерживающий расширения, а соответственно и свои методы шифрования и защиты приложений.
    "Касперский" - антивирус Лаборатории Касперского. На мой взгляд самый надежный из всех отечественных антивирусов, но при этом самый жадный до ресурсов, порой просто не дающий нормально работать.
    А на счет легкости взлома программ для разных компиляторов, скажем так, может быть немного отличается подход, но ни как компилятор не добавляет "защищенности" или какой-то "запутанности".