【验证码系列】某讯滑块-加密流程分析

某讯滑块-加密流程分析

声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在主页联系作者立即删除!

目标和接口

**目标:**滑动拼图验证成功
接口:aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE=

1. 请求流程分析

方法: 从验证接口入手,倒推所需参数和所有需要请求的接口
目标: 通过全局搜索,判断参数是需要逆向的值还是前置接口返回值

1.1. 验证接口

接口: cap_union_new_verify
参数:

  • collect:经测试此参数未校验,可固定
  • tlgcollect的长度
  • eks:来自 tdc.js 接口
  • sess:来自 cap_union_prehandle 接口
  • ans:滑动距离+ cap_union_prehandle 接口返回值
  • pow_answercap_union_prehandle 接口返回值+求解值
  • pow_calc_time:与 pow_answer 关联的求解值
    在这里插入图片描述

1.2. js接口

接口: tdc.js
参数: 接口url来自 cap_union_prehandle 接口返回值,拼接域名可直接请求

1.3. 验证码获取接口

接口: cap_union_prehandle
参数: 此接口参数固定也可请求,其中返回值的前缀与 callback 相同,如果 callback 为空,则返回值中的前缀也为空

2. 请求参数分析

方法和目标: 此处则需要正向分析,保证每一个接口请求成功再请求下一个接口
以下是最终参数生成位置,后面的参数都基于此过程需要的东西去分析
在这里插入图片描述

2.1. 验证码获取接口

请求中部分参数介绍:

参数作用
aid验证码应用 ID ,与站点关联
uaBase64 后的浏览器 UA
entry_url业务入口页,当前为云验证码产品页
js前端 frame 脚本路径
sess初始为空,服务端返回本次会话的 sess

响应中重点字段:

字段作用
sess本次验证码会话凭证,最终 verify 必带
data.comm_captcha_cfg.tdc_path本次需要加载的 TDC 采集脚本路径
data.comm_captcha_cfg.pow_cfg.prefixPOW 前缀
data.comm_captcha_cfg.pow_cfg.md5POW 目标 MD5
data.dyn_show_info.bg_elem_cfg.img_url背景图路径
data.dyn_show_info.sprite_url滑块图路径
data.dyn_show_info.fg_elem_list前景元素配置,包含滑块裁剪坐标、尺寸、初始位置

其中:

sprite_pos: 滑块在 sprite 图上的裁剪起点
size_2d: 滑块裁剪宽高
init_pos: 滑块初始展示位置

后续识别缺口和提交答案都依赖这些字段。

2.2. js接口

ekscollect 是当前项目里最关键的加密/风控参数。

eks 可以直接使用正则表达式提取,或者如页面一样使用补环境方式提取:

eks = re.findall("window\..*?'(.*?)'", tdc_js)[0]

在这里插入图片描述
collect 经测试是可以固定的,这与站点有关,官网示例并未校验此参数,或者如页面一样使用补环境方式提取:

collect = "tMUf/k3HOl1Z/idr4pb84nZb..."
return eks, collect

在这里插入图片描述

Node 伪浏览器环境方案:
其中 eks 仅需简单补环境就可出值,而 collect 则需要补充完整 dom 环境,包括 canvas、webgl

// 补环境
require("./env.js")
// tdc.js
require("./tdc.js")
// 与截图位置一致的初始化过程
window.TDC.setData({
    "ft": "qf_7Pf__H"
})
// 取值
const eks = window.TDC.getInfo().info
const collect = window.TDC.getData(true)

当前风险点很明确:
collect 我当前使用的是硬编码样本,这种写法只能针对未检验次参数的站点使用。因为 collect 理论上与本次TDC 脚本、环境指纹、轨迹和时间状态有关。

2.3. 图片缺口识别

这里我就不过多分析,也是参考其他人的经验做的,可以去搜下,很多分析这里的文章:

流程如下:

1. 下载背景图 bg_url
2. 下载 sprite 图 sprite_url
3. 根据 sprite_pos 和 size_2d 从 sprite 图中裁出滑块模板
4. 对背景图做 pyrMeanShiftFiltering 降噪
5. 对背景图和滑块模板做 Canny 边缘检测
6. 使用 cv2.matchTemplate 做模板匹配
7. 返回匹配位置 max_loc,即背景图缺口坐标

2.4. POW 计算

此部分解决参数 pow_answer、pow_calc_timecap_union_prehandle 接口返回:

pow_cfg.prefix
pow_cfg.md5

本地通过暴力枚举 prefixnonce 拼接,当md5拼接值等于目标值时返回拼接值与耗时

if hashlib.md5(f"{challenge_prefix}{pow_ans}".encode()).hexdigest() == target_md5:
    return pow_ans, cost_ms

最终提交:

"pow_answer": f"{pow_prefix}{pow_ans}",
"pow_calc_time": str(pow_time)

对应源码位置:
在这里插入图片描述
在这里插入图片描述

2.5. 验证接口

提交表单:

参数来源说明
collectTDC getData(true)加密采集数据(此站点可用固定值)
tlglen(collect)collect 长度
eksTDC getInfo()TDC 信息
sessprehandle 返回会话凭证
ans本地识别结果滑块答案
pow_answer本地 POWprefix + pow_ans
pow_calc_time本地 POW计算耗时

ans 的结构:

[
  {
    "elem_id": 1,
    "type": "DynAnswerType_POS",
    "data": "x,y"
  }
]

其中 x 来自 OpenCV 识别出的缺口横坐标加偏移(偏移值由实际识别结果经验总结),y 来自 prehandle 返回的滑块初始 Y 坐标。如果errorCode为50,则识别的距离不对。

3. 总结

当前最应该补强的是动态 collect 生成,但因此站点并未校验所以没有深究。使用当前的固定值或者补环境其实都是不完善的值,因为当前的补环境值仅有850左右的长度,而源网站是1600左右,原因是没有加入轨迹,如果路过大佬有 检验此值的站点 可以联系我研究学习。

关键参数: v: luobidamidi001

以下是运行效果演示:
在这里插入图片描述


感谢关注【遇事不決洛必達】!欢迎点赞收藏和交流指正,我会持续分享我的学习经验和心得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事不決洛必達

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值