我們知道,應(yīng)用程序總是離不開系統(tǒng)內(nèi)核所提供的服務(wù),比如它要使用內(nèi)存的時候,只要跟操作系統(tǒng)申請就行了,而不用自己操心哪里有空閑的內(nèi)存空間等問題,實際上,這些問題是由操作系統(tǒng)的內(nèi)核來代勞的。站在黑客的角度講,如果能夠控制內(nèi)核,實際上就是控制了內(nèi)核之上的各種應(yīng)用程序。本文將向您介紹如何建立內(nèi)核級鉤子來控制操作系統(tǒng)向上提供的各種低級功能。有了內(nèi)核級鉤子,我們不但能夠控制、監(jiān)視其他程序并過濾有關(guān)數(shù)據(jù),還能用其實現(xiàn)Rootkit本身及其它程序的隱形。
本文首先回顧系統(tǒng)調(diào)用表和內(nèi)存保護方面的知識,然后講解如何實現(xiàn)內(nèi)核鉤子,最后對一些重要的內(nèi)核函數(shù)進(jìn)行了簡要的說明。
一、系統(tǒng)調(diào)用表
系統(tǒng)調(diào)用表又稱系統(tǒng)服務(wù)表或者服務(wù)描述符表,是Windows 內(nèi)核在進(jìn)行各種系統(tǒng)操作時所需的一個函數(shù)指針表。也就是說,這個表中存放的是提供系統(tǒng)服務(wù)的各種函數(shù)的地址。當(dāng)然,該表所指向的都是系統(tǒng)自身的一些函數(shù),但是,如果我們對它做了手腳后,就可以讓它指向我們自己的函數(shù)。這正是本文要講解的重點。
讀者一定要注意,修改系統(tǒng)調(diào)用表及替換內(nèi)核函數(shù)時,會對系統(tǒng)全局產(chǎn)生影響,稍有不慎就會導(dǎo)致系統(tǒng)崩潰。所以,下手之前,最好對表中的各個函數(shù)要有足夠的認(rèn)識,然后才好用我們自己的函數(shù)替換這些內(nèi)核函數(shù)的方法。你對它們了解得越多越深,在實現(xiàn)內(nèi)核鉤子的時候就越順手。但話又說回來,這個系統(tǒng)調(diào)用表中的表項實在是太多了,有的指向字符串操作,有的指向客戶機/服務(wù)器操作,等等。所以要在短時間內(nèi)了解所有表項是不可能的,所以下文中對它們只做有選擇的、概括的介紹。
二、內(nèi)存保護
現(xiàn)代的Windows操作系統(tǒng)通常將系統(tǒng)調(diào)用表所在內(nèi)存頁設(shè)為只讀來提供保護。如果不能克服這個問題,實施內(nèi)核鉤子技術(shù)就是癡人說夢。因為試圖向只讀內(nèi)存寫入數(shù)據(jù)也即修改只讀內(nèi)存區(qū)時,立刻就會藍(lán)屏。為此,先讓我們來了解一下內(nèi)存保護方面的有關(guān)知識。
內(nèi)存描述符表是內(nèi)存保護的一大關(guān)鍵,具體定義詳見微軟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] 下一頁 | ||||||
|


