一、引言:绕过解密的绝妙思路
面对加密的API请求,传统做法是逆向加密算法。但有一个更巧妙的思路:不破解加密,而是劫持加密过程本身。
通过在加密前拦截请求参数,在解密后拦截响应数据,我们就能像在快递公司的分拣中心安装监控一样,看到每个包裹的原始内容。
二、三步实现请求透明化
2.1 找到并修改目标JS文件
假设目标网站使用api.js发送请求,其中包含加密方法:
// 原始api.js片段
const api = {
getEncrypt: function(url, params) {
const encrypted = encrypt(params); // 加密参数
return this._request('GET', url, encrypted);
},
postEncrypt: function(url, data) {
const encrypted = encrypt(data);
return this._request('POST', url, encrypted);
}
};
我们在浏览器Override中修改此文件,在末尾添加:
// 在api.js中对api对象,使用vue2监听数组更新的同款原理,进行监听
/**
* 监控对象中的方法,在调用时打印请求和响应信息
* @param {Object} obj - 要监控的对象
* @param {string[]} methodNames - 要监控的方法名数组
*/
function monitorMethods(obj, methodNames) {
methodNames.forEach(name => {
const original = obj[name];
if (typeof original !== 'function') {
console.warn(`监控失败:${name} 不是一个函数`);
return;
}
// 重写方法
obj[name] = function(...args) {
const requestUrl = args[0];
const result = original.apply(this, args);
// 如果原始方法返回Promise,则处理then和catch
if (result instanceof Promise) {
return result
.then(data => {
// 打印请求和响应信息
console.group(`URL【${name}】`, requestUrl);
for (let i = 1; i < args.length; i++) {
console.info(`请求参数${i}`, args[i]);
}
// 假设响应数据格式为 { data: { Result: any } }
console.info(`响应结果`, data?.data?.Result);
console.info(`源响应结果`, data);
console.groupEnd();
return data;
})
.catch(err => {
console.error(`${name} 失败:`, err);
// 重新抛出错误,保持Promise链的原始行为
throw err;
});
} else {
// 如果原始方法返回非Promise,直接打印结果
console.info(`${name} 返回:`, result);
return result;
}
};
// 可选:将原始方法保存在一个属性上,以便需要时可以恢复
obj[name]._original = original;
});
}
// 使用示例
// monitorMethods(api, ['get', 'post', 'putEncrypt', 'getEncrypt', 'postEncrypt']);
2.2 保存到插件目录
将修改后的文件保存为api-modified.js,放入插件目录:
2.3 配置插件重定向
// manifest.json
{
"manifest_version": 3,
"name": "请求透明化插件",
"version": "1.0",
"permissions": ["declarativeNetRequest"],
"host_permissions": ["*://*.target.com/*"],
"background": {
"service_worker": "background.js"
},
"web_accessible_resources": [{
"resources": ["overrides/*"],
"matches": ["
<all_urls>"]
}]
}
// background.js
chrome.declarativeNetRequest.updateDynamicRules({
addRules: [{
id: 1,
priority: 1,
action: {
type: 'redirect',
redirect: {
extensionPath: '/overrides/api-modified.js',
// 或者
url: chrome.runtime.getURL('/overrides/api-modified.js')
}
},
condition: {
urlFilter: targetUrl,
resourceTypes: ['script']
}
}]
});
三、实际效果
插件启用后,每次加密请求都会在控制台显示:
🔍 postEncrypt 请求
URL: https://api.target.com/submit
原始参数: {user: "张三", amount: 1000}
📦 postEncrypt 响应
URL: https://api.target.com/submit
响应数据: {code: 200, msg: "成功", data: {...}}
四、总结
这种方法的关键优势:
- 零解密成本:无需分析加密算法
- 实时透明:所有请求响应一目了然
- 非侵入性:不影响网站正常功能
缺点是:
非一次配置:不是永久生效,当网页发版后可能需要重复覆写
通过JS文件重定向,我们绕过了复杂的加密逆向,直接拿到了最核心的数据。当你需要调试加密接口时,这是一个简单高效的解决方案。
发表回复