Я пытаюсь подменить IP-адрес, просочившийся из WebRTC, поэтому я хочу переопределить функцию обратного вызова '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);
};
}
Как вы можете видеть: метод получения вашего реального ipот webRTC пытается установить соединение, затем установить обратный вызов для события «onicecandidate», информация о событии содержит информацию о реальном Ip.
То, что я хотел бы сделать, это переопределить функцию 'set' назначения 'onicecandidate', так что она будет заменена моей собственной функцией ловушки, и после "изменения" IP-адреса ловушка вызовет реальный получатель.устанавливается скриптом отпечатка пальца.
В моих тестах: я заметил, что после выполнения моего кода из консоли RTCPeerConnection.prototype был переопределен, если я назначил функцию RTCPeerConnection.onicecandidate, консоль напечатает «набор хуков», поэтому появилсяэто переопределение является успешным, также, если я вызвал RTCPeerConnection.onicecandidate (xxx) mannullay, и моя функция перехвата, и исходная функция выполняются, это работает, как и ожидалось.Тем не менее, этот код не работает, когда я использовал в подлинном скрипте отпечатка пальца, как я вставил выше.Событие onicecandidate никогда не запускается после применения переопределения.
Я новичок в javascript, надеюсь, кто-нибудь сможет объяснить мою путаницу.
Заранее спасибо.