上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

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

[复制链接]
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 363 天

    [LV.8]以坛为家I

    7

    主题

    30

    回帖

    246

    积分

    高级工程师

    积分
    246

    挑战者 lv2

    发表于 2023-12-13 14:06:56 | 显示全部楼层 | 阅读模式

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

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

    如果 orgin_onmessage_setter 报错,可能是浏览器不对,火狐的WebSocket好像不叫WebSocket这个名字,也有可能被别的脚本提前hook了(这个我就遇到了)

    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[0] !== 'message' || !arguments[1]) return orgin_addEventListener.apply(this, arguments)
            webSocket_client._onmessage = arguments[1]
            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
    }
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-12-13 15:28:37 | 显示全部楼层
    什么网站可以去验证测试呢?

    另外建议发到悬赏区,看见群里的消息才知道哥哥这是什么问题。。。。建议单独的描述清楚,不然有点无头苍蝇,不知道哥哥是提的什么问题
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-12-13 16:44:05 | 显示全部楼层

    因为i不知道卡在那里我就从新写了一下
    用的测例是

    <!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>

    代码

    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[0].length > 0) {
          args[0] = args[0] + "【被劫持提交了】";
        }
        return originSend.call(this, ...args);
      };
      ws.onmessage = function (evt) {
        const proxyEvent = new Proxy(evt, {
          get: function (target, prop) {
            const data = target[prop];
            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/

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 363 天

    [LV.8]以坛为家I

    7

    主题

    30

    回帖

    246

    积分

    高级工程师

    积分
    246

    挑战者 lv2

    发表于 2023-12-14 13:03:08 | 显示全部楼层
    李恒道 发表于 2023-12-13 16:44
    [md]因为i不知道卡在那里我就从新写了一下
    用的测例是
    ```html

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

    使用道具 举报

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 363 天

    [LV.8]以坛为家I

    7

    主题

    30

    回帖

    246

    积分

    高级工程师

    积分
    246

    挑战者 lv2

    发表于 2023-12-14 13:13:50 | 显示全部楼层
    王一之 发表于 2023-12-13 15:28
    什么网站可以去验证测试呢?

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

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

    原来哥哥是记录一下
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-29 15:06
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    9

    主题

    81

    回帖

    88

    积分

    初级工程师

    积分
    88
    发表于 2023-12-18 10:19:29 | 显示全部楼层
    李恒道 发表于 2023-12-13 16:44
    [md]因为i不知道卡在那里我就从新写了一下
    用的测例是
    ```html

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-12-19 23:34:27 | 显示全部楼层
    szzxc 发表于 2023-12-18 10:19
    能捕捉 post 和返回的内容的吗

    post是基于xhr和fetch,论坛有教程的
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表