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

Молот и топор

Shturmovik (Shturmovik@bk.ru)

Хакер, номер #073, стр. 073-108-2


LoadString(hInstance, 1, Buffer, 255);

Здесь 1 - это индекс строки в ресурсе, buffer - символьный массив в качестве буфера, его еще надо объявить, 255 - максимальный размер буфера. Следующей строкой мы уже присваиваем значение заголовку формы:

Form1.Caption := StrPas(Buffer);

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

Сила в картинке!

Есть и другой интересный способ - это вывод рисунка вместо текста. Его мы сейчас и рассмотрим. Создадим две картинки с текстом Unregistered и Registered соответственно. Как поместить в ресурс файл картинки (*.jpg) тебе уже должно быть известно. В приведенном ниже коде я показал, как извлечь их оттуда (не забудь добавить модуль JPEG в uses).

Выгружаем рисунок из ресурса

var

OurJPG: TJPEGImage;

ResStream: TResourceStream;

begin

try

OurJPG := TJPEGImage.Create;

ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);

OurJPG.LoadFromStream(ResStream);

Image1.Canvas.Draw(10,10, OurJPG);

finally

OurJPG.Free;

ResStream.Free;

end;

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

Генератор оттенков зеленого цвета

var

bufer: string;

gencolor: integer;

begin

randomize;

gencolor:=random($FF);

bufer:='$00'+IntToStr(gencolor)+'00';

Panel1.Color:=StrToInt(bufer);

end;

Нетрудно догадаться, что все приведенные методы работают лишь на этапе регистрации, в данном случае мы строим защиту только в одном месте, что в корне неправильно. Пойдем дальше :).

Ход конем

Если ты заюзал все вышеперечисленные методы, новичок-взломщик будет очень долго ломать голову над исследованием процесса регистрации. Опытный хакер не увидит вообще никакой преграды на своем пути, а просто начнет трассировать программу от события нажатия кнопки. Попробуем усложнить ему жизнь, считывая данные не процедурой нажатия кнопки, а раньше или позже нажатия. В своем исходнике я использовал третье поле, якобы предназначенное для ввода специального ключа. Конечно, это сделано для отвода глаз :), а самое главное тут - это три функции проверки данных. Если быть точнее, на одну функцию проверки будут приходиться три функции считывания. Разберемся поподробнее. Допустим, мы сделали регистрационный код, ориентированный на 9 знаков. Теперь создадим обработчик события OnKeyPress для компонента Tedit, который будет являться как раз полем для ввода серийного номера. Суть в том, что мы будем отслеживать первую половину серийного номера, введенного в поле Tedit, и передавать ее значение какой-нибудь глобальной переменной. В этом случае лучше опять скрыться за шифрованием (вспомни защиту строковых констант). Следующую половину мы получаем, перейдя на поле для ввода специального ключа. В данном случае нам надо сделать это в обработчике событий поля. Вторую половину тоже желательно подвергнуть шифровке. В исходнике я осуществил все то, о чем было сказано выше. Теперь займемся обманом. Итак, мы поместили зашифрованные данные в переменную. Взломщик, конечно, может перехватить наши действия, поставив в отладчике точку останова на считывание текста, но от этого, во-первых, никуда не денешься, а во-вторых, есть большая вероятность запутать и обмануть взломщика. Вернемся к нашим баранам, то есть к кнопке. Тут все просто, кнопка с ее обработчиком – чистая фикция, после нажатия на нее вызывается процедура псевдопроверки кода и что-нибудь возвращается в качестве результата, в это же время нажатие кнопки запускает таймер, а еще раньше - генератор случайных чисел для выставления интервала задержки таймера. Теперь в обработчике таймера будет располагаться результат нашей проверки либо вызов самой функции проверки. Трассируя обработчик события нажатия на кнопку, взломщик попадет на первую подложную процедуру, которую он начнет исследовать. В этом случае желательно засветить регистрационные данные в теле функции, тем самым направив взломщика на якобы светлый путь. Посмотри на врезку, там я расположил общий код для этого пункта статьи. Там нет только самой функции проверки, которая есть в исходнике на диске.

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