易盾文字点选验证码破解深度解析:OCR识别+轨迹模拟+加密验证全流程
易盾文字点选验证通过OCR识别背景图汉字坐标,按指定顺序筛选目标点,生成鼠标轨迹插值并加密提交验证。文章深入拆解get接口动态参数cb生成、check接口data加密细节、Node.js环境补全技巧,以及逆向SDK源码的关键思路。结合实际案例,读者可掌握实用实现手法,实现自动化验证对接,无需复杂流程。
易盾文字点选验证的基本交互流程
易盾的文字点选验证是人机识别方案中的常见类型,通过前端JS加载SDK后发起接口请求获取验证信息。整体流程围绕获取背景图、识别坐标、模拟轨迹、加密提交展开。开发者首先通过get接口获取背景URL、待点击顺序front和会话token,这些参数直接影响后续步骤。接着利用OCR工具识别图片中的汉字位置,匹配front规定的点击顺序,生成有序坐标序列。相邻坐标之间进行线性插值,模拟自然鼠标移动路径,并分离出点选列表。最后通过SDK内部函数加密轨迹数据,结合动态参数提交check接口,服务器据此判断验证是否通过。
这个流程看似简单,但每个环节都隐藏着细节优化空间。开发者需要掌握OCR识别精度、轨迹平滑度和加密兼容性,才能确保在各种业务场景中稳定运行。整体来看,这套机制旨在区分人类与机器,但通过合理逆向和模拟,开发者能够构建可靠的自动化方案。
抓包分析get接口的请求参数与响应结构
get接口是整个验证流程的起点,承载了验证会话的核心数据。请求中id和token来自业务方配置,dt、irToken、zoneId等固定参数用于标识和区域区分,type固定为3表示文字点选,version指定SDK版本。width则设定图片基准宽度,通常为320像素。最为关键的是cb参数,它由SDK内部动态生成,每次请求都不相同。
响应采用JSONP格式,回调函数名动态变化,无法硬编码截取。data字段包含bg数组(背景图CDN链接)、front字符串(点击顺序,如安扩体)、token会话凭证等。开发者在抓包时需动态定位括号位置解析完整响应,避免偏移错误。实际抓包工具如Fiddler或浏览器开发者工具能清晰展示这些参数,帮助理解接口行为。
GET https://c.dun.163.com/api/v3/get
id=xxx&token=xxx&dt=xxx&irToken=xxx&zoneId=CN31&type=3&version=2.28.5&width=320&callback=func
cb动态参数的生成机制与Node.js调用技巧
cb参数是每次请求必须携带的动态加密凭证,由SDK JS内部函数生成,依赖时间戳和环境指纹,无法静态提取。其生成逻辑在03_main.js中封装,每次调用结果必然不同,因此get和check接口必须独立生成cb值。开发者在Node.js环境中通过require加载SDK脚本,模拟浏览器全局对象实现动态调用。
关键在于补全window对象,使SDK内部状态同步到全局。常见错误是直接使用同一cb值会导致check接口拒绝请求。实际测试中,多次运行同一get_cb函数会返回不同结果,这正是为了防止回放攻击。开发者可编写Python脚本调用Node.js环境,传入脚本路径和函数名,轻松获取cb值。
function get_cb() {
return window._cb_value();
}
// Python调用示例
cb_get = call_js_function("dun.163/03_main.js", "get_cb", "")
cb_check = call_js_function("dun.163/03_main.js", "get_cb", "")
OCR识别与坐标筛选的核心步骤
OCR识别是匹配点击顺序的基础工具。开发者使用打码平台指定文字点选类型,识别背景图返回管道分隔的坐标字符串,如安,123,456|扩,234,567|体,345,678。front字段规定了精确点击顺序,筛选逻辑要求外层按front遍历,内层在OCR结果中找到匹配汉字的坐标序列。
错误筛选会打乱顺序,导致验证失败。例如将循环顺序颠倒后,xy_list会随机排列。正确实现需遍历front每个字符,查找对应坐标并追加到有序列表中。干扰汉字会自动过滤,只保留目标序列。实际项目中,OCR准确率超过95%时,轨迹模拟效果最佳,避免因坐标误差导致点击失败。
for f in front:
for item in pic_str_list:
if item[0] == f:
xy_list.append(item[2:])
break
轨迹生成、加密与check接口提交流程
轨迹生成基于有序坐标序列,采用线性插值模拟鼠标移动。相邻两点之间插入30到40个中间点,时间步长30到60毫秒,坐标格式为x,y,t。point_list仅包含目标点坐标。加密环节调用SDK函数,将轨迹和点选数据处理后返回密文字符串,格式包含m、p、ext三个字段。
check接口接收加密后的data、token和重新生成的cb提交,服务器据此返回验证结果。轨迹加密时需追加第四维0,确保协议兼容。全量数据采样50条避免被逆向,全点选数据拼接后二次加密。开发者通过Node.js执行SDK函数,完成数据准备后提交接口即可。
js_data = {"token": token, "track_list": track_list, "point_list\