您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
绕过网站对开发工具的限制,具有增强的保护功能
当前为
- // ==UserScript==
- // @name DevTools Bypass
- // @name:vi Bỏ Qua Chặn DevTools
- // @name:zh-CN 开发工具限制绕过
- // @namespace https://greasyfork.org/vi/users/1195312-renji-yuusei
- // @version 2.3
- // @description Bypass for website restrictions on DevTools with improved protection
- // @description:vi Bỏ qua các hạn chế của trang web về DevTools với bảo vệ được cải tiến
- // @description:zh-CN 绕过网站对开发工具的限制,具有增强的保护功能
- // @author Yuusei
- // @match *://*/*
- // @grant unsafeWindow
- // @run-at document-start
- // @license GPL-3.0-only
- // ==/UserScript==
- (function() {
- 'use strict';
- const config = {
- debugKeywords: /;\s*(?:debugger|debug(?:ger)?|breakpoint)\s*;?/g,
- consoleProps: ['log', 'warn', 'error', 'info', 'debug', 'assert', 'dir', 'dirxml', 'trace', 'group', 'groupCollapsed', 'groupEnd', 'time', 'timeEnd', 'profile', 'profileEnd', 'count', 'table', 'clear'],
- maxLogHistory: 100,
- cutoffs: {
- table: { amount: 10, within: 10000 },
- clear: { amount: 10, within: 10000 },
- redactedLog: { amount: 10, within: 10000 },
- debugger: { amount: 15, within: 15000 },
- debuggerThrow: { amount: 15, within: 15000 },
- },
- protectionLevel: 'aggressive'
- };
- // Originals storage with deep cloning
- const originals = {
- console: {},
- Function: window.Function.prototype.constructor,
- createElement: document.createElement.bind(document),
- toString: Function.prototype.toString,
- eval: unsafeWindow.eval,
- functionConstructor: window.Function,
- setInterval: window.setInterval,
- setTimeout: window.setTimeout,
- addEventListener: window.addEventListener,
- removeEventListener: window.removeEventListener
- };
- // Console method preservation
- config.consoleProps.forEach(prop => {
- try {
- if (console[prop]) {
- originals.console[prop] = console[prop].bind(console);
- }
- } catch (e) {
- // Silent fail for stealth
- }
- });
- const logHistory = new Array(config.maxLogHistory);
- let debugCount = 0;
- // Logging control system
- const shouldLog = (type) => {
- try {
- const cutoff = config.cutoffs[type];
- if (!cutoff) return true;
- if (cutoff.tripped) return false;
- const now = Date.now();
- cutoff.current = (cutoff.current || 0) + 1;
- cutoff.last = cutoff.last || now;
- if (now - cutoff.last > cutoff.within) {
- cutoff.current = 1;
- cutoff.last = now;
- return true;
- }
- if (cutoff.current > cutoff.amount) {
- if (config.protectionLevel === 'aggressive') {
- originals.console.warn?.(`Rate limit exceeded for ${type}`);
- }
- cutoff.tripped = true;
- return false;
- }
- return true;
- } catch (e) {
- return true;
- }
- };
- // Safe evaluation with context isolation
- const safeEval = (code, context = {}) => {
- try {
- const isolatedFunc = new Function(
- ...Object.keys(context),
- `return (function() { ${code} })()`
- );
- return isolatedFunc(...Object.values(context));
- } catch (error) {
- if (config.protectionLevel === 'aggressive') {
- originals.console.error?.('Evaluation failed:', error);
- }
- return null;
- }
- };
- // Function modification system
- const modifyFunction = (func) => {
- if (typeof func !== 'function') return func;
- try {
- const funcStr = func.toString();
- if (config.debugKeywords.test(funcStr)) {
- const modifiedStr = funcStr.replace(config.debugKeywords, ';/* debug removed */;');
- return safeEval(modifiedStr) || func;
- }
- } catch (e) {
- // Return original on failure
- }
- return func;
- };
- // Console wrapper with protection
- const wrapConsole = () => {
- const wrappedConsole = {};
- config.consoleProps.forEach(prop => {
- try {
- Object.defineProperty(wrappedConsole, prop, {
- configurable: true,
- enumerable: true,
- writable: true,
- value: function(...args) {
- if (!shouldLog(prop)) return;
- if (prop === 'clear' && shouldLog('clear')) {
- if (config.protectionLevel === 'aggressive') {
- originals.console.warn?.('Console clear prevented');
- }
- return;
- }
- const processedArgs = args.map(arg => {
- try {
- if (typeof arg === 'function') return '[Function]';
- if (!arg || typeof arg !== 'object') return arg;
- const descriptors = Object.getOwnPropertyDescriptor(arg, 'toString');
- if (descriptors && !descriptors.configurable) {
- return '[Protected Object]';
- }
- return arg;
- } catch (e) {
- return '[Protected]';
- }
- });
- if (originals.console[prop]) {
- originals.console[prop].apply(console, processedArgs);
- }
- }
- });
- } catch (e) {
- // Skip problematic properties
- }
- });
- // Console protection with fallback
- try {
- Object.defineProperty(window, 'console', {
- configurable: true,
- enumerable: true,
- get: () => wrappedConsole
- });
- } catch (e) {
- config.consoleProps.forEach(prop => {
- try {
- console[prop] = wrappedConsole[prop];
- } catch (_) {}
- });
- }
- };
- // Function constructor protection
- const protectFunctionConstructor = () => {
- try {
- const handler = {
- apply(target, thisArg, args) {
- const modifiedArgs = args.map(arg =>
- typeof arg === 'string' ? arg.replace(config.debugKeywords, '') : arg
- );
- return Reflect.apply(target, thisArg, modifiedArgs);
- },
- construct(target, args) {
- const modifiedArgs = args.map(arg =>
- typeof arg === 'string' ? arg.replace(config.debugKeywords, '') : arg
- );
- return Reflect.construct(target, modifiedArgs);
- }
- };
- window.Function = new Proxy(window.Function, handler);
- } catch (e) {
- const originalFunction = window.Function;
- window.Function = function(...args) {
- const modifiedArgs = args.map(arg =>
- typeof arg === 'string' ? arg.replace(config.debugKeywords, '') : arg
- );
- return originalFunction.apply(this, modifiedArgs);
- };
- Object.setPrototypeOf(window.Function, originalFunction);
- }
- };
- // createElement protection
- const protectCreateElement = () => {
- try {
- document.createElement = new Proxy(originals.createElement, {
- apply(target, thisArg, args) {
- const element = Reflect.apply(target, thisArg, args);
- if (args[0]?.toLowerCase?.() === 'iframe') {
- const protectIframe = () => {
- try {
- const iframeWindow = element.contentWindow;
- const iframeConsole = iframeWindow.console;
- Object.keys(wrappedConsole).forEach(key => {
- try {
- iframeConsole[key] = wrappedConsole[key];
- } catch (_) {}
- });
- // Protect iframe's Function constructor
- iframeWindow.Function = window.Function;
- } catch (_) {}
- };
- element.addEventListener('load', protectIframe, { once: true });
- }
- return element;
- }
- });
- } catch (e) {
- // Fallback protection
- }
- };
- // Timer protection
- const protectTimers = () => {
- try {
- const wrapTimer = (original, name) => {
- return function(handler, ...args) {
- if (typeof handler === 'string') {
- handler = handler.replace(config.debugKeywords, '');
- } else if (typeof handler === 'function') {
- handler = modifyFunction(handler);
- }
- return original.call(this, handler, ...args);
- };
- };
- window.setInterval = wrapTimer(originals.setInterval, 'setInterval');
- window.setTimeout = wrapTimer(originals.setTimeout, 'setTimeout');
- } catch (e) {
- // Fallback to originals
- }
- };
- // Main protection setup with improved error handling
- const setupProtection = () => {
- try {
- wrapConsole();
- protectFunctionConstructor();
- protectCreateElement();
- protectTimers();
- // Media protection
- try {
- const mediaProto = HTMLMediaElement.prototype;
- const originalPlay = mediaProto.play;
- Object.defineProperty(mediaProto, 'play', {
- configurable: true,
- writable: true,
- value: function(...args) {
- return originalPlay.apply(this, args);
- }
- });
- } catch (_) {}
- // Success message
- if (config.protectionLevel === 'aggressive') {
- console.log('%cDevTools Bypass activated', 'color: #00ff00; font-weight: bold;');
- }
- } catch (e) {
- // Silent fail for stealth
- }
- };
- // Initialize protection
- setupProtection();
- })();