// ==UserScript==
// @name Bypass网页调试限制
// @namespace http://tampermonkey.net/
// @version 0.2
// @description 用于绕过限制和调试问题的差价,绕过debugger,绕过移动端检测,绕过ua检测,限制RTC泄露等功能
// @author arschlochnop
// @license MIT
// @match *://*/*
// @run-at document-start
// ==/UserScript==
// 删除RTC相关对象,防止泄露真实IP
["","webkit","moz","ms"].forEach(prefix => {
[
"RTCError",
"RTCRtpSender",
"RTCDTMFSender",
"RTCErrorEvent",
"RTCTrackEvent",
"RTCCertificate",
"RTCDataChannel",
"RTCRtpReceiver",
"RTCStatsReport",
"RTCIceCandidate",
"RTCIceTransport",
"RTCDtlsTransport",
"RTCSctpTransport",
"RTCPeerConnection",
"RTCRtpTransceiver",
"RTCDataChannelEvent",
"RTCEncodedAudioFrame",
"RTCEncodedVideoFrame",
"RTCSessionDescription",
"RTCDTMFToneChangeEvent",
"RTCPeerConnectionIceEvent",
"RTCPeerConnectionIceErrorEvent"
].forEach(rtc => {
const obj = prefix + rtc;
if (unsafeWindow[obj]) delete unsafeWindow[obj];
});
});
// 修改navigator对象,防止泄露真实信息
const platform = "Android";
const platforms = {
"HP-UX": "Mozilla/5.0 (HP-UX; HP-UX 11.31)",
"Linux i686": "Mozilla/5.0 (Linux; i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Linux armv7l": "Mozilla/5.0 (Linux; ARM; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mac68K": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
"MacPPC": "Mozilla/5.0 (Macintosh; PPC Mac OS X 10_15_7)",
"MacIntel": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
"SunOS": "Mozilla/5.0 (SunOS; SunOS 5.11)",
"Win16": "Mozilla/5.0 (Windows 3.1)",
"Win32": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"WinCE": "Mozilla/5.0 (Windows CE; IEMobile 10.0)",
"iPhone": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"iPod": "Mozilla/5.0 (iPod; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"iPad": "Mozilla/5.0 (iPad; CPU OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
"Android": "Mozilla/5.0 (Linux; Android 10; Pixel 3 XL Build/QQ1A.200205.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Mobile Safari/537.36",
"BlackBerry": "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.36 (KHTML, like Gecko) Version/10.3.3.2204 Mobile Safari/537.36",
"Opera": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 OPR/45.0.2516.0"
};
Object.defineProperty(navigator, 'platform', { get: function() {console.log("禁止查看浏览器平台"); return platform; } });
Object.defineProperty(navigator,'userAgent',{get:function(){console.log("禁止查看浏览器UA");return platforms[platform];}});
Object.defineProperty(navigator,'language',{get:function(){console.log("禁止查看浏览器语言");return 'en-US';}});
Object.defineProperty(navigator,'languages',{get:function(){console.log("禁止查看浏览器语言集"); return ['en-GB', 'en-US'];}});
Object.defineProperty(navigator,'userAgentData',{get:function(){console.log("禁止查看userAgentData"); return '';}});
Object.defineProperty(navigator,'appVersion',{get:function(){console.log("禁止查看appVersion"); return '999';}});
Intl.DateTimeFormat.prototype.resolvedOptions = function() {
console.log("禁止查看时区");
};
// 绕过debugger防调试功能
console.log("========== my hook start ==========");
function hook_Function() {
let raw_F_c = Function.prototype.constructor;
let _constructor = function (params) {
//注释输出,避免影响性能
//console.log("调用 Function.prototype.constructor: ", params);
if (params.includes("debugger")) {
//console.log("发现 debugger in Function.prototype.constructor");
params = params.replaceAll("debugger", "");
}
return raw_F_c(params);
}
Object.defineProperty(window.Function.prototype, "constructor", { value: _constructor })
}
function hook_setInterval() {
let raw_set = setInterval;
let _setInterval = function () {
console.log("调用 setInterval: ", arguments)
// 直接置空似乎没有什么影响
return; // 如果出现问题可以删除该语句
let s = arguments[0].toString();
if (s.includes("debugger")) {
console.log("发现 debugger in setInterval");
s = s.replaceAll("debugger", "");
arguments[0] = eval(s);
}
raw_set(...arguments);
}
Object.defineProperty(window, "setInterval", { value: _setInterval })
}
function hook_eval() {
let raw_eval = eval;
let _eval = function(param) {
console.log("调用 eval: ", param);
if (param.includes("debugger")) {
console.log("发现 debugger in eval");
if (param === "(function() {var a = new Date(); debugger; return new Date() - a > 100;}())") {
param = "(function() { return false; })()";
}
param = param.replaceAll("debugger", "");
}
raw_eval(param);
}
Object.defineProperty(window, "eval", { value: _eval })
}
hook_setInterval();
hook_eval();
// 如果置空 setInterval 出现了其它问题,可以取消该注释
// 可能会影响一些负责页面的渲染功能,默认关闭,如果无法绕过debugger可以取消注释
//hook_Function();