如何以无法检测到的方式读取Chrome扩展或Firefox附加组件中网页的WebSocket框架?

Inspect WebSockets frames from a Chrome Dev Tools extension提出了类似的问题,但是开发NPAPI插件不再有意义,因为它将很快被删除。

最佳答案

Rob W的方法还有另一种方法,可以完全掩盖与页面的任何交互(Chrome的)

即,您可以取出一些重型大炮并使用 chrome.debugger

请注意,使用它会阻止您打开有问题的页面的开发工具(或者更确切地说,因为只有一个调试器客户端可以连接,所以打开开发工具将使其停止工作)。由于以下原因,此功能得到了改进:可以附加多个调试器。

这是一个相当低级的API。您需要自己使用debugger protocol构建查询。另外,相应的事件不在1.1文档中,您需要查看development version

您应该能够接收到类似的WebSocket事件并检查它们的payloadData:

{"method":"Network.webSocketFrameSent","params":{"requestId":"3080.31","timestamp":18090.353684,"response":{"opcode":1,"mask":true,"payloadData":"Rock it with HTML5 WebSocket"}}}
{"method":"Network.webSocketFrameReceived","params":{"requestId":"3080.31","timestamp":18090.454617,"response":{"opcode":1,"mask":false,"payloadData":"Rock it with HTML5 WebSocket"}}}

This extension sample应该提供一个起点。

实际上,这是一个起点,假设tabId是您感兴趣的选项卡:
chrome.debugger.attach({tabId:tab.id}, "1.1", function() {
  chrome.debugger.sendCommand({tabId:tabId}, "Network.enable");
  chrome.debugger.onEvent.addListener(onEvent);
});

function onEvent(debuggeeId, message, params) {
  if (tabId != debuggeeId.tabId)
    return;

  if (message == "Network.webSocketFrameSent") {
    // do something with params.response.payloadData,
    //   it contains the data SENT
  } else if (message == "Network.webSocketFrameReceived") {
    // do something with params.response.payloadData,
    //   it contains the data RECEIVED
  }
}

我已经测试了这种方法(上面修改了链接的示例),并且可以正常工作。

关于javascript - 以无法检测的方式检查WebSocket框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31181651/

10-09 06:12
查看更多