Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 覆盖RTPeerConnection回调';onicecandidate';_Javascript_Webrtc - Fatal编程技术网

Javascript 覆盖RTPeerConnection回调';onicecandidate';

Javascript 覆盖RTPeerConnection回调';onicecandidate';,javascript,webrtc,Javascript,Webrtc,我试图欺骗从WebRTC泄漏的ip地址,所以我想覆盖“onicecandidate”回调函数,但下面的代码不起作用,我无法找出原因 Object.defineProperty(RTCPeerConnection.prototype, 'onicecandidate', { set: function (eventHandler) { console.log('hook set'); this._onicecandidateEventHandler

我试图欺骗从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;
    }

})
上面的代码应该钩住“指纹脚本”指定的接收器函数

指纹脚本的示例如下所示:

    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);
        };
    }
函数findIP(){
var myPeerConnection=window.rtpeerconnection | | window.mozrtpeerconnection | | window.webkirtpeerconnection;
var pc=newmypeerconnection({iceServers:[{url:stun:stun.l.google.com:19302“}]}),
noop=函数(){},
localIPs={},
ipRegex=/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
钥匙
函数ipIterate(ip){
如果(!localIPs[ip]){console.log('got-ip:',ip);}
localIPs[ip]=真;
}
pc.createDataChannel(“”);
pc.createOffer(功能(sdp){
sdp.sdp.split('\n').forEach(函数(行){
if(line.indexOf('candidate')<0)返回;
line.match(ipRegex).forEach(ipIterate);
});
pc.setLocalDescription(sdp、noop、noop);
},noop);
pc.onicecandidate=函数(ice){
如果(!ice | |!ice.candidate | |!ice.candidate.candidate | |!ice.candidate.candidate.match(ipRegex))返回;
ice.candidate.candidate.match(ipRegex.forEach)(ipIterate);
};
}
如您所见:从webRTC获取真实ip的方法是尝试估计连接,然后在“onicecandidate”事件上设置回调,事件信息包含真实ip信息

我想做的是覆盖'onicecandidate'分配的'set'函数,这样它将被我自己的钩子函数替换,在“改变”ip地址后,钩子将调用指纹脚本设置的真正接收器

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

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


先谢谢你

如果不解释为什么这不起作用,那么单凭这一点无法帮助您对抗使用addEventListener('icecandidate')的脚本

包含一个“WrapperConnectionEvent”辅助函数,用于处理这两个变量。有了这个助手,它就变成了一项非常简单的任务:

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;
});
有关完整示例,请参见。 请注意,您可能还需要注意服务器自反和中继候选者的relAddr字段中的ip