iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Security

走進資安現場: JavaScript資安逆向工程超實戰系列 第 10

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

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250910/20169775RtK9rJ9Ne2.jpg

本系列文章所討論的 JavaScript 資安與逆向工程技術,旨在分享知識、探討防禦之道,並促進技術交流。
所有內容僅供學術研究與學習,請勿用於任何非法或不道德的行為。
讀者應對自己的行為負完全責任。尊重法律與道德規範是所有技術人員應共同遵守的準則。

本文同步發佈:https://nicklabs.cc/what-is-hook-js-reverse-engineering

什麼是 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')

https://ithelp.ithome.com.tw/upload/images/20250910/20169775mWBlM6whOl.jpg

Hook 的流程

保存原始函數

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

覆寫並加入監聽

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

使用 apply 呼叫原始邏輯

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

為什麼要用 apply?

apply 方法:允許我們以指定的 this 與參數陣列來執行函數。

this 關鍵字:確保原始函數在執行時,其內部的 this 維持正確的綁定。

arguments 物件:包含了呼叫該函數時傳入的所有參數,讓我們能完整地轉交給原始的 console.log。

保留功能並額外執行

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


上一篇
Day 9 驗證參數的藏身之處
下一篇
Day 11 Object.defineProperty、Proxy 在 JavaScript 逆向中的應用
系列文
走進資安現場: JavaScript資安逆向工程超實戰15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言