一、数据接口分析
主页地址:某江酒店
1、抓包
通过抓包可以发现数据接口是/api/member/login
2、判断是否有加密参数
- 请求参数是否加密?
通过查看“载荷”模块可以发现,有TDFingerprint
、blackBoxMd5
、password
和sw
四个加密参数,剩下的did
和deviceInfo
是可以写死的。
- 请求头是否加密?
无 - 响应是否加密?
无 - cookie是否加密?
无
二、加密位置定位
1、password
通过搜索password:
可以发现有一处加密的位置
点进去,打上断点,可以发现,就是可以断住,并且就是在这里进行的加密。
2、sw
我们可以发现,在上方password
加密的位置,并没有其他参数,但是在下方调用了一个r.login
方法,我们可以进入该方法查看。
进入之后,发现还有一层a.login
,我们接着进入a.login
方法查看,进入之后,可以发现,sw
参数是在此处使用md5进行加密的。
3、TDFingerprint
和 blackBoxMd5
虽然我们在上方的方法中,也发现了TDFingerprint
和blackBoxMd5
,但是它们的生成位置不在这里
然后我们可以通过搜索_fmOpt.TDFingerprint =
,可以发现一处赋值位置。
我们在此处打上断点,然后刷新页面,发现可以断住。
然后通过查看堆栈,可以发现data
参数是由oooOoQ
方法生成的。
三、扣js代码
password
和sw
参数的加密都是使用的标准模块进行的加密,直接使用标准加密,然后再将TDFingerprint
的生成方法扣出即可。
js源代码:
var CryptoJS = require('crypto-js')var QOoOoo = {};
var o00o0O = [];function o00Q00(QQQoO) {var Qo000 = ""var oQoQo = ['ghijklmnopqrstuv'['charAt']('0123456789abcdef'['indexOf'](QQQoO['substring'](0, 1))), QQQoO['substring'](1, 4), QQQoO['substring'](4, 14), QQQoO['substring'](14, 22), QQQoO['substring'](22, 23)];var Oo000 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']var oQOQO = [];var QOQQO = 0;oQOQO = [Oo000[parseInt(Math['random']() * 62)], Oo000[parseInt(Math['random']() * 62)], Oo000[parseInt(Math['random']() * 62)]];QOQQO = 1000o00o0O['push']("" + oQOQO[0] + oQOQO[1] + oQOQO[2])Qo000 = "" + oQoQo[0] + oQoQo[1] + oQOQO[0] + oQoQo[2] + oQOQO[1] + oQoQo[3] + oQOQO[2] + oQoQo[4];QOQQO++;return Qo000
}encryptAES = function (e) {var n = CryptoJS.enc.Latin1.parse("h5LoginKey123456"), a = CryptoJS.enc.Latin1.parse("h5LoginIv1234567"), t = e, o = CryptoJS.AES.encrypt(t, n, {iv: a,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding});return o.toString()
}hex_md5 = function (text) {return CryptoJS.MD5(text).toString()
}function get_params(mobile, password, yzm) {let t = '7a2jY0'let deviceInfo = {"fingerPrintJs": "30c4e77f147c1e20d765a426d3903d48","userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","platform": "Win32"}let data = o00Q00('bWPH1712728929bkst3r3de')l = {groupTypeId: 2,type: 1,mobile: mobile,password: encryptAES(password),rememberMe: true,verifyCode: yzm,TDFingerprint: data,blackBoxMd5: hex_md5(data),did: 'd26ff897e3a0dd231c97e33c84ca4c0f',deviceInfo: deviceInfo,sw: hex_md5(t + mobile + deviceInfo.fingerPrintJs),channelCode: 'CA00046'}return l
}