JavaScript 的 Anti-Debugging 技術( 三 )

九、灌爆 console另一個有趣的 side-channel 是透過大量寫入各種資訊並衡量所需時間 。
以前有一種方法是,不斷地建立新的 DOM element,並計算所需時間,如果所需時間太長,可能就是 DevTools 有開啟,因為當 DevTools 開啟時若 DOM tree 有改變則會需要在 DevTools 中標示出改變,這個動作很吃效能,會導致新增 DOM element 的速度變慢 。然而這方法已經不能用了 。
現在有另一個方法是,不斷寫資料到 console 並計算所需時間,如果所需時間過長,可能就是瀏覽器忙著把資料輸出到 DevTools,代表 DevTools 有開啟 。
1 2 3 4 5 6 7 8 9101112function measure() {const start = performance.now();for (let i = 0; i < 100; i++) {console.log(i);console.clear();}const time = performance.now() - start;if (time > threshold) {// DevTools are open.}}setInterval(measure, 1000); 這個方法的一個缺陷是,如果使用者電腦太慢,可能會導致 false positive 或是拖垮網頁效能 。
後記以上總共討論了九種 anti-debugging 的方法 。方法與 code 主要出自 U Can’t Debug This: Detecting JavaScript Anti-Debugging Techniques in the Wild,除了少數幾個範例為了呈現品質而有調整 。另外我也參考了這篇 Stackoverflow 問題 。如果想對這議題有更多了解,例如該怎麼偵測 anti-debugging techniques、哪些方法被廣泛使用之類的,可以看看原始論文 。

  • Author: Allen Chou
  • Link: https://blog.allenchou.cc/post/js-anti-debugging/




推荐阅读