声明:文章仅供学习,禁止非法用途,侵权请告知删除
前言
地址:aHR0cHM6Ly93d3cucWltYWkuY24vcmFuaw==
一、网页分析
数据请求的方式是xhr请求,需要解决analysis参数是怎么生成的
二、analysis参数获取
1.定位加密位置
打一个xhr断点,然后刷新网页,根据请求堆栈,一步步追上去,最后会看到这边,跟请求数据的接口的一样
一步一步调试之后,最后会定位到这边,下面可以看到analysis的参数生成了,其实就是a
2.破解加密参数
可以看到a参数的生成方式
a = (0, n.cv)((0, n.oZ)(r, l))
n.cv 和 n.oZ是两个函数
l是一个定值
r是动态改变的
三、源代码
抱着缺啥补啥的方式,把代码扣下来,100行都不到,在请求不同榜单的数据的时候,需要修改 e.url 的值
function get_analysis(pg) {
window = global;
window.document = {
cookie: '' // 这边带上自己的cookie,但是!置为空,也能够访问???
}
function i(e) {
var t, a = (t = "",
["66", "72", "6f", "6d", "43", "68", "61", "72", "43", "6f", "64", "65"].forEach((function (e) {
t += unescape("%u00" + e)
}
)),
t);
return String[a](e)
}
function s() {
return unescape("861831832863830866861836861862839831831839862863839830865834861863837837830830837839836861835833".replace(/8/g, "%u00"))
}
var l = "00000008d78d46a"
var n = {
oZ: function g(e, t) {
t || (t = s());
for (var a = (e = e.split("")).length, n = t.length, o = "charCodeAt", r = 0; r < a; r++)
e[r] = i(e[r][o](0) ^ t[(r + 10) % n][o](0));
return e.join("")
},
cv: function h(e) {
return function (e) {
try {
return btoa(e)
} catch (t) {
return Buffer.from(e).toString("base64")
}
}(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, (function (e, t) {
return i("0x" + t)
}
)))
},
ej: function u(e) {
var t, a = new RegExp("(^| )" + e + "=([^;]*)(;|$)");
return (t = document.cookie.match(a)) ? unescape(t[2]) : null
}
}
var d = "@#"
var e = {
// url: "/rank/indexPlus/brand_id/1",
url: "/rank/indexPlus/brand_id/" + pg, // 1.免费榜 0.付费 2.畅销榜
baseURL: "https://api.qimai.cn",
}
var c = {
default: function On(e) {
this._init(e)
}
}
var u = "synct"
var t = (0, n.ej)(u);
var m = "syncd"
var f = f = c.default.prototype.difftime = -(0, n.ej)(m) || +new Date - 1e3 * t
var o = +new Date - (f || 0) - 1515125653845
var r = []
r = r.sort().join(""), r = (0, n.cv)(r), r += d + e.url.replace(e.baseURL, ""), r += d + o, r += d + 1,
a_ = (0, n.cv)((0, n.oZ)(r, l))
return a_
}