天天看點

硬體安全與惡意代碼: Linux Hooking(鈎子)機制原理與實作Hooking簡介Hook實作的一般方法Linux的Hook應用pcileech3.7中的鈎子基礎知識補充參考文獻

Hooking簡介

Hooking技術是一系列技術的通稱,通過攔截在軟體構件之間傳遞的 函數調用(function calls)/資訊(messages)/事件(events) 來改變OS, 應用(application)或者其他軟體構件的行為. 譬如改變準備調用的函數指針使之指向需要的hook函數,在執行了hook函數之後再傳回原來的函數指針。

當我們試圖用一段代碼來分析程式中某段邏輯路徑被執行的頻率,或者想要在其中插入更多功能時就會用到鈎子.

通過Hook, 我們可以暫停系統調用,或者通過改變系統調用的參數來改變正常的輸出結果,甚至可以中止一個目前運作中的程序并且将控制權轉移到自己手上.

這種用來實作hooking技術的代碼叫做hook(鈎子).

調試(debugging)

拓展函數功能

  • 攔截鍵盤/滑鼠資訊
  • 攔截作業系統調用
  • 度量3D遊戲幀率

惡意代碼(rootkits)

Hook實作的一般方法

1.在應用運作之前更改源

通過逆向工程修改可執行檔案或者庫,通常用來攔截函數調用,進而監控或者完全替換掉調用

1.1

通過反彙編器,可以找到在一個子產品裡面的函數入口點。更改入口點進而動态地加載我們需要的庫

1.2

修改可執行檔案的入口表

入口表修改之後可以加載任何附加的的庫子產品,同時在應用程式調用函數時修改外部代碼的調用

1.3

通過包裝庫(wrapper library)攔截函數調用。

包裝庫:滿足所有原庫可調用的函數,并附加了自己的實作

2.運作時(runtime) 修改

作業系統和會提供途徑讓我們在運作時很容易地插入hook(需要插入hook的程序有足夠的權限)

當作業系統沒有提供這一功能時。可以使用修改記憶體中的中斷向量表,入口描述符表的方法(對于有共享庫的作業系統)。(實質上這種辦法也是修改代碼,隻是在運作時更改程序記憶體中的指令和結構).

Unix系統用LD_PRELOAD環境變量輕松地實作了函數重載,當你在建立了一個已經存在的共享函數庫中的函數時,你會在DYLD_INSERT_LIBRARIES注冊你自己的函數,這樣就會調用自己的函數了。

Linux的Hook應用

ptrace(在執行系統調用之前)

linux下系統調用hook機制主要靠下面兩個機制

LD_PRELOAD機制:允許使用者手動指定使用的動态連結庫,将系統庫函數hook->lib.so.6

dlyopen,dlsym: 通過句柄和連接配接符名稱擷取真實庫函數名或者變量名

ptrace由linux作業系統核心提供,可觀察和控制其他程序的執行, 并且可以檢查和修改其核心鏡像和寄存器. 通常用來

作為調試器(例如gdb)或用來跟蹤各種其他系統調用.

ptrace追蹤示意圖

硬體安全與惡意代碼: Linux Hooking(鈎子)機制原理與實作Hooking簡介Hook實作的一般方法Linux的Hook應用pcileech3.7中的鈎子基礎知識補充參考文獻

一個使用gdb調試,修改printf列印内容的例子

https://www.linuxidc.com/Linux/2012-04/57910p5.htm

pcileech3.7中的鈎子

https://github.com/ufrisk/pcileech

to do

基礎知識補充

Rootkit

Intel的x86處理器是通過Ring級别來進行通路控制的,級别共分4層,從Ring0到Ring3。R0層擁有最高的權限,R3層擁有最低的權限。按照Intel原有的構想,應用程式工作在R3層,隻能通路R3層的資料;作業系統工作在R0層,可以通路所有層的資料;而其他驅動程式位于R1、R2層,每一層隻能通路本層以及權限更低層的資料。

這應該是很好的設計,這樣作業系統工作在最核心層,沒有其他代碼可以修改它;其他驅動程式工作在R1、R2層,有要求則向R0層調用,這樣可以有效保障作業系統的安全性。但現在的OS,包括Windows和Linux都沒有采用4層權限,而隻是使用2層——R0層和R3層,分别來存放作業系統資料和應用程式資料,進而導緻一旦驅動加載了,就運作在R0層,就擁有了和作業系統同樣的權限,可以做任何事情,而所謂的rootkit也就随之而生了。

rootkit是一組計算機軟體(通常為惡意),旨在允許通路計算機或其軟體的某個不允許通路的區域(例如未經授權的使用者通路),并常常隐藏其存在。

Rootkit安裝可以自動化,或者攻擊者可在獲得root或管理者通路權限後安裝rootkit。獲得這種通路權是直接攻擊系統的結果,即利用已知的漏洞(如特權更新)或密碼(通過破解或“網絡釣魚”之類的社會工程政策獲得)。一旦安裝,就可以隐藏入侵并維護特權通路(關鍵是root或管理者的特權)。對一個系統的完全控制意味着可以修改現有的軟體,包括可能被用來檢測或繞過它的軟體。

Rootkit檢測是困難的,因為Rootkit可能會阻礙自己可能被檢測到的途徑。檢測方法包括使用可信作業系統、基于行為的方法、簽名掃描、差異掃描和記憶體轉儲分析等等。删除可能很複雜,或者實際上是不可能的,特别是在rootkit駐留在核心中的情況下;重新安裝作業系統可能是解決這個問題的唯一可行方案。當處理固件rootkit時,删除可能需要更換硬體。

共享庫(shared library)

共享庫是可以在執行過程中加載到與程序關聯的記憶體空間中的代碼對象。庫代碼可以在記憶體中由多個程序共享,也可以在磁盤上共享。如果使用虛拟記憶體,程序執行相同的RAM實體頁面,并映射到每個程序的不同位址空間。這是有好處的。例如,在一些系統上,應用程式的大小通常隻有幾百kb,并且加載速度很快;它們的大部分代碼位于已經被作業系統加載用于其他目的的庫中。

為了改變另一個程序裡面的代碼,我們需要在另一個程序的位址空間中載入自己的共享庫。在Unix平台上用LD_PRELOAD環境變量可以實作這個功能

ps: 在windows平台上需要用DDL注入(事實上windows的.dll==linux的.so==MAC-OSX的 .dylib)

參考文獻

[1] https://en.wikipedia.org/wiki/Hooking

[2] http://ntvalk.blogspot.com/2013/11/hooking-explained-detouring-library.html

[3] https://www.cnblogs.com/pannengzhi/p/5203467.html

[4]https://www.linuxidc.com/Linux/2012-04/57910.htm

[5]https://blog.csdn.net/swartz_lubel/article/details/79312047

繼續閱讀