Щит и меч Фленов Михаил Хакер, номер #070, стр. 070-118-2 Теперь у тебя может сложиться впечатление, что защита в программе - вещь абсолютно бесполезная. Однако если вообще не ставить заслона от хака, то ломать начнут даже убежденные чайники, и уже не от жадности, а для того, чтобы Василий Пупло смог гордо сказать своим друзьям: «Сегодня я сломал прогу. Я, наверное, хакер. Можете не аплодировать и не вставать» :). Практикум защиты Когда я впервые (чисто для тренировки) попробовал сломать чужую программу, то на все про все ушло около получаса. В то время я очень плохо знал Assembler и сначала пытался разобраться в методе проверки пароля. Потом запустил поиск по функции выхода 21-го прерывания и нашел все точки выхода из программы. И тут я увидел конструкцию, которая народным языком описывается так: если результат проверки не содержит нужного значения, то выход. Именно так завершается большинство проверок пароля. Каким бы сложным ни был алгоритм, в конце концов будет простая проверка на правильность и переход на завершение проги. Для взлома нужно просто убрать выход, и все. Итак, чтобы усложнить жизнь хакерам, нужно замаскировать выход, а точнее, делать его нестандартным способом. Нормальный выход в Delphi – это закрытие основной формы, при этом вызывается метод Application.Terminate. Можно и напрямую вызывать этот метод. Но это уже стандартный выход, который генерирует событие WM_CLOSE и легко вычисляется. Программеры на Delphi могут при неправильном вводе пароля вызывать метод Halt. Этот метод не генерирует никаких событий, а просто вырубает программу. Не все хакеры смогут сразу вычислить такой выход, и это увеличивает время поиска. Первый этап Каким должен быть регистрационный код? Он может быть и простым (числовым), главное - сделать красивую проверку в разных местах. Например, после ввода пароля можно проверять код по маске. Допустим, мы решили, что первые четыре символа должны быть 1234, а символы с 10-го по 13-й - 4321. Что будет между ними и после этого, не имеет значения, например, число 1234001904321 будет соответствовать шаблону. Для реализации проверки по шаблону можно использовать примерно такой код, какой указан на листинге. Функции Terminate1 и Terminate2 - это выход из программы, в них можно также насовать бесполезных расчетов и между ними незаметно вставить вызов Halt. Почему две функции? Они должны быть немного разными, чтобы усложнить жизнь хакера. Для взлома одной-единственной было бы достаточно заблокировать ее вызов. Между реальными проверками делаем множество бесполезных расчетов с вызовом метода Close, который закрывает приложение. Эти расчеты и проверки должны работать так, чтобы результат был всегда разным, но при этом выход из программы никогда не выполнился. Это опять же бутафория, которая нужна только для отвода глаз. |