Важно было бы сказать, что реализуемая машина, крайне далека от той, которая удовлетворяет современной спецификации.
Вообще, в изначальной версии статьи всё это было) Потом исчезло, потому что не хотелось пугать читателей тем, что мы будем писать какой-то там интерпретатор. Нужно было хоть как-то прокрутить скрипт.
Но я оставил фразу
Также, мы используем множество грязных хаков при разработке, которые облегчат нам этот нудный процесс
Названия же узлов и конструкции были просто взяты из парсера babel, который для удобства использования добавляет некоторую отсебятину. Задача была в том, чтобы люди поняли что откуда берётся и почему так написано. В конечном счёте, как мне кажется, это получилось, потому что написание всего кода свелось к системе "посмотреть в astexplorer-перенести на бумагу"
Моя ошибка, видимо, в том, что я использовал "слова" из спецификации. Не нужно было и этого делать.
А еще можно было бы воспользоваться DevTools протоколом, который предоставляет тот самый DevTools.
Это отличный вариант(лучше нашего), но рассказ про применение CDP к деобфускации я припас на потом, а в этом материале хотелось сохранить более выраженную связь с предыдущей статьёй.
Он работает в datadome. Даже если бы он захотел чем-нибудь поделиться, то нового бы ничего не сказал. Их антибот - это, наверное, одно из самых худших решений на рынке
Сообщество живое, вопросы регулярно задаются. Да, используется.
Как видно из количества незакрытых багов, подход с переопределением давно не работает и работать больше никогда не будет.
Я могу применяя лишь один JS обойти и клаудфлеер, акамай, и имперву, и периметр, и шейп...
Этот вектор атаки полностью блокирован.
Его никогда не заблокировать. Может быть в контексте стелс плагина всё и заблокировано, но как подход - нет.
То есть при надевании чужого отпечатка js вроде бы не имеет инструментов для проверки того, что браузер подделал все
Если движок вашего хромиума 110, а вы "надели" чужой отпечаток от хромиума 109, то обнаружить это раз плюнуть. Например, достаточно посмотреть свойства объекта window - Object.getOwnPropertyNames(window). От версии к версии набор будет отличаться. Сюда можно приплести ещё много чего, те же CSS стили.
И экран можно понять что не ваш, и тем более канвас, и шрифты и тд... Даже если вы всё это внутри хромиума переопределили. Вот даже в моём примере недостаточно просто пропатчить Object.getOwnPropertyNames(), чтобы он выдавал в зависимости от юа определённые наборы данных. Я могу определить какое-нибудь свойство во фрейме и при сборе свойств проверять, что оно там есть. Простым патчем этой функции здесь не обойдёшься. Надо знать как все WebAPI друг с другом связаны. А поскольку знать всего нельзя, то и существует эта бесконечная игра с детектами. Поэтому я и сказал: "чтобы пропатчить, нужно знать что именно патчить." А узнать это можно ориентируясь на проверки антиботов.
Что же там светится?
В контексте того репозитория и использования хромиума с патчами вместе с puppeteer всякие штуки по типу Runtime.Enable, Network.Enable и прочее очень просто обнаруживаются. Ну и само собой то, что я только что написал. Там во многих уклонениях сделана треть(а то и меньше) от того, что нужно.
Может просто дискуссия между нападением и обороной ушла из публичного поля?
Нет, эта дискуссия живее всех живых. Достаточно почитать сообщества разработчиков ботов для тех же кроссовок.
Тех, кто способен патчить хромиум, их мало и далеко не все хотят делиться опытом.
Я вот не хочу, да. Тем не менее, материалов для обучения достаточно.
школота со стелс плагином и прочими фейкбраузерами отвалилась
Я всё-таки ещё раз хочу заметить, что у людей разные задачи. Кому-то и стелс плагин всё ещё подходит. А кому-то изначально не подошёл, но он сам пофиксил в нём нужные баги и пользуется. И всех их называть "школотой" как-то не очень. Эта "школота" свои сайты в топ в том же яндексе накруткой продвигает.
В любом случае, хедлес маркер бота. Хоть новый, хоть старый.
У людей разные задачи, для которых подходят разные инструменты. Условно говоря, никому не надо заморачиваться с патчингом хромиума, чтобы пробить клаудфлеер, но с помощью стелс плагина никто не пойдёт всерьёз регистрировать аккаунты гугла...
Вот там я вижу, что наивный подход с переопределением - это подход давно минувших дней.
Само собой, но антиботами до сих пор это проверяется, а людьми используется
И перешли к другому варианту:
И мы переходим к тому, что для того, чтобы что-то пропатчить, нужно знать что именно патчить. Потому что одни и те же штуки через JS можно просмотреть разными способами. И эта другая версия с патченным хромиумом светится только в путь. Да, не toString, но другими вещами
Никакого больше геморроя.
Его никогда в таких вещах меньше не становится)
Это уже к тому, что еще можно включить в отпечаток.
Вот из статьи прекрасно видно, что именно акамай включает в отпечаток. Правда за пару лет мало что изменилось...
вроде результата исполнения фрагмента кода, который нарушает стандарт js
Если не ошибаюсь, то бет365 когда-то давно подобным промышлял, хотя может чего путаю... Тем не менее, у этой БК в своё время были самые весёлые обнаружения ботов, например, метод querySelectorAll(), который использовался ботами для поиска элементов, они переопределяли так, что при его использовании запускался бесконечный цикл и браузер падал)
А так да, у антиботов бывает достаточно ложных срабатываний даже на обычных пользователей. Именно поэтому нам иногда приходится прокликивать те капчи, которые для нас не предназначены. Та же капча от PerimeterX(press and hold) зачастую срабатывает на юзерах, даже если сам антибот настроен на "средние" проверки.
Тоже хочется рассмотреть подобную тему с байткодом. Много антиботов сейчас используют именно эту схему обфускации через виртуализацию. Компилируют свой JS в байткод, а со стороны клиента реализуют на JS вм, которая этот байткод крутит)
Если речь идет об этом расширении, то тоже следует быть аккуратным. Он переопределяет некоторые методы в объекте window(alert(), prompt()), также добавляет функцию getFrameLocation(), которой изначально в браузере нет.
Да, вас не забанят, в привычном понимании этого слова, но пару лишних капч могут попросить прокликать)
Да, правильно написал @ionicman. Можно и через JS "спрятать", но это потребует немалых трудов, порой очень немалых. Патченный хромиум тоже не панацея, ведь постоянно появляются новые способы обнаружения.
Плюс переопределения методов через JS как раз в том, что такое решение проще поддерживать при обновлении движка браузера. Но, если честно, селениум "из коробки" я бы для обхода антиботов не использовал. Слишком уж он отличается от обычного браузера. А ваша задача не "быть уникальным", а "быть как все".
В смысле? Кому данные нужны, те и подделывают. Например, первый в гугле.
Мы, видимо, друг-друга не совсем понимаем и говорим о разных вещах. По вашей же ссылке и располагает то, о чём я говорил - не эмуляция ради эмуляции, а такая эмуляция, чтобы её было сложнее обнаружить. Посмотрите в репозитории на то, как переопределяются объекты. Вместо того, чтобы просто "прописать" им заранее собранные значения, используется вагон логики, который пытается скрыться от антиботов: переопределение toString(), обработка стека ошибок, правильный триггер ошибок в зависимости от вызова геттера. Например, если я переопределю свойство navigator.webdriver так(чтобы попытаться себя не обнаружить):
Я не настоящий сварщик и не знаю → при какой атаке на данные актуальны параметры экрана?
Как бы направление мысли вроде улавливаю, но пример (наверное) не актуальный.
Да, пример абстрактный. Правильнее использовать своё разрешение и не беспокоиться ни о чём. Но даже здесь можно допустить ошибку, если я решу выставить в playwright разрешение 1920x1080 следующим образом:
В таком случае параметр screen.height будет равен screen.availHeight, что не является правдой для обычного хрома, и меня обнаружат.
Эмуляция должна быть необнаружима в принципе. А не в текущем варианте конкретного антибота. Завтра придет второй, третий, пятый, каждый день будете эмуляцию изобретать? Антиботы же не совсем дураки пишут, что, они не догадаются как их будут обманывать?
Достаточно посмотреть ветку знаменитого стелс плагина, чтобы понять, что очень сложно сделать "не обнаруживаемую эмуляцию". Как там выражаются: "это бесконечная игра в кошки-мышки". Сегодня антиботы обнаруживают одно, завтра их обходят, они обнаруживают другое, их снова обходят и так далее...
Вы правда думаете, что магазины борются с покупателями, которые покупают без затрат времени и рекламных бюджетов?
Не всегда. Вернее не только. Достаточно посмотреть в сторону какого-нибудь Shape Security или Kasada хотя бы, которые проводят более глубокие проверки на эмуляцию параметров. Кстати, ботгуард гугла даже этим занимается, хотя кому-кому, а вот ему-то вообще на такое внимание обращать не нужно)
Тому же яндексу(о нём ещё поговорим скорее всего) тоже бы не помешало повнимательнее смотреть за эмуляцией. Потому как одни накручивают ПФ, а другие вынуждены платить за какую-нибудь рекламу, чтобы поднять свой сайт повыше.
Кстати, некоторые рекламные сети, например AdScore, тоже делают более глубокие проверки браузера, чтобы не показывать рекламу абы кому.
Если идентифицированный по отпечатку пользователь скачивает всю категорию товаров ежедневно на протяжении месяцев, то тут конечно нужен суперИИ, чтобы определить бота)
Ну вот один, не совсем аккуратный(ну или не парится просто), скачивает, а другой тихо сидит в сторонке, не отсвечивает и "нагуливает" историю, чтобы закосить под человека, а в нужный момент берёт и выкупает товар, который только-только появился "на полке". В это же мгновение подтягиваются подобные ему друзья и за 10 минут сметают всё. Это я утрирую, конечно, но всё-таки
Нельзя же считать результатом вывод о том, что антибот собирает отпечатки?)
Мне кажется, это к акамаю больше претензия) Я же не виноват, что он ничем более с клиентской стороны через JS не занимается.
Да и в целом, сам процесс деобфускации тоже должен быть интересен людям. Ведь часто приходится пытаться найти как генерируется тот или иной параметр, если сайт не предоставляет официального апи...
Подделка отпечатков все равно делается без оглядки на то, как их тестируют те или иные антиботы.
Кто их так подделывает? Если бы антидетект браузеры их так подделывали, то никто бы ими не пользовался, а пользовались бы обычными расширениями. Зачем подделывать, условно говоря, только screen.width, если антибот может сравнить это дело с CSS Media Queries через MediaQueryList.prototype.matches(), а ещё посмотреть ширину document.body.clientWidth или отрисовать что-нибудь во всю ширину и взять значение? Плюсом ко всему, через JS можно обнаружить и наличие автоматизации, то есть самой CDP-сессии, которая и управляет что selenium'ом, что playwright'ом, что puppeteer'ом. Нет смысла просто эмулировать отпечатки ради отпечатков. Нужно ещё и озаботиться тем, чтобы их эмуляция не была обнаружена, а для этого не помешает "почитать" скрипты антиботов, ради которых, собственно, отпечатки и подделываются.
Кажется с подсказками ИИ разбирать такой код может быть проще.
Наверное, поначалу да, но со временем потребность в этом отпадает, если честно) Когда постоянно читаешь подобного рода скрипты, то как-то без особых проблем понимаешь происходящее. Но, как ещё один из вариантов применения ChatGPT, почему нет. Возьму на заметку, спасибо. А ещё, чтобы лучше разбираться в техниках минификации и не впадать в ступор при виде !0 вместо true, стоит погуглить(или поспрашивать у ChatGPT) "JavaScript golfing". Например, можно почитать что-то подобное.
Спасибо за такой развернутый ответ !
Вообще, в изначальной версии статьи всё это было) Потом исчезло, потому что не хотелось пугать читателей тем, что мы будем писать какой-то там интерпретатор. Нужно было хоть как-то прокрутить скрипт.
Но я оставил фразу
Названия же узлов и конструкции были просто взяты из парсера babel, который для удобства использования добавляет некоторую отсебятину. Задача была в том, чтобы люди поняли что откуда берётся и почему так написано. В конечном счёте, как мне кажется, это получилось, потому что написание всего кода свелось к системе "посмотреть в astexplorer-перенести на бумагу"
Моя ошибка, видимо, в том, что я использовал "слова" из спецификации. Не нужно было и этого делать.
Это отличный вариант(лучше нашего), но рассказ про применение CDP к деобфускации я припас на потом, а в этом материале хотелось сохранить более выраженную связь с предыдущей статьёй.
Он работает в datadome. Даже если бы он захотел чем-нибудь поделиться, то нового бы ничего не сказал. Их антибот - это, наверное, одно из самых худших решений на рынке
Сообщество живое, вопросы регулярно задаются. Да, используется.
Я могу применяя лишь один JS обойти и клаудфлеер, акамай, и имперву, и периметр, и шейп...
Его никогда не заблокировать. Может быть в контексте стелс плагина всё и заблокировано, но как подход - нет.
Если движок вашего хромиума 110, а вы "надели" чужой отпечаток от хромиума 109, то обнаружить это раз плюнуть. Например, достаточно посмотреть свойства объекта window -
Object.getOwnPropertyNames(window)
. От версии к версии набор будет отличаться. Сюда можно приплести ещё много чего, те же CSS стили.И экран можно понять что не ваш, и тем более канвас, и шрифты и тд... Даже если вы всё это внутри хромиума переопределили. Вот даже в моём примере недостаточно просто пропатчить
Object.getOwnPropertyNames()
, чтобы он выдавал в зависимости от юа определённые наборы данных. Я могу определить какое-нибудь свойство во фрейме и при сборе свойств проверять, что оно там есть. Простым патчем этой функции здесь не обойдёшься. Надо знать как все WebAPI друг с другом связаны. А поскольку знать всего нельзя, то и существует эта бесконечная игра с детектами. Поэтому я и сказал: "чтобы пропатчить, нужно знать что именно патчить." А узнать это можно ориентируясь на проверки антиботов.В контексте того репозитория и использования хромиума с патчами вместе с puppeteer всякие штуки по типу
Runtime.Enable
,Network.Enable
и прочее очень просто обнаруживаются. Ну и само собой то, что я только что написал. Там во многих уклонениях сделана треть(а то и меньше) от того, что нужно.Нет, эта дискуссия живее всех живых. Достаточно почитать сообщества разработчиков ботов для тех же кроссовок.
Я вот не хочу, да. Тем не менее, материалов для обучения достаточно.
Я всё-таки ещё раз хочу заметить, что у людей разные задачи. Кому-то и стелс плагин всё ещё подходит. А кому-то изначально не подошёл, но он сам пофиксил в нём нужные баги и пользуется. И всех их называть "школотой" как-то не очень. Эта "школота" свои сайты в топ в том же яндексе накруткой продвигает.
Вот материал есть, если самому в хромиум лезть не хочется
У людей разные задачи, для которых подходят разные инструменты. Условно говоря, никому не надо заморачиваться с патчингом хромиума, чтобы пробить клаудфлеер, но с помощью стелс плагина никто не пойдёт всерьёз регистрировать аккаунты гугла...
Само собой, но антиботами до сих пор это проверяется, а людьми используется
И мы переходим к тому, что для того, чтобы что-то пропатчить, нужно знать что именно патчить. Потому что одни и те же штуки через JS можно просмотреть разными способами. И эта другая версия с патченным хромиумом светится только в путь. Да, не toString, но другими вещами
Его никогда в таких вещах меньше не становится)
Вот из статьи прекрасно видно, что именно акамай включает в отпечаток. Правда за пару лет мало что изменилось...
Да я для примера... Их здесь вагон можно привести
Если не ошибаюсь, то бет365 когда-то давно подобным промышлял, хотя может чего путаю... Тем не менее, у этой БК в своё время были самые весёлые обнаружения ботов, например, метод
querySelectorAll()
, который использовался ботами для поиска элементов, они переопределяли так, что при его использовании запускался бесконечный цикл и браузер падал)А так да, у антиботов бывает достаточно ложных срабатываний даже на обычных пользователей. Именно поэтому нам иногда приходится прокликивать те капчи, которые для нас не предназначены. Та же капча от PerimeterX(press and hold) зачастую срабатывает на юзерах, даже если сам антибот настроен на "средние" проверки.
Тоже хочется рассмотреть подобную тему с байткодом. Много антиботов сейчас используют именно эту схему обфускации через виртуализацию. Компилируют свой JS в байткод, а со стороны клиента реализуют на JS вм, которая этот байткод крутит)
Если речь идет об этом расширении, то тоже следует быть аккуратным. Он переопределяет некоторые методы в объекте window(
alert()
,prompt()
), также добавляет функциюgetFrameLocation()
, которой изначально в браузере нет.Да, вас не забанят, в привычном понимании этого слова, но пару лишних капч могут попросить прокликать)
Да, правильно написал @ionicman. Можно и через JS "спрятать", но это потребует немалых трудов, порой очень немалых. Патченный хромиум тоже не панацея, ведь постоянно появляются новые способы обнаружения.
Плюс переопределения методов через JS как раз в том, что такое решение проще поддерживать при обновлении движка браузера. Но, если честно, селениум "из коробки" я бы для обхода антиботов не использовал. Слишком уж он отличается от обычного браузера. А ваша задача не "быть уникальным", а "быть как все".
Стоит сейчас обратить внимание на новый headless режим.
Соглашусь с тем, что написать хороший AST интерпретатор это задачка со звёздочкой, но приведённая мной реализация интеллектом вроде не очень пахнет)
Спецификация EcmaScript охала бы и ахала, если бы видела, как моё творчество скрипт выполняет
Мы, видимо, друг-друга не совсем понимаем и говорим о разных вещах. По вашей же ссылке и располагает то, о чём я говорил - не эмуляция ради эмуляции, а такая эмуляция, чтобы её было сложнее обнаружить. Посмотрите в репозитории на то, как переопределяются объекты. Вместо того, чтобы просто "прописать" им заранее собранные значения, используется вагон логики, который пытается скрыться от антиботов: переопределение toString(), обработка стека ошибок, правильный триггер ошибок в зависимости от вызова геттера. Например, если я переопределю свойство navigator.webdriver так(чтобы попытаться себя не обнаружить):
То смогу вызвать геттер следующим образом:
В реальности же, без переопределения свойство выдаст ошибку:
error
Антибот может проверить это и сделать вывод, что свойство эмулировано.
По этой причине и существует другая версия с патченным хромиумом, чтобы на такие проверки не попадаться.
Да, пример абстрактный. Правильнее использовать своё разрешение и не беспокоиться ни о чём. Но даже здесь можно допустить ошибку, если я решу выставить в playwright разрешение 1920x1080 следующим образом:
В таком случае параметр
screen.height
будет равенscreen.availHeight
, что не является правдой для обычного хрома, и меня обнаружат.Достаточно посмотреть ветку знаменитого стелс плагина, чтобы понять, что очень сложно сделать "не обнаруживаемую эмуляцию". Как там выражаются: "это бесконечная игра в кошки-мышки". Сегодня антиботы обнаруживают одно, завтра их обходят, они обнаруживают другое, их снова обходят и так далее...
Иногда боты вредят бизнесу. Ну и вот статейка есть об этом
Не всегда. Вернее не только. Достаточно посмотреть в сторону какого-нибудь Shape Security или Kasada хотя бы, которые проводят более глубокие проверки на эмуляцию параметров. Кстати, ботгуард гугла даже этим занимается, хотя кому-кому, а вот ему-то вообще на такое внимание обращать не нужно)
Тому же яндексу(о нём ещё поговорим скорее всего) тоже бы не помешало повнимательнее смотреть за эмуляцией. Потому как одни накручивают ПФ, а другие вынуждены платить за какую-нибудь рекламу, чтобы поднять свой сайт повыше.
Кстати, некоторые рекламные сети, например AdScore, тоже делают более глубокие проверки браузера, чтобы не показывать рекламу абы кому.
Ну вот один, не совсем аккуратный(ну или не парится просто), скачивает, а другой тихо сидит в сторонке, не отсвечивает и "нагуливает" историю, чтобы закосить под человека, а в нужный момент берёт и выкупает товар, который только-только появился "на полке". В это же мгновение подтягиваются подобные ему друзья и за 10 минут сметают всё. Это я утрирую, конечно, но всё-таки
Мне кажется, это к акамаю больше претензия) Я же не виноват, что он ничем более с клиентской стороны через JS не занимается.
Да и в целом, сам процесс деобфускации тоже должен быть интересен людям. Ведь часто приходится пытаться найти как генерируется тот или иной параметр, если сайт не предоставляет официального апи...
Кто их так подделывает? Если бы антидетект браузеры их так подделывали, то никто бы ими не пользовался, а пользовались бы обычными расширениями. Зачем подделывать, условно говоря, только
screen.width
, если антибот может сравнить это дело с CSS Media Queries черезMediaQueryList.prototype.matches()
, а ещё посмотреть ширину document.body.clientWidth или отрисовать что-нибудь во всю ширину и взять значение? Плюсом ко всему, через JS можно обнаружить и наличие автоматизации, то есть самой CDP-сессии, которая и управляет что selenium'ом, что playwright'ом, что puppeteer'ом. Нет смысла просто эмулировать отпечатки ради отпечатков. Нужно ещё и озаботиться тем, чтобы их эмуляция не была обнаружена, а для этого не помешает "почитать" скрипты антиботов, ради которых, собственно, отпечатки и подделываются.Наверное, поначалу да, но со временем потребность в этом отпадает, если честно) Когда постоянно читаешь подобного рода скрипты, то как-то без особых проблем понимаешь происходящее. Но, как ещё один из вариантов применения ChatGPT, почему нет. Возьму на заметку, спасибо.
А ещё, чтобы лучше разбираться в техниках минификации и не впадать в ступор при виде
!0
вместоtrue
, стоит погуглить(или поспрашивать у ChatGPT) "JavaScript golfing". Например, можно почитать что-то подобное.