青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長(zhǎng)網(wǎng)

17站長(zhǎng)網(wǎng) 首頁(yè) 安全 安全教程 查看內(nèi)容

Rootkit技術(shù)之內(nèi)核鉤子原理

2022-9-24 10:15| 查看: 2326 |來(lái)源: 互聯(lián)網(wǎng)

我們知道,應(yīng)用程序總是離不開(kāi)系統(tǒng)內(nèi)核所提供的服務(wù),比如它要使用內(nèi)存的時(shí)候,只要跟操作系統(tǒng)申請(qǐng)就行了,而不用自己操心哪里有空閑的內(nèi)存空間等問(wèn)題,實(shí)際上, ...

我們知道,應(yīng)用程序總是離不開(kāi)系統(tǒng)內(nèi)核所提供的服務(wù),比如它要使用內(nèi)存的時(shí)候,只要跟操作系統(tǒng)申請(qǐng)就行了,而不用自己操心哪里有空閑的內(nèi)存空間等問(wèn)題,實(shí)際上,這些問(wèn)題是由操作系統(tǒng)的內(nèi)核來(lái)代勞的。站在黑客的角度講,如果能夠控制內(nèi)核,實(shí)際上就是控制了內(nèi)核之上的各種應(yīng)用程序。本文將向您介紹如何建立內(nèi)核級(jí)鉤子來(lái)控制操作系統(tǒng)向上提供的各種低級(jí)功能。有了內(nèi)核級(jí)鉤子,我們不但能夠控制、監(jiān)視其他程序并過(guò)濾有關(guān)數(shù)據(jù),還能用其實(shí)現(xiàn)Rootkit本身及其它程序的隱形。
本文首先回顧系統(tǒng)調(diào)用表和內(nèi)存保護(hù)方面的知識(shí),然后講解如何實(shí)現(xiàn)內(nèi)核鉤子,最后對(duì)一些重要的內(nèi)核函數(shù)進(jìn)行了簡(jiǎn)要的說(shuō)明。

一、系統(tǒng)調(diào)用表

系統(tǒng)調(diào)用表又稱(chēng)系統(tǒng)服務(wù)表或者服務(wù)描述符表,是Windows 內(nèi)核在進(jìn)行各種系統(tǒng)操作時(shí)所需的一個(gè)函數(shù)指針表。也就是說(shuō),這個(gè)表中存放的是提供系統(tǒng)服務(wù)的各種函數(shù)的地址。當(dāng)然,該表所指向的都是系統(tǒng)自身的一些函數(shù),但是,如果我們對(duì)它做了手腳后,就可以讓它指向我們自己的函數(shù)。這正是本文要講解的重點(diǎn)。
讀者一定要注意,修改系統(tǒng)調(diào)用表及替換內(nèi)核函數(shù)時(shí),會(huì)對(duì)系統(tǒng)全局產(chǎn)生影響,稍有不慎就會(huì)導(dǎo)致系統(tǒng)崩潰。所以,下手之前,最好對(duì)表中的各個(gè)函數(shù)要有足夠的認(rèn)識(shí),然后才好用我們自己的函數(shù)替換這些內(nèi)核函數(shù)的方法。你對(duì)它們了解得越多越深,在實(shí)現(xiàn)內(nèi)核鉤子的時(shí)候就越順手。但話(huà)又說(shuō)回來(lái),這個(gè)系統(tǒng)調(diào)用表中的表項(xiàng)實(shí)在是太多了,有的指向字符串操作,有的指向客戶(hù)機(jī)/服務(wù)器操作,等等。所以要在短時(shí)間內(nèi)了解所有表項(xiàng)是不可能的,所以下文中對(duì)它們只做有選擇的、概括的介紹。

二、內(nèi)存保護(hù)

現(xiàn)代的Windows操作系統(tǒng)通常將系統(tǒng)調(diào)用表所在內(nèi)存頁(yè)設(shè)為只讀來(lái)提供保護(hù)。如果不能克服這個(gè)問(wèn)題,實(shí)施內(nèi)核鉤子技術(shù)就是癡人說(shuō)夢(mèng)。因?yàn)樵噲D向只讀內(nèi)存寫(xiě)入數(shù)據(jù)也即修改只讀內(nèi)存區(qū)時(shí),立刻就會(huì)藍(lán)屏。為此,先讓我們來(lái)了解一下內(nèi)存保護(hù)方面的有關(guān)知識(shí)。
內(nèi)存描述符表是內(nèi)存保護(hù)的一大關(guān)鍵,具體定義詳見(jiàn)微軟DDK中的ntddk.h頭文件,我們這里僅做簡(jiǎn)要介紹:
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 )


內(nèi)存描述符表(MDL)的作用是將虛擬內(nèi)存映射成物理頁(yè)。如果將系統(tǒng)調(diào)用表所在內(nèi)存頁(yè)的MDL的MDLFlags成員設(shè)為MDL_MAPPED_TO_SYSTEM_VA 并且該頁(yè)面被鎖定的話(huà),那么就可以使用內(nèi)核鉤子技術(shù)了。以下代碼將可以達(dá)此目的:
#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
PVOID* NewSystemCallTable;
PMDL pMyMDL = MmCreateMdl( NULL,
KeServiceDescriptorTable.ServiceTableBase,
KeServiceDescriptorTable.NumberOfServices * 4 );
MmBuildMdlForNonPagedPool( pMyMDL );
pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode );
好了,我們現(xiàn)在可以通過(guò)NewSystemCallTable來(lái)新建系統(tǒng)調(diào)用表了。系統(tǒng)調(diào)用表如下圖所示。


圖1  系統(tǒng)調(diào)用表示意圖

進(jìn)行掛鉤時(shí),可以使用以下宏:
#define HOOK_INDEX(function2hook) *(PULONG)((PUCHAR)function2hook 1)
#define HOOK(functionName, newPointer2Function, oldPointer2Function )  \
oldPointer2Function = (PVOID) InterlockedExchange( (PLONG)
&NewSystemCallTable[HOOK_INDEX(functionName)], (LONG) newPointer2Function)
#define UNHOOK(functionName, oldPointer2Function)  \
InterlockedExchange( (PLONG) &NewSystemCallTable[HOOK_INDEX(functionName)]
, (LONG)
oldPointer2Function)

使這些宏后,鉤子技術(shù)會(huì)變得更簡(jiǎn)單,也更安全。因?yàn)镮nterlockedExchange 是原子函數(shù),不會(huì)要求中止中斷,所以交換指針的方式是安全的;另外,它也不需要用一個(gè)宏掛鉤之后用另一個(gè)宏卸載鉤子,所以也更方便。下圖向我們展示了攔截系統(tǒng)調(diào)用表的過(guò)程。


圖2  系統(tǒng)調(diào)用表攔截技術(shù)示意圖

系統(tǒng)調(diào)用表數(shù)據(jù)結(jié)構(gòu)KeServiceDescriptorTable不僅含有ntdll.dll 的全部函數(shù)指針,還存有系統(tǒng)調(diào)用表的基地址和表的大小,當(dāng)建立我們自己的內(nèi)存描述符表的時(shí)候,這些信息是不可或缺的。利用MDL_MAPPED_TO_SYSTEM_VA 標(biāo)志,我們可以建立一個(gè)不可頁(yè)出(即不會(huì)被換到內(nèi)存之外)的MDL ,這樣我們就可以將其鎖定,并把返回的地址用于我們自己的系統(tǒng)調(diào)用表,重要的是,這個(gè)系統(tǒng)調(diào)用表是可寫(xiě)的。

三、定義鉤子函數(shù)

內(nèi)核鉤子主要有三部分組成:要鉤取的函數(shù)(在下文中稱(chēng)為目標(biāo)函數(shù))、替代要鉤取的函數(shù)的函數(shù)(在下文中成為鉤子函數(shù))和系統(tǒng)調(diào)用表。前面部分介紹了系統(tǒng)調(diào)用表的問(wèn)題,下面開(kāi)始介紹鉤子函數(shù)。一般說(shuō)來(lái),當(dāng)定義自己的鉤子函數(shù)時(shí),可以先到DDK 的頭文件中找到所想要的函數(shù)的原型,然后,稍加修改就能把目標(biāo)函數(shù)變成鉤子函數(shù)了。

例如,ZwMapViewOfSection 是一個(gè)內(nèi)核函數(shù),允許應(yīng)用程序把從動(dòng)態(tài)鏈接庫(kù)導(dǎo)出的函數(shù)映射至內(nèi)存。如果我們想要鉤住這個(gè)內(nèi)核函數(shù),那么可以到ntddk.h頭文件中查看其函數(shù)原型,如下所示:

NTSYSAPI
NTSTATUS
NTAPI
ZwMapViewOfSection(
IN HANDLE SectionHandle,
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG CommitSize,
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
IN OUT PSIZE_T ViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Protect );

有了函數(shù)原型,我們就可以確定指向目標(biāo)函數(shù)的指針了,如下所示:

typedef NTSTATUS (*ZWMAPVIEWOFSECTION)(
IN HANDLE SectionHandle,
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG CommitSize,
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
IN OUT PSIZE_T ViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Protect );
ZWMAPVIEWOFSECTION OldZwMapViewOfSection;

鉤子函數(shù)如下所示:

NTSTATUS NewZwMapViewOfSection(
IN HANDLE SectionHandle,
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG CommitSize,
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
IN OUT PSIZE_T ViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Protect )
{
NTSTATUS status;
DbgPrint("comint32: NewZwMapViewOfSection called.");
//我們可以對(duì)輸入為所欲為,既可以馬上返回,也可以繼續(xù)執(zhí)行原函數(shù)
status = OldZwMapViewOfSection(SectionHandle,
 ProcessHandle,
 BaseAddress,
 ZeroBits,
 CommitSize,
 SectionOffset OPTIONAL,
 ViewSize,
 InheritDisposition,
 AllocationType,
 Protect );
// 我們可以在此對(duì)輸出為所欲為,想返回什么,就返回什么
return status;
}

好了,鉤子技術(shù)的三大件已經(jīng)準(zhǔn)備好了。現(xiàn)在,我們就可以像下面這樣使用它們:
HOOK( ZwMapViewOfSection, NewZwMapViewOfSection, OldZwMapViewOfSection );

如果你打算使用DriverUnload ()的話(huà),可千萬(wàn)不要忘了卸載鉤子。

四、內(nèi)核函數(shù)系列

經(jīng)過(guò)上面的介紹,我們已經(jīng)了解了系統(tǒng)調(diào)用表有關(guān)知識(shí),也已知道如何攔截系統(tǒng)調(diào)用表中的函數(shù),下面,我們?cè)賮?lái)了解一下我們要鉤取的函數(shù):目標(biāo)函數(shù)。這方面,如果我們不僅了解系統(tǒng)調(diào)用表中有哪些函數(shù),還知道這些函數(shù)的工作機(jī)制就最好了。但實(shí)際上,ntdll.dll 中的導(dǎo)出函數(shù)有好幾百個(gè),別說(shuō)一個(gè)一個(gè)的探究,就是把它們都列出來(lái),看著看著頭都大了。幸運(yùn)的是,我們不必了解每個(gè)函數(shù),只要了解其所在的系列就行了。為什么這么說(shuō)?因?yàn)槲④浺呀?jīng)按照函數(shù)的功能對(duì)Ntdll.dll的導(dǎo)出函數(shù)進(jìn)行了分組,并冠以意義明確的前綴,所以根據(jù)函數(shù)系列的前綴就能明白它們的大體功能了。下面對(duì)這些函數(shù)系列進(jìn)行簡(jiǎn)單的介紹:

1.KiEtw系列:本系列內(nèi)核函數(shù)用于系統(tǒng)內(nèi)核,這些函數(shù)只能從內(nèi)核的內(nèi)部進(jìn)行調(diào)用,常用的有:KiUserCallbackDispatcher、KiRaiseUserExceptionDispatcher、KiUserApcDispatcher、KiUserExceptionDispatcher等。

2.Csr系列:此系列函數(shù)用于客戶(hù)機(jī)和服務(wù)器運(yùn)行時(shí),如果您想攔截客戶(hù)機(jī)/服務(wù)器方面的操作,那么就需要對(duì)Csr系列內(nèi)核函數(shù)做進(jìn)一步的了解。常見(jiàn)的有:CsrClientCallServer、CsrCaptureMessageBuffer、CsrConnectClientToServer和CrsNewThread等。

3.Ldr系列:本系列內(nèi)核函數(shù)用于加載程序管理器,如果你打算攔截加載程序的話(huà),那么請(qǐng)進(jìn)一步考察這組以Ldr為前綴的函數(shù),常用的有:LdrInitializeThunk、LdrLockLoaderLock、LdrUnlockLoaderLock、LdrGetDllHandle、LdrGetProcedureAddress等。

4.Dbg系列:本系列內(nèi)核函數(shù)用于調(diào)試管理,如果打算攔截調(diào)試操作的話(huà),那么請(qǐng)進(jìn)一步考察這組以Dbg為前綴的函數(shù),常用的函數(shù)包括:、DbgBreakPoint、DbgUserBreakPoint、DbgPrint和DbgUiConnectToDbg等。

5.Etw系列:本系列內(nèi)核函數(shù)用于追蹤窗口事件,如果你打算攔截追蹤之類(lèi)的操作的話(huà),那么請(qǐng)進(jìn)一步考察這組以Etw為前綴的函數(shù)。常用的函數(shù)包括:EtwTraceEvent、EtwEnableTrace、EtwGetTraceEnableLevel和EtwGetTraceEnableFlags等。

6.Rtl系列:本系列內(nèi)核函數(shù)用于運(yùn)行時(shí)庫(kù),以Rtl為前綴的函數(shù)可以完成多種操作,例如字符串、線程、資源、臨界區(qū)、安全對(duì)象的初始化和使用,內(nèi)存、進(jìn)程異常和數(shù)據(jù)類(lèi)型的處理,還用于完成定時(shí)器、堆、IPv4和IPv6方面的操作,以及壓縮和解壓縮等。

7.Pfx系列:本系列內(nèi)核函數(shù)用于ANSI字符串操作,如果你打算攔截ASNI串表方面的操作的話(huà),就需要進(jìn)一步了解這些函數(shù)。常用的包括:PfxInitialize、PfxRemovePrefix、PfxInsertPrefix、PfxFindPrefix等。

8.Zw系列:本系列內(nèi)核函數(shù)用于文件和注冊(cè)表方面的操作,比如文件操作、注冊(cè)表操作、訪問(wèn)進(jìn)程、事件操作、令牌操作、進(jìn)程操作和端口操作等。

這里介紹的只是內(nèi)核函數(shù)中的一部分,限于篇幅其他部分在此不作介紹。

六、結(jié)束語(yǔ)

本文深入介紹了系統(tǒng)調(diào)用表和內(nèi)存保護(hù)方面的知識(shí),并介紹了實(shí)現(xiàn)鉤子函數(shù)的方法,最后對(duì)一些重要的內(nèi)核函數(shù)進(jìn)行了簡(jiǎn)要的說(shuō)明。有了內(nèi)核級(jí)鉤子,我們不但能夠控制、監(jiān)視其他程序并過(guò)濾有關(guān)數(shù)據(jù),還能達(dá)到隱藏Rootkit本身及其它程序的目的。需要說(shuō)明的是,盡管可以通過(guò)內(nèi)核鉤子技術(shù)來(lái)實(shí)現(xiàn)rootkit所需的一些功能,但是,現(xiàn)實(shí)中的rootkit通常組合使用多種其它技術(shù),如進(jìn)程注射、分層驅(qū)動(dòng)過(guò)濾等。

tag標(biāo)簽:Rootkit 內(nèi)核鉤子
本文最后更新于 2022-9-24 10:15,某些文章具有時(shí)效性,若有錯(cuò)誤或已失效,請(qǐng)?jiān)诰W(wǎng)站留言或聯(lián)系站長(zhǎng):17tui@17tui.com
·END·
站長(zhǎng)網(wǎng)微信號(hào):w17tui,關(guān)注站長(zhǎng)、創(chuàng)業(yè)、關(guān)注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營(yíng)銷(xiāo)服務(wù)中心

免責(zé)聲明:本站部分文章和圖片均來(lái)自用戶(hù)投稿和網(wǎng)絡(luò)收集,旨在傳播知識(shí),文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請(qǐng)勿用于商業(yè)用途,如果損害了您的權(quán)利,請(qǐng)聯(lián)系我們及時(shí)修正或刪除。謝謝!

17站長(zhǎng)網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長(zhǎng)、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長(zhǎng)轉(zhuǎn)型升級(jí),為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營(yíng)銷(xiāo)服務(wù),與站長(zhǎng)一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!

掃一掃,關(guān)注站長(zhǎng)網(wǎng)微信

大家都在看

    熱門(mén)排行

      最近更新

        返回頂部
        主站蜘蛛池模板: 两个吃奶一个添下面视频 | 久久夜色噜噜噜亚洲AV0000 | 无码专区无码专区视频网网址 | 轻轻cao | 我在厨房摸岳的乳HD在线观看 | 亚洲 欧美 国产 综合久久 | MMM日本兽交 | 色欲狠狠躁天天躁无码中文字幕 | 国产精品99久久久久久AV蜜臀 | 欧美丝袜女同 | 热久久国产欧美一区二区精品 | 且试天下芒果免费观看 | 亚洲偷自拍精品视频在线观看 | 欧美日韩亚洲综合2019 | 麻豆产精品一二三产区区 | 精品国产在天天线在线麻豆 | 久久精品国产96精品亚洲 | 动漫成年美女黄漫网站 | 久久热这里只有 精品 | jizz国产丝袜18老师美女 | 亚洲第一页在线播放 | 国产又爽又黄又不遮挡视频 | 午夜看片福利在线观看 | 好男人社区 | 最近中文字幕MV高清在线 | 国产成人刺激视频在线观看 | 色噜噜狠狠色综合欧洲 | 国产精品香蕉视频在线 | 日本漫画母亲口工子全彩 | 欧美大片免费 | 中文字幕欧美一区 | 中文字幕久久久 | 美女被日出水 | 亚洲高清中文字幕 | 竹菊精品久久久久久久99蜜桃 | 国产呻吟久久久久久久92 | 爽娇妻快高h| 日韩人妻精品久久日 | 亚洲中文 字幕 国产 综合 | 久久影院中文字幕 | 欧美97色伦影院在线观看 |