在進行以下操作之前,請確保已完成之前文章中提到的 源碼拉取及編譯 部分。
如果已順利完成相關配置,即可繼續執行后續操作。
在瀏覽器中實現“無限 debugger”的反調試技術是一種常見的手段,用于防止他人通過開發者工具對網頁進行調試或逆向分析。這種技術的核心是利用 JavaScript 的 debugger 語句,當開發者工具打開時,debugger 會觸發斷點,從而阻止代碼繼續執行。
以下是如何實現“無限 debugger”的幾種方式
使用 setInterval
setInterval(() => {debugger;
}, 100);
遞歸調用
function infiniteDebugger() {debugger;infiniteDebugger();
}
infiniteDebugger();
事件監聽
document.addEventListener('keydown', (event) => {if (event.key === 'F12' || (event.ctrlKey && event.shiftKey && event.key === 'I')) {debugger;}
});document.addEventListener('contextmenu', (event) => {debugger;
});
檢測開發者工具狀態
setInterval(() => {const start = performance.now();debugger;const end = performance.now();// 如果執行時間過長,說明開發者工具可能已打開if (end - start > 100) {console.clear(); // 清空控制臺debugger; // 再次觸發斷點}
}, 500);
使用console.debug
const hook = new Error()
let num = -1
Object.defineProperty(hook, "stack", {get: function () {num += 1num ? debugger : ''return num;}
});
function isOpenDevTool() {num = -1console.debug(hook);hook.stackrequestAnimationFrame(isOpenDevTool);
}
requestAnimationFrame(isOpenDevTool);
在了解實現原理后,我們現在的思路是讓 debugger 關鍵字像 JavaScript 中的其他獨立關鍵字一樣,無需特定上下文即可單獨執行。以下是一些可以在 JavaScript 中獨立執行且不需要特定上下文的關鍵字示例:
true;
false;
this;
null;
undefined;
NaN;
Infinity;
-Infinity;
這些關鍵字在 JavaScript 中具有獨立的意義和用途,我們的目標是使 debugger 關鍵字也能以類似的方式運行。
以下為修改路徑
\src\v8\src\parsing\keywords-gen.h
我們將 debugger 關鍵字替換為與 null 等效的值。當然,也可以選擇其他關鍵字,但需確保其能夠獨立運行,且不依賴任何參數或上下文環境。
修改保存之后,執行以下命編譯
autoninja -C out/Default chrome
經過驗證可以發現,運行 debugger 語句的效果與返回 null 是等價的。這種情況下,程序既不會拋出錯誤,也不會因斷點而中斷執行。