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

文章目錄
本系列文章所討論的 JavaScript 資安與逆向工程技術,旨在分享知識、探討防禦之道,並促進技術交流。
所有內容僅供學術研究與學習,請勿用於任何非法或不道德的行為。
讀者應對自己的行為負完全責任。尊重法律與道德規範是所有技術人員應共同遵守的準則。
什麼是 Hook
Hook 的字面意思
「Hook」直譯就是「鉤子」。
在程式中的意義
在程式設計與逆向工程的領域中,Hook 代表一種 「攔截機制」,允許開發者(或攻擊者)在程式的正常執行流程中「插入」自定義的邏輯。
常見的 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')

Hook 的流程
保存原始函數
我們首先將原本的 console.log 函數保存到一個名為 __consoleLog__ 的變數中,這麼做的目的,是避免在覆寫後遺失原始的執行邏輯。
覆寫並加入監聽
接著,我們重新定義 console.log,讓它成為一個新的函數,並在其中加入我們設計的「監聽」程式碼。
使用 apply 呼叫原始邏輯
在新函數中,透過 __consoleLog__.apply(this, arguments) 呼叫原始的 console.log。
為什麼要用 apply?
- apply 方法:允許我們以指定的 this 與參數陣列來執行函數。
- this 關鍵字:確保原始函數在執行時,其內部的 this 維持正確的綁定。
- arguments 物件:包含了呼叫該函數時傳入的所有參數,讓我們能完整地轉交給原始的 console.log。
保留功能並額外執行
透過這樣的設計,我們能在 console.log 被呼叫時,額外執行自訂的日誌紀錄程式碼,同時保留它原有的功能,不會影響核心的輸出邏輯。