烯牛数据JS逆向分析
一、接口特征分析
1.1 请求/响应结构
请求参数特征
可以看出 payload和sig参数是加密生成的
响应特征
返回的数据也是经过加密,需要解密后才能使用
二、加密过程分析
通过搜索关键参数 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..." (二进制数据) |
2 | Base64编码 | 异或结果 | "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…} | ✔️ |
八、完整代码
声明:本文所有技术细节均用于学习交流,请勿用于非法爬取数据。