李恒道 发表于 2022-6-10 23:30:01

[油猴脚本开发指南]油猴的本质以及document的处理(三)

# M函数
我们继续研究M函数
```javascript
t || (t = he({
instance: n,
is_open: !1
}),
b(["write", "writeln", "open", "close"], o=>{
t = n,
n = function() {
    let r = !1;
    -1 != O(["write", "writeln", "open"], o) ? t.is_open ? r = !0 : t.is_open = !0 : "close" === o && (t.is_open = !1),
    !r && t.is_open && ve.send("document.write");
    const s = Ee.documentElement
      , a = _(t, n, arguments);
    if (!r && t.is_open)
      return s !== Ee.documentElement && (t.instance !== n && (t = null,
      M(Ee)),
      b(e.write_listeners, e=>{
            e(Ee)
      }
      )),
      a
}
}
))
```
首先慢慢看,查看是否有t
没有则合并出来一个t,he是合并对象函数,n是document,is_opne为固定属性false
可知t是一个对象
```
t || (t = he({
    instance: n,
    is_open: !1
})
```
![图片.png](data/attachment/forum/202206/10/232656qx6p43fsw7xbqcbz.png)
然后往下看
![图片.png](data/attachment/forum/202206/10/232732p6nn6l8z8c55apnm.png)
可以看到t大概是一个forEach函数
对write writeln等函数进行处理
n是document,而t是合并对象
首先我们把document的函数赋值给对应的t对象上
![图片.png](data/attachment/forum/202206/10/232824j9lpus7xsz0pllep.png)
然后将document函数上的对应属性进行劫持
![图片.png](data/attachment/forum/202206/10/232843gqziej5jxe9ugzgm.png)
进行一定的处理
因为我们这次目标主要是document,所以就不分析这部分代码了
大概了解M函数的作用即可
# M函数作用
对"write", "writeln", "open", "close"四个属性进行劫持处理
# 结语
太长
继续撒花~
页: [1]
查看完整版本: [油猴脚本开发指南]油猴的本质以及document的处理(三)