ZBLOG

blob产生的代码,获取JS响应没有经过我的代理服务器,我如何对代码进行HOOK?

如果你的 Blob 生成的代码(例如动态创建的脚本或 Worker)中的 JavaScript 请求没有经过你的代理服务器,而你希望对这些请求进行 Hook,可以通过以下方法实现:


1. Hook fetch / XMLHttpRequest 全局对象

在 Blob 代码执行前,覆盖全局的 fetchXMLHttpRequest,确保所有请求都经过你的代理逻辑。

示例:Hook fetch

  1. // 保存原生 fetch
  2. const originalFetch = window.fetch;
  3. // 重写 fetch
  4. window.fetch = async function(...args) {
  5. const [input, init] = args;
  6. let url = typeof input === 'string' ? input : input.url;
  7. // 修改 URL,使其经过你的代理服务器
  8. if (!url.startsWith('http://your-proxy/')) {
  9. url = 'http://your-proxy/?target=' + encodeURIComponent(url);
  10. }
  11. console.log('Proxied request:', url);
  12. // 使用修改后的 URL 发起请求
  13. return originalFetch(url, init);
  14. };

示例:Hook XMLHttpRequest

  1. const originalXHR = window.XMLHttpRequest;
  2. window.XMLHttpRequest = class extends originalXHR {
  3. open(method, url, async, user, password) {
  4. // 修改 URL,使其经过代理服务器
  5. if (!url.startsWith('http://your-proxy/')) {
  6. url = 'http://your-proxy/?target=' + encodeURIComponent(url);
  7. }
  8. console.log('Proxied XHR request:', url);
  9. super.open(method, url, async, user, password);
  10. }
  11. };

2. Hook importScripts(适用于 Web Workers)

如果 Blob 代码运行在 Worker/Service Worker 中,可以劫持 importScripts()

  1. const originalImportScripts = self.importScripts;
  2. self.importScripts = function(...urls) {
  3. const proxiedUrls = urls.map(url =>
  4. 'http://your-proxy/?target=' + encodeURIComponent(url)
  5. );
  6. console.log('Proxied importScripts:', proxiedUrls);
  7. return originalImportScripts.apply(this, proxiedUrls);
  8. };

3. Monkey Patch <script> /动态加载的 JS

如果 Blob 是通过 <script><iframe>、或者动态插入的 JS (document.createElement('script'))执行的:

  1. // Hook document.createElement("script")
  2. const originalCreateElement = document.createElement;
  3. document.createElement = function(tagName) {
  4. if (tagName.toLowerCase() === 'script') {
  5. const scriptEl = originalCreateElement.call(this, tagName);
  6. // Hook src setter
  7. Object.defineProperty(scriptEl, 'src', {
  8. set: function(value) {
  9. const proxiedUrl = 'http://your-proxy/?target=' + encodeURIComponent(value);
  10. scriptEl.setAttribute('src', proxiedUrl); // Apply proxy URL
  11. },
  12. get: function() { return this.getAttribute('src'); }
  13. });
  14. return scriptEl;
  15. }
  16. return originalCreateElement.call(this, tagName);
  17. };

4. Service Worker:拦截所有网络请求

如果是浏览器环境,可以注册一个 Service Worker,拦截所有 HTTP(S) 请求:

  1. // sw.js (Service Worker)
  2. self.addEventListener('fetch', (event) => {
  3. const requestUrl = event.request.url;
  4. if (!requestUrl.includes('your-proxy')) { // Avoid infinite loop!
  5. const proxyUrl = new URL(requestUrl);
  6. // Modify the request to go through your proxy server:
  7. proxyUrl.hostname = 'your-proxy-server.com';
  8. event.respondWith(
  9. fetch(proxyUrl.toString())
  10. .catch(err => fetch(event.request)) // Fallback to direct fetch on error
  11. );
  12. console.log(`Intercepted and rerouted: ${requestUrl} ${proxyUrl}`);
  13. }
  14. });

然后注册它:

  1. navigator.serviceWorker.register('/sw.js');

5. Node.js / Puppeteer:直接替换全局对象

如果你使用 Puppeteer/Cypress/Selenium,可以在页面加载前注入脚本:

  1. await page.evaluateOnNewDocument(() => {
  2. window.fetch = new Proxy(window.fetch, { /* ... */ });
  3. window.XMLHttpRequest = new Proxy(window.XMLHttpRequest, { /* ... */ });
  4. });

总结

方法 适用场景
Hook fetch/XHR Blob/Worker/Dynamic Script
Hook importScripts() Web Workers
Monkey Patch <script> Dynamic JS Injection
Service Worker Interception Browser-wide Request Control
Puppeteer Injection Automated Testing

选择最适合你场景的方法进行拦截和代理! 🚀


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23187

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?