windows系统下Smss.exe加载win32k.sys过程详解

windows操作系统初始化

windows操作系统再初始化的历程中,当核心彻底初始化并且每个部件也早已准备好后会加载一个个用户进程smss.exe(对话管理器),此进程会然后调用NtSetSystemInformation并传到SystemRegistryAppendStringInformation == 38主要参数加载win32k.sys这一模块,然后便会调用win32k.sys的DriverEntry入口。然后smss.exe便会启动Windows 子系统进程csrss.exe。

win32k.sys加载ShadowSSDT表

当smss.exe在加载win32k.sys模块后,win32k.sys这一模块会随后实行其模块入口DriverEntry,随后其会实行AddSystemServiceTable为系统增加一张ShadowSSDT表。我们可以在smss.exe刚加载win32k.sys是将ntoskrnl.exe所导出来的KeAddSystemServiceTable给EAThook了,随后在我们自己的MyKeAddSystemServiceTable()中分辨根据分辨加载的表的基地址是不是在win32k.sys模块地址范畴中,假如没有在证实并不是恰当的ShadowSSDT表。

关于win32k.sys所属地址实效性的问题

win32k.sys包括ShadowSSDT表,只需进程中调用GUI函数公式最终都是会调用ShadowSSDT表格中的服务项目。但并并不是仅有GUI进程才会将win32k.sys加载到运存中,参照掌教的贴子是说win32k.sys模块的加载参会话相关,因此如果并不是System和smss.exe(对话管理器不属于随意一个承继)进程别的一切一个进程都是会加载win32k.sys。
大家看一下在System进程中win32k.sys模块的地址,发觉的确是无效的。

windows系统下Smss.exe加载win32k.sys过程详解
 

因此如果我们需要在核心中改动win32k.sys模块(IAT_hook)就务必确保现阶段进程前后文没有在System和smss.exe中,也就是必须将进程前后文切换到除开2个进程以外的任何一个进程地址室内空间中。

得到csrss.exe进程的PID

在我们必须IAT_HOOKwin32k.sys模块时可以将地址室内空间切换到csrss.exe进程地址空间中,再这以前大家必须先得到csrss.exe进程的PID,随后根据其PID获得相应的EPROCESS,随后切换到相匹配的进程地址室内空间中。一种得到csrss.exe的方法是根据枚举类型系统中任何的句柄随后,找寻名叫”WindowsApiPort”的ALPC port句柄随后获得其相应的进程PID(csrss.exe进程会创建一个名叫”WindowsApiPort”的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);              //根据调用ZwQuerySystemInformation得到全部的句柄信息返回SYSTEM_HANDLE_INFORMATION_EX结构体     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)))    //将句柄复制到现阶段进程中                {                    if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL)))                            //传到主要参数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的主要参数SystemInformationClass相当于SystemHandleInformation(16),SystemInformation会返回SYSTEM_HANDLE_INFORMATION_EX结构体,其第一个NumbreOfHandles字段名为得到的句柄的总数量,随后SYSTEM_HANDLE_INFORMATION二维数组为每个句柄的信息。

typedef struct _SYSTEM_HANDLE_INFORMATION_EX {ULONG NumberOfHandles;SYSTEM_HANDLE_INFORMATION Information[1];}SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;

SYSTEM_HANDLE_INFORMATION构造包括了句柄的一些基本信息,例如隶属进程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;

到此这篇关于windows系统下Smss.exe加载win32k.sys全过程详细说明的内容就讲解到这了,大量有关Smss.exe加载win32k.sys内容请搜索之前的文章内容或再次浏览下面的相关文章,期待我们之后多多的适用酷开导航!

文章版权声明

 1 原创文章作者:汇维网,如若转载,请注明出处: https://www.52hwl.com/10919.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年2月22日
下一篇 2023年2月23日