一、数据接口分析
主页地址:某查查
1、抓包
通过抓包可以发现数据接口是api/people/getRelatCompany
2、判断是否有加密参数
-
请求参数是否加密?
无 -
请求头是否加密?
通过查看“标头”可以发现,请求头中有一个key和value都是密文的请求头和一个X-Pid
-
响应是否加密?
无 -
cookie是否加密?
无
二、加密位置定位
1、密文请求头
(1)看启动器
查看启动器发现里面包含异步,所以无法正确找到加密位置
(2)搜索关键字
因为请求头key也是密文,所以无法搜索key值,但是因为是请求头加密,所以可以搜索关键字headers[
。通过搜索可以发现,有一处设置请求头的位置,所以怀疑此处就是加密位置。
在此处打断点,再次获取数据,发现可以断住,并且此处key值与value值都是密文,所以此处就是加密位置,而且i
和l
的生成就在上方。
2、X-Pid
(1)搜索关键字
通过搜索关键字x-pid
可以发现,网站是从window
中取出来的。
所以我们可以通过搜索window.pid=
可以发现,是写在静态页面中的,同时还有一个tid
是加密请求头中用到的。
三、扣js代码
将定位到的加密位置的代码扣出,缺啥补啥即可。
在扣js代码时,可以发现o.default
中使用的是HmacSHA系列算法,所以我们可以尝试一下,判断是否是标准算法,通过控制台的输出,可以发现,o.default
就是标准的HmacSHA算法,所以此处我们可以使用标准模块来加密。
JavaScript源代码:
const CryptoJS = require('crypto-js')
var a_o_default = function (e, t) {
return CryptoJS.HmacSHA512(e, t).toString()
};
var a_a_default = function () {
var codes = {
"0": "W",
"1": "l",
"2": "k",
"3": "B",
"4": "Q",
"5": "g",
"6": "f",
"7": "i",
"8": "i",
"9": "r",
"10": "v",
"11": "6",
"12": "A",
"13": "K",
"14": "N",
"15": "k",
"16": "4",
"17": "L",
"18": "1",
"19": "8"
}
for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), t = e + e, n = "", i = 0; i < t.length; ++i) {
var a = t[i].charCodeAt() % 20;
n += codes[a]
}
return n
};
var a_default = function () {
var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase()
, n = JSON.stringify(e).toLowerCase();
return a_o_default(t + n, a_a_default(t)).toLowerCase().substr(8, 20)
};
var r_default = function () {
var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : ""
, n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase()
, i = JSON.stringify(e).toLowerCase();
return a_o_default(n + "pathString" + i + t, a_a_default(n))
};
function get_headers(tid) {
var t = '/api/people/getrelatcompany?keyno=pac1d468055811d835c90bf67aa9c656&pagesize=10';
var i = a_default(t, undefined)
var l = r_default(t, undefined, tid);
return {i:l}
}