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