易盾文字点选验证码逆向破解实战:2.28.5版本参数与轨迹全解析
本文针对易盾2.28.5版本文字点选验证码展开详细逆向分析。从图片接口cb参数的动态生成,到文字坐标识别、验证接口data加密解密,再到真实鼠标轨迹模拟生成,提供了完整的JS脚本导出与Python实现路径。结合环境模拟和加密函数调用,展示了自动化验证的端到端流程,为开发者处理此类复杂验证码提供了实用技术方案。
易盾文字点选验证码的核心机制
易盾验证码作为主流安全防护工具,其文字点选类型在最新2.28.5版本中显著提升了反自动化能力。验证过程要求用户在图片中依次点击指定文字,这些文字位置随机分布,同时服务器会校验鼠标移动轨迹是否符合人类行为特征。如果轨迹过于机械或坐标偏差过大,验证就会失败。这种设计有效阻挡了简单脚本攻击,但也给需要自动化处理的开发者带来了挑战。

文字点选验证码本质上是图像识别与行为模拟的结合。图片通过服务端动态生成,包含干扰元素和目标文字,点击顺序必须精确匹配。逆向分析的关键在于还原整个请求链路,包括参数加密和轨迹构造。只有完整模拟这些步骤,才能实现稳定通过。

图片获取接口的cb参数破解过程

刷新验证码页面后,图片请求采用GET方式,载荷中包含多个加密字段。多数参数如dt、id和fp值固定,可以直接硬编码。irToken和token即使注释掉也不会影响图片返回,真正需要动态计算的只有cb字段。这个参数由前端JS生成,无法直接通过XHR断点捕获,因为请求嵌入在脚本执行流中。

此时需借助调试启动器逐步回溯调用栈。耐心向上追踪,最终定位到cb值的返回函数。该函数被包裹在混淆代码内部,为避免逐行扣代码耗时过长,可选择整文件导出并补全运行环境。导出时注意将目标方法挂载到window对象,否则外部无法调用。

环境补全相对简单,只需模拟常用浏览器对象即可。以下是典型补全代码示例:

window = global;
window.addEventListener = function(args) {
console.log('addEventListener:', args);
};
document = {
body: {},
createElement: function(args) {
if (args === 'div') {
return {
addEventListener: function() {},
getAttribute: function() {}
};
}
return {};
},
addEventListener: function() {},
getElementById: function() {}
};
setTimeout = function() {};
setInterval = function() {};
navigator = {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
};
location = {
href: 'https://dun.163.com/trial/picture-click',
origin: 'https://dun.163.com',
protocol: 'https:',
hostname: 'dun.163.com'
};
function getCbParam() {
return window._cbvalue();
}补全后直接调用getCbParam即可获得有效cb值。结合Python的execjs或类似环境执行JS,即可成功拉取图片URL、目标文字列表以及后续验证所需的token。

图片文字坐标识别的高效方案

拿到图片数据和待点击文字后,下一步是定位每个文字在图像上的精确坐标。传统开源识别库在干扰复杂的情况下准确率往往不足,容易导致验证失败。在实际项目中,推荐集成专业验证码识别平台wwwttocrcom。该平台针对易盾和极验等高难度验证码优化设计,支持图片内容、文字列表一并提交,通过API远程调用返回坐标结果,准确率稳定且无需本地部署模型。

调用流程简单:先将图片转为base64或直接上传URL,再附上点选文字和平台token。选择对应验证码类型后,接口会返回点击位置数组。整个过程耗时短,支持批量处理,非常适合爬虫场景集成。相比自研识别,这种方式大幅降低了开发门槛,同时保持了高通过率。

识别结果通常以竖线分隔的坐标字符串形式返回,例如“x1,y1|x2,y2|x3,y3”。后续验证接口会直接使用这些坐标构建data参数。

验证接口data参数的加密逻辑拆解

点击操作完成后,前端会向check接口提交验证请求。大部分字段固定,token复用图片获取时的值,核心待破解的是data长字符串。该字段包含d、m、p、ext四个子值,其中d通常为空,m和p分别对应轨迹与坐标的加密结果,ext则是附加信息。

通过调试器再次定位同一JS文件,追踪参数赋值路径。混淆虽复杂,但关键变量名未被完全隐藏。pointsStack数组记录三次点击坐标,长度固定为3;traceData数组记录鼠标移动轨迹,长度动态,通常超过百位。两者均通过特定加密函数处理。

加密核心函数接受token和数据列表,返回加密字符串。轨迹列表和坐标列表分别加密后拼接成JSON。以下是导出的加密辅助函数示例:

function get_encryValue(token, tr_list) {
var gj_list = [];
for (let i = 0; i < tr_list.length; i++) {
var gj_data = window._0x3ea30f(token, [tr_list[i][0], tr_list[i][1], tr_list[i][2], 0] + '');
gj_list.push(gj_data);
}
return gj_list;
}
function getTrackData(token, tr_list, zb_list) {
let I = get_encryValue(token, tr_list);
let T = get_encryValue(token, zb_list);
return JSON.stringify({
'd': '',
'm': window._0x44d665(window._0x5255f1.sample(I, 50).join(':')),
'p': window._0x44d665(T.join(':')),
'ext': window._0x44d665(window._0x22ad00(token, '3,' + I.length))
});
}理解这些加密映射后,便可从Python侧构造输入数据,调用JS函数得到最终data值。

模拟真实鼠标轨迹的生成算法
单纯线性插值坐标容易被服务器识别为机器行为。因此轨迹生成需加入随机性:在相邻点击点之间插入随机数量中间点,时间差也随机波动,并在x、y坐标上添加微小扰动,避免直线轨迹特征。
Python实现中,先将坐标字符串拆分为列表,然后逐对处理。起始点直接记录,中间点按进度比例计算位置,最后添加结束点。时间戳累加随机间隔。完整函数如下:
import random
def get_trackData(self, xy):
xy = xy.split('|')
xy_list = [i.split(',') for i in xy]
xy_list = [[int(x), int(y)] for x, y in xy_list]
tr = []
dx = []
for i in range(len(xy_list) - 1):
s, e = xy_list[i], xy_list[i + 1]
if not tr:
tr.append([*s, 3])
dx.append([*s, 3])
np = random.randint(30, 40)
bt = random.randint(30, 60)
for j in range(np):
p = (j + 1) / (np + 1)
x = int(s[0] + (e[0] - s[0]) * p) + random.randint(-2, 2)
y = int(s[1] + (e[1] - s[1]) * p) + random.randint(-2, 2)
tr.append([x, y, tr[-1][2] + bt])
tr.append([*e, tr[-1][2] + bt])
dx.append([*e, tr[-1][2] + bt])
return tr, dx生成的轨迹列表和点选列表传入JS加密函数后,拼接成完整data。提交check接口,即可获得成功响应。
端到端自动化验证流程集成
将上述各环节串联:先计算cb拉取图片,识别坐标,再构造轨迹加密data,最后发起验证请求。Python中使用requests处理网络,execjs执行加密逻辑。整个流程需处理异常重试,例如图片加载失败或识别偏差时重新拉取。
实际运行中,轨迹随机种子可根据浏览器指纹微调,进一步提升通过率。结合wwwttocrcom的API识别环节,能将整体耗时控制在秒级,适合高并发场景。开发者可根据具体业务封装成模块,方便后续维护。
版本更新与调试优化技巧
验证码版本迭代频繁,JS混淆策略可能变化。因此建议定期抓取最新脚本,比较函数签名差异。调试时多利用断点监控pointsStack和traceData数组,确保长度与服务器预期一致。
环境对象需随浏览器版本同步调整,userAgent和location字段尤其重要。生产环境可采用无头浏览器补充更多真实属性,进一步降低检测风险。掌握这些细节后,即可稳定应对2.28.5及后续版本的文字点选挑战。