⚠️前言⚠️
本文仅用于学术交流。
学习探讨逆向知识,欢迎私信共享学习心得。
如有侵权,联系博主删除。
请勿商用,否则后果自负。
网址
- aHR0cHM6Ly93d3cuZGluZ3hpYW5nLWluYy5jb20vYnVzaW5lc3MvY2FwdGNoYQ==
1. 参数分析
1_1. 验证码信息下发接口参数 - /api/a
1_2. 验证接口参数 - /api/v1
1_3. 验证成功返回信息 - /api/v1
2. c1 接口 - Param
- 说明: 该接口返回参数 c,目前我是固定的,但是对于一些定制化的验证码,可能会校验,这里简单说一下
2_1. Param 生成位置,ajax断点,调试堆栈
- 1
- 2
2_2. 参数appKey可固定,lid 其实存在于localStorage中
2_3. 直接hook调试 _dx_uzZo5y 生成的位置,注意参数在外部函数时需要将断点断在外部函数,重新调试
- 1
- 2
- 3
- 4
- 5
2_4. 两处生成位置和方法找到之后,直接全局导出,补环境即可
3. 底图还原
3_1. 先来看一下原生的底图,长这样
3_2. 老规矩,我们使用canvas事件监听断点来调试一下,刷新验证码
- 断点会断在这个位置,这就很明了了,drawImage方法就是canvas用来绘制图片的方法
- drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 参数说明
- image: 要绘制的图像对象
- sx: 源图像中需要截取的矩形区域的左上角x坐标。
- sy: 源图像中需要截取的矩形区域的左上角y坐标。
- sWidth: 源图像中需要截取的矩形区域的宽度。
- sHeight: 源图像中需要截取的矩形区域的高度。
- dx: 目标绘制图像的左上角x坐标。
- dy: 目标绘制图像的左上角y坐标。
- dWidth: 目标绘制图像的宽度。
- dHeight: 目标绘制图像的高度。
- 这里应该就是底图的还原位置了,而参数 t 就是图片的还原顺序
- 多次刷新验证码,发现 t 一直在变化,所以我们需要看一下这个序列 t 是怎么生成的
3_3 底图还原序列 t 的生成
- 形参 t 是由实参 E 传递过来的,上翻一下就能找到 E 的生成位置
- 此处的 n 对象中的 ranges 属性就是我们需要的序列值
- 调试堆栈,最终会找到这个位置
- Pn就是最终生成的方法,而参数就是底图链接的 id 值
- 这里的js代码还是很简单的,是扣js还是算法还原大家随意,下面说一下需要注意的地方
1. 底图大小是 400x200
2. 上述底图还原序列的长度是 32,而且js在还原底图时,这32份是等分的,大小是 12x200
3. 最后一块需要单独处理,大小是 16x200
- 最终还原结果
4. ac 生成
4_1. ac生成位置
- ac 生成的全部流程存在于 js 文件 greenseer.js 中,该文件每天的上午10点和下午7点更新, 因此需要动态获取
4_2. ac 初始化位置
- greenseer.js - webpack 代码加载器,并且执行了3号模块,跟一下就会发现其初始化的位置
- 不难发现其初始化的方法其实就存在于 window._dx.UA 中, 而参数n其实就是接口信息中返回的 sid 值
4_3. ac生成 - 轨迹,日志断点, 最终的 dx 值就是滑块的滑动距离
4_4. ac 生成 - sendTemp
- 下一个需要注意的就是这个位置了
- xn 是缺口距离底图边框的距离,不是滑块滑动的距离【也就是说滑块初始状态距离边框是 20】
- kn 就是验证码信息接口返回的 y 值
4_5. ac生成 - 基本流程总结,补环境出值
- window._dx.UA.init 初始化
- 滑动调用recordSA, 对轨迹进行加密
- sendSA, sendTemp 生成 ua