yhzc2023 发表于 2023-12-13 14:06:56

hook webSocket 可以修改发送数据和返回数据

> 本帖最后由 yhzc2023 于 2023-12-14 13:50 编辑

> 本帖最后由 yhzc2023 于 2023-12-13 14:09 编辑

如果 orgin_onmessage_setter报错,可能是浏览器不对,火狐的WebSocket好像不叫WebSocket这个名字,也有可能被别的脚本提前hook了(这个我就遇到了)
```js
const orgin_webSocket = window.WebSocket
const orgin_onmessage_setter = Object.getOwnPropertyDescriptor(orgin_webSocket.prototype, "onmessage").set
window.WebSocket = function () {
    const webSocket_client = new orgin_webSocket(...arguments)
    const orgin_send = webSocket_client.send
    const orgin_close = webSocket_client.close
    webSocket_client.send = function (data) {
      // 修改data 修改发送的数据
      orgin_send.call(this, data)
    }
    const message_handler = (event) => {
      const data = event.data
      Object.defineProperty(event, "data", {
            get: function () {
                // 修改data 修改接收的数据
                return data
            }
      })
      return webSocket_client._onmessage.call(this, event)
    }
    const orgin_addEventListener = webSocket_client.addEventListener
    webSocket_client.addEventListener = function () {
      if (arguments !== 'message' || !arguments) return orgin_addEventListener.apply(this, arguments)
      webSocket_client._onmessage = arguments
      orgin_onmessage_setter.call(webSocket_client, message_handler)
    }
    Object.defineProperty(webSocket_client, 'onmessage', {
      set: function (caller) {
            webSocket_client._onmessage = caller
            orgin_onmessage_setter.call(webSocket_client, message_handler)
      }
    })
    webSocket_client.close = function () {
      orgin_close.apply(this, arguments)
    }
    return webSocket_client
}
```

王一之 发表于 2023-12-13 15:28:37

什么网站可以去验证测试呢?

另外建议发到悬赏区,看见群里的消息才知道哥哥这是什么问题。。。。建议单独的描述清楚,不然有点无头苍蝇,不知道哥哥是提的什么问题

李恒道 发表于 2023-12-13 16:44:05

因为i不知道卡在那里我就从新写了一下
用的测例是
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <button class="btn">Connect</button>
</head>
<body></body>
<script>
    document.querySelector(".btn").addEventListener("click", () => {
      let ws = new WebSocket("ws://127.0.0.1:8080/socketTest");
      ws.onopen = function (evt) {
      console.log("Connection open ...");
      ws.send("Hello WebSockets!");
      };

      ws.onmessage = function (evt) {
      console.log("Received Message: " + evt.data);
      };
    });
</script>
</html>
```
代码
```js
const originSocket = window.WebSocket;
window.WebSocket = function (...args) {
let callback = undefined;
const ws = new originSocket(...args);
const originSend = ws.send;
ws.send = function (...args) {
    if (args.length > 0) {
      args = args + "【被劫持提交了】";
    }
    return originSend.call(this, ...args);
};
ws.onmessage = function (evt) {
    const proxyEvent = new Proxy(evt, {
      get: function (target, prop) {
      const data = target;
      if (prop === "data") {
          return data + " 【被劫持返回了】";
      }
      return data;
      },
    });
    callback && callback(proxyEvent);
};
Object.defineProperty(ws, "onmessage", {
    get: () => {
      return callback;
    },
    set: (setCall) => {
      callback = setCall;
    },
});
return ws;
};
```
文章https://learn.scriptcat.org/docs/middle/WebSocket%E6%8F%90%E4%BA%A4%E8%BF%94%E5%9B%9E%E5%8A%AB%E6%8C%81/

yhzc2023 发表于 2023-12-14 13:03:08

李恒道 发表于 2023-12-13 16:44
因为i不知道卡在那里我就从新写了一下
用的测例是
```html


我上面的代码,把所有log删掉,如果不是油猴脚本的话处理一下unsafewindow,也是可以正常用的。哥哥这个确实也简洁了不少

yhzc2023 发表于 2023-12-14 13:13:50

王一之 发表于 2023-12-13 15:28
什么网站可以去验证测试呢?

另外建议发到悬赏区,看见群里的消息才知道哥哥这是什么问题。。。。建议单独 ...

这个代码是可以使用的,看了下百度没什么关于websocket例子,就发出来了。至于bug是薛定谔的bug。至于验证网站,我当时测试的网站有反爬机制,要先做处理,就没发出来。

李恒道 发表于 2023-12-14 15:01:16

yhzc2023 发表于 2023-12-14 13:03
我上面的代码,把所有log删掉,如果不是油猴脚本的话处理一下unsafewindow,也是可以正常用的。哥哥这个 ...

原来哥哥是记录一下{:4_94:}

szzxc 发表于 2023-12-18 10:19:29

李恒道 发表于 2023-12-13 16:44
因为i不知道卡在那里我就从新写了一下
用的测例是
```html


能捕捉 post 和返回的内容的吗

李恒道 发表于 2023-12-19 23:34:27

szzxc 发表于 2023-12-18 10:19
能捕捉 post 和返回的内容的吗

post是基于xhr和fetch,论坛有教程的
页: [1]
查看完整版本: hook webSocket 可以修改发送数据和返回数据