房天下滑块验证全流程说明文档¶
本文档以房天下滑块为示例,介绍滑块 js 验证的通用方式。随便介绍补环境框架的使用方法
1. 前提条件¶
房天下 js 滑块验证码逆向前准备如下:
- 安装
node
、vscode
及vm2
库 - 若需要浏览器无环境来辅助调试,则需要安装
node-inspect
的node
库 - 目标网址:验证页面
- 补环境框架基于
node vm2
开发,所以使用一些执行js
的库来调用时可能会有运行结果与浏览器运行不一致的问题,或运行报错的问题。若出现此问题,推荐以下方法解决:- 将框架的内容转为
v8
模块再调用(暂未实现,待定) - 使用
python
的node_vm2
之类的库来执行(一般使用此方法)
- 将框架的内容转为
2. 验证流程¶
一般的验证码验证流程大都分为多个请求包,来分别验证请求者的环境信息(浏览器 bom 信息,dom 信息)及鼠标事件数组(滑块为拖动像素距离及移动轨迹,点选为点击顺序及坐标)是否正常。
以下为房天下滑块验证流程,一般极验等站也都采用类似的流程:
2.1. __get_verify_index¶
请求验证页面,获取初始 cookie 及响应内容长度,其中响应长度可供环境参数生成使用
此请求包主要用来获取响应内容长度,会在后面环境参数的生成中使用。但也可不模拟此请求(有多种方法生成环境参数 i),直接从 2.2. __get_gt 获取 gt 和 challenge 部分开始即可。
- 由于此请求不很重要,略。
2.2. __get_gt¶
获取
gt
和challenge
值,一般这两个值参与判断是否是同一轮验证。房天下只在请求参数中体现,没有像极验之类的站点使用这两个值参与请求值的计算。
- 请求地址:http://search.fang.com/captcha-b93a359399c88c9e40/captcha-image?channel=pc
-
请求方式:GET
-
请求参数:
字段 | 说明 | 类型 | 是否必填 | 备注 |
---|---|---|---|---|
channel | 平台 | str | 是 |
注:请求需要携带 cookie
值 global_cookie
和 unique_cookie
,参数定位使用 cookie
的 hook
方法。
- 返回结果(只介绍主要参数,其余略):
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
gt | 用于同一轮验证 | str | |
challenge | 用于同一轮验证 | str |
2.3. __get_config¶
获取到版本等配置信息,一般此请求同 2.4. __get_image 一样用来
set-cookie
操作,根据不同站点来确定是否需要模拟请求。建议还是与浏览器一致。
- 请求地址:https://recaptcha.fang.com/?c=index&a=getType>=a3a2e8a38b7081d92709905838535bd2&challenge=049ddbad741424c63e1efa01350858b1&time=1636337192267&callback=fangcheck_1636337200549&_200226
-
请求方式:GET
-
请求参数(只介绍主要参数,其余略):
字段 | 说明 | 类型 | 是否必填 | 备注 |
---|---|---|---|---|
c | str | 是 | 写死,值为 index | |
a | str | 是 | 写死,值为 getType | |
gt | 用于同轮验证 | str | 是 | |
challenge | 用于同轮验证 | str | 是 | |
time | str | 是 | ||
callback | str | 否 | 爱写不写,写死也可以 |
- 返回结果(只介绍主要参数,其余略):
返回内容全都不重要,略。
2.4. __get_image¶
获取验证码图片信息,用于获取滑块的位移距离
- 请求地址:https://recaptcha.fang.com/?c=index&a=jigsaw>=a3a2e8a38b7081d92709905838535bd2&challenge=049ddbad741424c63e1efa01350858b1&callback=fangcheck_1636337193822&_200226
-
请求方式:GET
-
请求参数(只介绍主要参数,其余略):
字段 | 说明 | 类型 | 是否必填 | 备注 |
---|---|---|---|---|
c | str | 是 | 写死,值为 index | |
a | str | 是 | 写死,值为 getType | |
gt | 用于同轮验证 | str | 是 | |
challenge | 用于同轮验证 | str | 是 | |
callback | str | 否 | 爱写不写,写死也可以 |
- 返回结果(只介绍主要参数,其余略):
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
surl | 滑块图 | str | |
url | 滑块背景图 | str |
2.4.1. 确定滑块位置¶
直接匹配滑块和背景图像素即可,具体请参考程序。
略。
2.5. __verify¶
验证请求包,用于验证环境参数和拖动距离和轨迹信息
此包比较重要,需要正确生成环境
i
值和轨迹t
值。具体请在 其它参数定位 中查看。
字段 | 说明 | 类型 | 是否必填 | 备注 |
---|---|---|---|---|
c | str | 是 | 写死,值为 index | |
a | str | 是 | 写死,值为 getType | |
start | 开始时间,与 end 参数的差值要与生成轨迹的时间一致 | str | 是 | |
end | 结束时间 | str | 是 | |
i | 环境验证参数,取浏览器特征并处理而生成 | str | 是 | 请在 其它参数定位 中查看 |
t | 轨迹处理后的值 | str | 是 | 请在 其它参数定位 中查看 |
gt | 用于同轮验证 | str | 是 | |
challenge | 用于同轮验证 | str | 是 | |
callback | str | 否 | 爱写不写,写死也可以 |
注:i
值可以复制浏览器参数,就只更改时间戳和 2.1. __get_verify_index 中的值即可,甚至只修改时间戳,或直接写死都能过验证。具体环境的随机生成方法和轨迹解密方法,请看 ast-hook-for-js
和补环境框架的教程。
- 返回结果(只介绍主要参数,其余略):
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
validate | 通过验证后的值 | str |
3. 补充说明¶
对以上流程进行补充说明
3.1. 房天下注意点¶
3.1.1. 生成 cookie 的位置¶
房天下
cookie
生成的位置大都在同一位置
3.1.2. hook cookie 参数方法¶
注:
hook cookie
的代码如下(具体请看开发文档中的cookie
定位和调试方法):
3.1.3. 其它参数定位¶
使用内存漫游很方便就能定位到大致位置
-
请求参数获取方法
-
推荐直接在同目录(开发文档中) 下的
ast-hook-for-js
即可定位到参数生成的大致位置,再根据调用栈调试即可。 xhr
断点调试-
特征值搜索
-
这里以轨迹
t
值为例:
直接搜 url 或特征值即可定位在这附近,稍微断点调试即可得到轨迹 t 的生成逻辑。而环境 i 值就在轨迹生成逻辑的上面。
3.2. 如何运行 hook 到的 js 代码¶
- 比较推荐使用补环境框架来调试,
js
整体try catch
,再加上js proxy
输出日志,通过debugger
后即可v8
和node
运行。
- 其中
js
所有方法所依赖的环境较少,直接手补最差的环境都能过。
具体请参考 gitlab 中的 ftx.js 内容
jsdom
环境也能过
略,不再演示。
注:补框架导出的环境在通过
v8
调试,或者 node 调试正常后,才可使用py execjs
库运行。
可能通过 js 调试工具了,还需要相应地稍微修改调试代码才能供 py execjs 直接使用(毕竟
js
调试工具大都是v8
环境,推荐使用带有系统调用和v8
运行双环境的调试工具)。
4. 运行方式¶
对应程序在房天下程序中查看
- 直接运行
run_slide.py
文件即可
这里放上整个流程图: