JavaScript奇技淫巧:debugger攔截
debugger指令,一般用于調(diào)試,在如瀏覽器調(diào)試執(zhí)行環(huán)境中,可以在JavaScript代碼中產(chǎn)生中斷。
如果想要攔截debugger,是不容易的,常用的函數(shù)替代、proxy方法均對(duì)它無效,如:
window.debugger = (function() {
var origDebug = console.debugger;
return function() {
// do something before debugger statement execution
origDebug.apply(console, arguments);
// do something after debugger statement execution
或:
var handler = {
get: function(target, prop, receiver) {
if (prop === 'debugger') {
throw new Error("Debugger statement not allowed!");
return Reflect.get(target, prop, receiver);
var obj = new Proxy({}, handler);
以上兩方法,都無法對(duì)debugger生效。
甚至連大名鼎鼎的人工智能ChatGPT也認(rèn)為debugger無法攔截。如下圖:ChatGPT的回答。
而debugger有多種寫法,如:
1、debugger;
2、Function("debugger").call();
3、eval("debugger");
4、setInterval(function(){debugger;},1000);
5、[].constructor.constructor('debugger')();
最原始的debugger,想要攔截這一個(gè)單詞,確實(shí)是似乎不可行,但它在現(xiàn)實(shí)中的使用頻率是不高的,更多的是后面幾種用法。
這是因?yàn)椋琩ebugger更多的被人們用于反調(diào)試,比如用JShaman對(duì)JavaScript代碼進(jìn)行混淆加密后,就可以被加入多種不同的debugger指令用于反調(diào)試。
而上面展示的后4種用法,是可以在代碼中進(jìn)行攔截的。
Function("debugger").call()
攔截示例:
Function_backup = Function;
Function = function(a){
if (a =='debugger'){
console.log("攔截了debugger,中斷不會(huì)發(fā)生1")
return Function_backup("console.log()")
}else{
return Function_backup(a)
Function("debugger").call();
運(yùn)行效果:
eval("debugger")
攔截示例:
eval_backup = eval;
eval = function(a){
if(a=='debugger'){
console.log("攔截了debugger,中斷不會(huì)發(fā)生0")
return ''
}else{
return eval_backup(a)
eval("debugger");
運(yùn)行效果:
setInterval(function(){debugger;},1000)
攔截示例:
var setInterval_backup = setInterval
setInterval = function(a,b){
if(a.toString().indexOf('debugger') != -1){
console.log("攔截了debugger,中斷不會(huì)發(fā)生2")
return null;
setInterval_backup(a, b)
setInterval(function(){
debugger;
},1000);
運(yùn)行效果:
[].constructor.constructor('debugger')()
攔截示例:
var constructor_backup = [].constructor.constructor;
[].constructor.constructor = function(a){
if(a=="debugger"){
console.log("攔截了debugger,中斷不會(huì)發(fā)生3");
}else{
constructor_backup(a);
try {
[].constructor.constructor('debugger')();
} catch (error) {
console.error("Anti debugger");
運(yùn)行效果:
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.