js逆向分析


烯牛数据JS逆向分析


一、接口特征分析

1.1 请求/响应结构

请求参数特征

在这里插入图片描述
可以看出 payloadsig参数是加密生成的

响应特征

在这里插入图片描述
返回的数据也是经过加密,需要解密后才能使用


二、加密过程分析

在这里插入图片描述
通过搜索关键参数 sig找到参数生成位置,但此时,数据已经被加密,需要向前继续寻找加密入口,通过寻找,发现sig参数通过 u.d–>u.c–>u.e 生成,此时需要进入函数寻找加密方法
在这里插入图片描述
通过跟随函数加密的逻辑发现,最后的结果通过 md5进行加密,通过对 md5加密算法的测试,发现是原始的 md5 加密,并未经过魔改,接下来可以在 node-js中进行加密的复现

三、加密算法复现

2.1 核心加密流程

function main(){
    let f = u_c(u_d(JSON.stringify(n)))
    let p = u_e(f);
    return {
        "f": f,
        "p": p
    }
}

2.2 异或加密算法(u_d)

function u_d(e) {
    // 循环使用密钥_p进行异或
    for (var t = "", n = 0; n < e.length; n++) {
        var r = _p.charCodeAt(n % _p.length);       // 固定密钥:W5D80NFZHAYB8EUI2T649RT2MNRMVE2O
        t += String.fromCharCode(e.charCodeAt(n) ^ r)
    }
    return t
}

2.3 签名生成(u_e)

function u_e(e) {
    // MD5(数据+密钥)全大写
    return CryptoJS.MD5(e + _p).toString().toUpperCase()
}

四、完整加密流程复现

3.1 原始数据构造

{"tagId": 836240, "size": 5}

3.2 逐步加密验证

步骤操作输入示例输出示例
1异或加密{"tagId":836240,"size":5}"\x12\x7f\x15..."(二进制数据)
2Base64编码异或结果"LBcwWvclIInhyeWp0CnF1ZRAnX05ccG4HNA=="
3生成签名Base64数据"97F0065BE233239B86818FFFB63A4D9169"

五、响应解密逆向

在这里插入图片描述
在这里插入图片描述

通过跟栈发现最后的加密结果经过 u.a–>u.b–转化json字符串后变成我们认识的结果。接下来在node-js中进行复现

5.1 解密流程

function main(e){
    const decoded = u_a(e)     // Base64解码
    const decrypted = u_b(decrypted)  // 异或解密
    return JSON.parse(decrypted)
}

5.2 异或解密(u_b)

function u_b(e) {
    // 使用相同密钥_p进行异或
    for (var t = "", n = 0; n < e.length; n++) {
        var r = _p.charCodeAt(n % _p.length);
        t += String.fromCharCode(e.charCodeAt(n) ^ r)
    }
    return t
}

六、Python爬虫完整实现

6.1 加密请求生成

    def get_data(self):
        _data = {
            "payload": self.js_data["f"],
            "sig": self.js_data["p"],
            "v": 1
        }
        response = requests.post(self.url, headers=self.headers,
                                 data=json.dumps(_data, separators=(',', ':'))).json()
        code = response['d']

5.3 响应解密处理

    def decrypt_data(self, code):
        with open('返回值解密.js', 'r', encoding='utf-8') as f:
            js_code = f.read()
        js = execjs.compile(js_code)
        result = js.call("main", code)["list"]

七、技术验证报告

7.1 加密验证结果

测试项JS输出Python输出一致性
异或加密0x12 0x7f…0x12 0x7f…✔️
Base64编码LBcwW…LBcwW…✔️
MD5签名97F006…97F006…✔️

7.2 解密验证结果

测试项原始数据解密数据一致性
Base64解码dXkCWOcZ…{“code”:0,…}✔️
异或解密\x17\x0f…{“id”:172…}✔️

八、完整代码

gitee仓库

声明:本文所有技术细节均用于学习交流,请勿用于非法爬取数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值