声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!
项目场景:
我们通常遇到的JS加密呢一般是请求参数经过加密的,而这次遇到了返回参数经过加密,其实这两者的解密方法都是一样的,就是要找到前端调用的JS解密的函数,话不多说,我们直接开始。
解决方案:
1.这里抓的是药品研发–药品注册与受理数据库里的信息
2.清空下xhr,点个第二页看看请求,可以明显的看出data参数是加密过后的,那么我们就需要找到data解密的JS代码,怎么着呢,这里给两个思路①:ctrl+shift+f全局搜索请求的链接里主要的部分即/zhuce,然后逐一查找有请求到这个链接的JS代码,看看里面是否有解密的方法。思路②:在翻页时下xhr断点找出解密方法,即我本次使用的方法,接下来会慢慢讲解。
3.然后下xhr断点,请求下一页,然后进去慢慢找解密的地方……
4.最终,我们在app开头的JS文件中找到了解密的位置,可以看到a参数就是前端返回的加密数据,然后使用at.decryptResponse(a.data, "yaozh_vip2020")
去解密。
5.我们点at.decryptResponse方法进去看看,这下一目了然,直接将at函数整个抠出来。
6.这里我帮大家抠出来了,这里要注意的是this.decryptResponse
方法里的a = et()(i),这个参数a是个定值,即MD5('yaozh_vip2020') --> c8d9534c6e599a37818fc0d613515b88
,然后我们找一个加密过的data,执行一下。
var at = new function () {
var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
, a = ""
, t = 0
, n = []
, o = function (e) {
return 32 == t && (t = 0),
e ^= a.charCodeAt(t++),
i(e)
}
, i = function (e) {
if (n.length) {
var a = n[0];
if (a > 191 && a < 224)
return n = [],
String.fromCharCode((31 & a) << 6 | 63 & e);
if (1 === n.length)
return n.push(e),
"";
var t = n[1];
return n = [],
String.fromCharCode((15 & a) << 12 | (63 & t) << 6 | 63 & e)
}
return e < 128 ? String.fromCharCode(e) : (n.push(e),
"")
};
this.decryptResponse = function (n) {
var i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "yaozh_cydn";
if (!n)
return !1;
// a = et()(i), //MD5('yaozh_vip2020') --> c8d9534c6e599a37818fc0d613515b88
a = 'c8d9534c6e599a37818fc0d613515b88';
t = 0;
var s = ""
, r = 0;
for (n = n.replace(/[^A-Za-z0-9\+\/\=]/g, ""); r < n.length;) {
var A = e.indexOf(n.charAt(r++))
, c = e.indexOf(n.charAt(r++))
, u = e.indexOf(n.charAt(r++))
, m = e.indexOf(n.charAt(r++));
s += o(A << 2 | c >> 4),
64 != u && (s += o((15 & c) << 4 | u >> 2)),
64 != m && (s += o((3 & u) << 6 | m))
}
return s
}
}
;