逆向案例二十六——新问题加密js代码是由eval函数运行的,中国观鸟记录中心参数逆向

网址:中国观鸟记录中心 - 记录查询

抓包分析,请求头有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))

猜你喜欢

转载自blog.csdn.net/m0_57265868/article/details/140550140