Javascript 如何使用代理捕捉对象创建?

Javascript 如何使用代理捕捉对象创建?,javascript,proxy,Javascript,Proxy,感谢您抽出时间阅读我的问题。网站的javascript I'm reverse engineering执行以下命令: this.socket = new WebSocket(o.host) 该行被其他函数的函数等掩埋,因此我无法在运行时正常访问它。每当调用new Websocket()时,我想使用代理对象“注入”代码,以便通知我它的创建,并将其保存到我之前准备的全局变量中 我的greasemonkey脚本如下所示: var caught_socket; // prepare variable

感谢您抽出时间阅读我的问题。网站的javascript I'm reverse engineering执行以下命令:

this.socket = new WebSocket(o.host)
该行被其他函数的函数等掩埋,因此我无法在运行时正常访问它。每当调用new Websocket()时,我想使用代理对象“注入”代码,以便通知我它的创建,并将其保存到我之前准备的全局变量中

我的greasemonkey脚本如下所示:

var caught_socket; // prepare variable

handler = {
  apply: function(target, thisArg, argumentsList) {
    console.log("WebSocket was created!");
    caught_socket = target;
  }
}

WebSocket = new Proxy(WebSocket, handler);
这显然不起作用,我将非常感谢任何关于代理如何实际工作的帮助或演示

改用,它将在调用
new
时执行

//创建新的WebSocket代理
WebSocket=新代理(WebSocket{
构造:(目标,参数)=>{
log('newWebSocket实例!')
返回新目标(…args)
}
})
//通过连接到远程服务器来测试WebSocket代理
const ws=新的WebSocket('wss://echo.websocket.org')
//侦听打开的连接
//向连接发送消息
ws.addEventListener('open',()=>{
console.log('连接打开!')
ws.send('hello')
})
//侦听来自远程服务器的消息
ws.addEventListener('message',msg=>console.log('Response:',msg.data))
请改用,它将在调用
new
时执行

//创建新的WebSocket代理
WebSocket=新代理(WebSocket{
构造:(目标,参数)=>{
log('newWebSocket实例!')
返回新目标(…args)
}
})
//通过连接到远程服务器来测试WebSocket代理
const ws=新的WebSocket('wss://echo.websocket.org')
//侦听打开的连接
//向连接发送消息
ws.addEventListener('open',()=>{
console.log('连接打开!')
ws.send('hello')
})
//侦听来自远程服务器的消息

ws.addEventListener('message',msg=>console.log('Response:',msg.data))
您尝试过吗?在覆盖全局
Websocket
变量后,不要忘记执行类似
Websocket.prototype.constructor=Websocket
的操作。否则脚本可能仍然会访问原始构造函数并感到困惑。您尝试过吗?在覆盖全局
Websocket
变量后,不要忘记执行类似
Websocket.prototype.constructor=Websocket
的操作。否则脚本可能仍然会访问原始构造函数并感到困惑。答案中的代码确实有效。我删除了ws变量,以便捕获由网站脚本创建的WebSocket,但它没有触发代理。我在调用新WebSocket的行上放置了一个断点,以确保实际调用了该行,并且该行是正确的。我已经超出了问题的范围,但是这个网站是否可能“清除任何代理”,是否有其他反调试代码隐藏在某个地方?(这是周围代码的样子)我只是想问是否有可能网站的javascript“禁用”了我在脚本运行之前创建的代理,因为新的WebSocket已被明确调用,但代理处理程序没有启动。是的,这是可能的。。。我们只是这么做了,所以网站没有理由不这么做…我可能会收回。。。如果有第二个代理,两个代理都会执行。啊。我将您的代码粘贴到控制台本身,它捕获了WebSocket的创建。我不知道为什么Greasemonkey脚本不起作用,尽管我保证它可以运行,但你完美地回答了我的问题。非常感谢。Greasemonkey脚本:它在“脚本注入”出现后运行,但从未捕获websocket创建。在控制台中粘贴效果很好:答案中的代码确实有效。我删除了ws变量,以便捕获由网站脚本创建的WebSocket,但它没有触发代理。我在调用新WebSocket的行上放置了一个断点,以确保实际调用了该行,并且该行是正确的。我已经超出了问题的范围,但是这个网站是否可能“清除任何代理”,是否有其他反调试代码隐藏在某个地方?(这是周围代码的样子)我只是想问是否有可能网站的javascript“禁用”了我在脚本运行之前创建的代理,因为新的WebSocket已被明确调用,但代理处理程序没有启动。是的,这是可能的。。。我们只是这么做了,所以网站没有理由不这么做…我可能会收回。。。如果有第二个代理,两个代理都会执行。啊。我将您的代码粘贴到控制台本身,它捕获了WebSocket的创建。我不知道为什么Greasemonkey脚本不起作用,尽管我保证它可以运行,但你完美地回答了我的问题。非常感谢。Greasemonkey脚本:它在“脚本注入”出现后运行,但从未捕获websocket创建。在控制台中粘贴效果非常好: