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
Похуярили
Начнем с простого, с реверса. Так, ну токен изи, он в первом запросе.
Тайм штампы тоже изи, 0 обфускации - 0 проблем
При отправке решения используется challengeId, эт uuid с сервера в теле ответа на запрос капчи, а challenge там эт сама картинка.
Прогнав пару капч, можно заметить, что размер фул капчи всегда фикс, а количество иконок (задач) внутри 5-8. А еще, мы можем пройтись вверху с шагом в пиксель посчитать количество черных писелей фильтруя по альфа каналу, это будет количество частей (+1).
Докинем парочку функций и веселая нарезка готова. Код максимально простой.
Ну и всё бы ничего, если б картинки определялись нормально, только по итогу нихуя не получалось их нормально сравнить.
Я потыкал разные алгоритмы иии.. нихуя. Казалось бы, дохуя алгоритмов, но блять, простой сдвиг в пару пикселей и оно уже нихуя не видит. Однако..
Используя 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%)