【JS逆向百例-3】某数据平台逆向分析


声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,相关网址和数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请联系删除!
 
 

前言

  • 网址:b64dcf187434c4c93c81b501c5da5ca7
  • 加密接口:ba4764a717a194b5659a26befcb4dd75
     
     

抓包分析

老套路第一步,F12打开开发者工具进行抓包

在这里插入图片描述
随便点一个进行发包,然后找可能带有数据的接口
在这里插入图片描述
可以看到,左边那个接口带有明显的东西limit=50&page=1,这个一看就符合咱们要的翻页数据,再看看右边,可以明显发现数据加密了,而请求头、参数啥的也没有任何加密,所以本次的逆向目标也是只有一个:解密响应数据
 
 

逆向分析

上次解密数据用的是关键字搜索,这次我们来用hook试试,往控制台注入下面的脚本

(function() {
    var _parse = JSON.parse;
    JSON.parse = function(ps) {
        console.log("Hook JSON.parse ——> ", ps);
        debugger;
        return _parse(ps);  
    }
})();

注入完后,点击一个按钮进行发包,可以看到成功断住
在这里插入图片描述
这时候我们只要观察上面参数的变化,一直执行直到看到我们想要的参数为止
在这里插入图片描述
到了这里我们打印可以看到,这正是我们想要的数据,这时候我们跟栈看看用的什么解密方法
在这里插入图片描述
打印decode(data2, response)可以看到得到的数据是我们想要的,接下来我们进入到这个方法中看看
在这里插入图片描述
可以看到,后面又进入到一个decrypt方法中,我们先来分析一下传递的参数

// response.config.url.split("?") : ['/api/rank/sku/live/popular', 'limit=50&page=1&sort_field=sales&sort=0']
// 第一个传参url2[0] 也就是请求的接口不带参数那块
// 第二个传参data2 这是需要解密的密文,直接传就可以了

再进入decrypt方法中,看看如何解密的
在这里插入图片描述
看起来像是标准的AES算法,我们扣下来放在node中进行调试就可以了,这里没有涉及什么补环境和一些坑,所以扣代码这块就不再赘述啦

 
 

Js部分实现

var cryptoJs = require('crypto-js')

function encode(str) {
    const encode22 = encodeURI(str);
    return btoa(encode22)
}

const decrypt = function (url2, text2) {
    const str = encode(url2).repeat(3), orgKey = str.slice(0, 16), orgIv = str.slice(12, 28),
        ikey = cryptoJs.enc.Utf8.parse(orgKey), iiv = cryptoJs.enc.Utf8.parse(orgIv);
    return cryptoJs.AES.decrypt(text2, ikey, {
        iv: iiv, mode: cryptoJs.mode.CBC, padding: cryptoJs.pad.Pkcs7
    }).toString(cryptoJs.enc.Utf8)
};


e = '密文'


decrypt('/api/rank/sku/pmt', e)


 
 

Py部分实现


import requests
import json
import execjs

with open('2.js', 'r', encoding='utf-8') as f:
    js_code = execjs.compile(f.read())

headers = {
}
url = ""
params = {
    "limit": "50",
    "page": "1",
    "sort_field": "sales",
    "sort": "0"
}
data = {
    "date_code": 20240504,
    "period": 1,
    "m_lv1": 0
}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, params=params, data=data).json()

text = js_code.call('get_data', response['data'])

print(text)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值