一、数据接口分析
主页地址:某视综
1、抓包
通过抓包可以发现数据接口是/rank/waiting/fans
2、判断是否有加密参数
- 请求参数是否加密?
通过查看"载荷"模块可以发现有一个sign
参数
- 请求头是否加密?
无 - 响应是否加密?
通过查看"响应"模块可以发现数据是加密的
- cookie是否加密?
无
二、加密位置定位
1、sign
(1)看启动器
查看启动器发现里面包含异步,所以无法正确找到加密位置
(2)搜索关键字
通过搜索关键字sign=
,可以发现有一处sign
的生成位置
在此处打上断点,再次获取数据,发现可以断住,并且sign
的密文就是在此处生成的
2、响应
因为响应加密数据一般都是json数据,所以解密后会使用JSON.parse
进行解密,所以我们可以对JSON.parse
进行hook
hook代码:
javascript
var my_parse = JSON.parse;
JSON.parse = function (params) {
debugger
console.log("json_parse params:",params);
return my_parse(params);
};
运行hook代码,再次获取数据,发现可以断住明文数据
通过跟栈就可以找到解密位置
三、扣js代码
扣js代码时,可以发现sign
在加密时,使用的加密方法是标准的MD5,所以我们可以使用标准模块进行加密,不扣js代码
同时,网站解密时使用的是标准的AES算法,所以我们可以使用标准的模块进行解密,不扣js
JavaScript源码:
javascript
const CryptoJS = require('crypto-js')
function getSign(e) {
delete e.sign;
for (var t = [], n = Object.keys(e).sort(), r = 0; r < n.length; r++) {
var i = n[r]
, a = e[i];
t.push(i),
t.push(a)
}
t.push("iIndex");
var s = t.join("_")
, c = CryptoJS.MD5(s).toString();
return c
}
function get_data(lastFetchTime, r) {
var i = CryptoJS.enc.Utf8.parse(lastFetchTime + "000")
, a = CryptoJS.enc.Utf8.parse(lastFetchTime + "000")
, s = CryptoJS.AES.decrypt(r.toString(), i, {
iv: a
})
return s.toString(CryptoJS.enc.Utf8);
}