Безопасность в Дельфи

       

«Как написать программу которую будет дешевле купить чем сломать»


Раздел "Анти крэковые мучения" Часть I. Автор Дмитрий Логинов
дата публикации 10 января 2000 г.

Часть II.

Я не стал подробно останавливаться на других средствах, но о них я упомяну чуть ниже, когда попытаюсь описать основные ошибки в созданных и предлагаемых защитах от копирования.

Серийные номера.

Итак, самая распространенная защита, если это можно назвать защитой. Эта защита делится на три части. Первые самые ранние и легкие варианты этой защиты, которые, правда, встречаются и по сей день, это просто ввод некоей последовательности символов, которую программа сверяет с эталоном. Короче говоря, пароль. Обычно написание таких вещей сводится к такому виду: TPasswordForm=class(TForm) … EditPassword : TEdit; … end; … procedure TPasswordForm.EditPasswordKeyPressed (Sender : TObject; var Key : char); Begin If (Key=#13) Then begin … if EditPassword.Text<>OkPassword then begin MessageBox(handle,'Неправильный серийный номер!', 'Ошибка',MB_ICONHAND+MB_OK); Close; end; … End; End; Давайте разберем эту "защиту". Существуют несколько способов войти в уже открытую дверь.
  1. Поставить брейк на функцию виндов GetWindowText (старый, описанный во всех учебниках) BPX GETWINDOWTEXT. Далее жмем F5, пущаем прогу. Когда брейк сработает, жмем F11 - выполняем функцию, потом ставим брейк на область памяти, куда это все записалось. Если сразу нет кода на проверку строки! Опять F5. Бах! И вот мы в коде, реализующем проверку. Далее смотрим данные в сверочной строке и выписываем на бумажку.
  2. Другой, более железный, способ. Поставить брейк на MessageBox - BPX MESSAGEBOX. Когда брейк сработает, мы поднимаемся вверх до ближайшего условного перехода. Опа! Опять у нас есть пароль!
  3. Далее, для совсем уж безграмотных. Т.е. неспособных определить, какие функции винды используются при регистрации! Так же этот способ подойдет, если программа не сообщает о неправильной регистрации. Те, кто придумал это, считают себя слишком умными. А если действительный покупатель программы опечатался? У него что, винт форматировать? Прогу сносить? В общем, в жизни не кричащих программ не бывает. Но все-таки, чтобы вы знали. Сл. способ, вводим рег-ную инфу, переключаемся в айс и ставим на место, где эта инфа хранится брейк по чтению. Когда брейк срабатывает, смотрим условные переходы. Там где идет сверка с эталоном или контрольная сумма, мы выписываем нужный серийный номер!
Вот и все! Есть еще методы, но мне о них только рассказывали. Та троица, о которой я рассказал, мной опробована на практике. И не было еще пока ни одной регистрационной проги, попадавшей ко мне, из которой я не вытащил бы серийные номера. Поверьте, это очень легко, особенно если набита рука. Смотрим дальше. Есть разновидность проверки серийки - это ввод имени владельца и вычисления эталонной серийки. Также это может вычисляться из серийного номера винта, из версии биоса, из версии видео-биоса, ну и т.д. Не так много вариантов. Но самое главное! ПРИ СОБЫТИЙНОЙ ОТЛАДКЕ МЫ НЕ ИЩЕМ ПРАВИЛЬНЫЙ ПАРОЛЬ, МЫ ВЕШАЕМСЯ НА СОБЫТИЕ СВЕРКИ С ВВЕДЕННЫМ ПАРОЛЕМ!!! А как вы там вычисляете эталон, никого не мучает. Я все равно это перехвачу на 100%. Вы ограничены в этом методе защиты. Ваша программа уязвима. Ваше время потрачено зря. БУРЖУИНЫ СТАВЯТ ТАКУЮ ЗАЩИТУ, ЧТОБЫ НЕ ОСТАВЛЯТЬ ДВЕРЬ ОТКРЫТОЙ. Чтобы не каждый дурак сумел бы использовать прогу. Поверьте, там за бугром проще выложить пару десятков Зеленых Президентов, чем каждый раз дрожать запуская ломанную прогу. А то еще накапает кто-нибудь Но это все лирика. Промежуточный итог и совет.
  • Никогда не пишите функции типа CheckPassword : boolean
  • Никогда не храните, и не вычисляйте ключевых слов в программе только лишь для того, чтобы произвести банальную проверку.
  • Никогда явно сразу после проверок нужных вам флагов и обнаружения несоответствия, не кричите об этом тут же.
  • Не используйте стандартных методов сверки, как то if EnterPassword=NeedPassword, или цикл и составление некоей контрольной суммы и проверки ее, или произведения неких операций, операндами которых служат введенный и эталонный пароли и т.д.
  • Старайтесь вообще избегать проверок. Используйте возможность работать с данными, как с кодом и наоборот. Например, раньше был такой прием. Содержалась таблица адресов процедур или джампов, а программа к введенному паролю добавляла константу, получая смещение в таблице переходов. И хлоп, туда! Этот прием стар, как мир. Но он менее тривиален, чем сравнение строк. Возьмите массив переменных процедурного типа, или variant. Запихайте туда сколько-нибудь OLE-контейнеров и где-то в этой куче поставьте переменную процедурного типа с адресом туда, куда нужно. Ну вобщем, импровизируйте.
  • Т.к. использование серийных номеров не годится для построения полноценной защиты от копирования. То используйте этот метод, как ловушку для невнимательного кракера. Когда вы четко будете знать, что если запускается какая-то процедурка, то программа взломана. Элементарной ловушкой может быть условный переход, под ним MessageBox, сообщающий "Вы завершили регистрацию!", а затем вызов загадочной БОЛЬШОООЙ процедуры. Некоторые сразу подумают, что именно в это место программы нужно попасть, и попадаются. Только неявностью вы можете победить кракера. Хорошая наблюдательность дефицит в этом мире.
  • Давайте сомнительные подтверждения на действия пользователя. Например, регистрация завершилась, а программа выдает ошибку, предлагая позвонить Продавцу. Какой-нибудь торопыга будет спешить и подумает, что это неверный ход программы. И действительно, программа после этого закрывается. На самом же деле, этот ACCESS VIOLATION 00000:7632621 не что иное, как неявный замаскированный вывод идентификационного номера машины. Честный покупатель звонит в магазин, сообщает номер своей лицензии (или товарного чека) и говорит о чудовищной ошибке "вашей программы". А вы ему говорите, нажмите CTRL+ALT+S. Опа, и программа побежала дальше.
  • Никогда не ставьте ограничений на время исполнения или количество запусков вашей ШАРЕВАРНОЙ программы. Это еще более легкая защита. Примеры ломки:
    1. Ставлю на компьютере 2010 год, ставлю программу и возвращаю дату на место. Все!
    2. Существуют "пускалки", которые удерживают заданную дату при пуске какой-нибудь программы. И вертают ее на место при выходе из шареварного подарка.
    3. Существую два изумительных инструмента МОНИТОР REGISTRY и МОНИТОР ФАЙЛОВ. Используя их, я легко могу определить, где и что вы прячете. Поверьте мне, этого достаточно. И уверяю вас, контрмеры для этих трех шагов обнаруживаются также элементарно и теми же средствами.
    Итак, вы получили представление о мифе "достаточной защищенности регистрационных и шареварных программ". И если только вы не продаете свою программу где-нибудь в колхозе Ильича близ города Мухосранск, не используйте эти методы по прямому назначению, т.е. для "защиты". А используйте их для расстановки ловушек. В следующей статье я расскажу вам, как ломаются "зашифрованные" программы. Криптография достаточно романтичная область математики на службе у дядечек в сером. Ни в одном ВУЗе не преподается достаточно раскрыто Теория Чисел, это военная математика. Ее призвали и нет приказа о дембеле. А дядьки из всяких там "Б" (поймите меня правильно, я имею ФСБ, КГБ, а не что-то еще ;))) очень хорошо умеют пускать слухи. Люди верят этим слухам и имеют не правильное представление о том, что такое зашифрованные данные. Но об этом позже.

    Дмитрий Логинов,
    10 января, специально для «Королевства Дельфи»



    Содержание  Назад  Вперед