破解反爬虫策略 /_guard/auto.js(一) 原理

背景

当用代码或者postman访问一个网站的时候,访问他的任何地址都会返回<script src="/_guard/auto.js"></script>,但是从浏览器中访问显示的页面是正常的,这种就是网站做了反爬虫策略。本文就是带大家来破解这种策略,也就是反反爬虫。

思路

寻找关键参数

既然在浏览器中访问没问题,那我们就把浏览器的请求复制下来,看是哪些参数让请求可以正常访问,将curl复制到postman中,把请求头一个个去掉,看去掉哪些请求头会让请求无法正常访问

最终发现是Cookie和User-Agent一起使得请求合法,如下

  • Cookie:guardret=BQgG; __51vcke__K1rw5p3uprPRftXo=21f5dde6-91d9-520b-a429-4a6e99d44523; __51vuft__K1rw5p3uprPRftXo=1720509084853; guardok=9DltyP8ERJnWJaolNInDWV03ft30EOzKt4tqyEk7ovRpu+YeNMKAWDqyyT9DwacZaxy9brXjs+8M+k2pbxhhWw==; PHPSESSID=khol0nbd4esktf48ddmecbidb6; __vtins__K1rw5p3uprPRftXo=%7B%22sid%22%3A%20%22045d7540-b7de-543b-830f-f3cb437c85bd%22%2C%20%22vd%22%3A%201%2C%20%22stt%22%3A%200%2C%20%22dr%22%3A%200%2C%20%22expires%22%3A%201721135512843%2C%20%22ct%22%3A%201721133712843%7D; __51uvsct__K1rw5p3uprPRftXo=7
  • User-Agent:Mozilla/xxx

可以看到Cookie中有好几项,我们继续在Cookie中删除,发现只有guardok有用,其他的都没用,所以最终有用的请求头如下

  • Cookie:guardok=9DltyP8ERJnWJaolNInDWV03ft30EOzKt4tqyEk7ovRpu+YeNMKAWDqyyT9DwacZaxy9brXjs+8M+k2pbxhhWw==
  • User-Agent:Mozilla/xxx

js混淆

这么看来关键的东西就是这个guardok,那我们看看这个是什么时候生成的,把浏览器的cookie删除,再打开开发者模式

但是发现在开发者模式下,这个js在无限的debug,这是一个很常见的防debug的代码,就是定时循环执行含有debugger的代码,如果没在开发者模式那么debug就不会生效(遇到debugger断点不会停),但如果是在开发者模式下就会停到断点处,并且这个方法还会不断的自己调自己直到下一次定时时间,所以即使我们调试通过这个断点也会立刻到这个断点处。

由于这个代码的存在我们不能查看network,因为会一直卡在debuger。那我们就直接用postman访问这个js看看guardok是不是在这个js中生成的。

但是这个js返回的内容还是混淆过的,直接看是看不懂的,比如他会把 "location" 混淆成 _0x10a691(0x215, 'lIIz'),其实这个的意思是将一个初始值_0x10a691 进行位偏移,偏移后就变成了另一个值"location" ,并且这个在浏览器上运行也是能正常运行,只不过加大了我们的翻译成本。

分析关键参数guardok生成过程

既然翻译成本大,那我就先确认这个guardok是否和这个js有关,别翻译了半天发现跟他没关系,那心态就崩了。这个也好确认,在浏览器上访问一次看这个guardok是什么时候生成的就行,但因为这个debbuger的问题我们不能直接在浏览器上访问,所以就抓个包看看这个接口就行,比如使用Charles。

通过抓包可以看到,同一个接口访问了两次

  1. 第一次访问,在响应头中的cookie里返回了guard,并且返回的报文体中返回了那个js文件
  2. 第二次访问,在响应头中的cookie里返回了guardok,并且返回的报文体中返回了正常的页面数据

可以看到第二次访问的请求中并没有任何地方携带guardok,但是在响应头中有guardok。那么就说明第二次的请求中有参数会传给后端,由后端生成guardok并放到Set-Cookie中,后续的请求就都携带了guardok。

查看第二次的请求只是在请求的cookie中多了guardret和guard这两项。由此可以知道是根据guardret和guard去服务端换取guardok,而guard会在第一次请求的响应中返回到Set-Cookie,无需客户端手动生成。而guardret则只可能会由第一次请求返回的那个js中生成,那我们只需在js中把生成guardret的算法找出来就行了

反js混淆

到这里也就只能对js进行反混淆了,只有知道生成guardret的算法,那一切就都通了。我试过好多反混淆工具都无法解析出实际的代码。没办法只能花时间一点点的还原了。重头戏来了,还原的方法其实并不难,相反还很简单,就是苦力活。比如这个方法


var _0xd750ee = _0x5391;function setRet(_0x34d4ed) {var _0x10a691 = _0xd750ee, WtHInZ = {'GIeQp': function (callee, _0xf9e2d4) {return callee(_0xf9e2d4);}, 'LYVKf': 'undefined', 'fOOLQ': function (_0x396e94, _0x39a709) {return _0x396e94 - _0x39a709;}, 'FARua': function (_0x4be905, _0x42316e) {return _0x4be905 * _0x42316e;}, 'ascvk': function (callee, _0x10b8fa, _0x4313da) {return callee(_0x10b8fa, _0x4313da);}, 'wqePU': function (callee, _0x1a7786) {return callee(_0x1a7786);}, 'dYcOv': _0x10a691(0x201, '0@TB')}, _0x3a9f4b = _0x34d4ed[_0x10a691(0x1ee, '6%cq')](0x0, 0x8), time_num_plain = _0x34d4ed['substr'](0xc),_0x305bd1 = WtHInZ[_0x10a691(0x1c8, '2qE2')](parseInt, time_num_plain['substr'](0xa));typeof window === WtHInZ[_0x10a691(0x1dd, 'WPXd')] && (_0x305bd1 = 0x2);var _0x552e00 = WtHInZ[_0x10a691(0x1da, 'QiI*')](WtHInZ[_0x10a691(0x1d2, 'p7[8')](_0x305bd1, 0x2) + 0x11, 0x2),encrypted = WtHInZ[_0x10a691(0x25a, '!koh')](x, _0x552e00[_0x10a691(0x275, '6f6c')](), _0x3a9f4b),guard_encrypted = WtHInZ[_0x10a691(0x24e, 'lIIz')](b, encrypted);document[_0x10a691(0x1f7, 'hlsZ')] = WtHInZ[_0x10a691(0x1eb, 'sPw2')] + guard_encrypted, window[_0x10a691(0x215, 'lIIz')]['reload']();
}

里面的很多代码都看不出是啥东西,不过没关系,我们可以让浏览器帮我们翻译,首先把无限debug的代码先去掉,改成空方法即可,如下

    function debuggerProtection(counter) {}

然后在一个文本里加入script标签, <script type="text/javascript"> </script>,再把修改后的js代码复制到标签中间,另存为.html文件。双击该html文件再使用开发者工具即可。

然后我们就一步步的用浏览器debug即可,比如 WtHInZ[_0x10a691(0x1d2, 'p7[8')](_0x305bd1, 0x2) 

1.文本翻译

首先翻译 _0x10a691(0x1d2, 'p7[8'),因为var _0x10a691 = _0xd750ee,所以_0x10a691(0x1d2, 'p7[8')也就是_0xd750ee(0x1d2, 'p7[8'),那我们只需要在浏览器中把它打印出来即可,alert、debug、console打印都行,在这里我们用debug,随便找个地方执行,如下打印个断点查看

可以看到_0x10a691(0x1d2, 'p7[8')为"FARua"

2.文本替换 

WtHInZ[_0x10a691(0x1d2, 'p7[8')](_0x305bd1, 0x2) 就等于 WtHInZ["FARua"](_0x305bd1, 0x2)

3.方法替换 

WtHInZ是一个字典值,里面的key对应里各种方法或者文本,key为"FARua"所对应的是一个方法如下

function (_0x4be905, _0x42316e) {return _0x4be905 * _0x42316e;}

可以看出也就是一个简单的两个数相乘,所以WtHInZ["FARua"](_0x305bd1, 0x2)=  _0x305bd1*0x2。

4.最终替换

到这里就完成了对WtHInZ[_0x10a691(0x1d2, 'p7[8')](_0x305bd1, 0x2)的翻译。即WtHInZ[_0x10a691(0x1d2, 'p7[8')](_0x305bd1, 0x2) = _0x305bd1*0x2 

其中的_0x305bd1是一个变量名,由上一步计算出来的,不用管

这样一步步把需要的代码就还原出来了,其实里面大部分代码是没用的就是为了混淆我们,所以我们不用都翻译,只要翻译自己感觉像的那几个方法就行。翻译完就是这样的

function setRet(_0x34d4ed) {var _0x10a691 = _0xd750ee, WtHInZ = {'GIeQp': function (callee, _0xf9e2d4) {return callee(_0xf9e2d4);}, 'LYVKf': 'undefined', 'fOOLQ': function (_0x396e94, _0x39a709) {return _0x396e94 - _0x39a709;}, 'FARua': function (_0x4be905, _0x42316e) {return _0x4be905 * _0x42316e;}, 'ascvk': function (callee, _0x10b8fa, _0x4313da) {return callee(_0x10b8fa, _0x4313da);}, 'wqePU': function (callee, _0x1a7786) {return callee(_0x1a7786);}, 'dYcOv': "guardret="}_0x3a9f4b = _0x34d4ed["substr"](0x0, 0x8)time_num_plain = _0x34d4ed['substr'](0xc)_0x305bd1 = parseInt(time_num_plain['substr'](0xa));var _0x552e00 = _0x305bd1 * 0x2 + 0x11 - 0x2encrypted = x(_0x552e00["toString"](), _0x3a9f4b)guard_encrypted = btoa(encrypted);document["cookie"] = "guardret=" + guard_encrypted, window['location']['reload']();
}

可以看到guardret确实是在这个js中生成的,并且生成的算法也比较简单就是一些加减乘除加上异或操作等,生成后就可以使用guardret和guard去服务端换guardok了。由此这个破解反爬虫策略也就完成了

完整破解实战

下一篇文章我会实战破解两个这种反爬虫策略的网站,并用java实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246237.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++ 关机整人代码

目录 &#x1f4d2;温馨提示 &#x1f4d2;示例代码 &#x1f4d2;代码分析 &#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&…

深入浅出消息队列----【初始篇】

深入浅出消息队列----【初始篇】 一、思考&#xff1a;为什么会出现 “消息队列”二、RocketMQ 总览producerproducer groupnameSrvBrokerBroker clusterconsumerconsumer groupTopicTag 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&a…

linux下Jenkins的安装部署

前言&#xff1a; 用docker安装Jenkins非常方便快捷&#xff0c;但是最近国内的docker镜像源都不好用了&#xff0c;这里回顾一下最原始的Jenkins安装方式 安装前准备 安装环境 Jenkins的运行依赖java环境&#xff0c;linux下jdk的安装参考&#xff1a;linux下JDK的安装-CSD…

有效、轻松地从 SD 卡恢复已删除照片的教程

“我拿到了新手机&#xff0c;并将 SD 卡设置为保存手机拍摄的照片的位置&#xff1b;但是&#xff0c;我错误地删除了 SD 卡上的某些高清照片&#xff0c;如何从 SD 卡恢复已删除的照片&#xff1f;请帮忙。” 除了意外删除之外&#xff0c;许多因素都可能导致 SD 卡上的照片…

CH552G的使用IAP下载方式,下载IAP文件和用户运行代码

参考 参考&#xff1a;https://mar-sky.blog.csdn.net/article/details/140448176&#xff0c;本质一样&#xff0c;实现方式不同&#xff0c;对程序的要求不同&#xff0c;不用放在运行代码中。和下面最大区别就是代码的下载地址不同&#xff0c;IAP的代码放在的另一个区域。 …

持续集成03--Jenkins的安装与配置

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的实践中&#xff0c;Jenkins作为一个开源的自动化服务器&#xff0c;扮演着至关重要的角色。本篇“持续集成03--Jenkins的安装配置”将带您走进Jenkins的世界&#xff0c;深入了解如何在Linux环境中安装并配置Jenkins。…

在 Apifox 中如何高效批量添加接口请求 Body 参数?

在使用 Apifox 进行 API 设计时&#xff0c;你可能会遇到需要添加大量请求参数的情况。想象一下&#xff0c;如果一个接口需要几十甚至上百个参数&#xff0c;若要在接口的「修改文档」里一个个手动添加这些参数&#xff0c;那未免也太麻烦了&#xff0c;耗时且易出错。这时候&…

W外链创建抖音私信卡片教程,私信卡片跳转微信工具

W外链地址wai.cn 在数字化时代的浪潮中&#xff0c;私域流量的价值愈发凸显&#xff0c;成为企业获取用户、建立品牌忠诚度、提升转化率的关键手段。抖音&#xff0c;作为当下最热门的短视频社交平台之一&#xff0c;其用户基数庞大、互动性强&#xff0c;为企业私域引流提供了…

3872:Library

网址如下&#xff1a; OpenJudge - 3872:Library 这玩意的dp公式应该很明显吧&#xff1f; 和斐波纳契数列一个样 就是n太大了&#xff0c;最高有十亿&#xff0c;不能用普通的dp来做 经验丰富的可能已经知道了 就是用快速幂加上斐波那契数列通项就行了&#xff0c;虽然f&…

看看我发现了什么好东西!FlowUs知识库还有“就业服务站点”?!

不得不说&#xff0c;FlowUs的知识库内容是在是太丰富了, 浏览了一下&#xff0c;发现真有能帮助毕业生的就业信息分享人才政策汇总等我需要的信息&#x1f4a1;&#xff0c;我反手就是一个订阅&#xff0c;怕下次找不到了&#xff01; 在数字化转型的浪潮中&#xff0c;团队和…

代理IP为何难以达到百分百的有效率?

“随着网络技术的不断发展代理IP成为了众多网络用户的重要工具&#xff0c;尤其在需要保护隐私、突破网络限制或进行大规模网络数据抓取等场景下。然而尽管代理IP的应用广泛且功能强大&#xff0c;但在实际应用中&#xff0c;我们不难发现代理IP的有效率往往难以达到百分百。”…

跨境电商账号被封禁?浏览器指纹风险你需要了解一下!

跨境电商运营者在利用海外社媒平台推广产品时&#xff0c;常常会遭遇一个难题&#xff1a;如何在利用这些平台进行市场营销的同时&#xff0c;避免因浏览器指纹识别技术而导致账户被封禁呢&#xff1f;作为资深的跨境电商从业人员&#xff0c;龙哥将分享一些专业见解&#xff0…

Qt中的弹簧:QSpacerItem的用法

Qt是一个跨平台的C++图形用户界面应用程序框架,它提供了丰富的控件和布局管理功能,使得开发复杂的用户界面变得简单。在Qt的布局系统中,QSpacerItem扮演了一个重要的角色,它被用来在界面元素之间添加“弹簧”,以确保布局的灵活性和适应性。 什么是QSpacerItem? QSpacerI…

【sklearn | 7】:scikit-learn项目实战指南

引言 在数据科学和机器学习领域&#xff0c;Python以其简洁的语法和强大的库支持&#xff0c;成为了许多开发者和研究者的首选语言。而在众多Python机器学习库中&#xff0c;scikit-learn以其易用性、灵活性和强大的算法集合&#xff0c;成为了最受欢迎的库之一。本文将深入探…

路由上传一个ui_control参数(uint32类型)控制页面UI显隐

前言&#xff1a;传一个uint32类型的值&#xff0c;通过 按位或操作符&#xff08;|&#xff09;来设置ui_control的值&#xff0c;通过按位与操作符&#xff08;&&#xff09;来检测是否显示或隐藏 简单介绍一下两个概念&#xff1a; 按位与操作符和按位或操作符都是二进…

【漏洞复现】泛微E-Cology WorkflowServiceXml SQL注入漏洞

0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台&#xff0c;支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 泛微OAE-Cology 接口/services/WorkflowServiceXml 存在SQL注入漏洞&#xff0c;可获取数据库权限&#xff0c;导致数据泄露…

移动端APP 如何进行自动化和探索性测试?

在测试设计时最主要依据的就是测试金字塔的测试结构。如果在项目临近发布才开始测试并发现缺陷&#xff0c;这样修复缺陷的成本就会很高&#xff0c;项目的进度也会很不确定。所以&#xff0c;就开发阶段来说&#xff0c;如果把测试分层&#xff0c;在不同的开发阶段都进行测试…

IIS短文件名称POC检测

使用方法 安装python环境 执行此文件 python [命名].py -u http://baidu.com #!/usr/bin/env python # -*- encoding: utf-8 -*- """ File : IIS-ShortName-PoC.py tell : 用于安全人员检测系统是否存在该漏洞&#xff0c;切勿用于非法用途 "…

分类预测 | Matlab实现OOA-LSSVM鱼鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断

分类预测 | Matlab实现OOA-LSSVM鱼鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断 目录 分类预测 | Matlab实现OOA-LSSVM鱼鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | Matlab实现OOA-LSSVM鱼…

生物化学基础1 : 蛋白质

生物化学基础1 : 蛋白质 /***************************************************/ /***************************************************/ /***************************************************/ /***************************************************/ /**************…