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

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

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

    [LV.7]常住居民III

    620

    主题

    5084

    回帖

    5958

    积分

    管理员

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

    积分
    5958

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

    发表于 2022-6-10 23:24:19 | 显示全部楼层 | 阅读模式

    开篇

    我们继续看N、M、I函数

    N函数

    我们先看一下代码

    e=>{
        e.__evaluate || (U(e, he({
            __evaluate: he({
                value: e.evaluate,
                enumerable: !1,
                configurable: !1
            })
        })),
        e.evaluate = function(e, t, o, r, s) {
            let a;
            if (n && k("env: document.evaluate " + e),
            t || (t = this),
            "undefined" != typeof XPathResult) {
                let i = e
                  , c = null;
                try {
                    a = this.__evaluate(i, t, o, r, s)
                } catch (e) {
                    c = e
                }
                let l, d = !1;
                try {
                    d = d || !!a.snapshotLength
                } catch (e) {}
                try {
                    d = d || !!a.singleNodeValue
                } catch (e) {}
                if (d || "." == (l = W(e, 0, 1)) || h(t))
                    n && k("env: queried document for " + i);
                else {
                    n && k("env: query added elem for " + i),
                    i = ("/" == l ? "." : "./") + e;
                    try {
                        a = this.__evaluate(i, t, o, r, s)
                    } catch (e) {}
                }
                if (n && k("env: query returned ", a, c),
                !d && c)
                    throw c
            } else
                n && k("env: XPathResult == undefined, but selectNodes via ", e),
                a = t.selectNodes(e);
            return a
        }
        ,
        Ue.push(()=>{
            e.evaluate = e.__evaluate
        }
        ))
    }

    一行一行读

    e.__evaluate || (U(e, he({
        __evaluate: he({
            value: e.evaluate,
            enumerable: !1,
            configurable: !1
        })
    }))

    首先判断是否存在__evaluate
    如果不存在则执行后面的代码
    首先定义一个对象

    {
        __evaluate: he({
            value: e.evaluate,
            enumerable: !1,
            configurable: !1
        })
    }

    我们往he传入了一个对象
    我们看一下he是什么

    e=>s({
            __proto__: null
        }, e)

    s函数是一个assign函数

    图片.png
    可以看出he是将属性合并到一个空对象上

    he({
        __evaluate: he({
            value: e.evaluate,
            enumerable: !1,
            configurable: !1
        })
    })

    将我们刚才合成的对象放到了evaluate对象上
    然后调用U函数
    图片.png
    U函数是一个defineProperties函数
    可以知道我们做了往document定义了一个
    evaluate属性
    其实际值是evaluate
    然后对document.evaluate进行了赋值
    并在其内部调用了a = this.evaluate(i, t, o, r, s)
    也就是我们之前赋值的属性
    这里可以看到了做了一定的处理
    具体我们就不提了
    Ue.push(()=>{
    e.evaluate = e.
    evaluate
    }
    然后调用了Ue函数
    我们看看Ue函数

    图片.png
    我们看一下Ue的push函数
    图片.png
    大致可以看到生成一个id然后往objs上进行赋值,并设置上属性等

    N函数总结

    我们对evlaute进行了定义以及劫持处理

    结语

    太长了
    他妈的再撒一次花

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

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

    发表回复

    本版积分规则

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