gpt4 book ai didi

javascript - 覆盖 RTCPeerConnection 回调 'onicecandidate'

转载 作者:行者123 更新时间:2023-12-03 00:02:43 30 4
gpt4 key购买 nike

我试图欺骗从 WebRTC 泄漏的 IP 地址,所以我想重写“onicecandidate”回调函数,但下面的代码不起作用,我不明白为什么。

  Object.defineProperty(RTCPeerConnection.prototype, 'onicecandidate', {
set: function (eventHandler) {

console.log('hook set');

this._onicecandidateEventHandler = eventHandler;
this._onicecandidate = function (event) {

console.log('hook');

this._onicecandidateEventHandler.apply(this, arguments);
};


},
get: function () {
return this._onicecandidate;
}

})

上面的代码应该 Hook “指纹脚本”分配的接收器函数。

指纹识别脚本的示例如下:

    function findIP() {
var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var pc = new myPeerConnection({iceServers: [{urls: "stun:stun.l.google.com:19302"}]}),
noop = function() {},
localIPs = {},
ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
key;

function ipIterate(ip) {
if (!localIPs[ip]) {console.log('got ip: ', ip);}
localIPs[ip] = true;
}

pc.createDataChannel("");

pc.createOffer(function(sdp) {
sdp.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') < 0) return;
line.match(ipRegex).forEach(ipIterate);
});
pc.setLocalDescription(sdp, noop, noop);
}, noop);

pc.onicecandidate = function(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
};
}

如您所见:从 webRTC 获取真实 IP 的方法是尝试建立连接,然后在“onicecandidate”事件上设置回调,事件信息包含真实的 Ip 信息。

我想要做的是覆盖“onicecandidate”分配的“set”函数,以便它将被我自己的钩子(Hook)函数替换,并且在“更改”IP地址之后,钩子(Hook)将调用由指纹脚本。

在我的测试中:我可以观察到,从控制台执行代码后, RTCPeerConnection.prototype 已被覆盖,如果我为 RTCPeerConnection.onicecandidate 分配了一个函数,控制台将打印“hook set”,因此看起来覆盖是成功,如果我调用 RTCPeerConnection.onicecandidate(xxx) mannullay,我的钩子(Hook)函数和原始函数都会被执行,它会按预期工作。然而,当我在真实的指纹脚本中使用时,就像我粘贴上面的代码一样,这段代码不起作用。应用覆盖后,onicecandidate 事件永远不会被触发。

我是javascript的初学者,希望有人能解释我的困惑。

提前谢谢您。

最佳答案

如果不评论为什么这不起作用,仅此一点无法帮助您对抗使用 addEventListener('icecandidate') 的脚本。

adapter.js包含一个处理这两种变体的“wrapPeerConnectionEvent”辅助函数。有了这个助手,任务就变得非常简单:

wrapPeerConnectionEvent(window, 'icecandidate', (e) => {
if (e.candidate) {
const parts = e.candidate.candidate.split(' ');
parts[4] = '127.0.0.1'; // replace the real ip with 127.0.0.1
e.candidate.candidate = parts.join(' ');
}
return e;
});

参见https://jsfiddle.net/krgz5qu1/一个完整的例子。请注意,您可能还需要处理服务器自反和中继候选的 relAddr 字段中的 IP。

关于javascript - 覆盖 RTCPeerConnection 回调 'onicecandidate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55103321/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com