Repositório GitHub: https://github.com/JSREI/js-cookie-monitor-debugger-hook
Chinês Simplificado | Inglês
Em uma era em que os dados não têm preço, o confronto entre rastreadores e anti-rastreadores tornou-se intenso. Os anti-rastreadores de cookies são最常见之一
de anti-rastreadores. Os sites definem cookies por meio de código JS que é tão confuso que até as mães o fazem. não o reconhece (geralmente durante a navegação) Impressões digitais do servidor, cookies que devem ser trazidos ao fazer solicitações, etc.), Cookies que devem ser trazidos ao enfrentar solicitações, mas não sabem onde são gerados, Você está lutando em dezenas de milhares de linhas confusas de merda JS que sua mãe não reconhece, na esperança de encontrar o lugar onde os cookies são gerados (se o pensamento inverso não for científico, você pode engasgar algumas vezes...), e até quero encontrar algumas vezes. Você está tentando se enganar e desistir ou por que não apenas usar um método de emulação de navegador como o Selenium? Se você é covarde, esse roteiro está aqui para te ajudar! (Você e eu sabemos que este parágrafo é simplesmente um disparate para apoiar a cena, você pode ignorá-lo, se não tiver a infelicidade de terminar de lê-lo...)
A função deste script é basicamente dividida em duas partes:
Este script injeta seu próprio código JS na página e conecta document.cookie
para completar várias funções. Portanto, antes de usar este script, você deve primeiro confirmar se o cookie a ser gerado é realmente gerado por JS (um método muito especial será introduzido posteriormente). . Basta determinar se o cookie é gerado por JS ou retornado pelo servidor).
Atualmente, muitos scripts de Hook têm posturas de hooking incorretas. Este script usa Hooks únicos e repetidos, o que não tem impacto no gerenciamento de cookies integrado do navegador:
Além da função de ponto de interrupção de cookies, foi adicionada uma função de monitoramento de modificação de cookies, que pode analisar os cookies na página de uma perspectiva mais macro:
(Esqueça, desista da codificação...)
A cor é usada para distinguir os tipos de operação:
Cada operação será seguida por um local de código. Clique para localizar o local do código JS que executou a operação.
A partir da versão 0.6, foram introduzidas regras de ponto de interrupção com funções mais poderosas e configurações mais flexíveis, e um mecanismo de eventos foi introduzido para subdividir as modificações de cookies em três eventos: adicionar, excluir e atualizar, suportando pontos de interrupção mais refinados. Eventos de cookies, consulte a Parte 5 deste artigo para obter detalhes.
Por que foi projetado dessa maneira? Uma situação relativamente comum é que o cookie anti-rastreamento no site de destino seja definido por JS, mas a lógica do código JS é excluí-lo freneticamente primeiro e depois excluí-lo várias vezes antes de adicionar o valor real. desta forma pode neutralizar exatamente a depuração geral do Cookie Hook.
Aqui está um exemplo, como a proteção de cookies do F5, existe um cookie TS51c47c46075
, que é excluído várias vezes e adicionado novamente: Nesse caso, você pode definir um ponto de interrupção para o evento de cookie denominado TS51c47c46075
para evitar confundir os eventos de exclusão em vermelho.
Teoricamente, desde que o código JS deste script possa ser injetado na página, o plug-in Grease Monkey é usado para injetar o código JS na página.
O plug-in Grease Monkey pode ser instalado na Chrome Store:
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
Se você não conseguir contornar o muro, poderá procurar por "Tampermonkey" no Baidu para encontrar sites de terceiros para download. No entanto, tome cuidado para não instalar plug-ins maliciosos falsos. É recomendável instalar a partir da loja oficial.
Outras ferramentas também estão disponíveis, desde que o código JS deste script possa ser injetado no topo da página para execução.
Você pode instalar o script Grease Monkey da loja oficial ou pode copiar o código e criá-lo localmente.
Este método é recomendado. O script Oil Monkey instalado na Oil Monkey Store pode ser atualizado automaticamente quando versões subsequentes forem atualizadas. Este script foi colocado na Oil Monkey Store:
https://greasyfork.org/zh-CN/scripts/419781-js-cookie-monitor-debugger-hook
Se você achar as atualizações automáticas muito irritantes ou tiver outras preocupações, você pode copiar o código deste script aqui:
https://github.com/CC11001100/js-cookie-monitor-debugger-hook/blob/main/js-cookie-monitor-debugger-hook.js
Após revisar e confirmar que não há problema, você pode adicioná-lo no painel de gerenciamento do Oil Monkey.
Observe que monitorar é ter uma compreensão geral em nível macro, não localizar detalhes (normalmente o uso correto de ferramentas pode melhorar a eficiência. É claro que o conhecimento de uma pessoa é limitado e todos são bem-vindos para dar feedback sobre maneiras mais interessantes de play), por exemplo ao abrir uma página:
Com base nesta imagem, podemos ter uma compreensão geral de quais cookies deste site são operados pela JS, quando e como são operados.
Outro exemplo é usar um monitor para observar a mudança do padrão dos cookies. Por exemplo, nesta página, você pode ver com base no tempo que o cookie será alterado a cada meio minuto:
(2021-1-7 18:27:49 atualizado v0.4 para adicionar este recurso): Se houver muita informação impressa pelo console, você pode usar a filtragem que vem com o navegador Chrome para filtrá-la. os logs impressos foram unificados e só precisam de cookieName = Cookie名字
, por exemplo:
Observe que, ao pesquisar, certifique-se de que suas informações de pesquisa sejam decodificadas por URL, caso contrário, podem não corresponder, porque as informações de impressão do console são primeiro decodificadas por URL e depois impressas.
Se você não tiver certeza se o cookie que deseja definir foi gerado localmente ou retornado por um servidor solicitante set-cookie
, você pode abrir este script, atualizar a página do site de destino e procurar o nome do cookie no console. O método é o mesmo acima. Esta seção é semelhante Quando o nome do cookie é curto e não distintivo, você pode adicionar cookieName
para auxiliar no posicionamento, por exemplo:
cookieName = v
Às vezes, o site de destino pode definir um cookie repetidamente com o mesmo valor. Esta variável é usada para ignorar tais eventos:
Geralmente, basta manter o padrão.
@since v0.6
Esta parte do documento se aplica à versão v0.6+. Se sua versão local for inferior a 0.6, atualize a versão antes de ler o documento.
A partir da versão 0.6, os pontos de interrupção quando o valor do cookie muda tornaram-se muito complicados e também muito simples. A complexidade se deve à introdução do mecanismo de evento e a simplicidade ocorre porque a configuração da regra do ponto de interrupção é simplificada. e mais flexível.
As regras de ponto de interrupção podem ser divididas em标准规则
e简化规则
. As regras padrão são para fácil implementação e processamento na parte inferior do programa. As regras simplificadas são para os usuários configurarem de forma mais conveniente. Quando a configuração de regras simplificadas não puder Verifique novamente para ver como configurar as regras padrão quando suas necessidades forem atendidas.
Todas as regras são configuradas no array debuggerRules
e há uma variável no início do script: Se não conseguir encontrar, você pode pressionar Ctrl+F para pesquisar pelo nome da variável:
debuggerRules
Esta variável é do tipo array, que armazena algumas condições de regra para determinar em que circunstâncias o ponto de interrupção será inserido.
Observe que esta é uma matriz e as regras na matriz estão em um relacionamento OR. Quando o evento de modificação do cookie for acionado, cada regra será correspondida sequencialmente. Contanto que uma regra seja correspondida com sucesso, um ponto de interrupção será inserido.
Insira um ponto de interrupção quando o cookie chamado foo
for alterado:
const debuggerRules = [ "foo" ] ;
Especificar uma string da maneira acima corresponderá ao nome do cookie se for igual à string fornecida.
Observe que se houver uma parte da correspondência exata codificada em URL aqui, ela precisará ser primeiro decodificada em URL e depois colada aqui. Outros locais que envolvem strings são os mesmos e não serão descritos novamente.
Se o nome do cookie contém uma parte em constante mudança, como carimbo de data/hora, UUID, etc., que não pode ser localizada pelo nome, então a correspondência regular é usada:
const debuggerRules = [ / foo.+ / ] ;
Na maioria dos casos, apenas estas duas configurações são suficientes.
Vamos praticar agora ao abrir esta página.
https://www.ishumei.com/trial/captcha.html
Você pode ver que o script detectou algumas operações de cookies:
Um deles, smidV2
é suspeito, então adicionamos um ponto de interrupção para ele:
Depois de modificar debuggerRules
, certifique-se de pressionar Ctrl+S para salvar o script. Como o Oil Monkey injeta o código JS quando a página é carregada, você precisa atualizá-la e injetá-la novamente. o ponto de interrupção será inserido automaticamente:
Na caixa vermelha A da imagem acima estão algumas variáveis passadas especialmente. Ao mover o mouse sobre essas variáveis para visualizar os valores, podemos conhecer aproximadamente algumas condições do ponto de interrupção atual:
Depois, há a caixa vermelha B. Definimos o ponto de interrupção do cookie para rastrear a pilha de chamadas e localizar o local onde o cookie é gerado. A caixa vermelha é a pilha de chamadas deste script. Há um logotipo userscript.html
claro. esta parte da pilha de chamadas.
Em seguida, rastreie a pilha de chamadas e você poderá ver onde o cookie está definido:
Claro, é inútil olharmos para esta pilha. O que temos que fazer é avançar gradualmente até localizarmos o local onde o cookie é realmente gerado. das estrelas e do mar dependerá disso mais tarde!
Insira um ponto de interrupção quando o cookie chamado foo
for添加
:
const debuggerRules = [ { "add" : "foo" } ] ;
Insira um ponto de interrupção quando o cookie chamado foo
for删除
:
const debuggerRules = [ { "delete" : "foo" } ] ;
Insira um ponto de interrupção quando o cookie chamado foo
já existir, mas o valor for更新
:
const debuggerRules = [ { "update" : "foo" } ] ;
Várias condições podem ser especificadas ao mesmo tempo e pontos de interrupção são inseridos ao添加和更新
, o que equivale a excluir exclusões:
const debuggerRules = [ { "add|update" : "foo" } ] ;
Strings ou expressões regulares podem ser usadas sempre que a correspondência de nomes de cookies estiver envolvida:
const debuggerRules = [ { "add" : / foo_d+ / } ] ;
As regras simplificadas acima serão convertidas em regras padrão. Você também pode configurar regras padrão diretamente na matriz debuggerRules
.
{
"events": "{add|delete|update}",
"name": {"cookie-name" | /cookie-name-regex/},
"value": {"cookie-value" | /cookie-value-regex/}
}
Tipo de string, indicando o tipo de evento correspondido por esta regra |
Pode ser um único evento, como add
, ou vários eventos. Use |
para separar vários eventos, como add|update
. Adicione espaços em ambos os lados, como add | update
Quando o tipo de evento for configurado, ele corresponderá apenas ao tipo de evento fornecido. Quando esta opção não estiver configurada, todos os tipos de evento serão correspondidos por padrão.
Pode ser uma string ou um padrão regular. É verdade quando o nome do cookie corresponde à string ou padrão regular fornecido. Este item não pode ser ignorado e deve ser configurado.
Pode ser uma string ou um padrão regular. Esta regra é verdadeira quando o valor do cookie corresponde à string ou padrão regular fornecido. Se não for configurada, esta opção será ignorada.
A configuração das regras de ponto de interrupção foi introduzida anteriormente e os tipos de eventos foram mencionados muitas vezes. Conhecemos apenas a string de nome correspondente a cada evento, mas ainda não sabemos o que cada evento significa no nível inferior. O mecanismo de realização de um evento.
As alterações de cookies são subdivididas em adição de cookies, exclusão de cookies e atualização de valores de cookies existentes. Cada evento corresponde a um nome de evento:
O cookie não existia localmente antes e esta é a primeira vez que foi adicionado. Pode ser a primeira vez que você visita este site, ou você pode limpar os cookies e visitar novamente, ou um novo cookie será gerado toda vez que você visitar o site, ou pode até ser que o próprio código do site exclua cookies e adicione novamente eles, o que acionará o evento de adição de cookies.
Por exemplo, execute o seguinte código. Para garantir que o cookie não exista antes, um carimbo de data/hora é adicionado ao nome do cookie:
document . cookie = "foo_" + new Date ( ) . getTime ( ) + "=bar; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
Quando executamos esta linha de código no console, o evento Cookie Add será acionado:
Quando um cookie já existe localmente e você tenta definir um valor para ele, o evento Update Cookie será acionado.
Por exemplo, o seguinte código:
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=/" ;
A primeira instrução para definir Cookie acionará o evento Cookie New, e a segunda instrução para definir Cookie acionará o evento Cookie Update porque o Cookie a ser definido já existe.
Se o desenvolvedor front-end expirar antes do horário atual ao definir o cookie, isso significa que o cookie precisa ser excluído. Por exemplo, uma maneira comum de excluir cookies é:
const expires = new Date ( new Date ( ) . getTime ( ) - 1000 * 30 ) . toGMTString ( ) ;
document . cookie = "foo=; expires=" + expires + "; path=/"
Quando executarmos este código no console, o evento de exclusão de cookie será acionado:
Também pode ser visto acima que o acionamento do evento de exclusão de cookie é puramente para detectar expirações e não irá realmente verificar se o cookie existia antes.
Conforme mencionado anteriormente, existe um tipo de evento ao configurar regras de ponto de interrupção de cookie. Na verdade, cada tipo de evento corresponde a um bit de flag que indica se o ponto de interrupção deste tipo de evento está ativado. , se não estiver Quando o ponto de interrupção de exclusão de cookie estiver ativado e um evento de exclusão de cookie for acionado, ele primeiro verificará se o ponto de interrupção de exclusão de cookie está ativado. Se estiver desativado, o evento será ignorado e não haverá mais tentativas. ser feito para corresponder às regras do ponto de interrupção (controlado pelas ferramentas do desenvolvedor). O log deste evento de exclusão ainda será impresso na plataforma).
Então agora a situação ficou muito complicada. Vamos percorrer o processo deste pequeno ponto de interrupção do Cookie:
Por padrão, apenas os pontos de interrupção para eventos de adição de cookies e eventos de modificação de cookies estão habilitados:
Porque em circunstâncias normais, adicionar cookies e atualizar cookies pode ser confuso. Ambos atribuem um valor ao cookie e, na maioria dos casos, não prestaremos atenção ao caso de o cookie ser excluído, então é assim que ele é definido aqui. Se não atender às suas necessidades. Se necessário, você mesmo poderá modificar o valor correspondente de enableEventDebugger
.
Se você encontrar algum problema durante o uso, você pode fornecer feedback em Issues
no GitHub, também pode fornecer feedback na área de comentários do Grease Monkey Script ou pode me enviar um e-mail e tratarei disso assim que possível depois de ver.
A partir da versão v0.6, foi adicionada uma variável para ajustar o tamanho da fonte do log impresso por este script no console, em px:
À medida que a versão itera, ela pode não estar mais neste local. Se você não conseguir encontrá-la imediatamente, basta pesquisar no código:
consoleLogFontSize
Em seguida, modifique o valor desta variável.
Ou como outra solução, você pode manter pressionada a tecla Ctrl + roda do mouse no console de ferramentas do desenvolvedor para ampliar e ajustar o tamanho geral. Esta é uma função que vem com o navegador Chrome.
Conforme explicado no início deste artigo, este script deve ser injetado com sucesso no início da página e executado antes que o Hook possa ser bem-sucedido. Para a página inteira, semelhante à primeira camada do Acelerador, apenas um script é retornado. a lógica interna:
< script >
document . cookie = 这里是一些奇奇怪怪的JS用于计算出Cookie ;
location . href = "跳转走了" ;
</ script >
O cookie é definido e redirecionado para uma nova página imediatamente. Para esta operação, o gancho pode não estar disponível. Isso é um problema com o script Grease Monkey. este URL.
Abaixo desta página está um resumo de alguns exemplos práticos de engenharia reversa usando este script:
Clique em mim para entrar na página de navegação
Este projeto é dividido em: 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
Depois de alterar o namespace, o número de instalações pode ser apagado. Tirei uma captura de tela para comemorar. A partir de agora (2022-7-29 21:40:01), o número de instalações ultrapassou 300. Parece que sim. muito grande para uma ferramenta pequena em um campo tão estreito. Não é mais fácil...
Obrigado aos internautas entusiasmados pelo feedback, obrigado pelo seu apoio.
js-cookie-monitor-debugger-hook agora se juntou ao projeto 404 Star Chain
Digitalize o código QR para ingressar no grupo de troca de tecnologia reversa:
Se o código QR do grupo expirar, você pode me adicionar no WeChat pessoal e enviar [Reverse Group] para se juntar a você no grupo:
Clique aqui ou escaneie o código QR para ingressar no grupo de comunicação TG: