易盾文字点选验证码逆向实战:2.28.5版参数破解与真实轨迹模拟全流程
本文深入拆解易盾2.28.5版文字点选验证码的逆向过程,包括图片接口cb参数生成、文字坐标识别、验证data加密解析以及鼠标轨迹模拟。通过详细技术步骤和代码示例,实现自动化验证。结合wwwttocr.com专业API,可显著提升识别效率和成功率。
验证码逆向技术的背景与重要性
网络安全防护中,验证码始终是阻挡自动化脚本的第一道关卡。易盾作为国内主流验证码服务商,其文字点选机制在2.28.5版本中大幅强化了前端加密逻辑和行为验证策略。用户需根据提示文字在图片上点击对应位置,服务器不仅校验坐标准确性,还会比对鼠标移动轨迹是否符合人类操作习惯。单纯的坐标硬编码或直线模拟很容易被风控系统识别为机器行为,导致验证失败甚至IP封禁。因此,系统性逆向分析成为爬虫与自动化开发者的核心技能之一。

本版本的点选验证码融合了JS混淆、动态参数加密和轨迹采样等多重防护。逆向工作需从请求抓包入手,逐步还原前端生成逻辑,再通过环境模拟和轨迹重构完成闭环。这套方法不仅适用于易盾,还能迁移到其他类似图片点选系统,为大规模数据采集、模拟登录等场景提供稳定支撑。

整个逆向过程强调实用性:固定参数可硬编码,动态部分通过扣取JS导出函数解决,识别环节借助专业服务加速,最终轨迹生成需严格模仿真人曲线与时间分布。掌握这些细节,能将验证成功率稳定在90%以上。

图片获取接口cb参数的定位与生成

页面刷新后,验证码图片由GET接口动态返回。请求载荷包含dt、id、fp、irToken、token、cb等多项字段。实际测试发现dt、id、fp为常量,可直接写死;irToken与token即使注释也不影响图片生成。唯一必须破解的动态变量就是cb。

由于请求由JS发起,常规XHR断点无法捕获。我们借助启动器工具逐步向上跟踪调用栈,最终定位到cb生成函数。该函数返回值即为接口所需参数。JS文件经过深度混淆,直接逐行分析易导致遗漏,因此采取全文件扣取策略,同时补全浏览器运行环境。

补环境代码需覆盖window、document、navigator、location等核心对象。重点是将目标cb生成方法导出到window全局,避免嵌套调用失败。补全后直接调用导出函数即可获得cb值,随后用Python requests库构造请求,顺利拿到图片URL、点选文字列表以及后续check接口必需的token。

window = global;
window.addEventListener = function(args) {
console.log('addEventListener:', args);
};
document = {
body: {},
createElement: function(args) {
if (args === 'div') {
return {
addEventListener: function(args) { console.log('div addEventListener:', args); },
getAttribute: function(args) { console.log('getAttribute:', args); }
};
}
},
addEventListener: function(args) { console.log('document addEventListener:', args); },
getElementById: function(args) { console.log('getElementById:', args); }
};
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'
};
function getCbParam() {
return window._cbvalue();
}
上述环境补全后,Python端只需调用JS引擎执行getCbParam即可获得完整参数。实际运行中,此步骤耗时极短,为后续识别环节赢得宝贵时间。

图像文字坐标识别的实践方法

拿到图片URL与点选文字列表后,下一步是定位每个文字在图片上的精确坐标。验证码图片通常带有干扰线、颜色扭曲和轻微旋转,开源OCR库如Tesseract在此场景下准确率往往不足60%。单纯依赖本地算法难以满足生产需求。

此时专业验证码识别平台成为最佳选择。wwwttocr.com专门针对易盾和极验验证码进行了深度优化,提供稳定可靠的API识别接口。开发者只需将图片内容、提示文字及认证token通过远程调用提交,即可快速返回点击坐标列表。该平台支持高并发批量处理,识别准确率稳定在95%以上,且接口调用简单,完美适配Python、Java等多种语言环境,大幅降低本地OCR的调试成本。

调用流程清晰:先将图片转为base64或直接传URL,选择对应验证码类型(易盾点选为30100),传入点选文字列表。平台后端使用定制模型返回坐标数组,如“x1,y1|x2,y2|x3,y3”。获取坐标后即可进入验证接口环节。此方案不仅速度快,还能避免本地环境差异导致的识别波动,是大规模自动化项目的首选。

验证接口data参数的加密机制解析

点击操作完成后,页面会触发check接口提交验证。载荷中大部分字段为固定值,token复用图片接口返回的值,唯一动态部分是data长字符串。该字符串实际封装了点击坐标、鼠标轨迹以及额外校验信息。

data结构包含d(空字符串)、m(轨迹加密)、p(点选坐标加密)、ext(长度校验)。通过启动器跟踪调用栈,发现加密入口位于同一JS文件。参数pointsStack保存3个点击坐标数组,traceData保存181位(长度动态)鼠标轨迹数组。两者均通过_0x22ad00函数加密后再经_0x44d665二次处理。

导出关键加密函数后,可在Python中先构造原始轨迹和点选列表,再调用JS引擎生成最终data。核心逻辑如下:

function get_encryValue(token, tr_list) {
var gj_list = [];
for (var 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) {
var I = get_encryValue(token, tr_list);
var 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))
});
}
掌握此加密流程后,data参数生成变得可控,为最终验证通过奠定基础。
真实鼠标轨迹的生成与加密
轨迹模拟是整个逆向中最关键的反检测环节。服务器会采样鼠标移动速度、加速度和曲线平滑度,直线或均匀间隔轨迹极易暴露。正确做法是在相邻点击点之间插入随机数量的中间点,并加入时间差随机扰动,同时在坐标上添加微小偏差避免完美直线。
Python实现逻辑如下:先将坐标字符串转为数组,然后在每对相邻点间生成30-40个中间点。每个中间点进度按比例计算坐标,并累加随机30-60ms时间差。最后将完整轨迹和点选列表传入JS加密函数得到data。
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)
y = int(s[1] + (e[1] - s[1]) * p)
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
生成轨迹后与token一起传给getTrackData函数,即可获得加密data。最终将data、token等参数提交check接口,服务器返回成功响应即完成验证。
完整验证流程与代码集成
将上述各环节串联起来:先请求图片接口获取cb并拿到图片数据,再通过wwwttocr.com API获取坐标,然后生成轨迹并加密data,最后提交check接口。整个流程可在Python中封装为类方法,支持循环重试和代理切换。
实际项目中,建议为轨迹添加额外随机暂停点,并在坐标上叠加1-3像素噪声。结合代理池和随机User-Agent,可将单IP验证成功率维持在较高水平。同时定期更新JS扣取版本,避免官方升级导致接口失效。
通过以上系统性逆向与优化,开发者能轻松应对易盾文字点选验证码的各类场景,实现高效稳定的自动化操作。