JavaScript 奇技淫巧:debugger 攔截
debugger 指令,一般用於調試,在如瀏覽器調試執行環境中,可以在 JavaScript 代碼中產生中斷。
如果想要攔截 debugger,是不容易的,常用的函數替代、proxy 方法均對它無效,如:
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);
以上兩方法,都無法對 debugger 生效。
而 debugger 有多種寫法,如:
1、debugger
;
2、Function("debugger").call()
;
3、eval("debugger")
;
4、setInterval(function(){debugger;},1000)
;
5、[].constructor.constructor('debugger')()
;
最原始的 debugger,想要攔截這一個單詞,確實是似乎不可行,但它在現實中的使用頻率是不高的,更多的是後面幾種用法。
這是因爲,debugger 更多的被人們用於反調試,比如用 JShaman 對 JavaScript 代碼進行混淆加密後,就可以被加入多種不同的 debugger 指令用於反調試。
而上面展示的後 4 種用法,是可以在代碼中進行攔截的。
Function("debugger").call()
攔截示例:
Function_backup = Function;
Function = function(a){
if (a =='debugger'){
console.log("攔截了debugger,中斷不會發生1")
return Function_backup("console.log()")
}else{
return Function_backup(a)
}
}
Function("debugger").call();
運行效果:
eval("debugger")
攔截示例:
eval_backup = eval;
eval = function(a){
if(a=='debugger'){
console.log("攔截了debugger,中斷不會發生0")
return ''
}else{
return eval_backup(a)
}
}
eval("debugger");
運行效果:
setInterval(function(){debugger;},1000)
攔截示例:
var setInterval_backup = setInterval
setInterval = function(a,b){
if(a.toString().indexOf('debugger') != -1){
console.log("攔截了debugger,中斷不會發生2")
return null;
}
setInterval_backup(a, b)
}
setInterval(function(){
debugger;
},1000);
運行效果:
[].constructor.constructor('debugger')()
攔截示例:
var constructor_backup = [].constructor.constructor;
[].constructor.constructor = function(a){
if(a=="debugger"){
console.log("攔截了debugger,中斷不會發生3");
}else{
constructor_backup(a);
}
}
try {
[].constructor.constructor('debugger')();
} catch (error) {
console.error("Anti debugger");
}
運行效果:
- EOF -
作者:@w3sft:)
原文:https://zhuanlan.zhihu.com/p/624988530
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/vtZFzDJNMPTX6e4Brlfdbw