李恒道 发表于 2022-2-12 18:28:05

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

# 前文

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

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

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

网址是https://monkeytype.com/

目标输入内容

# 开始

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

![图片.png](data/attachment/forum/202202/12/175621mbdwqadbailsyzvw.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

输入一个按钮之后看触发

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

![图片.png](data/attachment/forum/202202/12/175725cme5ijijzskjjy5g.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

我们可以读到下方的函数

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

![图片.png](data/attachment/forum/202202/12/175832aa1dti1a80i0q3j8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

if的判断条件是

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

首先

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

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

接下来判断

```javascript
&& 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](data/attachment/forum/202202/12/180757md9rzt6ythrry995.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

我们先写一个大概的版本

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

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

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

![图片.png](data/attachment/forum/202202/12/181518a71eybp9ngey5eee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

这时候发现istrust没过

我们proxy秒一下

![图片.png](data/attachment/forum/202202/12/181929cngngra4pzgvgvqi.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

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

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

![图片.png](data/attachment/forum/202202/12/182014zz4u6ivoveqwkw1e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

同时因为

```javascript
inputValue = _event$originalEvent4.slice(1);
```

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

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

我们现在的代码是

```javascript
let dom=document.querySelector('#wordsInput')
let func=$._data(dom).events.input.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)

}
```

测试一下

```javascript
injectcahr('a')
```

可以发现成功了

![图片.png](data/attachment/forum/202202/12/182731mhdt2zgob3tthz1g.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

Ne-21 发表于 2022-2-12 20:07:25

ggnb!!!!!!

cxxjackie 发表于 2022-2-12 20:09:48

嗯…这个甚至没有要求event必须是个真event,可以弄得再简单点:
func({
    originalEvent: {isTrusted: true},
    target: {
      value: {
            normalize: () => '-test'
      }
    }
});
Proxy主要是对付instanceof Event检测的,没有的话直接造一个对象传进去就完事了。

李恒道 发表于 2022-2-12 21:02:02

cxxjackie 发表于 2022-2-12 20:09
嗯…这个甚至没有要求event必须是个真event,可以弄得再简单点:

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

好久没看到大佬说话了
我写的时候满脑子proxy
没考虑到这个问题...
看到你的代码直接笑出了声
我草
哈哈哈哈

cxxjackie 发表于 2022-2-12 22:43:01

李恒道 发表于 2022-2-12 21:02
好久没看到大佬说话了
我写的时候满脑子proxy
没考虑到这个问题...


过年摸鱼不香吗,敲什么代码{:4_109:}

李恒道 发表于 2022-2-14 09:31:35

cxxjackie 发表于 2022-2-12 22:43
过年摸鱼不香吗,敲什么代码

我都上班一个星期了!
天天上班好无聊啊
页: [1]
查看完整版本: [油猴脚本开发指南]实战秒杀istrust验证