Совместное использование кода: использование Python и Tesseract для идентификации графической капчи

задняя часть Python .NET модульный тест

*Первоначальный автор этой статьи: ipenox, эта статья принадлежит оригинальной программе вознаграждений FreeBuf, перепечатка без разрешения запрещена

Друзья, занимающиеся веб-сканированием уязвимостей или тестированием на проникновение на предприятии, могут часто сталкиваться с необходимостью программной идентификации графических проверочных кодов. Во многих случаях проверочный код, очевидно, очень прост (особенно для не-интернет-компаний или приложений во внутренней сети компании), но, поскольку под рукой нет базы данных распознавания, он может выполнять распознавание человеческой плоти только с горечью или неохотно сдаваться. задание. Здесь я поделюсь своим опытом использования Python и механизма OCR tesseract с открытым исходным кодом для распознавания проверочного кода, а также предоставлю соответствующие исходные коды и примеры для справки.

1. О распознавании графического проверочного кода и tesseractOCR

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

Механизм OCR Tesseract был впервые разработан HP Labs и когда-то был одним из трех самых точных механизмов распознавания в индустрии OCR. Движок был передан Google в 2005 году и выпущен в рамках Google Project как проект с открытым исходным кодом. Tesseract предоставляет пользователям две формы автономной программы и API. Изображения капчи с чисто белым фоном и обычными символами без интерферирующих пикселей можно идентифицировать прямым вызовом программы tesseract. Для более удобной и гибкой идентификации в собственной программе можно использовать API tesseract.

Во-вторых, компиляция и установка Tesseract

Домашняя страница проекта Tesseract (GitHub.com/t-gentle-act-oh…) На вики есть подробные этапы компиляции и установки, можете посмотреть, в этой статье за ​​основу возьмем версию 3.05.01. Моя системная среда — RHEL 7.4, 64-разрядная версия. Сначала установите различные зависимые графические библиотеки с помощью yum, а затем установите Leptonica с исходным кодом (официальная домашняя страницаwoohoo.leptonICA.com/download.Контракт…, версия должна быть выше 1.74), компиляция и установка очень простая, после распаковки выполнить configure, make, make последовательно с параметрами по умолчанию Можно использовать команду установки. После установки выполнить:

exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig

В противном случае на следующем шаге скрипт настройки tesseract сообщит, что Leptonica не может быть найдена.

После распаковки исходного кода tesseract введите его в основной исходный каталог и последовательно выполните:

./autogen.sh
./configure--with-extra-libraries=/usr/local/lib
make
make install

для успешной установки.

Загрузите соответствующий файл данных в соответствии с руководством вики проекта, раздел «Файлы данных», поскольку мы распознаем только английский язык и цифровые проверочные коды, поэтому загрузите версию 3.04/3.05 английского файла eng.traineddata и поместите его в /usr/ local/share после загрузки каталога /tessdata. На данный момент установлен tesseract.

3. Инкапсулируйте API tesseract для Python

Tesseract предоставляет C++ API (интерфейс интерфейса — это класс TessBaseAPI), а основной функцией является функция TessBaseAPI::TesseractRect. Для простоты использования в Python я инкапсулировал его как модуль Python, а подробный код находится на github:GitHub.com/Squirt-O-Virgin/Dec…. Модуль называется decaptcha, а исходный файл включает в себя следующие четыре файла:

setup.py, depcaptcha.i, depcaptcha.h и depcaptcha.cpp.

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

python setup.py install

Команду swig необходимо вызывать во время установки, поэтому системе необходимо сначала установить swig.

Если tesseract не установлен по пути по умолчанию, обратитесь к коду setup.py, чтобы самостоятельно изменить пути к соответствующим файлам заголовков и файлам библиотек.

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

from decaptcha import Decaptcha

Если сообщается об ошибке, что libtesseract не может быть найден, возможно, каталог библиотеки tesseract (/usr/local/lib) не находится в каталоге поиска библиотеки Python. В это время вы можете добавить каталог библиотеки tesseract в файл /etc/ld.so.conf системы (команда ldconfig должна быть выполнена после добавления, чтобы она вступила в силу); или перед каждым модулем импорта декапчи выполнить команду следующий код Python:

import sys
sys.path.append("/usr/local/lib")

В-четвертых, установите библиотеку Python PIL.

Полное название PIL — Python Imaging Library, мощная и простая в использовании библиотека изображений. на его главной странице (Python ware.com/products/pi…), чтобы загрузить исходный код последней версии (в настоящее время 1.1.7) для установки. Перед установкой убедитесь, что в системе установлены библиотеки изображений, такие как png/jpeg/tiff. После распаковки выполните установку python setup.py в основном каталоге.

Он очень прост в использовании. Следующий фрагмент кода создает объект Image из файла изображения произвольного формата, выполняет преобразование формата и получает его размер и массив пикселей. Это занимает всего несколько строк кода:

from PIL import Image
img = Image.open('test.png') # Your image here!  
img = img.convert("RGBA") 
pixdata = img.load() 
width,height = img.size
print 'imgsize: %dx %d' % (width, height)
print'pixel[2,4]:', pixdata[2, 4] #eg,(0xD3,0xD3,0xD3,0xFF)

5. Распознавание фактического проверочного кода

На данный момент зависимая среда для распознавания графического кода проверки готова, и мы можем начать.

Процесс идентификации выглядит следующим образом:

1. Загрузите изображение с помощью Image, преобразуйте его в формат RGBA, а затем получите данные о пикселях;

2. Преобразование данных пикселей в формате RGBA в байтовую строку из 0 и 1 (фактически бинаризация);

3. Вызвать модуль декапчи для распознавания изображений и получить строку кода подтверждения

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

验证码demo.png

<img alt="captcha demo.png" src="http://image.3001.net/images/20180227/15197364027891.png!small" width="690" height="198"& ; amp;gt;</p>

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

Первая группа серии aa, цвет символов белый, а фон черный, поэтому вы можете попытаться преобразовать при условии, что среднее значение RGB (или сумма) пикселей больше определенного значения: r+g+b>= 480 равно 1, иначе 0.

Вторая группа серий bb, символы цветные, а фон белый.Условием преобразования считается наличие двух элементов в RGB больше 0xf0: int(r/240)+int(g/240)+int( b/240)

В третьей группе серий cc и символы, и фон монохромны, но есть точечные интерференции с неправильным расположением, цвет интерференционных точек такой же, как и цвет символов, но все они дискретны. В этом случае, если пиксель белый, фон равен 0. В противном случае, чтобы судить, является ли это дискретной точкой, вы можете просто определить, являются ли все точки справа и под ним белым фоном.

Четвертая группа серии dd, цвет символов фиолетовый, есть фоновые интерференционные линии. Распечатывая значение RGB каждого пикселя некоторых образцов изображений, действительно обнаруживается, что значение G-канала символьного пикселя равно 0, а в других случаях это либо фоновые, либо интерференционные линии.

Пятая группа ее рядов самая сложная, есть интерференционные линии, интерференционные точки, символы также деформированы, цвет не закреплен. На самом деле, он исходит из библиотеки php под названием securimage, и я боюсь, что его нельзя бинаризировать одной или двумя строками кода. Однако, если вы внимательно посмотрите на его узор, вы обнаружите, что его большой фон, интерференционные линии, интерференционные точки и символы выполнены в одном цвете. Таким образом, мы можем узнать, какие цвета фона статистическим способом (наиболее частым, естественно, является цвет фона). Кроме того, считаем отклонение между цветом каждого символа и цветом фона (складываем квадраты разницы rgb), узнаем пороговый диапазон величины отклонения интерференционной линии, символа и цвета фона, а затем бинаризировать его.Его также можно успешно бинаризировать, применив его. Проблему деформации персонажа не нужно волновать, просто оставьте ее для тессеракта.

Во время бинаризации я выводил бинаризованное изображение на экран с символом #.Вы можете увидеть эффект:

python decaptcha_demo.py aa aa1.gif

识别aa1.png

<img alt="идентифицировать aa1.png" src="http://image.3001.net/images/20180227/1519736461478.png!small" width="478" height="387"& amp;gt;</p>

Код проверки на самом деле 5648, и он идентифицируется как 5649, что является одним неправильным битом.

Вот правильная идентификация:

python decaptcha_demo.py bb bb1.jpg

识别bb1.png

<img alt="идентифицируйте bb1.png" src="http://image.3001.net/images/20180227/15197369327012.png!small" width="690" height="468"& amp;gt;</p>

Идентификация пятой группы:

python decaptcha_demo.py ee ee9.png > 1.txt

Поскольку картинка немного длинная и превышает количество колонок в терминале, она выводится в txt-файл, а затем открывается с помощью notepad++:

识别ee9.png

<img alt="identify ee9.png" src="http://image.3001.net/images/20180227/15197364863281.png!small" width="632" height="310"<img alt="identify ee9.png" amp;gt;</p>

Код проверки на самом деле 912065, а идентификация 912085, что является одним неправильным битом.

Взгляните на общие результаты:

В группе аа 10 проверочных кодов, а в целом правильно идентифицированы 5.

В группе bb 10 проверочных кодов, а в целом правильно идентифицируются 3.

В группе cc 10 проверочных кодов, а в целом правильно идентифицируются 9.

В группе dd 10 проверочных кодов, а в целом правильно идентифицируются 3.

В группе ee 10 проверочных кодов, а в целом правильно идентифицируются 4.

Группа aa, группа cc и группа ee могут быть распознаны хорошо, а большинство нераспознанных групп ошибаются только на один символ. Группы bb и dd плохо распознаются, а те, которые не распознаются, могут иметь два или три неправильных символа.

Эта стенограмма, на первый взгляд, некоторым друзьям может показаться очень некрасивой. Однако, пожалуйста, не будьте слишком пессимистичны, подумайте о соотношении ввода-вывода.В большинстве случаев, в дополнение к фиксированному коду шаблона, нам нужно всего лишь написать несколько строк двоичного кода, чтобы получить результат, что означает, что при тестировании , программная автоматизация может быть выполнена: не требуйте 100%, просто требуйте один выстрел на десять миль. Даже если уровень распознавания составляет всего 30%, вероятность идентифицировать 5 изображений подряд и точно распознать одно из них составляет 86%, что является не чем иным, как пустой тратой некоторых веб-запросов.

Так как библиотека изображений поддерживает загрузку изображений из памяти, комбинация с библиотекой запросов также очень удобна, ее можно загружать напрямую через HTTP-запросы, а содержимое перекидывать на изображение:

import requests,StringIO
r =requests.get(imgurl)
imgbuf = StringIO.StringIO(r.content)
img =Image.open(imgbuf)

Это легко и приятно?

6. Постскриптум

С помощью приведенных выше примеров и кодов вы можете изучить возможности tesseract. На самом деле, tesseract поддерживает обучение.Благодаря выборочному обучению точность его распознавания можно значительно повысить.Конечно, этот процесс немного сложен и не соответствует цели достижения гибкости в этой статье. После многих лет технического противостояния традиционный код проверки изображения устарел, но многие корпоративные веб-сайты все еще используются.Я надеюсь, что эта статья может вдохновить вас и помочь.

*Первоначальный автор этой статьи: ipenox, эта статья принадлежит оригинальной программе вознаграждений FreeBuf, перепечатка без разрешения запрещена