Разбор простейшей капчи (C#) - Proxy-Base Community - Анонимность и безопасность в интернете.
Бесплатные прокси. Количество:
Прокси для пользователей форума (API). Количество:
Купить доступ к прокси-листам (API). Количество:
 



Информация по хайдам / репутации

(РЕКОМЕНДУЮ) №1 >>>DDos Атака<<|>>DDoS Service<<< ДДОС СЕРВИС<<|>>Заказать DDOS
Бесплатные прокси уже в Telegram
Все инфопродукты и приватная информация бесплатно
Старый 08.08.2011, 19:00   #1 (permalink)
VPN
 
Аватар для kekc
 
Регистрация: 11.05.2009
Адрес: 05
Сообщений: 1,405
Member ID: 8
ICQ 12400042

Репутация: 1421
Репутация: 1421
Сказал(а) спасибо: 1,275
Поблагодарили 1,346 раз(а) в 714 сообщениях
Топикстартер (автор темы) По умолчанию Разбор простейшей капчи (C#)

Какое-то время назад мне пришлось сделать программку, которая скачивала в автоматическом режиме файлы с одного достаточно известного сайта. Проблема /на первый взгляд/ состояла в том, что там была капча. Однако одного взгляда на нее было достаточно, чтобы понять, решаемо и очень быстро По прошествии нескольких лет снова наткнулся на тот проект и решил вот выложить на хабр. Сразу оговорюсь, сайт называть не буду ибо капча там до сих пор такая и пусть такой и остается.

Этап первый: Сбор информации

Перво-наперво была написана простенькая программка, которая дергала адрес с изображением капчи и складировала полученные изображения в отдельной папке. Когда я посмотрел на те 50 изображений, которые надергала программа, я понял, что все еще проще, чем я думал.

Вот посмотрите, это примеры капчи:

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536178.png

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536179.png

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536180.png


Цветов мало, цвет бэкграунда и самих цифр эпизодически менялся, но грани цифр видны четко, шумов нет. Соответственно я выбрал простейший вариант решения — простейший разбор по маске.

Этап второй: Первоначальный разбор изображения, создание маски


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

Приведу пример тех изображений:

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536181.png

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536182.png

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536183.png

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536184.png


Здесь я привел маску с только самыми часто встречаемыми цветами. Чтобы отсеять лишнее я убрал из маски все цвета, которые содержат менее 25 пикселей на форме. В принципе это дает возможность промахнуться с определением, если в капче будет 1-2 символа, которые займут меньше 25 пикселей, но я ни одного такого изображения в этой капче не встретил и заморачиваться не стал.

Итак в последнем отображении видно, что у нас фактически есть маска. Абсолютно чистая, которая выглядит в редакторе вот так:

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536185.png


Привожу код, которым выдергивал варианты масок по цветам:

PHP код:
        public Bitmap ClearBitmap(Bitmap inputColor clr)

        {

            var 
result = new Bitmap(input.Widthinput.Height);

            for (var 
0input.Widthx++)

            {

                for (var 
0input.Heighty++)

                {

                    var 
color input.GetPixel(xy);

                    
result.SetPixel(xyclr == color Color.Black Color.White);

                }

            }



            return 
result;

        }



        public 
void Main()

        {

            var 
bitmap = new Bitmap("D:\\check_image1227.png");

            var 
palette = new Dictionary<Colorint>();

            for (var 
0bitmap.Widthx++)

            {

                for (var 
0bitmap.Heighty++)

                {

                    var 
clr bitmap.GetPixel(xy);

                    if (!
palette.ContainsKey(clr))

                    {

                        
palette.Add(clr1);

                    }

                    else

                    {

                        
palette[clr] = palette[clr] + 1;

                    }

                }

            }

            var 
0;

            foreach (var 
c in palette)

            {

                if (
c.Value 30)

                {

                    var 
temp this.ClearBitmap(bitmapc.Key);

                    
temp.Save(String.Format("D:\\mask-{0}.bmp"i));

                    
i++;

                }

            }

        } 
Этап три: В бой!
Когда я увидел работу кода указанного выше, осталось только собрать все числа используемые в капче и приступать. Для этого была запущена программа, которая сохраняет изображения капчи с целью получить 200 изображений. Из полученных изображений выбрал те, в которых были отображены все основные символы и с помощью кода приведенного выше были получены их маски. Итог этой работы выглядел так:

Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536186.png


Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536187.png


По какой-то причине, в капче не использовался символ 9, но не важно. Дальше просто. Каждое число берем в квадрат, правая часть — минимальный бит, левая — максимальный. Кто работал с ассемблером на 8086 и делал маски символов меня поймет, для остальных пример:


Л®вёј/div>
http://www.inattack.ru/static/images/editor_2011/user_1/articles_1300536188.png



Дальнейший алгоритм выглядел так. Была написана функция, которая очищала полученное изображение от белых точек сверху, снизу и по бокам. И была написана функция, которая возвращала массив чисел, представляющих указанную область. После этого все было просто. Так как все делалось автоматически, я сделал так, что после очистки изображения и отрезания ненужных данных делалась проверка, чтобы высота изображения попадала под размер цифры (в данном случае имело смысл искать цифру). После чего в цикле слева направо сравнивалась область с каждой цифрой до совпадения. Совпала цифра -> передвигаемся по изображению на ширину символа вправо. Проверяем следующую область и так далее. В итоге, все получилось не сильно быстрым, я приложу проект, чтобы вы могли сами посмотреть, но решение возвращало 100% правильно распознанную капчу.
kekc вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Старый 09.08.2011, 09:32   #2 (permalink)
HTTP/S
 
Аватар для buket
 
Регистрация: 10.06.2009
Сообщений: 72
Member ID: 563
ICQ 589990

Репутация: 60
Репутация: 60
Сказал(а) спасибо: 8
Поблагодарили 46 раз(а) в 20 сообщениях
По умолчанию Re: Разбор простейшей капчи (C#)

а где сам проект?
__________________
[SIGPIC][/SIGPIC]
buket вне форума   Ответить с цитированием
Старый 30.10.2012, 14:23   #3 (permalink)
HTTP/S
 
Регистрация: 25.08.2012
Адрес: Москва
Сообщений: 36
Member ID: 30261
ICQ 571-558-846

Репутация: 120
Репутация: 120
Сказал(а) спасибо: 1
Поблагодарили 40 раз(а) в 20 сообщениях
По умолчанию Re: Разбор простейшей капчи (C#)

Что-то не картинок, не кода толком нету... ТС ты хоть видел, что скинул?
Kandi вне форума   Ответить с цитированием
Старый 12.11.2012, 00:54   #4 (permalink)
***VIP*** Reverser
Proxy-Base.Org Team
 
Аватар для staticspb
 
Регистрация: 07.11.2012
Адрес: http://gegechkori.ru
Сообщений: 138
Member ID: 32077
ICQ 900002
Skype static.spb

Репутация: 1191
Репутация: 1191
Сказал(а) спасибо: 90
Поблагодарили 397 раз(а) в 101 сообщениях
По умолчанию Re: Разбор простейшей капчи (C#)

Кому интересно, могу поделиться распознавателем картинок на PHP.
Писал под себя, для разбора номеров на авито (они там картинками выводятся), но скрипту можно скормить пример шрифта в картинке (с указанием букв), и он будет его разбирать. Легко "скармливал" ему почтовые коды, и прочую лабуду. Код сырой, и не дорабатывался в связи с отличной работой с авито. Но думаю можно его заставить разбирать некоторые капчи и т.д.
Работает на чистом GD
staticspb вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.





DDoS Protected




Мы в твиттере, Proxy-Base.Org Twitter

Proxy-Base Community - Анонимность и безопасность в интернете.
Наши партнеры: CRC Labs, SEO-Crack.Com, Garsuk.Com, SED Team, Skladchik.com, BSS Family

Powered by vBulletin® | Булка сделана в пекарне®
Copyright © 2000 - , Jelsoft Enterprises Ltd. Перевод: zCarot
Вся информация на сайте выложена исключительно в ознакомительных целях.