FineArt News

Hook API讓應用程式乖乖轉彎,駭客也是這麼做

我們知道,一些應用程式在設計完成後,就已經定版了,程式會依照特定的邏輯運行,除非拿到原始碼,修改後,重新編譯,否則無法更改程式的既定流程。例如:Notepad.exe 在原始的設計上可以開啟硬碟上的任何檔案,如果我們希望一個特別的 Notepad.exe 不能開啟在 C:\Security 目錄下的檔案,顯然和原始的設計不符。如果要達成上述的目標,強迫改變Notepad的行為,就必須使用Hook API的技術。駭客和安全防護間的攻防,也常會使用 Hook API 技術,來改變某些應用程式的行為,所以有必要進一步瞭解 Hook API 技術是什麼。

 

Windows架構簡介

我們必須先對 Windows 架構做一個簡單的說明,幫我們進一步清楚 Hook API 的流程中,為什麼須要一個名為注入程式的動作。

下圖是兩個應用程式 Myhook.exe、Notepad.exe 在 Windows 中記憶體的分佈圖,首先我們可以看出,記憶體區分成上、下兩半部,上半部是 User 區,一般常見的應用程式,就是載入到此區,而下半部是 Kernel 區,包含我們常見的各種軟、硬體 Driver。

上半部 User 區有一個特色,就是利用虛擬記憶體的技術,把應用程式分到同一位置的不同的區域,這樣的隔離方案,讓每個應用程式,都只能看見專屬於自己的 User 區,所以即使 Myhook當掉,也不會影響到 Notepad。

User 區的隔離方案,對於 Hook API 很不友善,因為我們希望透過 Myhook 的執行,修改 Notepad 的行為,但是由於兩個程式執行在不同的世界,所以 Myhook 基本上無法接觸 Notepad。

 

注入程式方案 

好在注入方案提供給我們探索另一個世界的工具,簡單的說,我們希望丟一段程碼,到另一個世界去執行,如下圖: MyHook利用 Inject DLL 將 MyHook.dll 送到 Notepad 的新世界。


方案一: 我們可以使用 Windows 的標準 Hook,例如: CBT Hook,Mouse Hook,Keyboard Hook … 等,適當的設定這些 Hook 後,一但 Notepad 執行時,會觸發對應的 Hook,就可以自動的載入 Hook.dll。Inject DLL 是一種描述注入程式的方法,有點神奇,是如何做到的呢? 一般來說,有兩種實作方案:

方案二: 有足夠的權限時,可以使用 CreateRemoteThread API 讓 Myhook 主動對 Notepad 進行遠端注入 Hook.dll。

透過上述的 2 種方案,我們就可以跨過 Windows User 區的隔離,送出一段可執行的程式到 Notepad。

著名的勒索軟體 NetWalker 就是利用方案二,對 Explorer 進行遠端注入勒索程式的主體,一但被注入成功,勒索軟體就可披著 Explorer 的外皮大量的破壞;反觀很多安全軟體,都認為 Explorer是安全的程式,因此無法阻擋 NetWalker。

 

 

Hook API

我們瞭解了Windows 中虛擬記憶體的架構,再辛苦的用注入方式,將 Hook.dll送到 notepad 的世界,這整個注入程式的流程,就是一般常見的入侵方式。

注入程式完成後,才算做完Hook API 的前置動作。

Hook 是勾子的意思,下圖說明如何進行 Hook API: 我們希望能勾住 Notepad 的 CreateFile API。


最後處理完後,必須要返回原本的 CreateFile API ( 上例為 ChainOldCreateFile ) 。Hook API 時,會針對要 Hook 的 API,修正 API 的進入點 ( 上例為: Jmp MyCreateFile ),將所有 Notepad CreateFile 的動作,導入Hook.DLL 中的 MyCreateFile 中,我們可以在此點,檢查 Notepad 要開啟那些檔案,例如: 由 CreateFile 的參數中,檢查是否開啟 C:\Security 目錄下的檔案。

在整個 Hook API 的過程中,可憐的Notepad 完全無感,他只知道使用了 Windows API CreateFile,並不知道這個 API 已經被 Hook了,事實上,被 Hook 的 CreateFile 會偷偷的被導向到 Hook.dll 中的 MyCreateFile,這是我們寫替代 CreateFile 的程式,可以為所欲為,針對 Notepad 所有呼叫 CreateFile 的動作,進行記錄或是阻擋。

 

結論

本文中介紹了由一程式 ( MyHook.Exe ) 入侵另一程式 ( Notepad.exe ) 的注入流程,並在注入後,使用 Hook API 技術,攔截 Notepad 使用 CreateFile,並將之導向到我們注入的 Hook.dll。

經由上述流程,我們即可改變 Notepad.exe 的行為,讓他無法讀取 C:\Security 目錄下的檔案。

Hook API 可以用在好的方面,例如:有些翻譯軟體,有螢幕取字的功能,只要將滑鼠移到英文字上,就可自動翻成中文,這個功能就是 Hook API 的應用。

反之,Hook API 也是屠龍刀,駭客也可以使用這種技術,做出強大的工具,例如: 我們常見的密碼竊取功能,使用者的行為紀錄,甚至更高級的功能,可以繞開 Windows 的權限控管,直接取得管理員權限… 等,這些常見的駭客手段,都是使用 Hook API 來達成。

希望本文對大家有幫助。