发布时间:2026/8/30 15:55:02
极验4滑块协议分析 摘要本文以极验4GT4滑块行为验证的官方 demo 为分析对象完整梳理从页面初始化到最终校验的协议流程。文章先介绍 load 初始化接口中 jsonp 回调名、challenge 与 cookie 的生成逻辑再讲解背景图与滑块图的下载、预处理、模板匹配及缺口定位方法最后深入拆解 verify 校验接口中 w 参数与 td 行为数据的生成逻辑涵盖 AES/RSA 加密、PoW 字段处理以及轨迹数据的 gzip 压缩与 Base64 编码流程为理解 GT4 滑块验证的逆向分析提供完整参考。文章大纲本文围绕极验4GT4滑块行为验证的完整协议流程展开从初始化接口到最终校验接口逐步拆解关键参数的生成逻辑。全文结构如下一、介绍 GT4 滑块验证的应用背景、分析目标与学习定位。二、GT4 完整校验流程梳理从 load 初始化到 verify 校验的完整链路。2.1 load 初始化接口分析 jsonp 回调名、challenge 与 cookie 的生成逻辑。2.2 图片处理讲解背景图与滑块图的下载、预处理、模板匹配与缺口定位。2.3 verify 校验接口拆解 w 参数与 td 行为数据的生成逻辑。一.前言极验4的滑块行为验证是目前应用很广的人机验证方案本文以官方demo作为分析站点完整梳理从初始化到最终校验的协议流程定位分析关键参数的生成逻辑仅用于技术学习交流。网址aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20二.GT4完整校验流程2.1load初始化接口使用Chrome Devtools调试手动触发并进行一次滑动接口返回如下完整流程load页面初始化 -- 返回jsonp -- 加载脚本和样式 -- 下载背景图和滑块图 -- 交互后verify校验其中payload请求参数需要注意有callback和challenge字段其他相对固定。load接口response返回格式不是纯json而是geetest_随机数{}的jsonp格式。核心字段包括lot_number、payload、process_token、payload_protocol、pt、bg、slice、ypos和pow_detail等。lot_number是后续动态字段和td_sign的关联值。需要定位参数生成位置直接搜索关键字段callback找到jsonp回调名的生成位置。进入random()函数里0~9999随机数和当前时间戳直接相加不是字符串拼接。用python类似import random import time def callback_name(now_ms: int | None None) - str: timestamp now_ms if now_ms is not None else int(time.time() * 1000) suffix random.randrange(10000) return fgeetest_{timestamp suffix}再搜challenge定位生成位置直接import uuid challenge str(uuid.uuid4())至于cookie在第一次请求load会返回set-cookie后续请求携带这个cookie即可。2.2图片处理对图片进行处理时先将load请求的response返回的slice和bg拼接成相应的url下载背景图和滑块图。将图片下载到本地后,将背景图读取为灰度图。bg cv2.imread(str(bg_path), cv2.IMREAD_GRAYSCALE)滑块图使用四通道模式读取。piece cv2.imread(str(slice_path), cv2.IMREAD_UNCHANGED)滑块图通常包含B、G、R图像颜色 AAlpha 透明度蒙版Alpha 通道可以区分滑块主体和透明背景因此比单纯比较 RGB 更可靠。验证码背景中的缺口区域通常会增加阴影或低频颜色变化因此先使用高斯模糊提取低频部分再与原图相减bg_hp ( cv2.GaussianBlur(bg, (3, 3), 0).astype(float32) - bg.astype(float32) )滑块图也进行相应处理piece_hp ( cv2.GaussianBlur(piece_gray, (3, 3), 0).astype(float32) - piece_gray.astype(float32) )处理后的结果重点保留边缘、纹理和局部细节削弱大面积颜色渐变造成的影响。滑块边缘通常包含装饰边框、阴影和透明过渡区域。为了减少这些区域对匹配结果的干扰对 Alpha 蒙版进行腐蚀mask cv2.erode( piece[:, :, 3], None, iterations9, )腐蚀后留下的是滑块内部较稳定的纹理区域。之后只使用这部分区域参与模板匹配。使用 OpenCV 的归一化相关系数方法进行模板匹配result cv2.matchTemplate( bg_hp, piece_hp, cv2.TM_CCOEFF_NORMED, maskmask, )result是一个二维矩阵result[y][x] 滑块模板放在背景坐标 (x, y) 时的匹配分数。模板在背景上逐点移动每个位置都会得到一个分数。分数越高表示滑块纹理与该位置越相似。load响应中还会返回ypos。它表示滑块缺口大致所在的垂直位置因此不需要扫描整张背景图。代码将搜索区域限制在ypos - 6 ≤ y ypos 7对应实现lo max(0, int(ypos) - 6) hi min(result.shape[0], int(ypos) 7) band result[lo:hi] _, score, _, local cv2.minMaxLoc(band) location ( local[0], local[1] lo, )最终得到gap_x, gap_y, score这里得到的gap_x还是原始图片坐标不一定等于浏览器滑块控件需要的移动距离。后续会根据客户端缩放比例进行换算set_left int((gap_x - 2) * scale) userresponse set_left / scale 2之后这些字段才会参与明文 JSON 组装和w加密。图片处理阶段只负责回答缺口在原始背景图的什么位置滑动距离、显示缩放和客户端字段则在后续参数组装阶段处理。2.3.verify校验接口2.3.1.w参数生成逻辑verify接口需要还原w和td。首先通过initiator调用堆栈找到对应文件关键词搜索参数process_token,定位到参数的赋值位置。w的值是c找c的生成位置加密函数为i跟入函数内部假设让table _ᖈᕴᖙᕶ.$_Dl() , 最开始state table[6][19] , 与第一个case: table[3][19]判断为true因此进入第一个case其中的if判断的是pt的值第一个case将Config赋值给n然后修改state。第二次循环新的state与第二个case匹配进入第二个case这是主加密分支。首先是一些赋值操作第一个是s跟入函数主要看e()继续跟入e(), 大致是return (65536 * (1 Math[random]()) | 0) [toString](16) [substring](1);生成一个随机数×65536再转成不带0x的十六进制串再去掉首位字符最后是4位十六进制字符s得到的就是16个十六进制字符这个s是后面AES加密的key。继续分析这里有个r函数r的作用就是给当前实例写入$_BJH属性保存传入的数组最后得到的就是个含有数组属性的对象。继续往后看1和2两条分支这个r会通过pt的值来判断分支这里只分析1先看symmetrical跟入函数后查看是标准AES加密再看asymmetric跟入其构造函数是个标准RSA加密这里是初始化 RSA 密钥对象并配置公钥往下通过pt判断先调用asymmetric.encrypt(s)s是前面随机生成的 16 位十六进制字符key返回RSA密文u然后判断u的长度是否为256个十六进制字符也就是128字节直到生成符合要求的RSA 输出。然后调用symmetrical.encrypt(plaintext, s)进行AES加密返回数组c。这里的plaintext是一个 JSON 字符串图片处理后由滑块定位得到的setLeft、passtime、userresponse 等行为参数以及 /load 响应中的lot_number、PoW 字段和其他协议字段共同组成。 PoW 字段pow_sign与pow_msg需要处理load响应中的pow_detail通过找堆栈定位到跟入函数pow_msg: version|bits|hashfunc|datetime|captcha_id|lot_number| device_id|随机16个十六进制字符,device_id这里是“ ”。pow_sign: SHA-256(pow_msg 的 UTF-8 字节).hex()最后将AES加密后的数组c经过下面的函数进行处理后与RSA密文u作拼接就是最后的w参数。2.3.2.td行为数据生成根据堆栈找生成位置定位到这里已经生成了完整的url继续往上找堆栈直到这查看作用域可以看到含有td的对象是在u的闭包。进入u的堆栈到这还不是生成位置但可以看到这个 _ 有td,在附近找 _ 的td是在这里赋值也就是_ᕺᕶᕹᕸ接着往上找_ᕺᕶᕹᕸ在这里生成跟入函数是把第一个参数的new_track属性给了n然后删掉new_track最后返回值是n同时第一个参数对象添加了一个td_sign所以呢new_track的值就是td因此需要找new_track是哪里生成的。函数u的堆栈内查看作用域u的第一个参数携带new_track同时u函数在$_BCEA的闭包作用域断到$_BCEA后发现u的第一个参数已经有new_track值再往上找堆栈。到这里可以看到有个对象的赋值操作有三个值setLeft, passtime,userresponse没有new_trackreturn中的这个函数里这个对象作为了参数传入所以跟入函数这里就是new_track的实际生成位置接收值的是i所以继续跟入i的生成函数跟入后传入参数是一个轨迹对象往后看o()返回的是一个压缩/编码工具对象strToU8字符串转 UTF-8 字节gzipSync对字节进行 gzip 压缩最后的返回值 JSON.stringify(轨迹对象)→ UTF-8 字节→ gzip 压缩→ URL-safe Base64 编码→ 去掉末尾填充 → new_track至于这个函数是一个字节数组编码函数Base64 编码器。最后补齐verify请求携带的参数后:免责声明本文内容仅用于技术学习与交流旨在帮助读者理解 GT4 滑块验证的协议流程与参数生成逻辑。文中涉及的代码、接口分析与逆向思路仅供学习研究使用请勿用于任何违反法律法规、平台服务条款或侵犯他人合法权益的场景。请读者遵守相关法律法规与平台规则合理合法地使用技术知识。

相关新闻

2026/8/30 15:50:02

Rust 实现 PDF 压缩与合并:Presse 命令行工具实战解析

平时整理 PDF 文件时,最烦的就是手里一堆扫描件、合同截图、报表导出文件,既要合并成一个文档,又希望体积别太大。网上在线工具要么限制文件数量,要么压缩后画质糊成一团,要么还得上传到别人的服务器。最近看到一个 Ru…

2026/8/30 15:50:02

STM32N6570-DK部署YOLOv5n自定义目标检测全流程指南

1. 项目概述:为什么我选择在STM32N6570-DK上跑自定义目标检测 这两年边缘AI的热度一直没降过,但说实话,真正能把目标检测模型从PC端搬到MCU级芯片上跑起来的方案并不多。ST推出的STM32N6570-DK是我最近重点折腾的一块板子,它核心优…

2026/8/30 15:50:02

基于Spark ALS的短视频推荐系统搭建与实现

基于Spark的个性化短视频推荐系统,是计算机毕业设计里综合性较强的一类题目。它同时涉及大数据存储、分布式计算、Web 后端和推荐算法,恰好覆盖 Hadoop、Spark、Django、Python 四类技术栈。很多同学拿到题目后的第一反应是去找源码,但源码一…

2026/8/30 16:10:03

STM32F446RE从CubeMX生成到Make构建烧录全流程排坑指南

先说个真实场面:我拿到一块Nucleo-F446RE,在STM32CubeMX里把引脚配好,时钟树按需求设好,点下Generate Code,一切看起来都很顺。结果回到终端敲了个make,屏幕上瞬间滚出一片红色报错。那一刻心里想的和搜这个…

2026/8/30 16:10:03

斐讯2017秋招Java笔试试卷复盘:核心考点与避坑指南

说实话,整理这份《斐讯2017秋招Java笔试试卷》复盘的时候,我自己也感叹了一句:当年的校招题放到今天,依然能精准戳中大量候选人的知识盲区。很多人以为校招笔试考的是“会不会写代码”,实际上考的是三件事:…

2026/8/30 16:10:03

STM32H7接入USB摄像头:UVC协议栈、带宽规划与图像采集实战指南

做嵌入式的人,尤其是刚把手伸到STM32H7这颗芯片上的朋友,看到“I want to connect a USB camera to an STM32H7 board”这句话时,大概率是有点低估了这件事的。你以为是把摄像头的USB线插到板子的USB口上、然后读像素数据这么简单&#xff1f…

2026/8/30 16:10:03

数据驱动磁芯损耗建模:从Steinmetz公式到机器学习实战

简介:本资源面向参加2024年‘华为杯’研究生数学建模竞赛C题的参赛队伍,聚焦‘数据驱动下磁性元件的磁芯损耗建模’这一工程与数学交叉难点,提供从问题理解、特征工程、模型构建到结果验证的完整解决方案。压缩包共100个文件,含28…

2026/8/30 16:10:03

ddddocr + opencv拖动滑动拼图总偏几个像素

ddddocr cv 总是“偏一点”,通常不是识别错,而是坐标定义、透明边距或缩放比例导致的系统性偏差。目前 ddddocr.slide_match() 返回的是匹配框 target[x1,y1,x2,y2],而不同版本/封装里 target_x 的含义可能并不完全适合直接拿来当拖动距离&a…

2026/8/30 16:05:03

MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处

做消费电子和工业设备的工程师都清楚,24V工业总线转低压的供电需求随处可见,但能在有限空间里稳定输出4A电流、效率还得高的方案,其实并不好找。今天聊的这颗MP2348GTL-Z,来自MPS,是一颗把性能和封装尺寸平衡得很好的同…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…