вах
March 22

IconCaptcha free 99,9%

Вы думаете что с человеком, который вот до такой степени точно исследует тему можно спорить? Вы думаете что я вас не переиграю? Что я вас не уничтожу? Я вас уничтожу!

А началось все как обычно. Некоторое время назад мне прилетел вопрос

И кто-то щя подумал: Ооо, очередной букс помойка.

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

Я уже сталкивался с похожей капчей, тогда это была икон капача. Нужно было просто найти 1 картинку отличную от других.

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

Мне она не понравилась. Я использовал подсчет траста каждой картинки (сравнение каждой с каждой). В перспективе это сработало бы и при наличии шума на картинках.

Ну и как будто бы, с моим подходом при наличии шума и поворота ничего сильно не поменялось бы. Нужно всего лишь докинуть еще 1 (2) цикл чтобы сравнивать все виды 1 картинки с вариантами других.

И так, генерим тест массив для визуализации манипуляций с чиселками, чтоб не наебаться потом с картинками. Создаем каждой "картинке" 8 вариантов положения: 4 поворот и еще 4 для каждой - отзеркаливание.

Чтоб не сравнивать с собой, есть резон добавить if (i === j) {continue;}

Атлишна. Осталось добавить счетчик макс значения, чтоб не была такая огромная ебала на 64 варианта каждая, а всего 4 варианта с ответами.

Чел утром:

Чет до меня только к утру дошло, что изначальный вопрос был не про иконкапчу, а про похожую, а я уже иконкапчу почти разъебал.

Штош, ну тогда добьем её.

Кстати, сурсы самой капчи с иконками https://github.com/Agence-MIBE/IconCaptcha-Plugin-jQuery-PHP/blob/master/assets/icons/light/icon-1.png

У капчи 2 версии, я начал с черной

Похуярили

Начнем с простого, с реверса. Так, ну токен изи, он в первом запросе.

Тело запроса. Тоже изи.

widgetId обычный uuid

Тайм штампы тоже изи, 0 обфускации - 0 проблем

При отправке решения используется challengeId, эт uuid с сервера в теле ответа на запрос капчи, а challenge там эт сама картинка.

Прогнав пару капч, можно заметить, что размер фул капчи всегда фикс, а количество иконок (задач) внутри 5-8. А еще, мы можем пройтись вверху с шагом в пиксель посчитать количество черных писелей фильтруя по альфа каналу, это будет количество частей (+1).

Докинем парочку функций и веселая нарезка готова. Код максимально простой.

Ну и всё бы ничего, если б картинки определялись нормально, только по итогу нихуя не получалось их нормально сравнить.

Сука, как же я заебался искать как сравнить 2 ебучих картинки

Я потыкал разные алгоритмы иии.. нихуя. Казалось бы, дохуя алгоритмов, но блять, простой сдвиг в пару пикселей и оно уже нихуя не видит. Однако..

Используя mage-js я написал перегон 1 картинки в 8 и дополнительно каждой мыло и сжатие до 20% + еще пару фильтров. И в итоге это сработало.

Видишь слева такую полоску хуйни? Это всё картинки, уменьшенные и замыленные. И попарно все они сравнены (4090 сравнений).

А 4090 сравнивания - не дохуя? Оказалось, что нет, решает мгновенно.

Примечательно, что без уменьшения и доп фильтров работало крайне ебано, возможно еще прозрачность самой иконки тож рандом.

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

Сейчас получилось по сути то же самое.

Я беру список коллекций (вариантов картинки: повороты и отзеркаливание) для каждой картинки. Первые 2 цикла перебирают коллекции 1-8 сравнивая их друг с другом. Чтобы сравнивать элементы коллекций есть еще 2 цикла (тк сравниваем 2 коллекции). Если какая-то картинка из коллекции нашла пару в другой, пишем collection_trust +1. Еще добавил пару прерываний цикла, чтоб если похожую картинку нашло, не искало дальше.

Через getSimilarity из image-js я сравниваю картинки и говорю совпадает или нет.

По итогу в trusts мы будем иметь инфу о количестве пар у каждой картинки.

Ну а дальше просто дергаем индекс макс элемента

А теперь можно и тесты провести. По итогу всего 1 ошибка, возможно, надо с порогом чуть поиграть, щя стоит 90%. За 300 тестов всего 1, довольно неплохо. Предположим, что качество решения 99,9%)