将二维码解码,得到网址如下
"
共有三个参数,uuid、clazzid和enc
clazzid可以确定为班级id,对于同一门课程是固定不变的
刷新页面获取最新二维码,解码后发现uuid和enc参数都发生了变化,并且两个参数在网页html里也同时用input标签存储,如下图
所以获取这两个参数只需要读取input标签即可,无需再解码
下一步,掏出手机,使用超星app扫码,然后fiddler抓包
需要一些基础的手机抓包技术(温馨提示:安卓6.0以下系统可以无视证书安全)
app界面显示如下
接下来按正常流程扫码验证
扫脸通过后,app一共请求了四个接口,前两个接口是检查图片id是否存在和上传图片,不重要,所以不展示。
上传完图片后返回了一个objectId,估计是图片资源对应的id,然后又请求了两个接口。
"
第二个接口返回的json数据:
[JavaScript] 纯文本查看 复制代码{"msg":"通过",
"log":"{\"data\":{\"relationId\":0,
\"objectId\":\"********************************\"},
\"clazzId\":********,
\"ip\":\"*.*.*.*\",
\"eventTime\":1638697167662,
\"personId\":*********,
\"eventType\":5,
\"courseId\":*******}",
"enc":"8cb8980acdbf8ec2b1db8bbe71527231",
"type":3,
"status":true}
这个json格式真让人窒息,不过他里面包含了“通过”字样,八成就是这个接口了,检查post数据:
clazzid和courseid经过比对是课程自带的,永远不会变
uuid和qrcenc就是网页input标签带的
objectid是上传人脸照片返回的
failcount和compareresult是请求第三个接口返回的
所以说只要解决后三个参数即可
关于objectid:上传人脸照片不可能,我要做的是破解人脸,而不是模拟人脸,所以objectid就先瞎填一下或者填一个已经存在的objectid
failcount和compareresult先用刚刚返回的0
接下来重新触发人脸,用post请求试一下(注意uuid和qrenc是刷新变化的,不能用旧的)
成功通过人脸识别!
尝试删除failcount和compareresult参数后post请求,再次通过!
研究到这里,可以判断,超星的人脸识别是在手机本地进行的,服务器端没有进行比对,objectid随便填。
总体思路如下:
1、在二维码页面获取uuid和qrenc、classid、courseid参数
2、POST如下接口,objectid随机(注意跨域问题):
url:https://mooc1-api.chaoxing.com/qr/updateqrstatus
data:clazzId=******&courseId=******&uuid=******&qrcEnc=******&objectId=随机字符
3、数秒后二维码自动消失,可以继续学习。
后记:在我开始研究的时候,已经做好失败的准备,因为如果超星是服务器端判断人脸然后返回id,那在本地怎么操作都不能跳过检测。
在把思路写成油猴脚本并发布后,经用户反馈,发现超星的人脸识别并不只有一个版本,另一版本的二维码格式相同,但手机app扫描后请求的接口不同,但总体思路类似。
注意:此文章的接口与思路已经通过油猴脚本实现并上传,如果你想写个同功能脚本,小心不要雷同。