声明:
该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!
前言
这次会讲解某东滑块登录的逆向分析流程,如果有疑问可以在评论区交流讨论,我看到会及时回复的,另外,有需要可私信我。
js逆向步骤:
通过接口获取两张验证码图片 ——> 处理图片 ——> 通过cv2 或者ddddocr计算出缺口的距离 ——> 模拟封装滑块的轨迹参数 ——> 逆向加密轨迹的参数 ——> 加密并请求验证接口----登录接口参数分析。
一、分析请求流程。
1.滑块的请求流程
a.https://iv.jd.com/slide/g.html
输入账号密码后,会触发滑块,可在https://iv.jd.com/slide/g.html接口看到跟滑块背景图相关的信息。
参数:appId,e这两个参数需要填写,appId可以固定
params = {
"appId": appId,
"scene": "login",
"product": "click-bind-suspend",
"e": e, # 检测浏览器指纹的,同一台电脑浏览器指纹相同,所以暂时可以固定,这个值是根据这个(https://gia.jd.com/fcf.html?)接口返回的,这个接口就是检测浏览器指纹,暂时不分析。
"j": "",
"lang": "zh_CN",
"callback": "jsonp_0914357298388242"
}
根据图片知道,返回的重要的数据有:(bg,patch)滑块相关的图片,challenge 后面滑块请求需要用到。
b.https://iv.jd.com/slide/s.html:滑块请求验证接口。
参数:
d:轨迹加密。
c:g接口获取到的数据challenge,
appId:跟该接口相同,固定
e:跟该接口相同,可以暂时固定
s:接口https://seq.jd.com/jseqf.html?bizId=passport_jd_com_login_pc&platform=js&version=1返回,这里不去分析。
o:登录的账号
params = {
'd': d,
'c': challenge,
'w': '242',#'278',
'appId': appId,
'scene': 'login',
'product': 'click-bind-suspend',
'e': e,
'j': '',
's': s,
'o': '123',
'o1': '0',
'u': 'https://passport.jd.com/new/login.aspx?',
'lang': 'zh_CN',
'callback': 'jsonp_04201456052783201',
}
2.登录的请求流程
1.登录首页分析:https://passport.jd.com/new/login.aspx
图片中标注处,是后面接口要用到的参数。
2.https://seq.jd.com/jseqf.html:这个接口返回的数据是登录接口中生成参数aksParamsB的参数seqSid。
3.https://passport.jd.com/publicKey/init:返回的数据,是后面登录接口参数的加密密钥。
4.https://passport.jd.com/uc/loginService?登录接口:
参数:aksParamsU,aksParamsB。
2.整体分析
二、分析接口参数。
根据前面的分析,主要要分析的参数有轨迹加密d、登录参数分析:aksParamsU,aksParamsB。
1.参数d分析。
通过堆栈分析得到轨迹加密的地方
'd': a['getCoordinate'](b),
b就是轨迹。进入到getCoordinate函数,分析具体是怎么加密的。
加密文件,加密函数:
把这个加密文件整体复制出来,缺啥补啥。
2.参数:aksParamsU,aksParamsB。
进入堆栈找到参数加密的地方。
参数生成的位置:
根据堆栈往上分析:this.url,this.data是什么。
通过上图得知,
this.url:
loginUrl + "?uuid=" + uuid + "&" + location.search.substring(1) + "&r=" + Math.random() + "&version=2015",
实际是:
url = "/uc/loginService" + "?uuid=" + uuid + "&" + '' + "&r=" + Math.random() + "&version=2015";
this.data:
var d = {
uuid: $("#uuid").val(),
eid: $("#eid").val(),
fp: $("#sessionId").val(),
_t: $("#token").val(),
loginType: $("#loginType").val(),
loginname: $("#loginname").val(),
nloginpwd: getEntryptPwd($("#nloginpwd").val()),
authcode: b,
pubKey: $("#pubKey"