// ==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();
})();