все ненавидятпроверяющий код- эти надоедливые картинки, показывающие текст, который нужно набрать, прежде чем попасть на сайт. дизайнпроверяющий кодЕго цель — избежать автоматического заполнения форм компьютером, подтвердив, что вы — реальный человек. Но с появлением глубокого обучения и компьютерного зрения капчи теперь часто легко взломать.
Я читал Адриана Роузброка.Deep Learning for Computer Vision with Python". В книге Адриан описывает, как он использовал машинное обучение для обхода капчи на сайте New York E-ZPass:
Адриан не имеет доступа к сборке приложенияпроверяющий кодисходный код. Чтобы сломать систему, ему пришлось загрузить сотни примеров изображений и вручную обработать их для обучения собственной системы.
Но если то, что мы хотим сломать, является открытым исходным кодомпроверяющий кодСистема, а что, если у нас есть доступ к исходному коду?
я посетилПлагины для WordPress.orgканал и искал "captcha". Первым результатом поиска была Really Simple CAPTCHA с более чем миллионом активных установок:
Лучше всего, это с открытым исходным кодом! Теперь, когда мы создалипроверяющий кодисходный код, его должно быть довольно легко сломать. Чтобы сделать это еще более сложным, давайте установим себе ограничение по времени. Мы можем полностью сломать это за 15 минутпроверяющий кодсистема? Приходите и попробуйте!
важный:Это ни в коем случае не критика плагина Really Simple CAPTCHA или его автора. Сам автор плагина заявил, что он больше не безопасен и рекомендует использовать другие плагины. Это просто веселая и быстрая техническая задача. Но если вы один из миллиона или около того оставшихся пользователей, возможно, вам стоит переключиться на другой плагин :)
испытание
Чтобы разработать план атаки, взгляните наReally Simple CAPTCHAКакая картинка будет сгенерирована. На тестовом сайте мы видим следующие изображения:
Итакпроверяющий кодКажется, четыре буквы. Проверьте это в исходном коде PHP:
public function __construct() {
/* Characters available in images */
$this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
/* Length of a word in an image */
$this->char_length = 4;
/* Array of fonts. Randomly picked up per character */
$this->fonts = array(
dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf',
dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf',
dirname( __FILE__ ) . '/gentium/GenBkBasBI.ttf',
dirname( __FILE__ ) . '/gentium/GenBkBasB.ttf',
);
Правильно, он использует случайную комбинацию четырех разных шрифтов для создания четырехбуквенногопроверяющий код. И, как видите, в коде никогда не используется O или I, чтобы не запутать пользователя. Всего нам предстоит идентифицировать 32 возможных буквы и цифры. нет проблем!
Время: 2 минуты
инструмент
Прежде чем перейти к следующему шагу, упомяните инструменты, которые мы будем использовать для решения проблемы:
Python 3
Python — интересный язык программирования с множеством библиотек машинного обучения и компьютерного зрения.
OpenCV
OpenCV — популярная среда компьютерного зрения и обработки изображений. Мы собираемся использовать OpenCV для обработкипроверяющий кодкартина. Поскольку у него есть Python API, мы можем использовать его прямо из Python.
Keras
Keras — это фреймворк для глубокого обучения, написанный на Python. Это позволяет легко определять, обучать и использовать глубокие нейронные сети с минимальным кодом.
TensorFlow
TensorFlow — это библиотека машинного обучения Google. Мы бы программировали в Keras, но вместо фактической реализации самой логики нейронной сети, Keras использует библиотеку Google TensorFlow для выполнения тяжелой работы за кулисами.
Хорошо, вернемся к нашему вызову!
Создайте наш набор данных
Для обучения любой системы машинного обучения нам нужны обучающие данные. сломатьпроверяющий кодсистемы, нам нужны обучающие данные, подобные этим:
Учитывая, что у нас есть исходный код плагина WordPress, мы можем настроить его и сохранить 10 000 из них вместе.проверяющий кодкартинки и соответствующие ответы.
После нескольких минут взлома кода и добавления простого цикла for у меня была папка с обучающими данными — 10 000 файлов PNG с именами файлов, соответствующими правильным ответам:
Это единственная часть, где я не буду давать вам пример кода. Мы делаем это для обучения, и я не хочу, чтобы вы на самом деле взламывали сайты WordPress. Тем не менее, я дам вам эти 10 000 изображений в конце, чтобы вы могли повторить мои результаты.
Время: 5 минут
упростить проблему
Теперь, когда у вас есть обучающие данные, вы можете использовать их непосредственно для обучения нейронной сети:
При достаточном количестве обучающих данных этот подход может сработать, но мы можем упростить задачу, чтобы решить ее. Чем проще задача, тем меньше обучающих данных и меньше вычислительной мощности требуется для ее решения. Ведь у нас всего 15 минут!
К счастью,проверяющий кодКартинки всегда состоят всего из четырех букв. Если мы сможем найти способ разделить картинки так, чтобы каждая буква находилась на отдельной картинке, нам нужно всего лишь научить нейронную сеть распознавать по одной букве за раз:
У меня нет времени просматривать 10 000 обучающих изображений и вручную разбивать их в Photoshop. Это займет несколько дней, а у меня осталось всего 10 минут. Мы пока не можем разделить изображение на четыре части одинакового размера, потому чтопроверяющий кодПлагин предотвращает это, случайным образом размещая буквы в разных горизонтальных позициях:
К счастью, мы все еще можем справиться с этим автоматически. При обработке изображений часто необходимо обнаруживать блоки пикселей одного цвета. Границы вокруг этих смежных блоков пикселей называются контурами. В OpenCV есть одинLndContours() можно использовать для обнаружения этих непрерывных областей.
Итак, мы начинаем с необработанного изображения капчи:
Затем преобразуйте изображение в чисто черно-белое (это называется пороговым значением), что упрощает поиск непрерывных областей:
Затем используйте OpenCVLndContours() для обнаружения разных частей изображения, содержащих блоки пикселей одного цвета:
Следующим шагом является просто сохранить каждый регион как другой файл изображения. Учитывая, что мы знаем, что каждое изображение должно содержать четыре буквы слева направо, мы можем использовать это, чтобы пометить буквы во время сохранения. Пока мы сохраняем в порядке, мы сможем сохранить каждое изображение изображения и его соответствующее название буквы.
Но подождите - я вижу проблему! иногдапроверяющий кодЕсть буквы, которые перекрываются следующим образом:
Это означает, что мы разделим две буквы на область:
Если вы не справитесь с этой проблемой, вы создадите плохие обучающие данные. Нужно это исправить, чтобы машины случайно не научились распознавать две перекрывающиеся буквы как одну.
Простой способ заключается в том, что если область контура шире, чем ее высота, это означает, что, вероятно, две буквы перекрываются. В этом случае мы можем разделить перекрывающиеся буквы на две посередине и рассматривать их как две разные буквы:
Теперь, когда мы нашли способ разделить отдельные буквы для всехпроверяющий кодизображение, чтобы сделать это. Цель состоит в том, чтобы собрать разные варианты каждой буквы. Мы можем хранить каждое письмо в соответствующей папке, чтобы оставаться организованным.
После того, как я отделил все буквы, моя папка W выглядит так:
Время: 10 минут
Развивайте и тренируйте нервную систему
Поскольку нам нужно распознавать только изображения отдельных букв и цифр, нам не нужны очень сложные структуры нейронных сетей. Распознавать буквы намного проще, чем распознавать сложные картинки, такие как кошки и собаки.
Мы собираемся использовать простую структуру сверточной нейронной сети с двумя сверточными слоями и двумя полносвязными слоями:
Если вы хотите узнать больше о работе нейронных сетей и о том, почему они идеально подходят для распознавания изображений, см.книга Адрианаилимои предыдущие статьи.
Для определения этой структуры нейронной сети требуется всего несколько строк кода с использованием Keras:
# Build the neural network!
model = Sequential()
# First convolutional layer with max pooling
model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Second convolutional layer with max pooling
model.add(Conv2D(50, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Hidden layer with 500 nodes
model.add(Flatten())
model.add(Dense(500, activation="relu"))
# Output layer with 32 nodes (one for each possible letter/number we predict)
model.add(Dense(32, activation="softmax"))
# Ask Keras to build the TensorFlow model behind the scenes
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
Теперь мы можем его тренировать!
# Train the neural network
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)
После 10 проходов по обучающему набору данных мы достигли почти 100% точности. На данный момент мы должны иметь возможность автоматически обойти это в любое время.проверяющий код! Мы сделали это!
Время: 15 минут (удачи!)
Используйте обученную модель для обработки капчи
Теперь, когда у вас есть обученная нейронная сеть, с ее помощью легко взломать настоящую капчу:
- 1. Загрузите изображение капчи с веб-сайта, на котором используется плагин WordPress.
- 2. Используя метод генерации набора обучающих данных, описанный в статье, разделите изображение капчи на четыре изображения букв.
- 3. Используйте нейронную сеть, чтобы делать прогнозы для каждого изображения буквы отдельно.
- 4. Используйте четыре угаданные буквы в качестве ответа на капчу.
- 5. Карнавал!
При взломе капчи наша модель выглядит так:
Или из команды:
Приходите и попробуйте!
Если вы хотите попробовать это сами, вы можете сделать это здесьнайти код(http://t.cn/R8yFJiN). Он содержит 10 000 примеров изображений и весь код для каждого шага в статье. См. инструкции по запуску в файле README.md.
Но если вы хотите понять, что делает каждая строка кода, я настоятельно рекомендую вам взглянуть наDeep Learning for Computer Vision with Python》. Книга содержит более подробную информацию, и есть много подробных примеров. Эта книга — единственная книга, которую я когда-либо видел, в которой рассказывается, как это работает, и как это можно использовать для решения сложных проблем в реальной жизни. Иди проверь!
3 лайка4 ИзбранноеКомментарий