Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #70, ОКТЯБРЬ 2004 г.

Щит и меч

Фленов Михаил

Хакер, номер #070, стр. 070-118-2


Теперь у тебя может сложиться впечатление, что защита в программе - вещь абсолютно бесполезная. Однако если вообще не ставить заслона от хака, то ломать начнут даже убежденные чайники, и уже не от жадности, а для того, чтобы Василий Пупло смог гордо сказать своим друзьям: «Сегодня я сломал прогу. Я, наверное, хакер. Можете не аплодировать и не вставать» :).

Практикум защиты

Когда я впервые (чисто для тренировки) попробовал сломать чужую программу, то на все про все ушло около получаса. В то время я очень плохо знал Assembler и сначала пытался разобраться в методе проверки пароля. Потом запустил поиск по функции выхода 21-го прерывания и нашел все точки выхода из программы. И тут я увидел конструкцию, которая народным языком описывается так: если результат проверки не содержит нужного значения, то выход. Именно так завершается большинство проверок пароля. Каким бы сложным ни был алгоритм, в конце концов будет простая проверка на правильность и переход на завершение проги. Для взлома нужно просто убрать выход, и все.

Итак, чтобы усложнить жизнь хакерам, нужно замаскировать выход, а точнее, делать его нестандартным способом. Нормальный выход в Delphi – это закрытие основной формы, при этом вызывается метод Application.Terminate. Можно и напрямую вызывать этот метод. Но это уже стандартный выход, который генерирует событие WM_CLOSE и легко вычисляется.

Программеры на Delphi могут при неправильном вводе пароля вызывать метод Halt. Этот метод не генерирует никаких событий, а просто вырубает программу. Не все хакеры смогут сразу вычислить такой выход, и это увеличивает время поиска.

Первый этап

Каким должен быть регистрационный код? Он может быть и простым (числовым), главное - сделать красивую проверку в разных местах. Например, после ввода пароля можно проверять код по маске. Допустим, мы решили, что первые четыре символа должны быть 1234, а символы с 10-го по 13-й - 4321. Что будет между ними и после этого, не имеет значения, например, число 1234001904321 будет соответствовать шаблону. Для реализации проверки по шаблону можно использовать примерно такой код, какой указан на листинге.

Функции Terminate1 и Terminate2 - это выход из программы, в них можно также насовать бесполезных расчетов и между ними незаметно вставить вызов Halt. Почему две функции? Они должны быть немного разными, чтобы усложнить жизнь хакера. Для взлома одной-единственной было бы достаточно заблокировать ее вызов.

Между реальными проверками делаем множество бесполезных расчетов с вызовом метода Close, который закрывает приложение. Эти расчеты и проверки должны работать так, чтобы результат был всегда разным, но при этом выход из программы никогда не выполнился. Это опять же бутафория, которая нужна только для отвода глаз.

Назад на стр. 070-118-1  Содержание  Вперед на стр. 070-118-3