
文章插图
JAVAScript 運行在客戶端,多數 Browser 亦有很強的 debugger,有時為了保護程式碼的邏輯不被破解或想要藏惡意程式之類的,會想辦法讓分析者沒辦法輕易分析原始碼 。通常又可以分為阻撓靜態分析(例如 obfuscation)和動態分析(例如 anti-debugging) 。這篇文章會介紹 JavaScript 的一些 anti-debugging 的方法,討論可以如何讓分析者沒辦法在 browser 上用 debugger 或甚至偵測自己是否正在被 debug,並分析他們的優劣與可能破解方法 。
這篇文章是 U Can’t Debug This: Detecting JavaScript Anti-Debugging Techniques in the Wild 的部份重點整理,該文發表於 USENIX Security 2021 。該文其實遠不只 anti-debugging 技術,不過因為他們分析做得很好,所以想針對這部份做重點整理 。
背景雖然我猜會看這篇文章的人應該都有概念 debugging 長怎樣,不過還是簡單講一下 。一般來說,如果要在 browser 上做 debugging,通常會使用 DevTool 給的 Debugger 。召喚方法大概是這樣的:對著網頁(恩,你現在就正在看的)點右鍵,按「檢視」 / “Inspect”(至少在 Firefox 上長這樣),就會看到 DOM 被解析的樣子,然後點 Debugger,便可以看到 JavaScript code,也可以下 breakpoint 。除了人工上 breakpoint,也可以在 JavaScript code 裡面用 debugger 直接下 breakpoint 。
為了避免自己的 code 分析,有些人會希望阻撓 manual analysis,或更好的狀況是,知道自己正在被 debug,也許可以有不同的行為(例如很多 malware 可能發現自己正在被分析,就開始裝死以隱藏其原先的 behavior) 。我們大致可以把策略分成三種:阻礙 debug、改變 debugger 行為、偵測是否在 debug 。
阻礙 Debugger 開啟一、攔截 DevTools 開啟的快捷鍵一種雖然無腦但偶而會有效的方法是,直接禁止使用者嘗試打開 DevTools,自然也就沒辦法使用 debugger 了 。一般來說打開 DevTools 有三種方法:按 F12、點右鍵選「檢視」(如前述)、從瀏覽器選單找到 DevTools 。前兩種方法在使用時都會在網頁上觸發一些 event,例如按鍵盤會有 keydown,滑鼠點右鍵會有 oncontextmenu,只要去聽特定的 event 並阻撓其行為,就可以避免 DevTools 開啟 。
1 2 3 4 5 6 7 8 910【JavaScript 的 Anti-Debugging 技術】window.addEventListener("keydown", function(event){if (event.key == "F12") {event.preventDefault();return false;}});window.oncontextmenu = (event) => {event.preventDefault();return false;}; 然而破解方法也很簡單,一來是如果要看 source code,大可直接用 view-source: ...,二來是就算真的想用 DevTools,從瀏覽器選單選 DevTools 就可以了 。二、塞入大量 breakpoint另一種惱人的方法是,在 code 裡面塞一堆 debugger 來預設 breakpoint,一般來說執行時 runtime 會直接忽略這些 breakpoint,但只要分析者一打開 debugger,把上就會被一堆 breakpoint 阻撓,完全沒辦法順利 debug 。
不過要阻止的方法很簡單 。首先,有些 browser 可以設定忽略特定 breakpoint,不過可以透過不斷建立新的 anonymous function 並在其中塞 debugger 來解決(因為對 browser 來說,anonymous function 的 breakpoint 是全新、未見過的) 。另一個方法則是直接忽略特定區段裡面的所有 debugger,有些 browser extension 可以作到這件事 。
三、不斷清除 console有些人 debug 的習慣是把訊息 output 到 console,或是可以透過在 console 執行一些 code 來改變變數數值,藉此分析程式行為 。因此,如果不斷地用 console.clear 把 console 清空,會對分析者造成不小的困擾 。
123setInterval(function() {console.clear();}, 100); 改變 Debugger 行為四、覆蓋掉預設 function 的行為JavaScript 有個令人又愛又恨的特性是,幾乎所有的內建 function 都可以被覆蓋 。許多人 debug 時會仰賴 console.log 或 alert,只要覆蓋掉某些 function,就有機會阻止分析者 debug,甚至適時地回報某個分析者可能正在嘗試 debug 。舉例來說,Spotify 之前有一段 code 就覆蓋掉 alert 預設的行為,因為不少 bug hunter 會用 alert來檢驗 XSS 有沒有成功,如此則就算 XSS 成功呼叫 alert,也只會偷偷地回傳參數,而不會真的噴出彈跳視窗 。
12345678// WrApping funcs in a naive attempt to catch externally found XSS vulns(function(fn) { window.alert = function() {var args = Array.prototype.slice.call(arguments);_doLog('alert', args);return fn.apply(window, args); };}(window.alert));
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 工厂模式:将对象的创建与使用分离,提高程序可维护性和可扩展性
- 从不同维度分析:Linux与Windows的区别
- 你应该知道的18个Python函数
- 周冬雨|周冬雨戛纳造型惨遭网友嫌弃,网友言语粗鄙,但说的好有道理!
- 自驾318川藏线,有哪些值得推荐的景点?我选了这5个地方
- 如何更好的选择白酒?
- 松茸和姬松茸的区别您知道多少
- 刚从街道办事处辞职,我来告诉你们事业编的真实工资
- 自动挡上的P、R、N、D、S、L和M,表示什么意思?一句口诀教会你
- 车险的5种买法,优缺点对比,看看哪种更适合您
