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;
Smss.exe加载win32k.sys过程总结的更多相关文章
- JVM加载类的过程,双亲委派机制中的方法
JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载 1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
这个问题是老生常谈的问题啦,虽然说到处百度都有的答案,还是希望自己能总结一下. 如今有很多答案,都是从硬件开始讲起,比如键盘的响应或者触屏的响应,然后CPU处理到OS的内核等等.这里不作为重点来讲,要 ...
- 从输入 URL 到页面加载完成的过程中都发生了什么
从输入 URL 到页面加载完成的过程中都发生了什么 过程描述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理 ...
- 从输入 URL 到页面加载完成的过程详解---【XUEBIG】
从输入 URL 到页面加载完成的过程中都发生了什么事情? 这是一道经典的面试题,涉及面非常广,要答出来并不困难,当要将问题回答好却不是那么容易 过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 ...
- Android4.0 Launcher 源码分析2——Launcher内容加载绑定详细过程
Launcher在应用启动的时候,需要加载AppWidget,shortcut等内容项,通过调用LauncherModel.startLoader(),开始加载的工作.launcherModel中加载 ...
- ASP.NET Ajax 客户端框架未能加载、"Sys"未定义
在Windows Server 2003 系统上部署asp.net项目出现以下问题: IIS为6.0 导致菜单控件的图片显示不出来: WebSite:程序中的图片显示正常. 但用到ASP.net 2. ...
- 【转】 从输入 URL 到页面加载完成的过程中都发生了什么事情?
该问题总结 一. 往浏览器输入URL后给你一个页面,你天天在使用的东西,学过计算机网络的知道是怎么回事,就DNS解析然后页面的回馈,不过要讲好还是有难度. 之前fex团队的nwind专门写过这个问题的 ...
- Web访问原理-从输入URL到页面加载完成的过程中都发生了什么事情?
从输入URL到页面加载完成的过程中都发生了什么事情?--这是一个经典的面试题: 主要是关于计算机网络方面的知识基础,对于非科班计算机自学web开发的同学可能理解起来就很困难. StackOverFlo ...
- 从输入 URL 到页面加载完的过程中都发生了什么事情?
1) 把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号:协议是从该计 算机获取资源的方式,常见的是HTTP.FTP,不 ...
随机推荐
- Python基础之告警定义与告警抑制
技术背景 在前面一篇博客中我们介绍了在python中自定义异常以及异常的捕获.这里我们要介绍另外一种形式的用户提醒:告警.我们这里就不给出一些过于官方或者技术的定义了,在实际项目中的使用场景主要有这么 ...
- 用 customRef 做一个防抖函数,支持 element 等UI库。
这几天学习Vue的官网,看到 customRef 提供了一个例子,研究半天发现这是一个防抖函数,觉得挺好,于是把这个例子扩展了一下,可以用于表单子控件和查询子控件. 需求 v-model 基于 ele ...
- 第25 章 : Kubernetes 网络模型进阶
Kubernetes 网络模型进阶 本文将主要分享以下五个方面的内容: Kubernetes 网络模型来龙去脉 Pod 究竟如何上网? Service 究竟怎么工作? 啥?负载均衡还分内部外部? 思考 ...
- 三分钟玩转微软AI量化投资开源库QLib
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 微软QLib简介 微软亚洲研究院发布了 AI 量化投资开源平台"微矿 Qlib".Q ...
- OGG-集成模式抽取与数据库参数streams_pool_size关系
一.学习目标 Oracle数据库,使用OGG集成模式抽取进程启动时,如果没有配置合理的streams_pool_size参数可能会过一段时间就报错abend! 那么我们如何配置这个参数的大小?如何计算 ...
- CSS3常见动画
一.是什么 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多,如 ...
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- 记一次 .NET游戏站程序的 CPU 爆高分析
一:背景 1. 讲故事 上个月有个老朋友找到我,说他的站点晚高峰 CPU 会突然爆高,发了两份 dump 文件过来,如下图: 又是经典的 CPU 爆高问题,到目前为止,对这种我还是有一些经验可循的. ...
- Day14_78_可变长参数
可变长参数 可变长参数只能在形参列表的最后一个,且只能出现一次. 代码实例 import java.util.Date; public class 可变长参数 { public static void ...
- Day01_11_Java方法
Java - 方法 什么是java中的方法? - 方法就是一段代码片段,并且这段代码可以完成某个特定的功能.动作.是可以被重复的使用. - 方法就是类的一个动作. - 方法在C语言中也叫做函数 或 f ...