我們知道,應用程序總是離不開系統內核所提供的服務,比如它要使用內存的時候,只要跟操作系統申請就行了,而不用自己操心哪里有空閑的內存空間等問題,實際上,這些問題是由操作系統的內核來代勞的。站在黑客的角度講,如果能夠控制內核,實際上就是控制了內核之上的各種應用程序。本文將向您介紹如何建立內核級鉤子來控制操作系統向上提供的各種低級功能。有了內核級鉤子,我們不但能夠控制、監視其他程序并過濾有關數據,還能用其實現Rootkit本身及其它程序的隱形。
本文首先回顧系統調用表和內存保護方面的知識,然后講解如何實現內核鉤子,最后對一些重要的內核函數進行了簡要的說明。
一、系統調用表
系統調用表又稱系統服務表或者服務描述符表,是Windows 內核在進行各種系統操作時所需的一個函數指針表。也就是說,這個表中存放的是提供系統服務的各種函數的地址。當然,該表所指向的都是系統自身的一些函數,但是,如果我們對它做了手腳后,就可以讓它指向我們自己的函數。這正是本文要講解的重點。
讀者一定要注意,修改系統調用表及替換內核函數時,會對系統全局產生影響,稍有不慎就會導致系統崩潰。所以,下手之前,最好對表中的各個函數要有足夠的認識,然后才好用我們自己的函數替換這些內核函數的方法。你對它們了解得越多越深,在實現內核鉤子的時候就越順手。但話又說回來,這個系統調用表中的表項實在是太多了,有的指向字符串操作,有的指向客戶機/服務器操作,等等。所以要在短時間內了解所有表項是不可能的,所以下文中對它們只做有選擇的、概括的介紹。
二、內存保護
現代的Windows操作系統通常將系統調用表所在內存頁設為只讀來提供保護。如果不能克服這個問題,實施內核鉤子技術就是癡人說夢。因為試圖向只讀內存寫入數據也即修改只讀內存區時,立刻就會藍屏。為此,先讓我們來了解一下內存保護方面的有關知識。
內存描述符表是內存保護的一大關鍵,具體定義詳見微軟DDK中的ntddk.h頭文件,我們這里僅做簡要介紹:
typedef struct _MDL { struct _MDL *Next; CSHORT Size; CSHORT MdlFlags; struct _EPROCESS *Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; #define MDL_MAPPED_TO_SYSTEM_VA 0x0001 #define MDL_PAGES_LOCKED 0x0002 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 #define MDL_ALLOCATED_FIXED_SIZE 0x0008 #define MDL_PARTIAL 0x0010 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 #define MDL_IO_PAGE_READ 0x0040 #define MDL_WRITE_OPERATION 0x0080 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 #define MDL_FREE_EXTRA_PTES 0x0200 #define MDL_IO_SPACE 0x0800 #define MDL_NETWORK_HEADER 0x1000 #define MDL_MAPPING_CAN_FAIL 0x2000 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \ MDL_PAGES_LOCKED | \ MDL_SOURCE_IS_NONPAGED_POOL | \ MDL_PARTIAL_HAS_BEEN_MAPPED | \ MDL_PARENT_MAPPED_SYSTEM_VA | \ MDL_SYSTEM_VA | \ MDL_IO_SPACE ) |
共4頁: 1 [2] [3] [4] 下一頁 | ||||||
|