windows系統(tǒng)下Smss.exe加載win32k.sys過程詳解

windows操作系統(tǒng)初始化
windows操作系統(tǒng)再初始化的過程中,當內(nèi)核完全初始化而且各個組件也已經(jīng)準備好后會加載一個個用戶進程smss.exe(會話管理器),此進程會接著調(diào)用NtSetSystemInformation并傳入SystemRegistryAppendStringInformation == 38參數(shù)加載win32k.sys這個模塊,接著就會調(diào)用win32k.sys的DriverEntry入口。接著smss.exe便會啟動Windows 子系統(tǒng)進程csrss.exe。
win32k.sys加載ShadowSSDT表
當smss.exe在加載win32k.sys模塊后,win32k.sys這個模塊會緊接著執(zhí)行其模塊入口DriverEntry,緊接著其會執(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ù)最后都會調(diào)用ShadowSSDT表中的服務(wù)。但并不是只有GUI線程才會將win32k.sys加載到內(nèi)存中,參考教主的帖子是說win32k.sys模塊的加載與會話有關(guān),所以只要不是System和smss.exe(會話管理器不屬于任意一個繼承)進程其他任何一個進程都會加載win32k.sys。
我們看一下在System進程中win32k.sys模塊的地址,發(fā)現(xiàn)確實是無效的。
所以如果我們想要在內(nèi)核中修改win32k.sys模塊(IAT_hook)就必須保證當前進程上下文不在System和smss.exe中,也就是需要將進程上下文切換到除了兩個進程之外的任意一個進程地址空間中。
獲得csrss.exe進程的PID
當我們需要IAT_HOOKwin32k.sys模塊時可以將地址空間切換到csrss.exe進程地址空間中,再這之前我們需要先獲得csrss.exe進程的PID,然后通過其PID得到對應(yīng)的EPROCESS,然后切換到對應(yīng)的進程地址空間中。一種獲得csrss.exe的方法是通過枚舉系統(tǒng)中所有的句柄然后,尋找名為"\Windows\ApiPort"的ALPC port句柄然后得到其對應(yīng)的進程PID(csrss.exe進程會創(chuàng)建一個名為"\Windows\ApiPort"的ALPC port對象)。
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ù)制到當前進程中 { if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL))) //傳入?yún)?shù)ObjectNameInformation得到對象的名稱信息 { 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會返回SYSTEM_HANDLE_INFORMATION_EX結(jié)構(gòu)體,其第一個NumbreOfHandles字段為獲得的句柄的總數(shù)目,然后SYSTEM_HANDLE_INFORMATION數(shù)組為各個句柄的信息。
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)包含了句柄的一些基本信息,例如所屬進程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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
電腦如何清除運行窗口歷史記錄? Windows系統(tǒng)清除運行窗口歷史記錄的技
winodws的命令行界面是一個不錯的快捷方式,我們只需要通過"win+r"就可以調(diào)用運行命令,隨著時間的累積,我們這里會積累下不少歷史命令,有泄露隱私的風險,所以2025-04-17電腦鎖屏壁紙怎么固定不變? Windows系統(tǒng)鎖定桌面背景圖的方法
最近就有不少用戶想要鎖定電腦的桌面背景圖,但不清楚具體如何操作,其實方法非常簡單,詳細請看下文介紹2025-04-17怎么關(guān)閉windows索引器? Windows系統(tǒng)禁用索引器回退功能的技巧
使用Windows系統(tǒng)中的搜索功能都是在索引功能的基礎(chǔ)上建立的,因此,若想要加快搜索索引速度,就要把系統(tǒng)中的索引器回退功能設(shè)置為禁用,詳細請看下文介紹2025-04-17微軟應(yīng)用商店無法打開怎么辦? 0x80248014錯誤的原因分析與解決方案
近有不少小伙伴反映,Windows 10自帶的微軟商店怎么都打不開,顯示0x80248014錯誤錯誤代碼,下面我們就來看看詳細解決方案2025-04-16Windows系統(tǒng)如何關(guān)閉自動維護功能? 關(guān)閉自動維護輕松提升電腦性能
最近有不少用戶想關(guān)閉其中的自動維護功能,但不清楚具體如何操作,下面我們就來看看Windows系統(tǒng)關(guān)閉自動維護功能的操作方法2025-04-15微軟發(fā)布多個 OOB 更新: 用于修復(fù) Active Directory 組策略 Bug
微軟發(fā)布多個 OOB 更新用于修復(fù) Active Directory 組策略 Bug,該問題具體表現(xiàn)為:當設(shè)備已啟用 "審核登錄 / 注銷事件" 功能且實際生效時,本地組策略編輯器或本2025-04-14定期掃描病毒功能有什么用? Windows系統(tǒng)開啟定期掃描病毒功能的技巧
定期掃描病毒功能可以很好的幫助我們電腦定義清理病毒,很多小伙伴都不知道在那里設(shè)置進行使用,該怎么開啟這個功能呢?詳細請看下文介紹2025-04-01Windows如何設(shè)置麥克風增強? Windows系統(tǒng)麥克風權(quán)限開啟全攻略
麥克風功能作為日常溝通和娛樂的重要工具,其表現(xiàn)尤為關(guān)鍵,然而,不少windows用戶發(fā)現(xiàn)麥克風的聲音偏小,影響了使用體驗,下面我們就來看看Windows系統(tǒng)設(shè)置麥克風增強功能2025-04-01提升性能30%! Windows系統(tǒng)關(guān)閉VBS的簡單方法
關(guān)閉VBS功能可以釋放部分系統(tǒng)資源,提高系統(tǒng)性能和游戲流暢度,windows系統(tǒng)該怎么關(guān)閉vbs功能呢?下面我們就來看看詳細教程2025-04-01Windows Server 2025安裝 Hyper-V Docker 容器的圖文教程
Hyper-V 容器是 Windows Server 2025 中的一項強大功能,今天我們就來介紹如何在 Windows Server 2025 上安裝、配置和運行容器主機,并下載運行一個 IIS 容器2025-03-27