鐵人賽 Day 10 什麼是 Hook?駭客常用的攔截技巧

鐵人賽 Day 10 什麼是 Hook?駭客常用的攔截技巧
鐵人賽 Day 10 什麼是 Hook?駭客常用的攔截技巧

本系列文章所討論的 JavaScript 資安與逆向工程技術,旨在分享知識、探討防禦之道,並促進技術交流。

所有內容僅供學術研究與學習,請勿用於任何非法或不道德的行為。

讀者應對自己的行為負完全責任。尊重法律與道德規範是所有技術人員應共同遵守的準則。

「Hook」直譯就是「鉤子」。

在程式設計與逆向工程的領域中,Hook 代表一種 「攔截機制」,允許開發者(或攻擊者)在程式的正常執行流程中「插入」自定義的邏輯。

  • 前置 Hook:在函式執行之前攔截,先行處理。
  • 後置 Hook:在函式執行之後攔截,追加處理。
  • 取代 Hook:完全取代原本的函式邏輯。

 

在逆向的過程中我們可以透過Hook技術來觀察到函式被使用前後參數的差異以及在Hook中下斷點進而快速找到目標邏輯。

因為 JavaScript 語言的特性,要實現起Hook的方法相對簡單容易。

我們可以直接存取並重新定義一個函數,就像是在替換一個變數的值一樣。

以下範例是將常用的console.log進行Hook

// 先將 console.log 存放到 __consoleLog__ 變數中
const __consoleLog__ = console.log
// 複寫 console.log 
console.log = function(){
    __consoleLog__.apply(this, ['start hook'])
    __consoleLog__.apply(this, arguments)
    __consoleLog__.apply(this, ['end hook'])
}
console.log('hello')
1.jpg

我們首先將原本的 console.log 函數保存到一個名為 __consoleLog__ 的變數中,這麼做的目的,是避免在覆寫後遺失原始的執行邏輯。

接著,我們重新定義 console.log,讓它成為一個新的函數,並在其中加入我們設計的「監聽」程式碼。

在新函數中,透過 __consoleLog__.apply(this, arguments) 呼叫原始的 console.log。

  • apply 方法:允許我們以指定的 this 與參數陣列來執行函數。
  • this 關鍵字:確保原始函數在執行時,其內部的 this 維持正確的綁定。
  • arguments 物件:包含了呼叫該函數時傳入的所有參數,讓我們能完整地轉交給原始的 console.log。

透過這樣的設計,我們能在 console.log 被呼叫時,額外執行自訂的日誌紀錄程式碼,同時保留它原有的功能,不會影響核心的輸出邏輯。

作者頭像
Nick

擅長從前端的互動設計到後端的資料處理,都能親自規劃與實作。對我來說開發網站不只是完成功能,而是打造一個能被真正使用、體驗順暢的平台。我喜歡把複雜的技術轉化成簡單好懂的成果,並在這個過程中持續學習與挑戰自己。