前期准备首先,需要一个干净的浏览器环境,最好使用firefox隐私模式,而不是chrome,firefox的防跟踪模式比chrome更加隐蔽,不过对于b站来说,指纹收集并没有那么变态,我们可以直接使用chrome系浏览器打开,这里我使用的是edge。打开b站登陆页面后,提前f12,勾选禁用缓存\保留日志\禁用断点,并准备一个api调试工具,利用reqable或apifox之类的调试软件可以轻松对参数进行验证。请求分析输入用户名和密码,然后触发登陆请求,对内容进行分析,这里可以看到请求内容还是较多的,我们点击搜索按钮,对登陆的账号进行搜索,这里可以快速定位到请求将payload复制下来,可以看到如下参数:source: main-fe-header username: 1234567890 password: Q3tKLCiEJpkKMPmwGkbW9uCYQGLoVSKHU7xOQl/TZRVnSI5bcyhzJ5RQY3zHE9Xnwc+KSCm1TAiRYRnlbz5auTn9Gy+g5fu7q1Q0jtQSnFJkLLa6oU5JwKW0iMcFPXL65X1DGHgzVZtu5
断点断到参数生成点可以看到,由于函数和变量名使用了大量的大小写字符和下划线混淆手段,导致阅读十分困难使用v_jstool对变量名进行压缩,放到vscode里面看看行数,一共943行,可以看到最下方传入值为虚拟机字节码ast还原标识符还原查看代码,发现含有大量常量及js方法引用,通过标识符替换的方式对js代码进行了混淆先不着急进行还原,先看一下开局的这些变量声明,其中这两个由函数生成的是什么呢?跳转进N,并查看其内部e的引用,很明显N是个字符串还原函数,查看N的引用,发现只有在此处变量声明含有引用直接运行代码,将所有常量声明还原回填标识符安全回填接下来我们需要判断一下这些变量是否未被修改,以及是否存在引用// 遍历 AST traverse(ast, { VariableDeclaration(path) { const { declarations } = path.node; for (const declaration of declarations) { const { id, init } = declaratio
抖音的验证码一般是这样的:解决方案通常可以选择:打码平台自己训练模型在请求量不大的情况下可以用第一种,而对于公司这种每天几千万的请求,这里就需要第二种一、我们识别的思路是什么?实际上在请求里还会带有这么一张标签图片:我们需要按照标签中给出的文字顺序点击图里的文本,因此,按照人类的思维,我们应当是如下操作:先找到标签中的文字和文本顺序再去图片中找哪几个位置有文字,这些文字是什么按照标签和图片中文字的关系进行点选而对于机器来说,我们需要转换一下第一第二步的顺序,并且我们不需要知道这个文字是什么先找出图片中找哪几个位置有文字(每个字的坐标)再去识别图中切出的文字和标签文字中的相似关系,不需要知道文字是什么最后按照顺序进行点选如果我们知道了验证部分的文字在图片中的什么位置,然后我们把每个字给剪切出来,然后再通过某种方式,识别出哪些字跟上面标签部分的字最相近不就知道了我们需要点击哪几个字了吗?这里我们可以使用yolo来进行位置识别(判断每个字的位置),再用用pytorch来训练网络模型(判断相似关系)我们需要按照他给的标签汉字顺序点击验证部分的汉字,最终要达到的效果是这样:(这张图中的精度较低,
登陆加密首先进入登陆页面,输入好登陆信息后点击登陆,查看f12,发现表单提交的密码被加密,多次进行提交,发现结果每次都不同,说明可能是rsa des等非对称加密切换至源代码板块,添加xhr断点找到断点位置数据向上跟栈,找到请求位置,发现依然被加密继续跟栈,发现在a函数中传入了原始的密码在控制台中构造一个promise运行一下试试,果然这个a函数就是我们的加密函数继续跟栈,发现了一个可疑函数执行一下,果真拿到了数据点进去后,很明显这段代码使用了RSA公钥加密算法来加密密码。具体操作是使用RSA公钥加密传入的密码 e,然后 encodeURIComponent 对加密后的字符串进行URL编码。我们可以使用python进行一下改写from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 import urllib.parse def encode_password(password): public_key = """-----BEGIN PU
Cloudflare 5秒盾在我们访问国外网站时经常会遇到一个检测页面:Checking if the site connection is secure这是Cloudflare的Web应用防火墙(WAF),一般我们称之为5秒盾,Cloudflare将其称为"等待室",如果检测到异常情况,就会弹出hCaptcha验证码或者拒绝请求。基于协议的爬虫如果不处理加密参数就会被banip,ban的次数多了就可能被添加到黑名单中。可以选择使用基于自动化测试框架的爬虫,如selenium、playwright等,配合指纹浏览器来过检但是使用自动化会导致经常被置于检测页面好几秒,相比于协议的一秒上百并发,自动化爬虫一分钟也请求不了几个页面,另外,5秒盾不一定是5秒,具体的检测时间取决于目标站点的安全配置和爬虫的行为。如果目标网站的安全配置较高,则检测页面可能需要花费十多秒的时间。这个检测页面覆盖了全站,包括HTML页面、后端接口以及静态资源,如果想要继续爬取,必须绕过盾检测页面。本节我们会初步研究Cloudflare的JavaScript反爬机制,梳理请求发送的流程,以便更好地分析后续的反爬技术。对
Cloudflare 主动爬虫程序检测技术当我们访问受Cloudflare保护的网站时,浏览器中会运行风控检测,其中包含以下内容验证码验证码会降低用户体验,Cloudflare是否显示验证码和用户设置有关:站点配置: 管理员是否启用了验证码风险级别: 管理员启用了验证码后,Cloudflare仅在流量可疑时才会跳出验证码。比如,如果用户使用Tor客户端浏览网站,会显示验证码,但如果用户运行标准浏览器,则不会显示验证码。Cloudflare早期使用 reCAPTCHA 作为他们的主要验证码提供商。但2020年后他们已经迁移到专门使用 hCaptcha,可能是reCAPTCHA的接码平台过多。我们后面会介绍如何绕过验证码Canvas指纹识别Canvas 允许浏览器获取 Web 客户端的设备环境,包括访问网页的系统的浏览器、操作系统、图形硬件参数等等。Canvas是一个 HTML5 API,可以使用javascript在网页上绘制图形和动画。那么这样的一个东西,是怎么实现指纹的呢?第一步,网页会使用浏览器的CanvasAPI绘制图像;第二步,对该图像进行hash处理以生成指纹。现代浏览器在进
Cloudflare被动反爬技术Cloudflare如何检测爬虫?Cloudflare的反爬可以分为两类: 被动 和 主动。被动爬虫检测技术包括后端执行的指纹检查等,而主动检测技术依赖于浏览器执行的检查。以下是我在爬取过程中发现的Cloudflare采用的一些检测方案:僵尸网络检测Cloudflare维护着已知与恶意爬虫相关的设备、IP地址和行为模式的目录。顶级黑名单中的设备会被永远禁止访问。次级黑名单(如代理、翻墙软件的节点)可能需要通过验证码、用户行为检测等验证。IP地址信誉(风险评分)用户的IP地址信誉(类似浏览器的反诈功能)基于地理位置、ISP和历史访问记录等多个因素生成。例如,属于数据中心或已知VPN提供商的IP,必定会产生大量非人类请求,因此,这些节点的声誉将比住宅IP地址差。站点还可以选择限制从其服务区域以外的区域访问站点,因为目标客户的流量不应来自那里(例如日本本土的迪士尼商城不会为日本地区外的用户提供服务,用户请求会被直接阻止)HTTP 请求头Cloudflare使用HTTP请求头中的 User-Agent 字段来确定是否为机器人。如果请求头中的User-Agent不
什么是clodflareCloudflare是一家美国网络基础设施和网站安全公司,提供内容交付网络和 DDoS 缓解服务。它的服务发生在网站访问者和 Cloudflare 客户的托管服务提供商之间,充当网站的反向代理。Cloudflare是一家致力于互联网性能和安全的公司。我们最常知道的是他们的CDN服务以及等待窗口。Cloudflare机器人管理解决方案(Bot Management Solution)是Cloudflare推出的一款强大的反爬产品,在Cloudflare的WAF中已经得到广泛应用。那么什么是Cloudflare机器人管理解决方案Cloudflare的反爬策略有Cloudflare反爬策略的逆向工程和绕过方案吗?Cloudflare机器人管理器(Bot manager)、5秒盾Cloudflare提供网络应用防火墙(WAF)来保护应用程序免受多种安全威胁,如跨站脚本(XSS)、凭证填充和DDoS攻击。在访问网站时,我们经常会遇到一个被称作 “5秒盾” 的东西。Cloudflare的Bot Manager是WAF的核心组成部分之一,它可以减轻恶意爬虫的攻击,同时不影响真
一、假设一个海量数据爬取的环境爬取数据时,我们一般都是从主页面进入,然后一层一层向下爬取,因此我们需要获取最初的“种子”url种子url1 Billion URL,假设在多层请求后,每个种子url里面还能链接到10个url, 一共10B URL假设每个网页大小100KB,一共有10B * 100KB ~ 10^12 KB ~ 1PB假设一个月需要爬所有网站,每天需要爬 10B/30days ~ 333M /day ~ 4K QPS数据量大,QPS比较高,需要多台机器处理。这种情况下,内存无法容纳种子url,硬盘无法容纳网页大小,而带宽和cpu也不允许这么高的并发,我们就需要设计一个分布式爬虫二、思考分布式爬虫的需求特点首先思考一下,在设计分布式服务时,一般都有什么特点面向海量数据的爬虫框架一般有以下几个需求:爬取任务量大,计算和io负载重不能反复重复抓取同一个网页不能出现单点故障影响整个系统的情况所需要的服务器资源应当是能够任意增加或缩减的此外,爬虫一般不是直接面对用户,而是需要将数据推入数据库或消息队列,时间上也不需要同步返回数据,不需要强一致性那也就意味着:高并发:服务需要分布式部
唯一解生成算法数独中,有一个被称作唯一性技巧的东西,唯一性技巧基于这样一个事实——各类出版物上发布的数独题目都只有唯一解。事实上,绝大多数数独玩家有这样的共识:即合格的数独题目解应该是唯一的。因此,为了保证题目合格、有效,出题者在制作题目时,会将一些虽然不违反数独规则,但会导致题目出现双解或多解的特殊结构加以处理。这也就代表我们的游戏设计中,不能出现多解核心思路:回溯法+广度优先生成目前主要的思路就是按照1-9的顺序填数,把整个大九宫格划分为9个小的小九宫格,按照1-9的顺序在每个小九宫格内随机填数,并对不需要回溯的特殊分支进行剪枝处理。比如填1的时候,先将候选数更改为“1”,然后从左上的小九宫格内填候选数,按从左至右从上至下的顺序填到最后一个小九宫格,当所有的小九宫格内都包含了候选数字“1”时,将候选数更改为2,然后重复这个过程;如果填数过程中数字在横行,纵行有重复,则重新在这个小九宫格内选取空格(由于我们是把整个大九宫格分为了9个小九宫格,然后按照小九宫格的顺序填入候选数,所以无需检测在同一小九宫格内候选数是否重复);如果这个小九宫格内没有可用空格,则回溯到上一个小九宫格,直到1-
dream
爬虫工程师,热衷于框架开发与逆向工程