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模块的地址,发现确实是无效的。
所以如果我们想要在内核中修改win32k.sys模块(IAT_hook)就必须保证当前进程上下文不在System和smss.exe中,也就是需要将进程上下文切换到除了两个进程之外的任意一个进程地址空间中。
获得csrss.exe进程的PID
当我们需要IAT_HOOKwin32k.sys模块时可以将地址空间切换到csrss.exe进程地址空间中,再这之前我们需要先获得csrss.exe进程的PID,然后通过其PID得到对应的EPROCESS,然后切换到对应的进程地址空间中。一种获得csrss.exe的方法是通过枚举系统中所有的句柄然后,寻找名为"\Windows\ApiPort"的ALPC port句柄然后得到其对应的进程PID(csrss.exe进程会创建一个名为"\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); //通过调用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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!
相关文章
Windows Server 2025 Build 26304预览版发布:新增Defender应用控制
Windows Server 2025 最新 Build 26304 预览版发布,这个版本主要新增Defender应用控制,详细请看下文介绍2024-10-12怎么看windows的版本? 轻松查看你的Windows版本5种方法
了解Windows版本信息是进行系统维护、软件兼容性检查以及故障排除等日常操作中的重要一环,下面我们就分享轻松获取Windows版本信息,无论您使用的是Windows 10、Windows 112024-10-11Windows Server 26296 预览版发布:附完整更新日志
昨天,微软发布了Windows Server Build 26296 预览版更新,主要改进 Windows Admin Center、可以访问全新的 Feedback Hub 应用等,详细更新日志如下2024-09-28如何快速修复Windows文件类型关联? Windows系统文件关联详解
在Windows操作系统中,文件关联扮演着至关重要的角色,简单来说,文件关联就是Windows系统根据文件的扩展名,自动判断并确定用哪个程序来打开这个文件的功能2024-09-20请用户尽快更新! Windows Server 26280 预览版发布
Windows Server 26280预览版最大的变化就是将有效期调至 2025 年 9 月 15 日,这意味着所有下载并使用旧 Windows Server 预览版的用户都需要下载并安装新的 26280 版本2024-09-09Windows系统启动设置提示找不到此应用怎么办? 微软提供修复指南
Windows系统中启动设置部分中的某些应用程序无法选择,会显示“找不到此应用”的错误消息,微软提供了官方的修复方法,详细请看下文介绍2024-09-03Windows新Bug! AMD处理器可通过切换到隐藏管理员账户提高游戏性能
AMD也已向HardwareUnboxed确认,使用最高权限的隐藏管理员账户可以实现最佳游戏性能,据称,该问题将在未来的Windows更新中修复,但目前尚不清楚何时修复,Windows这个“Bug2024-08-16无法访问localhost怎么办? Window解决UWP应用本地回环限制
微软在 Windows 8 以后就引入了 UWP 应用,UWP 应用存在沙盒机制,正常情况下无法访问 localhost,即无法访问回环地址,下面我们就来看看这个问题的解决办法2024-08-12- 在Windows操作系统中,命令提示符(CMD)是一个强大的工具,它允许用户与操作系统进行交互式操作,以下是一些常用的CMD命令及其操作示例2024-07-29
- windows操作系统提供了许多实用的命令行工具,用户可以执行各种任务,如文件管理、系统维护、网络配置等,掌握这些命令不仅能提高工作效率,还能帮助用户解决许多复杂的问题2024-07-25
最新评论