您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Bypasses various JavaScript anti-debugging techniques
// ==UserScript== // @name Anti-Debugger Bypass By Probablement // @namespace http://tampermonkey.net/ // @version 1.0 // @description Bypasses various JavaScript anti-debugging techniques // @author Probablement // @match *://*/* // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; const settings = { showNotifications: true, notificationDuration: 5000, logToConsole: true }; let bypassCounters = { debugger: 0, console: 0, devtools: 0, functionToString: 0, timing: 0, properties: 0 }; function log(message) { if (settings.logToConsole) { console.log(`%c[Anti-Debugger Bypass]%c ${message}`, 'color: #3498db; font-weight: bold;', 'color: inherit'); } } const notifications = (function() { const container = document.createElement('div'); container.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 9999; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; `; function show(message, type = 'info') { if (!settings.showNotifications) return; const notification = document.createElement('div'); notification.style.cssText = ` background-color: white; color: #333; border-radius: 8px; padding: 12px 16px; margin-bottom: 10px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); display: flex; align-items: center; min-width: 280px; max-width: 450px; transform: translateX(150%); transition: transform 0.3s ease-out; border-left: 4px solid #3498db; `; if (type === 'success') { notification.style.borderColor = '#2ecc71'; } else if (type === 'warning') { notification.style.borderColor = '#f39c12'; } else if (type === 'error') { notification.style.borderColor = '#e74c3c'; } const icon = document.createElement('div'); icon.style.cssText = ` margin-right: 12px; font-size: 18px; `; if (type === 'success') { icon.innerHTML = '✅'; } else if (type === 'warning') { icon.innerHTML = '⚠️'; } else if (type === 'error') { icon.innerHTML = '❌'; } else { icon.innerHTML = 'ℹ️'; } const content = document.createElement('div'); content.style.cssText = ` flex-grow: 1; `; const title = document.createElement('div'); title.style.cssText = ` font-weight: bold; margin-bottom: 4px; `; title.textContent = 'Anti-Debugger Bypass'; const messageEl = document.createElement('div'); messageEl.style.cssText = ` font-size: 14px; `; messageEl.textContent = message; const closeBtn = document.createElement('div'); closeBtn.style.cssText = ` margin-left: 12px; cursor: pointer; font-size: 18px; opacity: 0.6; transition: opacity 0.2s; `; closeBtn.innerHTML = '×'; closeBtn.addEventListener('mouseover', () => { closeBtn.style.opacity = '1'; }); closeBtn.addEventListener('mouseout', () => { closeBtn.style.opacity = '0.6'; }); closeBtn.addEventListener('click', () => { remove(notification); }); content.appendChild(title); content.appendChild(messageEl); notification.appendChild(icon); notification.appendChild(content); notification.appendChild(closeBtn); container.appendChild(notification); setTimeout(() => { notification.style.transform = 'translateX(0)'; }, 10); setTimeout(() => { remove(notification); }, settings.notificationDuration); return notification; } function remove(notification) { notification.style.transform = 'translateX(150%)'; notification.style.opacity = '0'; setTimeout(() => { if (notification.parentNode === container) { container.removeChild(notification); } }, 300); } function init() { document.addEventListener('DOMContentLoaded', () => { document.body.appendChild(container); }); if (document.body) { document.body.appendChild(container); } } return { init, show }; })(); notifications.init(); function bypassDebuggerStatements() { const originalConstructor = Function.prototype.constructor; Function.prototype.constructor = function() { const args = Array.from(arguments); const body = args.join(''); if (body.includes('debugger')) { bypassCounters.debugger++; const newBody = body.replace(/debugger;?/g, '// debugger bypassed'); return originalConstructor.apply(this, [newBody]); } return originalConstructor.apply(this, arguments); }; const originalEval = window.eval; window.eval = function(code) { if (typeof code === 'string' && code.includes('debugger')) { bypassCounters.debugger++; code = code.replace(/debugger;?/g, '// debugger bypassed'); } return originalEval.call(window, code); }; window.onerror = function(message, source, lineno, colno, error) { if (message && message.includes('debugger')) { bypassCounters.debugger++; return true; } return false; }; log('Debugger statement bypass installed'); } function protectConsole() { const originalMethods = { log: console.log, warn: console.warn, error: console.error, info: console.info, debug: console.debug, clear: console.clear, dir: console.dir, trace: console.trace }; for (const method in originalMethods) { Object.defineProperty(console, method, { get: function() { return originalMethods[method]; }, set: function(value) { bypassCounters.console++; log(`Prevented console.${method} override`); return originalMethods[method]; }, configurable: false }); } log('Console protection installed'); } function bypassDevToolsDetection() { const methodsToCheck = [ 'toString', 'constructor' ]; const originalFunctionToString = Function.prototype.toString; Object.defineProperty(Function.prototype, 'toString', { get: function() { return function() { try { const nativeString = originalFunctionToString.call(this); if (nativeString.includes('[native code]')) { return nativeString; } if (this === Object.defineProperty || this === Object.defineProperties || this === Object.getOwnPropertyDescriptor || this === Function.prototype.toString) { bypassCounters.functionToString++; return originalFunctionToString.call(Function.prototype.toString); } return nativeString; } catch (e) { return 'function() { [native code] }'; } }; }, set: function() { bypassCounters.functionToString++; }, configurable: false }); const originalDateNow = Date.now; let previousTime = originalDateNow(); Object.defineProperty(Date, 'now', { get: function() { return function() { const actualTime = originalDateNow(); if (actualTime - previousTime > 100) { bypassCounters.timing++; previousTime = previousTime + 16; return previousTime; } previousTime = actualTime; return actualTime; }; }, configurable: false }); if (window.performance && window.performance.now) { const originalPerformanceNow = window.performance.now; let previousPerformanceTime = originalPerformanceNow.call(window.performance); Object.defineProperty(window.performance, 'now', { get: function() { return function() { const actualTime = originalPerformanceNow.call(window.performance); if (actualTime - previousPerformanceTime > 100) { bypassCounters.timing++; previousPerformanceTime = previousPerformanceTime + 16; return previousPerformanceTime; } previousPerformanceTime = actualTime; return actualTime; }; }, configurable: false }); } function neutralizeDetection() { const detectionProps = [ { object: window, props: ['devtools', 'webdriver', '__webdriver_evaluate', '__selenium_evaluate', '__webdriver_script_fn', '__webdriver_script_func'] }, { object: document, props: ['__webdriver_script_fn', '__selenium_evaluate', '__webdriver_evaluate'] }, { object: navigator, props: ['webdriver'] } ]; detectionProps.forEach(({object, props}) => { props.forEach(prop => { try { if (object[prop]) { Object.defineProperty(object, prop, { get: function() { bypassCounters.properties++; return undefined; }, configurable: false }); } } catch (e) {} }); }); if (window.chrome) { const nativeChrome = window.chrome; Object.defineProperty(window, 'chrome', { get: function() { return nativeChrome; }, set: function() { bypassCounters.properties++; }, configurable: false }); } } if (window.console && window.console.firebug) { bypassCounters.devtools++; delete window.console.firebug; } neutralizeDetection(); log('DevTools detection bypasses installed'); } function bypassToStringChecks() { const nativeObjectToString = Object.prototype.toString; Object.defineProperty(Object.prototype, 'toString', { get: function() { if (new Error().stack.includes('detect')) { bypassCounters.functionToString++; return function() { if (this === window) return '[object Window]'; if (this === document) return '[object HTMLDocument]'; if (this instanceof HTMLElement) return '[object HTMLElement]'; if (this instanceof Event) return '[object Event]'; return nativeObjectToString.call(this); }; } return nativeObjectToString; }, configurable: false }); log('toString checks bypass installed'); } function patchBrowserFeatures() { if (window.navigator) { const originalUserAgent = navigator.userAgent; try { Object.defineProperty(navigator, 'userAgent', { get: function() { if (new Error().stack.includes('detect')) { bypassCounters.properties++; return originalUserAgent.replace(/FirePHP|Firebug/gi, ''); } return originalUserAgent; } }); } catch (e) {} } const heightDescriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetHeight'); const widthDescriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetWidth'); if (heightDescriptor && heightDescriptor.get) { Object.defineProperty(HTMLElement.prototype, 'offsetHeight', { get: function() { if (new Error().stack.includes('detect') || new Error().stack.includes('devtool')) { bypassCounters.properties++; return 0; } return heightDescriptor.get.call(this); } }); } if (widthDescriptor && widthDescriptor.get) { Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { get: function() { if (new Error().stack.includes('detect') || new Error().stack.includes('devtool')) { bypassCounters.properties++; return 0; } return widthDescriptor.get.call(this); } }); } log('Browser features patched'); } function activateBypasses() { bypassDebuggerStatements(); protectConsole(); bypassDevToolsDetection(); bypassToStringChecks(); patchBrowserFeatures(); setTimeout(() => { notifications.show('Anti-debugging protections activated', 'success'); }, 1000); setInterval(() => { const totalBypassed = Object.values(bypassCounters).reduce((total, count) => total + count, 0); if (totalBypassed > 0) { notifications.show(`Bypassed ${totalBypassed} anti-debugging techniques`, 'info'); Object.keys(bypassCounters).forEach(key => { bypassCounters[key] = 0; }); } }, 10000); log('All anti-debugging bypasses successfully applied'); } activateBypasses(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址