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

Программа с глазами

Филипп Коряка

Хакер, номер #073, стр. 073-120-1


(phil@pereslavl.ru)

Борьба с защитой, основанной на неумении программ видеть

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

Такой способ защиты используется на многих сайтах. Из самых популярных следует упомянуть регистрацию на narod.yandex.ru и отправку SMS-сообщений с сайта оператора сотовой связи Билайн. Для экспериментов возьмем сайт www.beelinegsm.ru и попробуем преодолеть используемую там защиту, суть которой сводится к следующему: Для всех желающих отправить SMS сообщение генерируется графическое изображение четырех цифр. При этом цифры наносятся на изображение со смещением, как по горизонтальной, так и по вертикальной оси. Кроме того, на изображение наносится шум в виде черных точек. Для успешной отправки SMS сообщения необходимо прочитать четырехзначное число и ввести его в специальное поле. SMS-сообщение будет отправлено только в том случае, если введено правильное число. Отправка SMS в автоматическом режиме может нанести большой урон компании, поскольку, во-первых, это потенциальная лазейка для спама, а во-вторых - может породить всяческие SMS-гейты типа EMAIL2SMS.

Подготовка

Итак, приступим. В качестве языка реализации будем использовать perl, а для работы с графическими изображениями - библиотеку GD. Одной из самых часто используемых функций данной библиотеки будет функция getPixel(), которая возвращает цвет точки, координаты которой передаются ей в качестве аргументов. Следует заметить, что в случае, если аргументы функции getPixel() выходят за пределы изображения, она просто возвращает цвет фона, избавляя нас от написания лишнего кода, отслеживающего выход за границу изображения. Существуют различные способы представления цвета. В случае с функцией getPixel() мы будем использовать целые числа без преобразования их в формат RGB или другие, более удобные для человека форматы.

Для начала загрузим картинку с сайта www.beelinegsm.ru из раздела отправки SMS-сообщений. Над ней мы и будем проводить свои эксперименты.

Поскольку данная картинка достаточно маленькая, мы напишем простенькую программу, которая будет переводить ее в более удобный для восприятия вид:

$img = new GD::Image("picture.gif");

for ($j=0; $j<20; $j++){

print "\n";

for ($i=0; $i<47; $i++){

print $img-> getPixel($i, $j) . " ";

}

}

Данная программа поочередно определяет цвет каждого пиксела изображения и печатает его на экран. Очевидно, что в таком виде изображение легче воспринимается.

Избавляемся от шумов

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

Содержание  Вперед на стр. 073-120-2