前言
本文仅供参考学习,如有侵权请联系本人删除!
本文参考:https://blog.csdn.net/Yy_Rose/article/details/125767465
目标网址
aHR0cHM6Ly9hY2NvdW50LnhpYW9taS5jb20vZmUvc2VydmljZS9sb2dpbi9wYXNzd29yZD9fcXJzaXplPTE4MCZzaWQ9bWlfZXNob3AmcXM9JTI1M0ZjYWxsYmFjayUyNTNEaHR0cCUyNTI1M0ElMjUyNTJGJTI1MjUyRm9yZGVyLm1pLmNvbSUyNTI1MkZsb2dpbiUyNTI1MkZjYWxsYmFjayUyNTI1M0Zmb2xsb3d1cCUyNTI1M0RodHRwcyUyNTI1MjUzQSUyNTI1MjUyRiUyNTI1MjUyRnd3dy5taS5jb20lMjUyNTI1MkYlMjUyNTI2c2lnbiUyNTI1M0ROelkzTURrMVl6Y3pObVV3TUdNNE9EQXhPV0UwTmpSaU5UVTVaR1F5TXpGaFlqRm1PR1UwTnclMjUyNTJDJTI1MjUyQyUyNTI2c2lkJTI1M0RtaV9lc2hvcCUyNTI2X3Fyc2l6ZSUyNTNEMTgwJmNhbGxiYWNrPWh0dHAlM0ElMkYlMkZvcmRlci5taS5jb20lMkZsb2dpbiUyRmNhbGxiYWNrJTNGZm9sbG93dXAlM0RodHRwcyUyNTNBJTI1MkYlMjUyRnd3dy5taS5jb20lMjUyRiUyNnNpZ24lM0ROelkzTURrMVl6Y3pObVV3TUdNNE9EQXhPV0UwTmpSaU5UVTVaR1F5TXpGaFlqRm1PR1UwTnclMkMlMkMmX3NpZ249dzFSQk02Y0c4cTJ4ajVKekJQUGE2NVFLczl3JTNEJnNlcnZpY2VQYXJhbT0lN0IlMjJjaGVja1NhZmVQaG9uZSUyMiUzQWZhbHNlJTJDJTIyY2hlY2tTYWZlQWRkcmVzcyUyMiUzQWZhbHNlJTJDJTIybHNycF9zY29yZSUyMiUzQTAuMCU3RCZzaG93QWN0aXZlWD1mYWxzZSZ0aGVtZT0mbmVlZFRoZW1lPWZhbHNlJmJpekRldmljZVR5cGU9Jl9sb2NhbGU9emhfQ04=
接口网址:aHR0cHM6Ly9hY2NvdW50LnhpYW9taS5jb20vcGFzcy9zZXJ2aWNlTG9naW5BdXRoMg==
逆向分析
经过多次抓包发现只有user
、hash
这两个地方是加密变化的。user就不用说都知道是用户了。那这个hash
是什么呢,其实就是密码的hash值。其实在这里我一眼就可以看出它是什么加密。在这里有一个小技巧,选择一个常用的数字作为密码,然后记住它的加密特征就能够知道属于什么加密了。
加密点分析
打上xhr断点,寻找user
和hash
的加密地方。
堆栈跟上九层就能看到:
user: v.user,
hash: j()(a.password).toUpperCase()
打上断点分析看一下。
确实能够断下来,说明找的位置没有错,往上找找它的加密逻辑。
hash参数分析
这几行很关键,首先确定是一个AES
加密,加密函数赋值给了变量u,然后加密后赋值给对象f,最后用v变量接收加密参数。
加密是在Pt函数中,仔细看一下就知道最后的g
是我们需要的加密后的user,再看一下o()(e = a()(t))
是什么玩意。
o() 是一个forEach循环,t={user: ‘13888888888’},==a()(t)==取了对象的键。
改写一下
Object.keys(t).forEach(function (e) {
dosomething……
}
代码放在最后,接着看一下hash参数的分析。
hash参数分析
之前说过能够看出是什么加密,方法也告诉小伙伴们了。很显然是一个MD5
加密,然后将加密结果大写。分析一下代码看一下是不是吧。
进去看一下。
在返回值l处打上断点,跳进去。
3825行使用了三目运算符的嵌套,一层层扒开看看调用了哪个方法。
前面都是False,所以最后调用了t.bytesToHex(r)
实现加密逻辑。其中参数r定义在上方。
最终的加密逻辑是:
var r = t.wordsToBytes(l(e, n))
t.bytesToHex(r)
这里就不细扣了,因为已经知道了加密方法。
代码复现
使用前安装
npm install js-md5
npm install crypto-js
//user
var CryptoJS = require('crypto-js');
function Pt(t) {
var i = function (t) {
for (var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*", r = "", i = 0; i < t; i++) {
var n = Math.floor(Math.random() * e.length);
r += e.substring(n, n + 1)
}
return r;
}(16)
var u = CryptoJS.enc.Utf8.parse("0102030405060708")
, f = CryptoJS.enc.Utf8.parse(i);
var encryptUser;
Object.keys(t).forEach(function (e) {
var r = t[e]
, i = CryptoJS.AES.encrypt(r, f, {
iv: u,
padding: CryptoJS.pad.Pkcs7
});
encryptUser = i.toString();
});
return encryptUser;
}
console.log(Pt({user: "your phone"}));
//hash
const md5 = require('js-md5');
function md5Encryption(pwd){
return md5(pwd)
}
console.log(md5Encryption('abc123')); //e99a18c428cb38d5f260853678922e03
搞清楚思路还是不难的。
如果觉得本文对你有帮助,可以点个赞再走。