windows系統(tǒng)下Smss.exe加載win32k.sys過程詳解
windows操作系統(tǒng)初始化
windows操作系統(tǒng)再初始化的過程中,當(dāng)內(nèi)核完全初始化而且各個(gè)組件也已經(jīng)準(zhǔn)備好后會(huì)加載一個(gè)個(gè)用戶進(jìn)程smss.exe(會(huì)話管理器),此進(jìn)程會(huì)接著調(diào)用NtSetSystemInformation并傳入SystemRegistryAppendStringInformation == 38參數(shù)加載win32k.sys這個(gè)模塊,接著就會(huì)調(diào)用win32k.sys的DriverEntry入口。接著smss.exe便會(huì)啟動(dòng)Windows 子系統(tǒng)進(jìn)程csrss.exe。
win32k.sys加載ShadowSSDT表
當(dāng)smss.exe在加載win32k.sys模塊后,win32k.sys這個(gè)模塊會(huì)緊接著執(zhí)行其模塊入口DriverEntry,緊接著其會(huì)執(zhí)行AddSystemServiceTable為系統(tǒng)增加一張ShadowSSDT表。我們可以在smss.exe剛剛加載win32k.sys是將ntoskrnl.exe所導(dǎo)出的KeAddSystemServiceTable給EAThook了,然后在我們自己的MyKeAddSystemServiceTable()中判斷通過判斷加載的表的基地址是否在win32k.sys模塊地址范圍中,如果不在證明不是正確的ShadowSSDT表。
關(guān)于win32k.sys所在地址有效性的問題
win32k.sys包含ShadowSSDT表,只要線程中調(diào)用GUI函數(shù)最后都會(huì)調(diào)用ShadowSSDT表中的服務(wù)。但并不是只有GUI線程才會(huì)將win32k.sys加載到內(nèi)存中,參考教主的帖子是說(shuō)win32k.sys模塊的加載與會(huì)話有關(guān),所以只要不是System和smss.exe(會(huì)話管理器不屬于任意一個(gè)繼承)進(jìn)程其他任何一個(gè)進(jìn)程都會(huì)加載win32k.sys。
我們看一下在System進(jìn)程中win32k.sys模塊的地址,發(fā)現(xiàn)確實(shí)是無(wú)效的。

所以如果我們想要在內(nèi)核中修改win32k.sys模塊(IAT_hook)就必須保證當(dāng)前進(jìn)程上下文不在System和smss.exe中,也就是需要將進(jìn)程上下文切換到除了兩個(gè)進(jìn)程之外的任意一個(gè)進(jìn)程地址空間中。
獲得csrss.exe進(jìn)程的PID
當(dāng)我們需要IAT_HOOKwin32k.sys模塊時(shí)可以將地址空間切換到csrss.exe進(jìn)程地址空間中,再這之前我們需要先獲得csrss.exe進(jìn)程的PID,然后通過其PID得到對(duì)應(yīng)的EPROCESS,然后切換到對(duì)應(yīng)的進(jìn)程地址空間中。一種獲得csrss.exe的方法是通過枚舉系統(tǒng)中所有的句柄然后,尋找名為"\Windows\ApiPort"的ALPC port句柄然后得到其對(duì)應(yīng)的進(jìn)程PID(csrss.exe進(jìn)程會(huì)創(chuàng)建一個(gè)名為"\Windows\ApiPort"的ALPC port對(duì)象)。
HANDLE GetCsrssPid()
{
HANDLE Process, hObject;
HANDLE CsrssId;
OBJECT_ATTRIBUTES obj;
CLIENT_ID cid;
UCHAR Buff[0x1000];
POBJECT_NAME_INFORMATION pObjName = (PVOID)&Buff;
PSYSTEM_HANDLE_INFORMATION_EX Handles;
Handles = QueryHandleInfo(SystemHandleInformation); //通過調(diào)用ZwQuerySystemInformation獲得所有的句柄信息返回SYSTEM_HANDLE_INFORMATION_EX結(jié)構(gòu)體
if (!Handles)
return CsrId;
for (ULONG i = 0; i < Handles->NumberOfHandles; i++)
{
if (Handles->Information[r].ObjectTypeNumber == 21) //ALPC Port object
{
InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
cid.UniqueProcess = (HANDLE)Handles->Information[r].ProcessId;
cid.UniqueThread = 0;
if (NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
{
if (NT_SUCCESS(ZwDuplicateObject(Process, (HANDLE)Handles->Information[r].Handle,NtCurrentProcess(), &hObject, 0, 0,DUPLICATE_SAME_ACCESS))) //將句柄復(fù)制到當(dāng)前進(jìn)程中
{
if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL))) //傳入?yún)?shù)ObjectNameInformation得到對(duì)象的名稱信息
{
if (pObjName->Name.Buffer && !wcsncmp(L"\\Windows\\ApiPort", ObjName->Name.Buffer, 20))
{
CsrssId = (HANDLE)Handles->Information[r].ProcessId;
}
}
ZwClose(hObject);
}
ZwClose(Process);
}
}
}
ExFreePool(Handles);
return CsrssId;
}
ZwQuerySystemInformation的參數(shù)SystemInformationClass等于SystemHandleInformation(16),SystemInformation會(huì)返回SYSTEM_HANDLE_INFORMATION_EX結(jié)構(gòu)體,其第一個(gè)NumbreOfHandles字段為獲得的句柄的總數(shù)目,然后SYSTEM_HANDLE_INFORMATION數(shù)組為各個(gè)句柄的信息。
typedef struct _SYSTEM_HANDLE_INFORMATION_EX
{
ULONG NumberOfHandles;
SYSTEM_HANDLE_INFORMATION Information[1];
}SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
SYSTEM_HANDLE_INFORMATION結(jié)構(gòu)包含了句柄的一些基本信息,例如所屬進(jìn)程PID等等。
typedef struct _SYSTEM_HANDLE_INFORMATION
{
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
}SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
到此這篇關(guān)于windows系統(tǒng)下Smss.exe加載win32k.sys過程詳解的文章就介紹到這了,更多相關(guān)Smss.exe加載win32k.sys內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

關(guān)閉煩人的廣告! Windows關(guān)閉個(gè)性化廣告的終極指南
Windows 11系統(tǒng)里的廣告越來(lái)越多,彈窗、推薦、提示層出不窮,簡(jiǎn)直讓人抓狂!別急,今天我為大家?guī)?lái)一份超詳細(xì)的教程,手把手教你如何關(guān)閉這些煩人的廣告,讓你的Win11清2026-04-18
電腦打印機(jī)狀態(tài)錯(cuò)誤怎么解決? 快速搞定Windows打印機(jī)狀態(tài)錯(cuò)誤的方法
當(dāng)我們急需打印文件時(shí),電腦右下角彈出的“打印機(jī)處于錯(cuò)誤狀態(tài)”或“無(wú)法打印”的提示,無(wú)疑會(huì)讓人感到困擾和焦慮,這種“錯(cuò)誤狀態(tài)”看似復(fù)雜,但實(shí)際上多數(shù)問題并非源于硬2026-04-18
電腦網(wǎng)絡(luò)受限怎么辦? Windows提示網(wǎng)絡(luò)連接受限的解決辦法
昨晚加班到一半,突然發(fā)現(xiàn)右下角的網(wǎng)絡(luò)圖標(biāo)多了個(gè)黃色嘆號(hào),提示“本地連接受限制”,下面我們就來(lái)看看解決辦法2026-04-18
輕松保護(hù)你的電腦隱私! Windows系統(tǒng)如何設(shè)置動(dòng)態(tài)鎖功能
如果您希望在離開電腦時(shí)無(wú)需手動(dòng)操作即可自動(dòng)鎖屏,Windows動(dòng)態(tài)鎖功能可通過藍(lán)牙檢測(cè)手機(jī)距離實(shí)現(xiàn)該效果,以下是設(shè)置此功能的具體步驟2026-04-17
保護(hù)電腦數(shù)據(jù)安全! Windows系統(tǒng)快速關(guān)閉磁盤默認(rèn)共享方法
你可能還不知道,系統(tǒng)默認(rèn)還開啟了硬盤分區(qū)(如C盤、D盤)的共享功能,今天我們就來(lái)看看一鍵關(guān)閉Windows默認(rèn)共享,保護(hù)電腦數(shù)據(jù)安全的設(shè)置方法2026-04-17
Windows預(yù)覽窗口大小怎么自由調(diào)節(jié)? 電腦任務(wù)欄預(yù)覽窗口設(shè)置方法
對(duì)于Windows系統(tǒng)的深度用戶來(lái)說(shuō),文件預(yù)覽功能無(wú)疑是日常操作中的得力助手,然而,系統(tǒng)默認(rèn)的預(yù)覽窗口大小可能并不完全符合每個(gè)人的使用習(xí)慣,今天,我就為大家?guī)?lái)一個(gè)技術(shù)2026-04-17
windows無(wú)法更改設(shè)置怎么辦? 電腦不允許修改系統(tǒng)設(shè)置無(wú)問題的解決辦法
想要調(diào)整一下系統(tǒng)設(shè)置,卻發(fā)現(xiàn)無(wú)論你怎么點(diǎn)來(lái)點(diǎn)去,它就是不給你改!這可真是讓人欲哭無(wú)淚?。e擔(dān)心,今天我就來(lái)給大家分享一些解決方法,讓你的Windows系統(tǒng)設(shè)置恢復(fù)正常2026-04-17
如何啟用項(xiàng)目復(fù)選框? Windows系統(tǒng)打開文件復(fù)選框設(shè)置的教程
Windows復(fù)選框,也稱為項(xiàng)目復(fù)選框,允許您在文件資源管理器中輕松選擇多個(gè)文件和文件夾,默認(rèn)情況下,此功能在Windows中是禁用的,但您可以通過進(jìn)行一些簡(jiǎn)單的自定義來(lái)快速2026-04-16
Windows系統(tǒng)如何設(shè)置DPI縮放? 屏幕DPI縮放設(shè)置全攻略
你是否遇到過這樣的困擾:新買的4K顯示器文字模糊發(fā)虛?手機(jī)屏幕圖標(biāo)小到看不清?這可能并非硬件問題,而是DPI設(shè)置在“搗亂”!本文將系統(tǒng)解析DPI設(shè)置原理與實(shí)操技巧,助你2026-04-16
微軟放大招! 所有Windows鏡像都將失效 強(qiáng)制執(zhí)行階段已到來(lái)
最近,微軟在win11系統(tǒng)“設(shè)置-Windows安全中心-設(shè)備安全性”中新增了安全啟動(dòng)檢查,由于一個(gè)不可忽視的“硬期限”到來(lái),安全啟動(dòng)的舊證書要過期了2026-04-08


