一、数据接口分析
主页地址:某查查
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}
}