Chrome插件黑魔法:JS重定向让加密请求一览无余

一、引言:绕过解密的绝妙思路

面对加密的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: {...}}

四、总结

这种方法的关键优势:

  1. 零解密成本:无需分析加密算法
  2. 实时透明:所有请求响应一目了然
  3. 非侵入性:不影响网站正常功能

缺点是:

非一次配置:不是永久生效,当网页发版后可能需要重复覆写

通过JS文件重定向,我们绕过了复杂的加密逆向,直接拿到了最核心的数据。当你需要调试加密接口时,这是一个简单高效的解决方案。


已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注