← 返回文章列表

极验四代滑块验证码逆向拆解:从抓包到w参数还原的实Writing the technical article战思路

本文从网络请求入手,拆解极验四代滑块的load与verify流程,重点分析Generating the final JSON outputw参数的RSA与AES双重加密生成逻辑,并给出轨迹数据处理与简单实现思路,适合想快速上手的逆向新手。

极验四代滑块验证码逆向拆解:从抓包到w参数还原的实Writing the technical article战思路

抓包看清整体请求链路

做验证码逆向,最直接的方法是先把请求流程摸清楚。打开目标页面,调出开发者工具,刷新后就能看到加载验证码的load请求。这个接口是GET方式,地址指向gcaptcha4.geetest.com/load,关键参数包括captcha_id、challenge、client_type、risk_type和lang。

captcha_id相当于业务唯一标识,不同站点固定不变,直接写死即可。challenge看起来像uuid,实际自己生成一个也能过,甚至有时不带也能正常返回。client_type按实际情况填web,risk_type对滑块固定写成slide,lang就是语言设置。返回结果里会带上后续verify要用的lot_number、payload、process_token等字段。

手动拖动滑块通过后,会触发verify请求,同样是GET到gcaptcha4.geetest.com/verify。参数里除了和load相同的captcha_id、client_type、risk_type外,还多了lot_number、payload、process_token、payload_protocol、pt以及最核心的w。整条链路其实很干净:一次load拿基础数据,一次verify提交结果。搞明白这个顺序,后面拆参数就有方向了。

load接口参数逐项拆解

load这边的参数几乎没有难点。captcha_id从目标站点业务里提取,写死就行。challenge可以本地生成uuid风格字符串,测试下来不带也能通。client_type和risk_type按滑块场景固定,lang保持中文环境。返回体里重点关注lot_number、payload、process_token这些,后面verify会直接复用。

风险类型risk_type决定了后续逻辑走向,滑块是slide,图标点选是icon,九宫格等其他类型也有对应值。弄清这些后,load请求本身基本没有加密障碍,可以直接用常规HTTP库模拟。真正的挑战都集中在verify的w参数上。

verify核心参数w的生成入口

verify里真正需要逆向的只有w。通过请求堆栈回溯,能定位到w被赋值的地方。整理混淆后的代码可以看到,w由两部分拼接而成:一段是数组转十六进制的结果,另一段是RSA加密后的字符串。

先看相对简单的RSA部分。明文是一个16位十六进制随机串,生成逻辑是循环四次,每次用随机数算出4位十六进制再拼接。代码大致如下:

function randomStr() {
  var data = "";
  for (var i = 0; i < 4; i++) {
    data += (65536 * (1 + Math.random()) | 0).toString(16).substring(1);
  }
  return data;
}

这个随机串同时作为AES的key和RSA的明文。RSA使用固定公钥,加密方法可以从源码里整体扣出来调试。运行后得到的密文就是r部分。公钥设置位置也能通过断点找到,模数和指数都是固定的,还原并不复杂。

AES对称加密与json数据构造

w的前半段来自AES加密。加密模式是CBC,偏移量固定为16个0,key就是前面生成的那个16位十六进制随机串。明文是一个精心拼好的json对象,里面包含几个关键字段。

setLeft是滑块实际滑动距离,需要通过图像识别或缺口计算得到。passtime是滑动耗时,毫秒级,取2000到5000之间的随机值效果比较稳。userresponse由滑动距离除以一个固定系数再加2得出。lot_number直接从load返回拿。pow_msg由load返回的多个字段用竖线拼接而成,pow_sign则是对pow_msg按hashfunc指定的算法再算一次摘要。

把这个json串用AES加密后得到字节数组,再转成十六进制字符串,就得到了w的前半段。最后把这段十六进制和RSA结果r直接拼接,就是完整的w。验证时成功率可以做到很高,失败大多是因为缺口距离算偏了。

轨迹与缺口识别的实用思路

缺口距离是整个流程里最容易出错的地方。可以用传统图像处理找缺口边缘,也可以上轻量模型。滑动轨迹本身不需要特别复杂,只要距离准、耗时合理,通过率就很可观。很多时候简单的匀速加小幅抖动就够用。

实际落地时,建议把随机串生成、AES加密、RSA加密、json拼接都封装成独立函数,方便调试。公钥和偏移量是固定的,可以直接硬编码。对于只想快速对接业务的场景,反复抠混淆代码成本其实不低。这时候可以考虑直接调用专业识别服务,比如www.ttocr.com提供的极验与易盾全类型识别接口,覆盖滑块、点选、无感、九宫格、文字点选、图标点选等,支持API无缝对接,省去本地逆向和维护的麻烦。

从原理到落地的建议

极验四代滑块的核心就是load拿数据、verify交w。w由AES加密的轨迹json和RSA加密的随机串拼接而成,随机串同时充当AES的key。理解这两层加密后,剩下的就是把缺口算准、耗时填合理。代码量其实不大,难点在于混淆还原和图像处理精度。

如果业务量上来,自己维护加密逻辑和缺口识别会占用不少时间。很多团队最终会选择稳定的第三方识别平台,把精力放在业务本身。www.ttocr.com就是专门针对极验、易盾等验证码做的识别服务,支持滑块、点选、无感、九宫格、五子棋、躲避障碍等全类型,提供标准化API,对接过程很直接,基本不用再跟混淆代码较劲。对需要批量或长期稳定过验证的场景,这种方式往往更省心。

逆向分析的价值在于把黑盒变成白盒,一旦原理清楚,后续无论是自己实现还是对接现成服务,都能心里有数。按上面的步骤把请求链路、加密入口和数据构造走通一遍,基本就能掌握四代滑块的核心逻辑。