Contornando a Proteção Anti-Scraping XX乐 com Técnicas de Engenharia Reversa

Este artigo explora uma técnica de engenharia reversa para superar um mecanismo de proteção anti-scraping conhecido como XX乐, comumente encontrado em websites. O processo envolve manipular cookies e executar código JavaScript gerado dinamicamente para simular um navegador legítimo.

O mecanismo XX乐 opera em três etapas sequenciais de requisições HTTP:

  • A primeira requisição retorna um erro HTTP 501 e estabelece um cookie inicial.
  • A segunda requisição, utilizando o cookie obtido, retorna um código JavaScript ofuscado que, quando executado, gera um novo cookie de sessão.
  • A terceira requisição, com o cookie final, obtém a resposta correta do servidor.

A implementação a seguir demonstra como automatizar este processo utilizando Python, com a biblioteca requests para gerenciar sessões HTTP e pyexecjs para executar o código JavaScript.

Análise e Implementação

Iniciamos estabelecendo uma sessão HTTP persistente para manter os cookies entre requisições. A primeira requisição é feita para a URL alvo.

import requests
import re
import execjs
from functools import partial
import subprocess

# Configuração para evitar problemas de encoding com pyexecjs
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

# Definição de headers para simular um navegador
cabecalhos = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
}

# URL de exemplo (substitua pela URL real)
alvo_url = "https://exemplo.com/pesquisa?termo=teste"

# Criação da sessão
cliente = requests.session()

# Primeira requisição
resp_inicial = cliente.get(alvo_url, headers=cabecalhos).text

# Extração do código JS para gerar o cookie inicial
codigo_js_inicial = re.findall(r'document\.cookie=(.*?);loca', resp_inicial)[0]
valor_cookie_inicial = execjs.eval(codigo_js_inicial).split(';')[0].split('=')[1]
cliente.cookies.set('__jsl_clearance_s', valor_cookie_inicial)

Na segunda etapa, a requisição retorna um trecho de JavaScript ofuscado. Para executá-lo, é necessário simular um ambiente de navegador mínimo, definindo objetos como window, navigator e document.

# Segunda requisição
resp_segunda = cliente.get(alvo_url, headers=cabecalhos).text

# Extração do código JavaScript principal
codigo_js_ofuscado = re.findall(r'<script>(.*?)</script>', resp_segunda)[0]

# Template de ambiente para execução do JS
ambiente_js = """var janela = global;
janela.navigator = {userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'};
var documento = {};
var localizacao = {};
function obterCookie() { return documento.cookie; }
setTimeout = function(fn, tempo) { fn(); };
CODIGO_PLACEHOLDER"""

# Substituição do placeholder pelo código real e execução
codigo_completo = ambiente_js.replace('CODIGO_PLACEHOLDER', codigo_js_ofuscado)
contexto_js = execjs.compile(codigo_completo)
cookie_final = contexto_js.call('obterCookie').split(';')[0].split('=')[1]
cliente.cookies.set('__jsl_clearance_s', cookie_final)

Com o cookie final configurado, a terceira requisição pode ser realizada para obter o conteúdo desejado.

# Terceira requisição
resultado_final = cliente.get(alvo_url, headers=cabecalhos).text
print(resultado_final[:500])  # Exibe os primeiros 500 caracteres para verificação

Considerações Técnicas

A técnica de ambiente simulado é crucial, pois o código JavaScript ofuscado frequentemente verifica propriedades do navegador. A biblioteca pyexecjs pode apresentar problemas de encoding em alguns sistemas; a solução acima mitiga isso com a redefinição de subprocess.Popen. Alternativas como Node.js diretamente ou bibliotecas mais modernas como js2py também podem ser exploradas.

O método de extração de cookies via regex e a execução do JS são adaptáveis a variações do mecanismo XX乐, mas podem requerer ajustes conforme a complexidade do código ofuscado.

Tags: Python javascript web scraping engenharia reversa Anti-Scraping

Publicado em 6-26 01:06