Этот метод борьбы с рептилиями немного интересен, смотрите, как я его сломаю!

Python рептилия

Этот метод защиты от сканирования широко используется в продуктах ведущих интернет-компаний, таких как веб-сайты автомобильной информации, новые веб-сайты и другие сайты с высокой плотностью текста. Прежде чем мы начнем учиться, давайте посмотрим на конкретное явление. Открытый URL-адрес:

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

Источник: Алгоритмы и антисканеры

Авторские права принадлежат автору. Пожалуйста, указывайте источник для некоммерческой перепечатки. Коммерческая перепечатка запрещена.