亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

  發(fā)布時間:2021-08-25 15:12:02   作者:漠上開花   我要評論
這篇文章主要介紹了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)文章

最新評論