https://implicit-style-css_0.crawler-lab.com
Перед нами представлен такой интерфейс:
в этот разЗадача, заключается в получении текста содержимого, представленного на странице. Прежде чем писать код сканера, нам нужно сделать несколько вещей:
- Определить источник целевого контента, то есть найти запрос, который ответил на целевой контент
- Определить расположение целевого контента на странице
По сути, это самое основное наблюдение и анализ.
По сетевым запросам, после открытия средства отладки браузера и перехода на панель Сеть вижу, что на странице загружаются только 2 ресурса:
HTML-документ и js-файл, предположительно, нужный нам контент находится в html-документе. Нажмите на запрос, и инструменты разработчика браузера будут разделены на две колонки: левая сторона по-прежнему представляет собой список записей запроса, а правая часть показывает детали указанного запроса. Переключитесь на Response на правой панели, и вы увидите содержимое ответа сервера:
Кажется, что то, что мы хотим, находится в теле этого ответа. На первый взгляд, мы можем напрямую взять текстовое содержимое тега p под тегом div, класс которого — rdtext. Однако не все так просто: внимательные читатели могут обнаружить, что содержимое, отображаемое в теле ответа, не совсем совпадает с текстом, отображаемым на странице — в теле ответа немного меньше знаков препинания и текста, а тегов span больше. Например, на странице отображается:
夜幕团队 NightTeam 于 2019 年 9 月 9 日正式成立,团队由爬虫领域中实力强劲的多名开发者组成:崔庆才、周子淇、陈祥安、唐轶飞、冯威、蔡晋、戴煌金、张冶青和韦世东。
И что вы видите в теле ответа:
<p>夜幕团队 NightTeam 于 2019 年 9 月 9 日正式成立<span class="context_kw0"></span>团队由爬虫领域中实力强劲<span class="context_kw1"></span>多<span class="context_kw21"></span>开发者组成:崔庆才、周子淇、陈祥安、唐轶飞、冯威、蔡晋、戴煌金、张冶青和韦世东<span class="context_kw2"></span>
</p>
В этом предложении тег span заменяетсязапятая,изХарактер,названиеХарактер. Взгляните на него в целом и обнаружите, что все эти теги span имеют атрибуты класса.
Любой проницательный человек с первого взгляда поймет, что это мера защиты от сканирования, использующая принцип рендеринга браузера. Читатели, которые не знают, почему, пожалуйста, перейдите на "Принцип антисканирования Python3 и обход реального боя".
Поскольку это связано с диапазоном и классом, давайте посмотрим, что установлено для атрибута класса. класс с именемcontext_kw0Стиль тега span выглядит следующим образом:
.context_kw0::before {
content: ",";
}
Посмотрите на других, атрибут классаcontext_kw21Стиль тега span выглядит следующим образом:
.context_kw21::before {
content: "名";
}
Оригинальный замененный текст появляется здесь! Видя это, вы должны быть умны и знать, что происходит!
решение этой проблемыочень простой, вам нужно только извлечь значение содержимого, соответствующее имени атрибута класса тега span, а затем восстановить его в текст.
Существует правило для имен атрибутов: context_kw + число. То есть, context_kw может быть фиксированным, число зациклено или индекс в массиве? Сделайте смелое предположение, предполагая, что такой словарь существует:
{0: ",", 1: "的", 21: "名"}
Затем context_kw объединяется с ключом словаря, и получается имя класса, а в качестве контента используется соответствующее значение, что вроде бы очень близко. Инженеры среднего и старшего звена в глубине души знают: на веб-страницах такие вещи можно делать только с помощью JavaScript. Читатели, которые не понимают, перейдите к разделу «Принципы борьбы с рептилиями Python3 и обход реального боя».
Тогда сделайте поиск!
Запустите функцию глобального поиска инструмента отладки браузера, введите context_kw, и автомобиль будет встречен. то ищите в результатах поискавыглядит полезныминформация, такая как:
Обнаружено, что context_kw появляется в коде JavaScript, а ключевая информация.context_kw + i + _0xea12('0x2c'). Код также запутан! Читатели, которые не видят его, могут найти автора Вэй Шидонга, чтобы подписаться на "Обратный ряд JavaScript", вы сможете быстро найти код, который выглядит полезным, и понять логику кода после изучения.
Вот практическое чтение кода JavaScript. Первый абзац, состоящий из 977 строк кода, выглядит следующим образом:
var _0xa12e = ['appendChild', 'fromCharCode', 'ifLSL', 'undefined', 'mPDrG', 'DWwdv', 'styleSheets', 'addRule', '::before', '.context_kw', '::before{content:\x20\x22', 'cssRules', 'pad', 'clamp', 'sigBytes', 'YEawH', 'yUSXm', 'PwMPi', 'pLCFG', 'ErKUI', 'OtZki', 'prototype', 'endWith', 'test', '8RHz0u9wbbrXYJjUcstWoRU1SmEIvQZQJtdHeU9/KpK/nBtFWIzLveG63e81APFLLiBBbevCCbRPdingQfzOAFPNPBw4UJCsqrDmVXFe6+LK2CSp26aUL4S+AgWjtrByjZqnYm9H3XEWW+gLx763OGfifuNUB8AgXB7/pnNTwoLjeKDrLKzomC+pXHMGYgQJegLVezvshTGgyVrDXfw4eGSVDa3c/FpDtban34QpS3I=', 'enc', 'Latin1', 'parse', 'window', 'location', 'href', '146385F634C9CB00', 'decrypt', 'ZeroPadding', 'toString', 'split', 'length', 'style', 'type', 'setAttribute', 'async', 'getElementsByTagName', 'NOyra', 'fgQCW', 'nCjZv', 'parentNode', 'insertBefore', 'head'];
(function (_0x4db306, _0x3b5c31) {
var _0x24d797 = function (_0x1ebd20) {
while (--_0x1ebd20) {
_0x4db306['push'](_0x4db306['shift']());
}
};
Читайте дальше, чтобы увидетьCryptoJSЭто слово, когда вы его видите, знайте, что в коде используются некоторые операции шифрования и дешифрования.
Второй абзац, 1133 строки кода, исходный текст выглядит следующим образом:
for (var i = 0x0; i < words[_0xea12('0x18')]; i++) {
try {
document[_0xea12('0x2a')][0x0][_0xea12('0x2b')]('.context_kw' + i + _0xea12('0x2c'), 'content:\x20\x22' + words[i] + '\x22');
} catch (_0x527f83) {
document['styleSheets'][0x0]['insertRule'](_0xea12('0x2d') + i + _0xea12('0x2e') + words[i] + '\x22}', document[_0xea12('0x2a')][0x0][_0xea12('0x2f')][_0xea12('0x18')]);
}
}
Петля здесьwords,ПотомwordsИндекс элемента и комбинация соответствующего элемента очень близки к тому, что мы догадались, и теперь нам нужно найтиwords.
Как его найти?
Не так ли?
Просто выполните поиск, следуйте результатам поиска и найдите определениеwordsкод:
var secWords = decrypted[_0xea12('0x16')](CryptoJS['enc']['Utf8'])[_0xea12('0x17')](',');
var words = new Array(secWords[_0xea12('0x18')]);
По этому методу мы наконец-то обнаружили, что содержимое CSS-контента представляет собой массив_0xa12e
Зашифрованный элементAES
Значение, полученное после расшифровки и некоторой обработки.
После того, как логика понятна, мы можем начать вытаскивать нужный нам JS-код.
Несмотря на то, что этот код запутан, он все еще относительно прост, поэтому конкретные шаги извлечения кода демонстрироваться не будут.Вот два момента, которые необходимо переписать после извлечения кода.
Первый — это захват исключения на рисунке ниже, который определяет, является ли текущий URL-адрес исходным веб-сайтом, но при отладке в среде узла нет объекта окна и объекта документа. происходят, поэтому код с этими объектами необходимо закомментировать, например следующий оператор if:
try {
if (top[_0xea12('0x10')][_0xea12('0x11')][_0xea12('0x12')] != window[_0xea12('0x11')]['href']) {
top['window'][_0xea12('0x11')]['href'] = window[_0xea12('0x11')][_0xea12('0x12')];
}
В других местах на яму нужно наступать самостоятельно.
После модификации вы можете получить все замененные символы, далее вам нужно только заменить их в HTML, чтобы восстановить нормальную страницу.replaceЯ не буду демонстрировать.
Принцип защиты от рептилий
Используемый пример::before, текст ниже описывает, что он делает:
В CSS,::beforeИспользуется для создания псевдоэлемента, который будет первым дочерним элементом, соответствующим выбранному элементу. Атрибут содержимого часто используется для добавления декоративного содержимого к элементу.
Цитата из:developer.Mozilla.org/this-cn/docs/…
Например, создайте новый HTML-документ и напишите в нем следующее:
<q>大家好,我是咸鱼</q>,<q>我是 NightTeam 的一员</q>
Затем стилизуйте тег q:
q::before {
content: "«";
color: blue;
}
q::after {
content: "»";
color: red;
}
Полный код выглядит следующим образом (написан для друзей, не знакомых с HTML):
<style>
q::before {
content: "«";
color: blue;
}
q::after {
content: "»";
color: red;
}
</style>
<q>大家好,我是咸鱼</q>,<q>我是 NightTeam 的一员</q>
Когда мы открываем HTML-документ в браузере, мы видим что-то вроде этого:
В стиле мы добавили атрибуты ::before и ::after к тегу q и установили содержимое и соответствующий цвет. В результате перед содержимым, обернутым тегом q, появится синий цвет."символ, за которым следует красный》символ.
Просто и понятно!
резюме
Эта статья кратко знакомит с применением Implicit Style-CSS в антикраулинге и учит, как бороться с этой ситуацией на простом примере.Я думаю, вы, кто попробовал это, уже четко знаете, что делать в следующий раз, когда вы столкнетесь с этим видом антисканирования. -ползание Как взломать.
Конечно, этот пример не настолько совершенен, чтобы полностью охватить все методы применения неявного Style-CSS в антикраулерах.Если читатели и друзья заинтересованы в такого рода антикраулерах, вы можете найти еще несколько примеров и попробуйте сами Вы также можете общаться и обсуждать со мной через область сообщений.
Ссылка в этой статье
Статья паблика NightTeam «Я слышал, что вы остановились, когда столкнулись с таким видом антилазания? Научите, как убить его за секунды! 》
Новая книга Вэй Шидонга «Принципы защиты от рептилий Python3 и обход реального боя»
Уведомление об авторских правах
Автор: sfhfpc — Вэй Шидун
Ссылка на сайт:www.sfhfpc.com
До завершения подачи к ней можно получить доступ только через ip:http://121.36.22.204
Источник: Алгоритмы и антисканеры
Авторские права принадлежат автору. Пожалуйста, указывайте источник для некоммерческой перепечатки. Коммерческая перепечатка запрещена.