主页地址:某准网
通过抓包可以发现数据接口是api_to/search/company_v2.json
b
参数和kiv
参数是加密参数b
和kiv
通过搜索关键字kiv:
可以发现有一处条件判断,根据请求的方法和请求头类型设置b
和kiv
,所以此处大概是加密参数的赋值位置。
在此处下断点,再次获取数据,发现可以断住,t
和a
是加密参数的值。同时t
和a
的生成就在上方,所以此处就是加密位置。
因为响应加密数据一般都是json数据加密,所以解密后会使用JSON.parse进行解密,所以我们可以对JSON.parse进行hook
hook代码段:
var my_parse = JSON.parse;
JSON.parse = function (params) {
debugger
console.log("json_parse params:",params);
return my_parse(params);
};
运行hook代码,再次获取数据,发现可以断住明文
接着调试执行,可以发现e.data
是密文数据,经过M.gy
方法解密后的t
是明文数据。
将加密以及解密的方法扣出,缺啥补啥即可。在扣代码时可以发现,网站使用的AES加密,所以可以直接使用标准模块。同时,kiv
是加解密时使用的iv
,所以加解密时要使用相同的kiv
。
JavaScript源码:
var CryptoJS = require('crypto-js')
function M_A(e) {
void 0 === e && (e = 16);
for (var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""), n = "", r = 0; r < e; r++) {
n += t[Math.ceil(61 * Math.random())]
}
return n
}
var s, u = (s = null,
function () {
return s || (s = function () {
var e, t, n, r, i = null;
return i || (t = new RegExp("\\u200c", "g"),
n = new RegExp("\\u200d", "g"),
r = new RegExp(".{8}", "g"),
e = "".replace(r, (function (e) {
return String.fromCharCode(parseInt(e.replace(t, 1).replace(n, 0), 2))
}
)),
i = {
key: CryptoJS.enc.Utf8.parse(e),
mode: CryptoJS.mode.CBC,
pad: CryptoJS.pad.Pkcs7
}),
i
}()),
s
}
)
l = function (e, t) {
void 0 === e && (e = ""),
void 0 === t && (t = "");
var n = u()
, r = CryptoJS.AES.encrypt(e.toString(), n.key, {
iv: CryptoJS.enc.Utf8.parse(t),
mode: n.mode,
padding: n.pad
});
return r = r.toString()
}
c = function (e, t) {
void 0 === e && (e = ""),
void 0 === t && (t = "");
var n = u()
, r = CryptoJS.AES.decrypt(e.toString(), n.key, {
iv: CryptoJS.enc.Utf8.parse(t),
mode: n.mode,
padding: n.pad
});
return r = r.toString(CryptoJS.enc.Utf8)
}
M_mA = function (e, t) {
return e ? ("string" != typeof e && (e = e.toString()),
l(e, t.iv)) : ""
}
function M_gy(e, t) {
var n = "";
return "string" == typeof e && e.length > 20 && (n = c(e, t.iv)),
n
}
function get_params() {
var r_data = {
"query": "爬虫",
"pageNum": 5,
"limit": 15
}
var n = JSON.stringify(r_data);
var kiv = M_A()
var t = M_mA(n, {iv: kiv}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~");
return {
b: t,
kiv: kiv
}
}
function decryption_data(e_data, kiv) {
var data = M_gy(e_data, {iv: kiv})
data = JSON.parse(data)
return data
}