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过程总结的更多相关文章

  1. JVM加载类的过程,双亲委派机制中的方法

    JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载  1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...

  2. 从输入 URL 到页面加载完成的过程中都发生了什么事情?

    这个问题是老生常谈的问题啦,虽然说到处百度都有的答案,还是希望自己能总结一下. 如今有很多答案,都是从硬件开始讲起,比如键盘的响应或者触屏的响应,然后CPU处理到OS的内核等等.这里不作为重点来讲,要 ...

  3. 从输入 URL 到页面加载完成的过程中都发生了什么

    从输入 URL 到页面加载完成的过程中都发生了什么 过程描述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理 ...

  4. 从输入 URL 到页面加载完成的过程详解---【XUEBIG】

    从输入 URL 到页面加载完成的过程中都发生了什么事情? 这是一道经典的面试题,涉及面非常广,要答出来并不困难,当要将问题回答好却不是那么容易 过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 ...

  5. Android4.0 Launcher 源码分析2——Launcher内容加载绑定详细过程

    Launcher在应用启动的时候,需要加载AppWidget,shortcut等内容项,通过调用LauncherModel.startLoader(),开始加载的工作.launcherModel中加载 ...

  6. ASP.NET Ajax 客户端框架未能加载、"Sys"未定义

    在Windows Server 2003 系统上部署asp.net项目出现以下问题: IIS为6.0 导致菜单控件的图片显示不出来: WebSite:程序中的图片显示正常. 但用到ASP.net 2. ...

  7. 【转】 从输入 URL 到页面加载完成的过程中都发生了什么事情?

    该问题总结 一. 往浏览器输入URL后给你一个页面,你天天在使用的东西,学过计算机网络的知道是怎么回事,就DNS解析然后页面的回馈,不过要讲好还是有难度. 之前fex团队的nwind专门写过这个问题的 ...

  8. Web访问原理-从输入URL到页面加载完成的过程中都发生了什么事情?

    从输入URL到页面加载完成的过程中都发生了什么事情?--这是一个经典的面试题: 主要是关于计算机网络方面的知识基础,对于非科班计算机自学web开发的同学可能理解起来就很困难. StackOverFlo ...

  9. 从输入 URL 到页面加载完的过程中都发生了什么事情?

    1) 把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号:协议是从该计 算机获取资源的方式,常见的是HTTP.FTP,不 ...

随机推荐

  1. 一些比较好的国外IT网站

    1.在线编程练习: LintCode --在线刷题网站,阶梯式训练,可帮助你更快速深入地了解各类面试题型,提供专业导师写的最优代码作为参考 (Lintcode 标准答案查询--lintcode 的参考 ...

  2. effective解读-第八条 避免使用finalizer和Cleaner

    java9之前finalizer,java9使用cleaner代替了finalizer.相比finalizer,cleaner(它存在于一个独立类Cleaner中,需要时候注入到对应类中即可)不会污染 ...

  3. CentOS7使用NTP搭建时间同步服务器

    前言 为什么要搭建时间同步服务器呢?场景是这样的. 我们有两台CentOS服务器,其中一台是可以连接外网的,下文中我们称它为A服务器,另一台不能连接外网,但是与A服务器在同一局域网中,下文中我们称它为 ...

  4. MongoDB教程--配置与入门

    MongoDB简介 阿里云配置MongoDB 数据库的增删查改 MongoDB 数据最重要的操作是Key-Value的映射.有了这样的映射,可以直接通过关键字去寻找想要的值.例如,通过用户的ID寻找与 ...

  5. angularjs 图片上传

    <input type="file" file-model="myFile"/><div class="col-md-12" ...

  6. 01_pytorch和tensorflow的区别

    Pytorch和TensorFlow的区别 目录 引言 pytorch和tensorflow的功能 torch和tf的区别 torch tf Torch和tf到底用哪个 总结 引言 在这里,我们长话短 ...

  7. 201871010109-胡欢欢-实验一-软件工程的准备(初识github及《现代软件工程-构建之法》)

    项目 内容 课程班级博客链接 2021年春软件工程课程班(2018级计算机科学与技术) 这个作业要求链接链接 实验一软件工程准备 我的课程学习目标 了解github的基本使用,学习markdown编辑 ...

  8. (十九)VMware Harbor 详细介绍

    一 . 简介 Harbor是VMware公司开源的企业级DockerRegistry项目,项目地址为https://github.com/vmware/harbor.其目标是帮助用户迅速搭建一个企业级 ...

  9. Python:读写文件(I/O) | 组织文件

    1. I/O 概述  程序与用户交互涉及到程序的输入输出(I/O) 一种类型是字符串,通过input() 和 print() 函数以及数据类型转换类函数如(int()),实现数据的输入输出. 另一种类 ...

  10. Java on Visual Studio Code的更新 – 2021年3月

    欢迎来到Java的VS Code更新.在过去的几个月中,我们的工程师一直在专注于一些非常重要的工作.现在,是时候揭开面纱了,开始吧. 类型层次结构(Type hierarchy) VS Code已经支 ...