windows系統(tǒng)下Smss.exe加載win32k.sys過(guò)程詳解
windows操作系統(tǒng)初始化
windows操作系統(tǒng)再初始化的過(guò)程中,當(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()中判斷通過(guò)判斷加載的表的基地址是否在win32k.sys模塊地址范圍中,如果不在證明不是正確的ShadowSSDT表。
關(guān)于win32k.sys所在地址有效性的問(wèn)題
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,然后通過(guò)其PID得到對(duì)應(yīng)的EPROCESS,然后切換到對(duì)應(yīng)的進(jìn)程地址空間中。一種獲得csrss.exe的方法是通過(guò)枚舉系統(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); //通過(guò)調(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ò)程詳解的文章就介紹到這了,更多相關(guān)Smss.exe加載win32k.sys內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

電腦如何清除運(yùn)行窗口歷史記錄? Windows系統(tǒng)清除運(yùn)行窗口歷史記錄的技
winodws的命令行界面是一個(gè)不錯(cuò)的快捷方式,我們只需要通過(guò)"win+r"就可以調(diào)用運(yùn)行命令,隨著時(shí)間的累積,我們這里會(huì)積累下不少歷史命令,有泄露隱私的風(fēng)險(xiǎn),所以2025-04-17
電腦鎖屏壁紙?jiān)趺垂潭ú蛔? Windows系統(tǒng)鎖定桌面背景圖的方法
最近就有不少用戶想要鎖定電腦的桌面背景圖,但不清楚具體如何操作,其實(shí)方法非常簡(jiǎn)單,詳細(xì)請(qǐng)看下文介紹2025-04-17
怎么關(guān)閉windows索引器? Windows系統(tǒng)禁用索引器回退功能的技巧
使用Windows系統(tǒng)中的搜索功能都是在索引功能的基礎(chǔ)上建立的,因此,若想要加快搜索索引速度,就要把系統(tǒng)中的索引器回退功能設(shè)置為禁用,詳細(xì)請(qǐng)看下文介紹2025-04-17
微軟應(yīng)用商店無(wú)法打開(kāi)怎么辦? 0x80248014錯(cuò)誤的原因分析與解決方案
近有不少小伙伴反映,Windows 10自帶的微軟商店怎么都打不開(kāi),顯示0x80248014錯(cuò)誤錯(cuò)誤代碼,下面我們就來(lái)看看詳細(xì)解決方案2025-04-16
Windows系統(tǒng)如何關(guān)閉自動(dòng)維護(hù)功能? 關(guān)閉自動(dòng)維護(hù)輕松提升電腦性能
最近有不少用戶想關(guān)閉其中的自動(dòng)維護(hù)功能,但不清楚具體如何操作,下面我們就來(lái)看看Windows系統(tǒng)關(guān)閉自動(dòng)維護(hù)功能的操作方法2025-04-15
微軟發(fā)布多個(gè) OOB 更新: 用于修復(fù) Active Directory 組策略 Bug
微軟發(fā)布多個(gè) OOB 更新用于修復(fù) Active Directory 組策略 Bug,該問(wèn)題具體表現(xiàn)為:當(dāng)設(shè)備已啟用 "審核登錄 / 注銷事件" 功能且實(shí)際生效時(shí),本地組策略編輯器或本2025-04-14
定期掃描病毒功能有什么用? Windows系統(tǒng)開(kāi)啟定期掃描病毒功能的技巧
定期掃描病毒功能可以很好的幫助我們電腦定義清理病毒,很多小伙伴都不知道在那里設(shè)置進(jìn)行使用,該怎么開(kāi)啟這個(gè)功能呢?詳細(xì)請(qǐng)看下文介紹2025-04-01
Windows如何設(shè)置麥克風(fēng)增強(qiáng)? Windows系統(tǒng)麥克風(fēng)權(quán)限開(kāi)啟全攻略
麥克風(fēng)功能作為日常溝通和娛樂(lè)的重要工具,其表現(xiàn)尤為關(guān)鍵,然而,不少windows用戶發(fā)現(xiàn)麥克風(fēng)的聲音偏小,影響了使用體驗(yàn),下面我們就來(lái)看看Windows系統(tǒng)設(shè)置麥克風(fēng)增強(qiáng)功能2025-04-01
提升性能30%! Windows系統(tǒng)關(guān)閉VBS的簡(jiǎn)單方法
關(guān)閉VBS功能可以釋放部分系統(tǒng)資源,提高系統(tǒng)性能和游戲流暢度,windows系統(tǒng)該怎么關(guān)閉vbs功能呢?下面我們就來(lái)看看詳細(xì)教程2025-04-01
Windows Server 2025安裝 Hyper-V Docker 容器的圖文教程
Hyper-V 容器是 Windows Server 2025 中的一項(xiàng)強(qiáng)大功能,今天我們就來(lái)介紹如何在 Windows Server 2025 上安裝、配置和運(yùn)行容器主機(jī),并下載運(yùn)行一個(gè) IIS 容器2025-03-27


