目标:请求参数signcode,请求结果data。
网址:aHR0cDovL3d3dy5jY2hpbmRleC5jb20vSG9tZS9pbmRleA==
查看载荷
查看响应数据
点击xhr,发现所有请求参数都是一个signCode,还是加密后的结果,对应结果中数据data也是一样,不同的数据加密后的字符串长度不同。(可以大胆的猜测一下对称加密,常见的对称加密aes,des等,sm4也是一个对称加密算法,说不定就是其中一个呢)
断点调试
要先过下面这个
编写js函数
控制台输出:
数据对应一致
解密响应数据的函数
主函数关键代码:
运行结果:
补充:
hook XMLHttpRequest,(function hookXMLHttpRequest() {// 备份一下原始open和send方法const realOpen = XMLHttpRequest.prototype.open;const realSend = XMLHttpRequest.prototype.send;// 重写open方法XMLHttpRequest.prototype.open = function (method, url) {console.log('请求地址是:', url);console.log('请求方法类型:', method);// 检查 URL 中是否包含 keyif (url.includes('radio.key')) {// debugger; // 触发断点console.log('URL 包含 key,断点触发');}// 调用原始的open方法realOpen.apply(this, arguments);};// 重写send方法XMLHttpRequest.prototype.send = function (data) {// 发送请求体参数console.log('请求体:', data);// 调用原始的send方法,并传入所有参数realSend.apply(this, arguments);// 监听请求状态变化this.addEventListener('readystatechange', () => {if (this.readyState === 4) {// 请求完成后执行的代码console.log('获取返回的全部数据:', this.responseText);}});};
})();
python版
import requests
import json
import time
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import binascii# 加密函数
def g(e):e = str(e)key = b'comkmv7wfcbu1kjk'cipher = AES.new(key, AES.MODE_ECB)ciphertext = cipher.encrypt(pad(e.encode('utf-8'), AES.block_size))return binascii.hexlify(ciphertext).decode('utf-8')# 解密函数
def y(e):key = b'comkmv7wfcbu1kjk'ciphertext = binascii.unhexlify(e)cipher = AES.new(key, AES.MODE_ECB)decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)return decrypted.decode('utf-8')