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

[油猴脚本开发指南]XHR劫持的第二种格式

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

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

    积分
    6078

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

    发表于 2021-11-1 09:45:39 | 显示全部楼层 | 阅读模式

    前言

    本文来自cxxjackie的代码,进行剖析

    来源为

    https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=1062&extra=&page=1

    开始

    其实之前proxy劫持还是相对复杂的,这节课根据cxxjackie的代码我们抄出来一个更简单的劫持方案。

    我们先输出一下xhr看看

    图片.png

    可以看到xhr的response和responseText等在原型链prototype上

    图片.png

    并且这两个属性都是只有get没有set,代表我们只可以获取他而不可以设置他的内容

    所以我们书写代码如下

        const xhrOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function() {
          const xhr = this;
          if (arguments[1] == 'xxxxx') {
    
            const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'response').get;
            Object.defineProperty(xhr, 'response', {
              get: () => {
                let result = getter.call(xhr);
                //这里可以修改result
                return result+'6648848';
              }
            });
          }
          return xhrOpen.apply(xhr, arguments);
        };

    首先我们对xhr的open函数进行劫持

    const xhrOpen = XMLHttpRequest.prototype.open;

    open是初始化xhr的内容,send是发送数据,这里我们在初始化内容的时候进行劫持。(我们其实可以在任何一个我们满足劫持需求的地方进行劫持)

    我们对地址进行判断,如果需要我们进行劫持,则进入劫持

            const xhr = this;
            const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'response').get;

    这里保存了this到xhr变量,方便接下来的操作

    然后获取response的操作符,如果你想要劫持responseText就需要改为responseText

    getOwnPropertyDescriptor获取的是一个对象上属性的相关的描述符

    可以拿到get set等等。

    图片.png

    获取到了get描述符我们就可以开始劫持了

            Object.defineProperty(xhr, 'response', {
              get: () => {
                let result = getter.call(xhr);
                //这里可以修改result
                return result+'6648848';
              }
            });

    这里对xhr的response属性做了一个defineProperty,当触发xhr.response的时候会访问对应的get,而get调用我们之前获取的getter函数,注意修改this指向,获取原返回内容,进行一定的修改,返回新的修改内容

    为什么设置到xhr上而不是xhr的原型链上

    因为这样可以形成对某一个xhr进行劫持,如果设置到原型链上相当于对所有的xhr进行了一次劫持,如果你的劫持get内有大量的回调代码会严重拖慢运行的速度

    为什么我没有对原型链的response进行劫持,却成功劫持了?

    因为查找response的属性的时候是按顺序查找的,首先在xhr上查找是否有response,然后在xhr的proto也就是构造函数的prototype上查找response属性,如果找不到就一层一层往上找,这里我们进行了劫持之后会直接在xhr自身找到,甚至不会找到xhr的proto上的response。

    代码

    那么我们最后回忆一下代码

        const xhrOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function() {
          const xhr = this;
          if (arguments[1] == url) {
            const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'response').get;
            Object.defineProperty(xhr, 'response', {
              get: () => {
                let result = getter.call(xhr);
                //这里可以修改result
                return result;
              }
            });
          }
          return xhrOpen.apply(xhr, arguments);
        };

    结语

    撒花

    已有1人评分好评 理由
    Kished + 1 很给力!

    查看全部评分 总评分:好评 +1 

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

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    294

    主题

    3906

    回帖

    3826

    积分

    管理员

    积分
    3826

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

    发表于 2021-11-1 11:05:39 | 显示全部楼层
    cxxjackie大佬快给你剖完了
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

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

    积分
    6078

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

    发表于 2021-11-1 11:18:47 | 显示全部楼层
    王一之 发表于 2021-11-1 11:05
    cxxjackie大佬快给你剖完了

    cxxjackie大佬天天被我骗代码
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:02
  • 签到天数: 711 天

    [LV.9]以坛为家II

    27

    主题

    733

    回帖

    7218

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    积分
    7218

    荣誉开发者油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2021-11-1 11:21:49 | 显示全部楼层
    加油加油,努力学习
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2021-11-1 11:37:32 | 显示全部楼层
    cxxjackie小弟快给你剖完了
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-14 00:00
  • 签到天数: 119 天

    [LV.6]常住居民II

    29

    主题

    599

    回帖

    536

    积分

    专家

    积分
    536

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2021-11-1 13:21:31 | 显示全部楼层
    此代码多一字显肥,少一字显瘦,妍姿妖艳,心旌神摇
    入驻爱发电 让这世界充满爱 https://afdian.net/a/vpannice
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

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

    积分
    6078

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

    发表于 2021-11-1 14:53:15 | 显示全部楼层
    cxxjackie 发表于 2021-11-1 11:37
    cxxjackie小弟快给你剖完了

    快!掏代码!我要剖!呜呜呜呜
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

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

    积分
    6078

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

    发表于 2021-11-1 16:14:37 | 显示全部楼层
    脚本体验师001 发表于 2021-11-1 13:21
    此代码多一字显肥,少一字显瘦,妍姿妖艳,心旌神摇

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

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

    使用道具 举报

  • TA的每日心情
    郁闷
    2023-11-22 09:19
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    2

    主题

    63

    回帖

    65

    积分

    初级工程师

    积分
    65

    新人报道油中2周年家财万贯

    发表于 2022-2-19 10:25:13 | 显示全部楼层
    控制台怎么输出xhr 的哥哥
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2023-11-22 09:19
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    2

    主题

    63

    回帖

    65

    积分

    初级工程师

    积分
    65

    新人报道油中2周年家财万贯

    发表于 2022-2-19 10:50:48 | 显示全部楼层
    劫持 感觉 好卡呀
    回复

    使用道具 举报

    发表回复

    本版积分规则

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