抓包分析,请求头有requestid和sign两个参数加密
载荷也进行了加密
返回数据也进行了加密
搜索requestid找到怀疑的第二个js文件位置
发现,这一段js代码是由eval加载的
接下来复制eval函数中的内容,在控制台打印
就可以解出eval ,复制放在pycharm中的,格式化。
可以比较清楚的看到加密的结构,但是这不是在浏览器中,还是无法打断点分析。
那么怎么做呢?
beforeSend提示我们,在发包之前,经过这个函数加密。所以我们回到浏览器中,搜索beforeSend (我搜索搜不到)直接跟栈,在send发包前面不远处就有
进入,k.beforeSend ,这是一个函数,发现创建了一个映射页面,里面有函数。
现在打断点分析
两个参数a,b,主要用的是b。b是表单载荷
由代码可以知道,c就是时间戳,d是requestid,f是sign。现在改造代码。
因为用到了JSEncrypt,首先导入这个库
再设置一个函数
报错,因为encrypt是JSEncrypt()对象,而这个对象中是没有这个函数的,这就是用库的弊端,但是全扣代码,太麻烦了。还记得原型链吗,这个函数是他自己定义的,这种情况我们怎么处理?
直接进入这个函数,浏览器中也是原型链添加的。
直接复制这些个自己添加的函数代码
按住ctrl键,点击require('node-jsencrypt')里面的库,可以进入这个库源代码中
比较库和浏览器中的末尾会发现是一样的,就是浏览器自己添加了那几个方法罢了。
我们把复制的添加到浏览器下面即可。
接着就是MD5没有定义了,我们定义好
现在代码没问题了,我们做小的调整
结果展现:
完整代码:
var JSEncrypt = require('node-jsencrypt')
const CryptoJS = require("crypto-js");
function MD5(data){
const hash = CryptoJS.MD5(data)
return hash.toString()
}
function getUuid() {
var s = [];
var a = "0123456789abcdef";
for (var i = 0; i < 32; i++) {
s[i] = a.substr(Math.floor(Math.random() * 0x10), 1)
}
s[14] = "4";
s[19] = a.substr((s[19] & 0x3) | 0x8, 1);
s[8] = s[13] = s[18] = s[23];
var b = s.join("");
return b
}
function sort_ASCII(a) {
var b = new Array();
var c = 0;
for (var i in a) {
b[c] = i;
c++
}
var d = b.sort();
var e = {};
for (var i in d) {
e[d[i]] = a[d[i]]
}
return e
}
function url2json(a) {
var b = /^[^\\?]+\\?([\\w\\W]+)$/, reg_para = /([^&=]+)=([\\w\\W]*?)(&|$|#)/g, arr_url = b.exec(a), ret = {};
if (arr_url && arr_url[1]) {
var c = arr_url[1], result;
while ((result = reg_para.exec(c)) != null) {
ret[result[1]] = result[2]
}
}
return ret
}
function dataTojson(a) {
var b = [];
var c = {};
b = a.split('&');
for (var i = 0; i < b.length; i++) {
if (b[i].indexOf('=') != -1) {
var d = b[i].split('=');
if (d.length == 2) {
c[d[0]] = d[1]
} else {
c[d[0]] = ""
}
} else {
c[b[i]] = ''
}
}
return c
}
const serialize = function (a) {
var b = [];
for (var p in a) if (a.hasOwnProperty(p) && a[p]) {
b.push(encodeURIComponent(p) + '=' + encodeURIComponent(a[p]))
}
return b.join('&')
};
var paramPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvxXa98E1uWXnBzXkS2yHUfnBM6n3PCwLdfIox03T91joBvjtoDqiQ5x3tTOfpHs3LtiqMMEafls6b0YWtgB1dse1W5m+FpeusVkCOkQxB4SZDH6tuerIknnmB/Hsq5wgEkIvO5Pff9biig6AyoAkdWpSek/1/B7zYIepYY0lxKQIDAQAB";
var encrypt = new JSEncrypt();
encrypt.setPublicKey(paramPublicKey);
function get_headers (data) {
var c = Date.parse(new Date());
var d = getUuid();
var e = JSON.stringify(sort_ASCII(dataTojson(data || '{}')));
data = encrypt.encryptUnicodeLong(e);
var f = MD5(e + d + c);
var all={};
all['headers']={}
all['headers']['timestamp']=c
all['headers']['requestId']=d
all['headers']['sign']=f
all['data']=data
return all
}
var data= 'page=3&limit=20'
console.log(get_headers(data))