javascript - 从 Chrome 扩展中 Hook Websocket

标签 javascript google-chrome-extension websocket hook addeventlistener

我正在尝试创建一个可以 Hook 特定页面的 WebSocket 的 Chrome 扩展内容脚本。当前,当访问页面时,内容脚本会向页面中注入(inject)另一个脚本,如下所示:

    var s = document.createElement('script');
    s.src = chrome.extension.getURL('Script.js');
    s.onload = function () {
        this.remove();
    };
    (document.head || document.documentElement).appendChild(s);

然后我的 Script.js 包含 websockets 的 addEventListener。
Window.WebSocket.addEventListener("message",function(event){
console.log("Websocket read");
})

但是当我运行扩展时,我收到一个错误,无法读取未定义的属性 addEventListener。所以我不完全确定这是否是正确的方法。我已经验证脚本确实被注入(inject)了页面,但是我将如何在页面的原始 onmessage WebSocket 之上覆盖或创建自己的监听器。可能吗?

最佳答案

WebSocket是一类。 addEventListener函数仅在类的实例中可用。因此,您必须找到网页创建的变量并将监听器添加到该变量中。例如:

var mySocket = new WebSocket("wss://127.0.0.1:8080");
你会做这样的事情:
mySocket.addEventListener("message", (e) => console.log(e));
但是,这将丢失所有初始消息,这取决于您能否访问变量,这在所有情况下都可能无法访问。
相反,你可以做的是用你自己的类覆盖这个类,这样当他们创建一个 WebSocket例如,它实际上是你的课。
这方面的一个例子是:
class MyWebSocket extends WebSocket
{
    __constructor()
    {
        super(...arguments);
    }

    addEventListener(name, callback)
    {
        // call the original event listener
        super.addEventListener(name, function()
        {
            console.log("Im sneakily listening in here", arguments);

            // call their callback
            callback(...arguments);
        });
    }
}

// Override the real web socket with your version
window.WebSocket = MyWebSocket;
请记住,上面的代码是伪代码且未经测试。
如果您只想查看套接字数据。您可以打开 chrome 开发工具,单击“ws”过滤器。然后单击列出的 Web 套接字并查看正在传输的原始数据。
这是一个应该在您的上下文脚本中工作的工作示例。
while(document == null || document.head == null);

var s = document.createElement("script");

function hookWebSocket()
{
    window.RealWebSocket = window.WebSocket;

    window.WebSocket = function()
    {
        var socket = new window.RealWebSocket(...arguments);

        socket.addEventListener("message", (e) =>
        {
            console.log("The message is: ", e);
        });

        return socket;
    }
}

s.innerHTML = `
    ${hookWebSocket.toString()}

    hookWebSocket();
`;

document.head.prepend(s);

关于javascript - 从 Chrome 扩展中 Hook Websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52650512/

相关文章:

node.js - rxjs/webSocket - 到 'ws://localhost:3000/' 的 WebSocket 连接失败 : Connection closed before receiving a handshake response

android - 优步如何向司机发送新的乘车请求?

javascript - 按钮 onClick 目标正在更改

javascript - 如何使用 jQuery 将多个 GET 放入一个数组中

javascript - 如何强制加载安装 "lazy load"的网页的图像而不滚动?

javascript - 如何使用 Google Chrome 扩展程序为另一个域设置 cookie

javascript - Websockets onMessage 函数 : What happens if the code block within onMessage takes longer to run than interval between two messages?

javascript - 如何访问表格单元格中的元素

javascript - jQuery 激活器不适用于多个 DIV

javascript - 让用户在浏览器扩展中记录快捷方式