JS爬虫实战之极验四代

极验四代滑块验证码

  • 一、目标网站说明
  • 二、流程步骤
    • 1. 逆向步骤一般分为:
    • 2. 接口确认
          • 1- 确认流程
          • 2- 获取verify的参数
          • 3- 构建requests验证verify的参数
          • 4- 锁定secode参数的作用
      • ok,让我们去获取verify接口中的响应!!!
    • 3. 参数确认 & 重试校验参数逻辑
          • 1- 我们确认了要获取verify接口后,便来开始参数确认。经过一番确认,所有的参数都在params中。
          • 2- verif接口
          • 3- load接口中参数lot_number, payload, process_token
          • 4- 跟进load接口
          • 5- 参数 captcha_id
          • 6- verify接口
    • 4. 寻找逆向入口
          • 1- Initiator堆栈进入, 断点调试
          • 2- 查找参数w
          • 3- 提取生成e的函数
          • 4- 这里是个异步函数,重新断点查看e是什么。
          • 5- 寻找e的生成逻辑。
          • 6- 寻找参数 setLeft, passtime, userresponse。
          • 6- 查看参数e的构成。
          • 7- 跟到此处,发现s中有参数出现。
          • 8- 如pow_msg参数生成位置。
          • 9- 此时,这个r就包含了我们要的两个参数,我们一个个看
          • 10- 参数pow_msg ,pow_sign
          • 11- ok,来,我们继续, 剩下还有7个字段。
          • 12- 参数: geetest, lang, ep。
          • 13- 参数: bhit。
          • 14- 参数 gee_guard
          • 15- 参数 vjRa![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/83462035c4c84b87a0767b5ea8998e2c.png)##### 16- 参数 em
          • 17- em转为参数w
            • 18-1 w中子参数n
            • 18-2 w中子参数n转化为w
    • 5. 爬虫代码编辑

一、目标网站说明

本文章仅用于学习,不可用于任何非法途径,不授权任何单位和个人。特此申明保命。我这里就直接放链接了

https://gt4.geetest.com/

!!! 后续还有,csdn出bug,后续图片一直无法显示,正在修复!!!

二、流程步骤

1. 逆向步骤一般分为:

  1. 接口确认: 找到我们需要的接口进行分析;
  2. 参数确认: 在接口中提炼出我们需要处理的参数;
  3. 重试校验参数逻辑: 查看参数之间关系;
  4. 寻找逆向入口: 找到参数生成位置 ;
  5. 获取加密算法: 实现参数逻辑;
  6. 爬虫代码编辑: 爬虫代码编写;

2. 接口确认

1- 确认流程

网站打开后就是一个验证页面。不知道怎么操作,那就模拟全程过一遍,抓个包。
在这里插入图片描述

2- 获取verify的参数

一点一划就提示验证通过。抓包如下,里面各类参数,也不知道有什么用。
在这里插入图片描述

3- 构建requests验证verify的参数

那我们点击登录, 提示成功。 我们拿到登录接口的包,构建requests
在这里插入图片描述

4- 锁定secode参数的作用

经过一番操作,我们知道了,登录中参数每次只能使用一次,而关键参数为验证码接口返回的参数:secode。每次拿到secode后,就可登录一次,那我们本次逆向就有目标了。获取verify接口中的响应,并提取secode参数。
在这里插入图片描述

ok,让我们去获取verify接口中的响应!!!

3. 参数确认 & 重试校验参数逻辑

1- 我们确认了要获取verify接口后,便来开始参数确认。经过一番确认,所有的参数都在params中。
params = {
    "callback": "geetest_1720668074855",
    "captcha_id": "54088bb07d2df...80300b0abbe",
    "client_type": "web",
    "lot_number": "047e84f8d5a...5bbbceb5748d",
    "risk_type": "slide",
    "payload": "_b-sD...H8Kw==",
    "process_token": "90dfc9ada24d1fc22...9770c09aeeebb7a3f",
    "payload_protocol": "1",
    "pt": "1",
    "w": "92e...78a6"
}
2- verif接口

其中captcha_id, lot_number, payload, process_token, w参数均为疑似的五个参数。 那我们一个个查看,他们是从哪里的。此时,切记不可上来就去源码中跟值跟栈,我们重新走一下流程,看下各个参数的出处。
在这里插入图片描述

3- load接口中参数lot_number, payload, process_token

刷新一下页面,直接就能看到load接口中lot_number, payload, process_token三个参数都出来了。
在这里插入图片描述

4- 跟进load接口

而load接口中的参数有两个,一个为 captcha_id,另一个为 challenge。而 captcha_id 同时也是verify接口中的参数。ok,那我们先搞定load接口
在这里插入图片描述

5- 参数 captcha_id

直接搜索,调用,ok搞定了 captcha_id 参数。至于challenge参数【多次调用,发现没有这个参数也同样能运行成功】。那我们可以认为challenge为非必须得。
在这里插入图片描述
在这里插入图片描述

6- verify接口

ok此时,verify接口中的参数只剩下最后一个w。而在多次搜索调用之后,发现w不是在其他接口中生成的。那我们大概率需要逆向的就是这个w参数了。此时,我们开始跟栈,来到我们今天的重头戏。极验四代验证码的核心逆向参数:w参数

4. 寻找逆向入口

1- Initiator堆栈进入, 断点调试

在这里插入图片描述

2- 查找参数w

向上跟栈,发现这个i就是我们要的w参数。i的生成方式就在这个函数内部,是由e通过一些函数生成来的。
在这里插入图片描述

3- 提取生成e的函数

打印可知,i是由e经过两个js内置函数生成来的,目前先,默认函数内无任何修改,那我们先继续看e。e是函数调用传入的参数,我们继续向上跟栈。

var i = (0,m[$_BIBCI(95)])(f[$_BIBCI(95)][$_BIBDJ(525)](e), n)

在这里插入图片描述

4- 这里是个异步函数,重新断点查看e是什么。

在这里插入图片描述
其中e的属性包括这些,那我们继续跟e值,查看其中14个字段都是从哪里来的。

{
    "setLeft": 181,
    "passtime": 841,
    "userresponse": 181.9300161705061,
    "device_id": "",
    "lot_number": "b462187b4ead41e6a5d2b77548203f5e",
    "pow_msg": "1|0|md5|2024-07-11T11:55:16.611805+08:00|54088bb07d2df3c46b79f80300b0abbe|b462187b4ead41e6a5d2b77548203f5e||658f22accd2183b4",
    "pow_sign": "ca634f84e6dcc5f99137a8630c0b3151",
    "geetest": "captcha",
    "lang": "zh",
    "ep": "123",
    "biht": "1426265548",
    "gee_guard": {
        "roe": {
            "aup": "3",
            "sep": "3",
            "egp": "3",
            "auh": "3",
            "rew": "3",
            "snh": "3",
            "res": "3",
            "cdc": "3"
        }
    },
    "7MVm": "l7wr",
    "em": {
        "ph": 0,
        "cp": 0,
        "ek": "11",
        "wd": 1,
        "nt": 0,
        "si": 0,
        "sc": 0
    }
}
5- 寻找e的生成逻辑。

断点断在这里,我们发现,e中只有三个参数。 说明加密逻辑就在这段中间。我们首先把这三个参数找到

var $_BIBCd = tLHEB.$_Cu

{
    "setLeft": 173,
    "passtime": 1512,
    "userresponse": 173.97730827346714
}

在这里插入图片描述

6- 寻找参数 setLeft, passtime, userresponse。

我们向上稍微一跟,就发现了如下地方, 这里就是三个参数的生成位置。

其中
t[$_FFFCq(1430)] 为固定值
a是由i生成, i为图形与左边坐标计算值
r为滑动花费时间

这段可能就涉及到滑块滑动数据,我们先暂存。搞定逆向逻辑,再看看滑块怎么回事。

在这里插入图片描述

6- 查看参数e的构成。

当我们走到以下断点时,发现e中莫名就出现了4个参数,仔细看这一段,就会发现是从this中传入的,那我们的目标就要换成this从何而来。
在这里插入图片描述
此时我们回过头来看e中内容已经如下,我们已经获取了其中7个字段。除了pow_msg, pow_sign两个参数需要查看生成逻辑,其余5个字段已经能成功获取到

{
    "setLeft": 198,
    "passtime": 1111,
    "userresponse": 198.82952045171382,
    "device_id": "",
    "lot_number": "f393217f8a5c42dab8307d4a39ceaf63",
    "pow_msg": "1|0|md5|2024-07-11T14:00:38.733038+08:00|54088bb07d2df3c46b79f80300b0abbe|f393217f8a5c42dab8307d4a39ceaf63||355ef192aefce069",
    "pow_sign": "8a5f229ce04fbc08862e98a17242c470"
}
7- 跟到此处,发现s中有参数出现。

再跟这两个值时一直有个误区,以为这两个值是滑块验证时出现的,其实不然,这两个值在加载图片的时候就已经生成,验证时才挂载到e上,所以我们应该从刷新页面时开始跟值而不是一直守着verify接口。
在这里插入图片描述
用同样的思路,一直向上跟栈。 终于跟到了这个地方,此处就是 pow_msg 生成的地方
在这里插入图片描述

8- 如pow_msg参数生成位置。
r = (0,d[$_BGCIY(42)])(n, i, s[$_BGCIY(518)], s[$_BGCIY(582)], s[$_BGCIY(535)], s[$_BGCIY(579)], $_BGCHo(79))

在这里插入图片描述

9- 此时,这个r就包含了我们要的两个参数,我们一个个看
n: 'lotNumber'
i: 'captchaId' 
s[$_BGCIY(518)]
s[$_BGCIY(582)]
s[$_BGCIY(535)]
s[$_BGCIY(579)]
$_BGCHo(79)
这些都是load接口中返回的数据。

在这里插入图片描述
pow_msg 最后还有一个后缀,是有该算法生成的
在这里插入图片描述

10- 参数pow_msg ,pow_sign

那我们还剩最后一点点, 还记得我们e参数吗, 总共14个未知字段,现在我们已经找到了7个字段。那我们回头再看

{
    "setLeft": 128,
    "passtime": 704,
    "userresponse": 129.2433263526231,
    "device_id": "",
    "lot_number": "078a7dabd0ef4076b5c0f6fe2ab1e076",
    "pow_msg": "1|0|md5|2024-07-11T16:52:56.688059+08:00|54088bb07d2df3c46b79f80300b0abbe|078a7dabd0ef4076b5c0f6fe2ab1e076||e5bdc9d776f2b288",
    "pow_sign": "e460f9786ef72965b9ec3b6117401639",
    "geetest": "captcha",
    "lang": "zh",
    "ep": "123",
    "biht": "1426265548",
    "gee_guard": {
        "roe": {
            "aup": "3",
            "sep": "3",
            "egp": "3",
            "auh": "3",
            "rew": "3",
            "snh": "3",
            "res": "3",
            "cdc": "3"
        }
    },
    "vjRa": "Vzej",
    "em": {
        "ph": 0,
        "cp": 0,
        "ek": "11",
        "wd": 1,
        "nt": 0,
        "si": 0,
        "sc": 0
    }
}
11- ok,来,我们继续, 剩下还有7个字段。

此时,我们清空所有断点, 再次跟到e生成的地方。跟到此处,又有4个参数,出现了,来,就是这段,仔细读读。
在这里插入图片描述

12- 参数: geetest, lang, ep。

从十行代码中找到参数位置也很快,跟到这个地方, 三个参数搞定。从这里进去。
在这里插入图片描述
在这里插入图片描述
但是怎么看这三个参数都像是可以固定的
在这里插入图片描述

13- 参数: bhit。

bhit 看起来似乎也是个固定值 “1426265548”
在这里插入图片描述

14- 参数 gee_guard

至此e中14个字段,搞定了12个。都看到这里了,最后两个字段,再坚持坚持
gee_guard目测也是固定值
在这里插入图片描述

15- 参数 vjRa在这里插入图片描述##### 16- 参数 em

在这里插入图片描述
看着em也是固定的,不管了,先把代码跑起来。

17- em转为参数w

从前面我们知道,i的值就为w,而i是由参数e经过一个函数转化来的。从这里可知

f[$_BIBCd(42)][$_BIBDQ(517)](e): 就是e字符串了一下。
m[$_BIBCd(42)]: 这个就是转换函数,我们跟进去

在这里插入图片描述
这里的 _ 看似就是我们要的w的值。n的生成逻辑在我圈中的位置。
在这里插入图片描述

18-1 w中子参数n

从n生成的地方进入,可以直接找到n的生成位置,由4个e()的值生成

(65536 * (1 + Math[$_EBHx(151)]()) | 0)[$_EBHx(109)](16)[$_EBHx(25)](1) 转成python语句如下:
hex(int(65536 * (1 + random.random())))[2:][1:]

在这里插入图片描述

18-2 w中子参数n转化为w

我们知道n了之后,跟进 _ 生成位置函数, 看到参数w是s数组tostrng一下来的。我们看一下s怎么来

在这里插入图片描述
到了这里,我们看得出,这是加密函数。具体怎么加密的,需要分析,剩下来的就是扣代码的事情了。
在这里插入图片描述

5. 爬虫代码编辑

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-table表格操作列错行处理

解决方法&#xff1a; <style>::v-deep .el-table th.el-table__cell > .cell {white-space: nowrap !important;} </style>

【C++航海王:追寻罗杰的编程之路】智能指针

目录 1 -> 为什么需要智能指针&#xff1f; 2 -> 内存泄漏 2.1 ->什么是内存泄漏&#xff0c;以及内存泄漏的危害 2.2 -> 内存泄漏分类 2.3 -> 如何避免内存泄漏 3 -> 智能指针的使用及原理 3.1 -> RAII 3.2 -> 智能指针的原理 3.3 -> std…

Kafka Producer发送消息流程之Sender发送线程和在途请求缓存区

文章目录 1. Sender发送数据1. 发送数据的详细过程&#xff1a;2. 关键参数配置 2. 在途请求缓存区 1. Sender发送数据 Sender线程负责将已经在RecordAccumulator中准备好的消息批次发送到Kafka集群。虽然消息在RecordAccumulator中是按照分区组织的&#xff0c;但Sender线程在…

【C++】类和对象的基本概念与使用

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C中的类的定义方式&#xff0c;并提出了一些注意事项&#xff0c;最后描述了类的大小的计算方法。 一、什么是面向对象&#xff1f; 1.面向对象的概念 …

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…

Ambari Hive 创建函数无权限

作者&#xff1a;櫰木 1、创建udf函数 参考文档&#xff1a;https://blog.csdn.net/helloxiaozhe/article/details/102498567 如果已经编写好&#xff0c;请使用自己的。如果没有请参考以上链接进行udf函数编写。 2、创建函数遇到的问题 由于集群开启了kerberos&#xff0…

常用的点云预处理算法

点云预处理是处理点云数据时的重要部分&#xff0c;其目的是提高点云数据的质量和处理效率。通过去除离群点、减少点云密度和增强特征&#xff0c;可以消除噪声、减少计算量、提高算法的准确性和鲁棒性&#xff0c;从而为后续的点云处理和分析步骤&#xff08;如配准、分割和重…

[超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动+CUDA+cuDNN+Pytorch)--[3]安装cuDNN与Pytorch

本次配置过程的三篇博文分享分别为为&#xff1a; [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[1]安装显卡驱动 [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[2]安装Anaconda与CUDA [超级详细系列]ubuntu22.04配置深…

使用windows批量解压和布局ImageNet ISLVRC2012数据集

使用的系统是windows&#xff0c;找到的解压命令很多都linux系统中的&#xff0c;为了能在windows系统下使用&#xff0c;因此下载Git这个软件&#xff0c;在其中的Git Bash中使用以下命令&#xff0c;因为Git Bash集成了很多linux的命令&#xff0c;方便我们的使用。 ImageNe…

Python: 一些python和Java不同的基础语法

文章目录 1. 数据类型2. 字符串的引用3. 字符串拼接4. Python中的报错5. Python中的输入语句(input)6. 运算符(**和//)7. 除法运算8. 注释方法: #或者三引号9. Python中的比较10. Java中用and, or, not代替逻辑运算符11. 多元赋值12. Python不支持自增自减操作13. 在Python中, …

jenkins 使用教程

1. 安装最新长期稳定版 2.426.1 Redhat Jenkins Packages sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum insta…

Oracle线上执行SQL特别慢的原因分析

一、背景&#xff1a; 线上反馈一张表select * from table where idxxx语句执行特别慢&#xff0c;超过60s超时不能处理&#xff0c;第一直觉是索引失效了&#xff0c;开始执行创建索引语句create index index_name on table() online。但是执行了超过20分钟索引还没有创建成功…

python课设——宾馆管理系统

python课设——宾馆管理系统 数据库课设-宾馆管理系统-python3.7pyqt5 简介 大二数据库课程设计&#xff08;3-4天工作量&#xff09;的项目&#xff0c;登录界面的ui设计参考了他人成果&#xff0c;其余ui以及所有后端部分全部独立完成&#xff0c;详细功能见功能模块图使用…

简单实现一个本地ChatGPT web服务(langchain框架)

简单实现一个本地ChatGPT 服务&#xff0c;用到langchain框架&#xff0c;fastapi,并且本地安装了ollama。 依赖安装&#xff1a; pip install langchain pip install langchain_community pip install langchain-cli # langchain v0.2 2024年5月最新版本 pip install bs4 pi…

Unity | Shader基础知识(第十八集:Stencil应用-透视立方盒子)

目录 一、前言 二、场景布置 三、 shader部分 1.图片的部分 2.图片部分纯净代码 3.遮罩部分复习 4.深度写入 ZWrite 5.颜色遮罩ColorMask 6.遮罩纯净代码 四、场景中shader使用 五、作者的碎碎念 一、前言 因为这个内容稍微有点多&#xff0c;我尽力讲清楚了&#x…

速部署 HBase 测试环境

快速部署 HBase 测试环境 第一步&#xff1a;下载软件&#xff0c;在HBase官网下载最新版&#xff0c; 找到 bin&#xff0c;点击下载&#xff0c;比如我这里下载的是 hbase-2.5.6-bin.tar.gz 第二步&#xff1a;解压软件 $ tar -zxvf hbase-2.5.6-bin.tar.gz $ cd hbase-2.…

业务终端动态分配IP-DHCP技术、DHCP中继技术

一、为什么需要DHCP? 1、许多设备(主机、无线WiFi终端等)需要动态地址的分配; 2、人工手工配置任务繁琐、容易出错,比如:IP地址冲突; 3、网络规模扩大、复杂度提高,网络配置越来越复杂,计算机的位置变化和数量超过可分配IP地址的数量,造成IP地址变法频繁以及IP地址…

微信小游戏 彩色试管 倒水游戏 逻辑 (四)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义了一个名为 WaterFlow class&#xff0c;该类继承自 cc.Graphics&#xff0c;用于在 Cocos Creator 中创建和显示水流的动画效果。下面是对代码的详细解释&#x…

FPGA FIR fdatool filter designer MATLAB

位数问题 fdatool 先确定输入信号的位宽&#xff0c;比如17位在fdatool中&#xff0c;选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意&#xff1a; 当设置输入位宽为16位时&#xff0c;ip核…

智能手术新时代:Apple Vision Pro在医疗领域的突破性应用

无人驾驶的未来&#xff1a;AI如何重塑我们的出行世界-CSDN博客文章浏览阅读2.2k次&#xff0c;点赞109次&#xff0c;收藏64次。无人驾驶汽车的发展是AI技术应用的一次伟大尝试。特斯拉与百度“萝卜快跑”在这个领域的竞争与合作&#xff0c;不仅展示了AI技术的强大潜力&#…