一、數(shù)據(jù)接口分析
主頁地址:某準(zhǔn)網(wǎng)
1、抓包
通過抓包可以發(fā)現(xiàn)數(shù)據(jù)接口是api_to/search/company_v2.json
2、判斷是否有加密參數(shù)
- 請求參數(shù)是否加密?
通過查看“載荷”模塊可以發(fā)現(xiàn)b
參數(shù)和kiv
參數(shù)是加密參數(shù) - 請求頭是否加密?
無 - 響應(yīng)是否加密?
通過查看“響應(yīng)”模塊可以發(fā)現(xiàn),網(wǎng)站返回的響應(yīng)數(shù)據(jù)也是加密的 - cookie是否加密?
無
二、加密位置定位
1、加密參數(shù)b和kiv
(1)看啟動(dòng)器
查看啟動(dòng)器發(fā)現(xiàn)里面包含異步,所以無法正確找到加密位置
(2)搜索關(guān)鍵字
通過搜索關(guān)鍵字kiv:
可以發(fā)現(xiàn)有一處條件判斷,根據(jù)請求的方法和請求頭類型設(shè)置b
和kiv
,所以此處大概是加密參數(shù)的賦值位置。
在此處下斷點(diǎn),再次獲取數(shù)據(jù),發(fā)現(xiàn)可以斷住,t
和a
是加密參數(shù)的值。同時(shí)t
和a
的生成就在上方,所以此處就是加密位置。
2、響應(yīng)數(shù)據(jù)
因?yàn)轫憫?yīng)加密數(shù)據(jù)一般都是json數(shù)據(jù)加密,所以解密后會使用JSON.parse進(jìn)行解密,所以我們可以對JSON.parse進(jìn)行hook
hook代碼段:
var my_parse = JSON.parse;
JSON.parse = function (params) {
debugger
console.log("json_parse params:",params);
return my_parse(params);
};
運(yùn)行hook代碼,再次獲取數(shù)據(jù),發(fā)現(xiàn)可以斷住明文
接著調(diào)試執(zhí)行,可以發(fā)現(xiàn)e.data
是密文數(shù)據(jù),經(jīng)過M.gy
方法解密后的t
是明文數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-680234.html
三、扣js代碼
將加密以及解密的方法扣出,缺啥補(bǔ)啥即可。在扣代碼時(shí)可以發(fā)現(xiàn),網(wǎng)站使用的AES加密,所以可以直接使用標(biāo)準(zhǔn)模塊。同時(shí),kiv
是加解密時(shí)使用的iv
,所以加解密時(shí)要使用相同的kiv
。
JavaScript源碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-680234.html
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
}
到了這里,關(guān)于爬蟲逆向?qū)崙?zhàn)(二十三)--某準(zhǔn)網(wǎng)數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!