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

[油猴脚本开发指南]实战秒杀istrust验证

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

    [LV.7]常住居民III

    637

    主题

    5194

    回帖

    6076

    积分

    管理员

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

    积分
    6076

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

    发表于 2022-2-12 18:28:05 | 显示全部楼层 | 阅读模式

    前文

    这节课我们继续研究一下元素触发,碰巧有istrust

    之前在论坛也发起过大挑战,也是istrust,不过这个istrust还是比较简单地,跟某数字相加等于10的网站比不了,所以我们过一下玩玩

    一些特别复杂的我目前还是没有特别好的办法,油猴方面还是得看cxxjackie和mhsj大佬给方案

    网址是https://monkeytype.com/

    目标输入内容

    开始

    首先找到对应元素,打字会插入相应元素,所以我们打一个子树修改断点

    图片.png

    输入一个按钮之后看触发

    这里可以看到是一个jq的文件,进行了事件的分发,我们直接跳过最上层的jq,来到匿名的monkeytype的第一个函数,也就是倒数第三个

    图片.png

    我们可以读到下方的函数

    我们看到最后走进了handleChar,参数像是一个字符+一个位置,因为如果进入调用的内部,首先需要过if

    图片.png

    if的判断条件是

    null !== (_event$originalEvent4 = event.originalEvent) && void 0 !== _event$originalEvent4 && _event$originalEvent4.isTrusted && !TestUI.testRestarting

    首先

    null !== (_event$originalEvent4 = event.originalEvent)

    event的orginalEvent赋值给_event$originalEvent4,然后判断是否是null值

    接下来判断

    && void 0 !== _event$originalEvent4 && _event$originalEvent4.isTrusted && !TestUI.testRestarting

    也就是说我们要伪造orginalEvent的isTrusted值

    这里的originalEvent就是原生Event,因为addeventlistener是由jq进行接受的,接受之后进行了一部分的修改和封装然后才传递给monkeytype

    我们根据

    https://bbs.tampermonkey.net.cn/thread-1250-1-1.html

    拿到jq的绑定on函数

    轻松拿到

    图片.png

    我们先写一个大概的版本

    window.dom=document.querySelector('#wordsInput')
    window.func=$._data(dom).events.input[0].handler
    window.inputevent={
        originalEvent:    new InputEvent('input', {
        inputType:'insertText',
        data:'i',
    })
    }

    创建一个inputevent对象,然后传递给监听器

    因为我们模仿jq,所以要设置给originalEvent属性

    图片.png

    这时候发现istrust没过

    我们proxy秒一下

    图片.png

    我们成功进来了,一开始我以为还需要testRestarting秒一下,结果好像还挺顺利的

    然后这里卡住了,我设置下event.target.value属性

    图片.png

    同时因为

    inputValue = _event$originalEvent4.slice(1);

    是读取第二位字符,抛弃第0,所以我们要加一个字符

    所以我们在nomalize函数需要返回一个字符串,并且第一个字符是废弃字符

    我们现在的代码是

    let dom=document.querySelector('#wordsInput')
    let func=$._data(dom).events.input[0].handler
    window.injectcahr=function(c){
        let event=new InputEvent('input', {
            inputType:'insertText',
            data:c,
        })
        const wrapevent = new Proxy(event, {
            get: function(target, property) {
                if (property === 'isTrusted') {
                    return true;
                } else {
                    return Reflect.get(target, property);
                }
            }
        });
        let inputevent={
            originalEvent:   wrapevent,
            target:{
                value:{
                    normalize:function(){
                        return "-"+c;
                    }
                }
            }
        }
        func(inputevent)
    
    }

    测试一下

    injectcahr('a')

    可以发现成功了

    图片.png

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

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

    [LV.9]以坛为家II

    27

    主题

    733

    回帖

    7217

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    积分
    7217

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

    发表于 2022-2-12 20:07:25 来自手机  | 显示全部楼层
    ggnb!!!!!!
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2022-2-12 20:09:48 | 显示全部楼层
    嗯…这个甚至没有要求event必须是个真event,可以弄得再简单点:
    1. func({
    2.     originalEvent: {isTrusted: true},
    3.     target: {
    4.         value: {
    5.             normalize: () => '-test'
    6.         }
    7.     }
    8. });
    复制代码

    Proxy主要是对付instanceof Event检测的,没有的话直接造一个对象传进去就完事了。
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    637

    主题

    5194

    回帖

    6076

    积分

    管理员

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

    积分
    6076

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

    发表于 2022-2-12 21:02:02 | 显示全部楼层
    cxxjackie 发表于 2022-2-12 20:09
    嗯…这个甚至没有要求event必须是个真event,可以弄得再简单点:

    Proxy主要是对付instanceof Event检测的 ...

    好久没看到大佬说话了
    我写的时候满脑子proxy
    没考虑到这个问题...
    看到你的代码直接笑出了声
    我草
    哈哈哈哈
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2022-2-12 22:43:01 | 显示全部楼层
    李恒道 发表于 2022-2-12 21:02
    好久没看到大佬说话了
    我写的时候满脑子proxy
    没考虑到这个问题...

    过年摸鱼不香吗,敲什么代码
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    637

    主题

    5194

    回帖

    6076

    积分

    管理员

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

    积分
    6076

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

    发表于 2022-2-14 09:31:35 | 显示全部楼层
    cxxjackie 发表于 2022-2-12 22:43
    过年摸鱼不香吗,敲什么代码

    我都上班一个星期了!
    天天上班好无聊啊
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

    发表回复

    本版积分规则

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