文章目录
某讯滑块-加密流程分析
声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在主页联系作者立即删除!
目标和接口
**目标:**滑动拼图验证成功
接口:aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE=
1. 请求流程分析
方法: 从验证接口入手,倒推所需参数和所有需要请求的接口
目标: 通过全局搜索,判断参数是需要逆向的值还是前置接口返回值
1.1. 验证接口
接口: cap_union_new_verify
参数:
collect:经测试此参数未校验,可固定tlg:collect的长度eks:来自tdc.js接口sess:来自cap_union_prehandle接口ans:滑动距离+cap_union_prehandle接口返回值pow_answer:cap_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 ,与站点关联 |
ua | Base64 后的浏览器 UA |
entry_url | 业务入口页,当前为云验证码产品页 |
js | 前端 frame 脚本路径 |
sess | 初始为空,服务端返回本次会话的 sess |
响应中重点字段:
| 字段 | 作用 |
|---|---|
sess | 本次验证码会话凭证,最终 verify 必带 |
data.comm_captcha_cfg.tdc_path | 本次需要加载的 TDC 采集脚本路径 |
data.comm_captcha_cfg.pow_cfg.prefix | POW 前缀 |
data.comm_captcha_cfg.pow_cfg.md5 | POW 目标 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接口
eks 和 collect 是当前项目里最关键的加密/风控参数。
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_time ,cap_union_prehandle 接口返回:
pow_cfg.prefix
pow_cfg.md5
本地通过暴力枚举 prefix 与 nonce 拼接,当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. 验证接口
提交表单:
| 参数 | 来源 | 说明 |
|---|---|---|
collect | TDC getData(true) | 加密采集数据(此站点可用固定值) |
tlg | len(collect) | collect 长度 |
eks | TDC getInfo() | TDC 信息 |
sess | prehandle 返回 | 会话凭证 |
ans | 本地识别结果 | 滑块答案 |
pow_answer | 本地 POW | prefix + 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
以下是运行效果演示:

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

4450

被折叠的 条评论
为什么被折叠?



