在操作以下内容之前,请先完成这个文章中的内容 源码拉取及编译
如果你已经完成了文章中的配置,就可以进行下面的操作了。
在浏览器中实现"无限 debugger"的反调试技术是一种常见的手段,用于防止他人通过开发者工具对网页进行调试或逆向分析。这种技术的核心是利用 JavaScript 的 debugger 语句,当开发者工具打开时,debugger 会触发断点,从而阻止代码继续执行。
以下是如何实现"无限 debugger"的几种方式
使用 setInterval
javascript
setInterval(() => {
debugger;
}, 100);
递归调用
javascript
function infiniteDebugger() {
debugger;
infiniteDebugger();
}
infiniteDebugger();
事件监听
javascript
document.addEventListener('keydown', (event) => {
if (event.key === 'F12' || (event.ctrlKey && event.shiftKey && event.key === 'I')) {
debugger;
}
});
document.addEventListener('contextmenu', (event) => {
debugger;
});
检测开发者工具状态
javascript
setInterval(() => {
const start = performance.now();
debugger;
const end = performance.now();
// 如果执行时间过长,说明开发者工具可能已打开
if (end - start > 100) {
console.clear(); // 清空控制台
debugger; // 再次触发断点
}
}, 500);
使用console.debug
javascript
const hook = new Error()
let num = -1
Object.defineProperty(hook, "stack", {
get: function () {
num += 1
num ? debugger : ''
return num;
}
});
function isOpenDevTool() {
num = -1
console.debug(hook);
hook.stack
requestAnimationFrame(isOpenDevTool);
}
requestAnimationFrame(isOpenDevTool);
在了解实现原理后,我们现在的思路是让 debugger 关键字像 JavaScript 中的其他独立关键字一样,无需特定上下文即可单独执行。以下是一些可以在 JavaScript 中独立执行且不需要特定上下文的关键字示例:
javascript
true;
false;
this;
null;
undefined;
NaN;
Infinity;
-Infinity;
这些关键字在 JavaScript 中具有独立的意义和用途,我们的目标是使 debugger 关键字也能以类似的方式运行。
以下为修改路径
sh
\src\v8\src\parsing\keywords-gen.h
我们将debugger关键字改成和null一样,当然,你也可以改成其他的,前提是这个关键字可以单独运行,不依赖其他参数和上下文。 修改保存之后,执行以下命编译
sh
autoninja -C out/Default chrome
验证一下结果,可以看到,运行debugger和null是等价的,这样,他几不会报错,也不会断点卡住。