关于某观鸟中心JS逆向分析

声明

本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文未经许可禁止转载,禁止任何形式的修改后进行二次传播,若有侵权,请联系作者删除!

逆向目标:aHR0cHM6Ly93d3cuYmlyZHJlcG9ydC5jbi9ob21lL2FjdGl2aXR5L3BhZ2UuaHRtbA==

小伙伴可以自行刷新网页,可以观察到Request Headers中有三个参数是变化的,Requestid、Sign、Timestamp。其中Requsetid和Timestamp是没太大关系的,对于后面结果影响不大

找到“发起程序”这个位置,点击点一个js文件

在f.send这个位置打上断点,然后点击第二页或者浏览器刷新。那么我们可以看到在c上,sign、requestid和timestamp已经有了,接下来就是进入跟栈

这里数据比较多,我们需要仔细观察这些数据,在b中出现了data字样

data中出现了两个值,一个page,一个limit,猜测是与我们需要的数据有关,那么我们接着往下看

在后面,发现l中的data已经被加密了,那么大概率加密函数就可能在这里,我们打上断点,观察k.beforeSend,这是一个函数

这里可以观察到最后面有我们想要的值,那么这里就是我们想要找的加密函数

打上断点以后,我们可以观察这些值,如果发现打上断点没有出现值的情况,那么就在上面一步的call前面打上断点,重新刷新页面,单步执行,进入函数体内部。在这里,我们可以发现timestamp是c赋值,requestId是d赋值,sign是f赋值,那么我们可以扣下相应的代码,不过友情提示,先不着急扣,看仔细,这些代码需要进行一定的改写,读者可以自行修改!

const JSEncrypt = require('jsencrypt')
const CryptoJS = require("crypto-js");

//这里MD5加密可以导入CryptoJS这个包
function MD5(arg){
    return CryptoJS.MD5(arg).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
}

var paramPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvxXa98E1uWXnBzXkS2yHUfnBM6n3PCwLdfIox03T91joBvjtoDqiQ5x3tTOfpHs3LtiqMMEafls6b0YWtgB1dse1W5m+FpeusVkCOkQxB4SZDH6tuerIknnmB/Hsq5wgEkIvO5Pff9biig6AyoAkdWpSek/1/B7zYIepYY0lxKQIDAQAB";

var encrypt = new JSEncrypt();

encrypt.setPublicKey(paramPublicKey);
$.ajaxSetup({
    beforeSend: function(a, b) {
        var c = Date.parse(new Date());
        var d = getUuid();
        var e = JSON.stringify(sort_ASCII(dataTojson(b.data || '{}')));
        b.data = encrypt.encryptUnicodeLong(e);
        var f = MD5(e + d + c);
        a.setRequestHeader("timestamp", c);
        a.setRequestHeader('requestId', d);
        a.setRequestHeader('sign', f)
    }
});

同时,我们继续观察代码,发现这条语句b.data = encrypt.encryptUnicodeLong(e);点击进入,观察encrypt.encryptUnicodeLong()方法这段方法就是data的加密函数,我们将其扣下,与上面需要自行改写的代码一起运行,结果会发现data为false
那么我们在仔细观察一下代码,为什么会出现false?那么就是我们缺少了hex2b64()这个函数,那么我们点击进入这个函数

将上述代码扣下,再次运行,就会得到我们想要的结果
到这里,我们整个python文件请求体中的requestid,sign,timestamp,data值就解析完成了,那么接下来的就是关于返回值的解密操作,同样,我们打开发起程序这个位置在前面已经点击了前面两个,那么我们来看看第三个发起的请求程序可以看出这里是请求成功后返回的结果,我们打上断点在这里我们发现data就是返回后的数据,再次打上断点,我们运行后发现,这里的密文数据变成了明文数据那么这其中就有我们想要的解密方法,那么取消断点,刷新页面重新调试一下这里就进入parseData的方法中,我们可以看到在这里,数据依然还是明文,那么我们可以在可疑的地方打上断点,这里可以看到decryptData,我们可以在这里打上断点,进行调试。之后我们会进入到这个页面那么到这里,我们就完成了解密工作中最重要的一步,那么我们就需要一步步还原一下代码如图所示,我们需要将其中混淆的代码进行还原。不过不需要将整个方法全部扣除,只要扣里面的方法体。最后,就是代码运行截图至此,我们整个逆向工作就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值