Репозиторий GitHub: https://github.com/JSREI/js-cookie-monitor-debugger-hook.
Упрощенный китайский |
В эпоху, когда данные бесценны, конфронтация между сканерами и антикраулерами стала интенсивной. Антикраулеры cookie являются最常见之一
типов антикраулеров. Веб-сайты устанавливают файлы cookie через JS-код, который настолько сбивает с толку, что это делают даже матери. не распознавать его (обычно при просмотре) Отпечатки серверов, файлы cookie, которые должны быть перенесены при выполнении запросов и т. д.), Файлы cookie, которые должны быть перенесены при обработке запросов, но неизвестно, где они генерируются, Вы боретесь с десятками тысяч запутанных строк JS-дерьма, которое ваша мать не узнает, в надежде найти место, где генерируются файлы cookie (если обратное мышление ненаучно, вы можете несколько раз подавиться...), и даже несколько раз хотите найти. Пытаетесь ли вы обманом заставить себя сдаться или почему бы просто не использовать метод эмуляции браузера, такой как Selenium? Если вы трус, этот сценарий поможет вам! (Мы с вами оба знаем, что этот абзац — просто ерунда для поддержки сцены, вы можете его пропустить, если вам не посчастливилось дочитать его...)
Функция этого скрипта условно разделена на две части:
Этот скрипт внедряет на страницу свой собственный JS-код и перехватывает document.cookie
для выполнения различных функций. Поэтому перед использованием этого скрипта вы должны сначала подтвердить, что генерируемый файл cookie действительно генерируется с помощью JS (позже будет представлен специальный метод). Просто определите, генерируется ли файл cookie JS или возвращается сервером).
В настоящее время многие скрипты-перехватчики имеют неправильную позицию перехвата. Этот сценарий использует одноразовые и повторяющиеся перехваты, что не влияет на встроенное управление файлами cookie браузера:
В дополнение к функции точки останова файлов cookie была добавлена функция мониторинга изменений файлов cookie, которая может анализировать файлы cookie на странице с более макроэкономической точки зрения:
(Забудьте об этом, откажитесь от кодирования...)
Цвет используется для различения типов операций:
За каждой операцией будет указано местоположение кода. Нажмите, чтобы найти местоположение кода JS, выполнившего операцию.
Начиная с версии 0.6, были введены правила точек останова с более мощными функциями и более гибкими настройками, а также был введен механизм событий, позволяющий разделить изменения файлов cookie на три события: добавление, удаление и обновление, поддерживая более детальные точки останова. События файлов cookie. Подробную информацию см. в части 5 этой статьи.
Почему он спроектирован таким образом? Относительно распространенная ситуация заключается в том, что файл cookie для защиты от сканирования на целевом веб-сайте устанавливается JS, но логика кода JS заключается в том, чтобы сначала лихорадочно удалить его, а затем удалить его много раз, прежде чем добавить реальную ценность. Установка файла cookie. этот способ может точно противодействовать отладке General Cookie Hook.
Вот один из примеров, таких как защита файлов cookie F5, есть файл cookie TS51c47c46075
, который удаляется много раз, а затем добавляется снова: В этом случае вы можете установить точку останова для события cookie с именем TS51c47c46075
, чтобы не путать красные события удаления.
Теоретически, пока JS-код этого скрипта можно внедрить на страницу, для внедрения JS-кода на страницу используется плагин Grease Monkey.
Плагин Grease Monkey можно установить из Chrome Store:
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
Если вы не можете обойти стену, вы можете выполнить поиск по запросу «Tampermonkey» в Baidu, чтобы найти сторонние веб-сайты для загрузки. Однако будьте осторожны и не устанавливайте поддельные вредоносные плагины. Рекомендуется устанавливать из официального магазина.
Также доступны и другие инструменты, если JS-код этого сценария можно внедрить в верхнюю часть страницы для выполнения.
Вы можете установить скрипт Grease Monkey из официального магазина, а можете скопировать код и создать его локально.
Рекомендуется использовать этот метод. Сценарий Oil Monkey, установленный из магазина Oil Monkey, может автоматически обновляться при обновлении последующих версий. Этот сценарий был помещен в магазин Oil Monkey:
https://greasyfork.org/zh-CN/scripts/419781-js-cookie-monitor-debugger-hook
Если вас слишком раздражают автоматические обновления или у вас есть другие проблемы, вы можете скопировать код этого скрипта здесь:
https://github.com/CC11001100/js-cookie-monitor-debugger-hook/blob/main/js-cookie-monitor-debugger-hook.js
После проверки и подтверждения отсутствия проблем вы можете добавить их в панели управления Oil Monkey.
Обратите внимание, что мониторинг подразумевает общее понимание на макроуровне, а не поиск деталей (обычно правильное использование инструментов может повысить эффективность. Конечно, знания человека ограничены, и каждый может оставить отзыв о более интересных способах решения проблемы). play) , например при открытии страницы:
Основываясь на этом изображении, мы можем получить общее представление о том, какие файлы cookie на этом веб-сайте используются JS, когда и как они используются.
Другой пример — использовать монитор для наблюдения за изменением структуры файлов cookie. Например, на этой странице вы можете видеть, в зависимости от времени, что файл cookie будет меняться каждые полминуты:
(2021-1-7 18:27:49 обновлена версия 0.4, чтобы добавить эту функцию): Если консоль выводит слишком много информации, вы можете использовать фильтрацию, поставляемую с браузером Chrome, чтобы отфильтровать ее. Формат. распечатанные журналы были унифицированы, и требуется только cookieName = Cookie名字
, например:
Обратите внимание: при поиске убедитесь, что ваша поисковая информация декодирована по URL-адресу, в противном случае она может не совпадать, поскольку информация для печати консоли сначала декодируется по URL-адресу, а затем печатается.
Если вы не уверены, создается ли файл cookie, который вы хотите установить, локально или возвращается запрашивающим сервером set-cookie
, вы можете открыть этот скрипт, обновить страницу целевого веб-сайта, а затем выполнить поиск имени файла cookie в консоли. Метод тот же, что и выше. Этот раздел аналогичен. Если имя файла cookie короткое и неразличимое, вы можете добавить cookieName
для облегчения позиционирования, например:
cookieName = v
Иногда целевой веб-сайт может повторно устанавливать файл cookie с одним и тем же значением. Эта переменная используется для игнорирования таких событий:
В общем, просто оставьте значение по умолчанию.
@since v0.6
Эта часть документа относится к версии v0.6+. Если ваша локальная версия ниже 0.6, обновите версию перед чтением документа.
Начиная с версии 0.6, точки останова при изменении значения Cookie стали очень сложными, а также стали очень простыми. Сложность связана с введением механизма событий, а простота - с упрощением настройки правил точек останова. и более гибкий.
Правила точек останова можно разделить на标准规则
и简化规则
. Стандартные правила предназначены для упрощения реализации и обработки в нижней части программы. Упрощенные правила предназначены для более удобной настройки пользователями. В обычных обстоятельствах вам нужно только понять упрощенные правила. Если упрощенная настройка правил невозможна. Проверьте еще раз, чтобы узнать, как настроить стандартные правила в соответствии с вашими потребностями.
Все правила настраиваются в массиве debuggerRules
, а в начале скрипта есть переменная: Если вы не можете ее найти, вы можете нажать Ctrl+F для поиска по имени переменной:
debuggerRules
Эта переменная представляет собой тип массива, в котором хранятся некоторые условия правил, определяющие, при каких обстоятельствах будет введена точка останова.
Обратите внимание, что это массив, и правила в массиве находятся в отношении ИЛИ. Когда срабатывает событие модификации файла cookie, каждое правило будет сопоставлено последовательно. Если одно правило успешно сопоставлено, будет введена точка останова.
Введите точку останова при изменении файла cookie с именем foo
:
const debuggerRules = [ "foo" ] ;
Указание строки указанным выше способом будет соответствовать имени файла cookie, если оно равно заданной строке.
Обратите внимание: если здесь есть часть точного совпадения, закодированная в URL-адресе, ее необходимо сначала декодировать в URL-адресе, а затем вставить сюда. Другие места, связанные со строками, такие же и не будут описываться снова.
Если имя файла cookie содержит постоянно меняющуюся часть, например метку времени, UUID и т. д., которую невозможно найти по имени, то используется обычное сопоставление:
const debuggerRules = [ / foo.+ / ] ;
В большинстве случаев достаточно только этих двух конфигураций.
Давайте попрактикуемся сейчас, открывая эту страницу.
https://www.ishumei.com/trial/captcha.html
Вы можете видеть, что скрипт обнаружил некоторые операции с файлами cookie:
Один из них, smidV2
вызывает подозрения, поэтому добавляем для него точку останова:
После изменения массива debuggerRules
обязательно нажмите Ctrl+S, чтобы сохранить скрипт. Поскольку Oil Monkey внедряет код JS при загрузке страницы, вам необходимо обновить страницу и повторно внедрить ее. точка останова будет введена автоматически:
В красном поле A на рисунке выше указаны некоторые специально переданные переменные. Наведя указатель мыши на эти переменные, чтобы просмотреть значения, мы можем примерно узнать некоторые условия текущей точки останова:
Затем идет красное поле B. Мы устанавливаем точку останова для файлов cookie, чтобы отслеживать стек вызовов и определять место, где генерируется файл cookie. Красное поле — это стек вызовов этого скрипта. Просто userscript.html
. эта часть стека вызовов.
Затем проследите стек вызовов и вы увидите, где установлен файл cookie:
Конечно, нам бесполезно смотреть на этот стек. Нам нужно постепенно двигаться вперед, пока мы не найдем место, где на самом деле генерируется cookie. Однако этот скрипт может помочь вам только установить точку останова. от звезд и моря будет зависеть позже Ты сам!
Введите точку останова при添加
файла cookie с именем foo
:
const debuggerRules = [ { "add" : "foo" } ] ;
Введите точку останова при删除
файла cookie с именем foo
:
const debuggerRules = [ { "delete" : "foo" } ] ;
Введите точку останова, когда файл cookie с именем foo
уже существует, но значение更新
:
const debuggerRules = [ { "update" : "foo" } ] ;
Одновременно можно указать несколько условий, а точки останова вводятся при添加和更新
, что эквивалентно исключению удалений:
const debuggerRules = [ { "add|update" : "foo" } ] ;
Строки или регулярные выражения можно использовать везде, где требуется сопоставление имен файлов cookie:
const debuggerRules = [ { "add" : / foo_d+ / } ] ;
Вышеупомянутые упрощенные правила будут преобразованы в стандартные правила. Стандартные правила также можно настроить непосредственно в массиве debuggerRules
. Формат стандартного правила:
{
"events": "{add|delete|update}",
"name": {"cookie-name" | /cookie-name-regex/},
"value": {"cookie-value" | /cookie-value-regex/}
}
Строковый тип, указывающий тип события, соответствующего этому правилу. Это может быть одно событие, например add
, или несколько событий. Используйте |
для разделения нескольких событий, например add|update
. Если вам кажется, что вам тесно, вы также можете добавить |
Добавьте пробелы с обеих сторон, например, add | update
Если тип события настроен, он будет соответствовать только заданному типу события. Если этот параметр не настроен, все типы событий будут соответствовать по умолчанию.
Это может быть строка или обычный шаблон. Это верно, если имя файла cookie соответствует заданной строке или обычному шаблону. Этот элемент нельзя игнорировать и его необходимо настроить.
Это может быть строка или обычный шаблон. Это правило действует, если значение файла cookie соответствует заданной строке или обычному шаблону. Если этот параметр не настроен, он будет игнорироваться.
Настройка правил точек останова была представлена ранее, а типы событий упоминались много раз. Мы знаем только строку имени, соответствующую каждому событию, но до сих пор не знаем, что означает каждое событие на нижнем уровне. В этом разделе объясняется каждое событие. Механизм реализации события.
Изменения файлов cookie подразделяются на добавление файлов cookie, удаление файлов cookie и обновление существующих значений файлов cookie. Каждое событие соответствует названию события:
Раньше этот файл cookie не существовал локально, и он был добавлен впервые. Это может быть первый раз, когда вы посещаете этот веб-сайт, или вы можете удалить файлы cookie и посетить его снова, или новый файл cookie будет создаваться каждый раз, когда вы посещаете веб-сайт, или даже может быть так, что собственный код веб-сайта удаляет файлы cookie и повторно добавляет их. их, что приведет к добавлению события cookie.
Например, выполните следующий код. Чтобы гарантировать, что файл cookie ранее не существовал, к имени файла cookie добавляется временная метка:
document . cookie = "foo_" + new Date ( ) . getTime ( ) + "=bar; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
Когда мы запустим эту строку кода в консоли, будет вызвано событие Cookie Add:
Если файл cookie уже существует локально и вы пытаетесь установить для него значение, будет инициировано событие «Обновить файл cookie».
Например, следующий код:
document . cookie = "foo_10086=blabla; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
document . cookie = "foo_10086=wuawua; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
Первый оператор для установки Cookie вызовет событие Cookie New, а второй оператор для установки Cookie вызовет событие Cookie Update, поскольку устанавливаемый Cookie уже существует.
Если при настройке файла cookie фронтенд-разработчик указывает срок действия раньше текущего времени, это означает, что файл cookie необходимо удалить. Например, общий способ удаления файлов cookie:
const expires = new Date ( new Date ( ) . getTime ( ) - 1000 * 30 ) . toGMTString ( ) ;
document . cookie = "foo=; expires=" + expires + "; path=/"
Когда мы запустим этот код в консоли, будет вызвано событие удаления файлов cookie:
Из вышеизложенного также видно, что запуск события удаления файла cookie предназначен исключительно для обнаружения истечения срока действия и фактически не проверяет, существовал ли файл cookie ранее.
Как упоминалось ранее, при настройке правил точки останова для файлов cookie существует тип события. Фактически, каждый тип события соответствует биту флага, указывающему, включена ли точка останова этого типа события. Например, приоритет этого бита флага. , если это не так. Когда включена точка останова удаления файлов cookie и срабатывает событие удаления файлов cookie, сначала проверяется, включена ли точка останова удаления файлов cookie. Если она отключена, событие будет игнорироваться, и больше попыток не будет. быть выполнено в соответствии с правилами точек останова (контролируется инструментами разработчика). Журнал этого события удаления по-прежнему будет печататься на платформе).
Итак, теперь ситуация стала очень сложной. Давайте рассмотрим процесс создания этой небольшой точки останова для файлов cookie:
По умолчанию включены только точки останова для событий добавления файлов cookie и событий изменения файлов cookie:
Потому что в обычных обстоятельствах добавление файлов cookie и обновление файлов cookie могут быть спутаны. Они оба присваивают значение файлу cookie, и в большинстве случаев мы не обращаем внимания на событие, когда файл cookie удаляется, поэтому здесь это установлено именно так. Если это не удовлетворяет вашим потребностям. При необходимости вы можете самостоятельно изменить соответствующее значение enableEventDebugger
.
Если у вас возникнут какие-либо проблемы во время использования, вы можете оставить отзыв в Issues
на GitHub, вы также можете оставить отзыв в области комментариев Grease Monkey Script или отправить мне электронное письмо, и я разберусь с этим, как только возможно после просмотра.
Начиная с версии v0.6 добавлена переменная для настройки размера шрифта журнала, выводимого этим скриптом на консоль, в пикселях:
По мере обновления версии ее может больше не быть в этом месте. Если вы не можете найти ее сразу, просто выполните поиск в коде:
consoleLogFontSize
Затем измените значение этой переменной.
Или в качестве другого решения вы можете удерживать нажатой клавишу Ctrl + колесо мыши в консоли инструментов разработчика, чтобы увеличить масштаб и отрегулировать общий размер. Это функция, которая поставляется с браузером Chrome.
Как объяснялось в начале этой статьи, этот сценарий должен быть успешно внедрен в начало страницы и выполнен, прежде чем перехватчик сможет сработать. Для всей страницы, аналогичной первому уровню ускорителя, возвращается только один сценарий. логика внутри:
< script >
document . cookie = 这里是一些奇奇怪怪的JS用于计算出Cookie ;
location . href = "跳转走了" ;
</ script >
Файл cookie устанавливается и немедленно перенаправляется на новую страницу. Для этой операции перехватчик может быть недоступен. Это проблема сценария Grease Monkey. Если вы настаиваете на перехвате, вы можете использовать подвисающий прокси-сервер для внедрения этого сценария. этот URL-адрес заголовка ответа.
Ниже этой страницы приводится краткое изложение некоторых практических примеров обратного проектирования с использованием этого сценария:
Нажмите меня, чтобы перейти на страницу навигации
Этот проект отделен от: https://github.com/CC11001100/crawler-js-hook-framework-public/tree/master/001-cookie-hook#%E7%9B%91%E6%8E%A7%E5. %AE%9A%E4%BD%8Djavascript%E6%93%8D%E4%BD%9Cookie
После изменения пространства имен количество установок может очиститься. На память об этом сделал скриншот. На данный момент (2022-7-29 21:40:01) количество установок превысило 300. Такое ощущение, что так и есть. очень большой для маленького инструмента в такой узкой области. Это уже непросто...
Спасибо восторженным пользователям сети за отзывы, спасибо за поддержку.
js-cookie-monitor-debugger-hook теперь присоединился к проекту 404 Star Chain.
Отсканируйте QR-код, чтобы присоединиться к группе обмена технологиями реверса:
Если срок действия группового QR-кода истечет, вы можете добавить меня в личный WeChat и отправить [Reverse Group], чтобы присоединиться к вам в группе:
Нажмите здесь или отсканируйте QR-код, чтобы присоединиться к коммуникационной группе TG: