魔改chromium源码——绕过无限debugger反调试

在进行以下操作之前,请确保已完成之前文章中提到的 源码拉取及编译 部分。

如果已顺利完成相关配置,即可继续执行后续操作。


在浏览器中实现“无限 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 是等价的。这种情况下,程序既不会抛出错误,也不会因断点而中断执行。

在这里插入图片描述
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP