ZBLOG

javascript Worker函数传入的是blob URL,如何hook Worker运行代码中的fetch函数,我不能直接修改Worker运行的代码

要 Hook Worker 中运行的 fetch 函数(且无法直接修改 Worker 内部代码),可以通过以下步骤实现。核心思路是 拦截 Blob URL 创建的 Worker,并在 Worker 脚本被解析前注入 Hook 逻辑。


解决方案

1. 拦截 Blob URL 并修改 Worker 脚本

由于 Worker 通过 Blob URL 加载,我们需要劫持原始的 Worker 构造函数,在脚本执行前插入 Hook 代码:

  1. // 保存原始的 Worker 构造函数
  2. const OriginalWorker = window.Worker;
  3. // 覆写 Worker 构造函数
  4. window.Worker = function(blobUrl) {
  5. // 如果是目标 Blob URL,则拦截并修改代码
  6. if (blobUrl instanceof URL || typeof blobUrl === 'string') {
  7. // Step1: 通过 fetch 获取原始脚本内容
  8. fetch(blobUrl)
  9. .then(response => response.text())
  10. .then(scriptText => {
  11. // Step2: 在原始脚本中注入 Hook
  12. const hookedScript = `
  13. // Hook fetch
  14. const originalFetch = window.fetch;
  15. window.fetch = function(...args) {
  16. console.log('Intercepted fetch call:', args);
  17. // TODO: 在这里添加你的自定义逻辑
  18. return originalFetch.apply(this, args);
  19. };
  20. // Original script below
  21. ${scriptText}
  22. `;
  23. // Step3: 创建新的 Blob URL
  24. const blob = new Blob([hookedScript], { type: 'application/javascript' });
  25. const hookedBlobUrl = URL.createObjectURL(blob);
  26. // Step4: 用新 URL 初始化原始 Worker
  27. return new OriginalWorker(hookedBlobUrl);
  28. });
  29. } else {
  30. // Fallback to original Worker for non-Blob URLs
  31. return new OriginalWorker(blobUrl);
  32. }
  33. };

2. Proxy + Override (备选方案)

如果无法拦截 Blob URL,但可以控制 Worker 创建后的通信,可通过 postMessage/onmessage动态注入 Hook:

  1. // Main thread code (假设你能控制主线程)
  2. const worker = new Worker(blobUrl);
  3. worker.postMessage({
  4. action: 'injectHook',
  5. code: `
  6. const originalFetch = window.fetch;
  7. window.fetch = function(...args) {
  8. console.log('Hooked fetch:', args);
  9. return originalFetch.apply(this, args);
  10. };
  11. `
  12. });
  13. // Worker.js (需预先留出协议接口)
  14. self.onmessage = (e) => {
  15. if (e.data.action === 'injectHook') {
  16. eval(e.data.code);
  17. }
  18. };

关键点说明

  1. Blob URL劫持

    • Works only if you can intercept the creation of the Worker.
    • May fail if the browser enforces strict CSP policies.
  2. 动态注入的局限性

    • Requires cooperation from the Worker’s original code (must listen to messages).
  3. Service Workers

    • If the target is a ServiceWorker, use similar interception via navigator.serviceWorker.register().
  4. 浏览器扩展环境

    • Chrome extensions can use chrome.debugger API to attach and modify runtime scripts.

适用场景

  • 调试/分析第三方Worker:监控其网络请求。
  • 安全测试:验证是否存在敏感数据泄漏。
  • 生产环境滥用:可能违反目标网站的安全策略。

如果需要更具体的实现帮助,可以提供目标代码的结构细节!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?