首页
社区
课程
招聘
[求助]关于win32k.sys的疑问
发表于: 2014-5-17 20:23 8703

[求助]关于win32k.sys的疑问

2014-5-17 20:23
8703
会话(session)是由进程和其他的系统对象(比如窗口站、桌面和窗口)构成的,它们代表了一个用户的工作站登录会话。会话具体是由如下几个部分组成的:

     1. 每个会话包含一个单独的win32k.sys

     2. 专门的换页池区域

     3. 私有windows子系统和登陆进程的拷贝

     4. 系统空间中被映射的空间,被称为会话空间的区域

以上为引用某文章,那么有一个疑问,如果2个用户登录,那么win32k.sys到底在内存中存在多个备份,还是一个备份啊?
另外我用devicetree查询,发现win32k.sys是builtin_driver.而还有两个builtin_driver是pnpmanager和acpi_hal,pnpmanager和acpi_hal是builtin_driver可以理解,但是win32k.sys
为什么是builtin_driver呢?而且builtin_driver的size显示都是0,win32k.sys显示size也是0,
但win32k.sys明明是磁盘上的一个文件有几兆的大小。而且很疑问,系统内是不是有多份win32k.sys还是只有1份?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
曾经对这里也有研究过,下面摘录下几句话,可以继续探讨
================================

另外还有win32k这个特殊的模块

首先要提一个观点,一些资料里面说:内核空间对所有的进程都是共享的。

按一般读者的理解,那就是不管哪个进程访问0x80000000(32bit系统下)以上的内存,得到的内容都是一样的。

我想说的是,这句话严格来说是不对的。至少在windows下的session空间是不一样的,不同session的进程访问对应的session空间是不一样的。

其中WIN32K也是在session空间之内,那是不是也说明不同的session对应的win32k模块的物理内存不一样的,一般情况下是一样的,本人通过粗略读了下WRK,

它有点像dll,只要不同session的win32k的默认基地址(准确的说是和第一个win32k加载的基地址)一样的话,那它们对应的物理内存是一样的
2014-5-17 21:25
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个不光牵涉到基址的问题。还有每个session是否是单独的一份数据空间的问题。
就像重载内核一样,牵涉到2份数据的问题。所以,如果2个session,它们的kernel32.dll等等,都是两份,那么win32k.sys应该也是两份,分别载入到内存的不同位置,有2份可执行代码,同时有2份不同的数据段。
只是我的猜想,没有具体测试。也许使用远程登录,让系统具有本地和远程2个session的时候,再用pchunter查一下也许可以看出来。同时我还发现跟随win32k.sys之后载入的是dxapi.sys,这是书上没有提到的,应该是dx的内核库文件。可能dxapi.sys在内存中也有多个备份?或者还是只有一个image。
2014-5-17 21:47
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
我当时研究过了,代码段一样,对应同一个CA,pfn一样。但数据这个如果是win32k模块空间的,应该也是一样。但貌似还有其它的不同session内核空间(非win32k模块内),为什么说像kernel32也可能是两份呢,

btw:你不是深信服的吧
2014-5-17 22:21
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我不是深信服的啊。我只是觉得有可能是2份,如果不是,那是我猜想错了。kernel32.dll在两个不同的session里面,应该是两份吧?win32k.sys不也就是个dll吗,不过是R0的dll,所以我觉得也可能有2份。
2014-5-17 22:45
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
关键还是在section(CA)里面,看Map的时候,是怎么使用的,在我印象中,应用层的模块map时候好像都是用同一个section什么的,回头有好点的电脑了,我再调下,比较简单,进入不同2个session后,看它们的PFN就知道了(前提先不触发cow)
2014-5-17 23:08
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
应用层都是同个control area,代码段共享同样的物理内存。和session没关系。
2014-5-18 01:11
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我觉得有这几种可能。
1,应用程序,*.exe,开启多次,那么内存中存在多个exe的备份。比如notepad.exe,你运行2次,那么内存中有2个notepad.exe。
2,不同应用层序调用的dll,应该是共享一份代码映像,但是有一个问题,dll里面的全局变量,好像在各个应用程序里又是不同的。但是又有一些共享数据段,在不同应用层序里的数据是一样的。所以我对次不太明了。猜测如下:
dll载入时,代码段在物理内存中只有一份,但是数据段有多个副本,对应不同应用程序,但是,又有一种“共享数据段”,在内存中只有一份,所有应用程序读写这个“共享数据段”的数据,都影响其他应用程序对其读写。
但同时,又有一个疑问,猜测:
如果有2个session,那么每个session都有各自的dll备份,那么,比如kernel32.dll,就有两个代码段,存在于物理内存的两个空间中。但是,对于这个猜想,我认为也可能是错误的,但没有证实,对于2个session的情况,kernel32.dll到底有2个备份,还是仅仅只有1个备份。
对于win32k.sys,也是猜测和dll一样,有1个代码段,但是又多个数据段备份,对应多个不同的session?同样,也可能否定自己的猜测。
2014-5-18 08:51
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
另外还有一个疑问,假设exe也有导出函数。比如notepad.exe.
我先运行notepad.exe,然后运行a.exe, a.exe动态load notepad.exe并调用其中的导出函数。
那这个时候,notepad.exe在内存中,是有2份?还是只有1份?如果只有1份的话,那么
notepad.exe的数据段至少应该有2份吧,这样才不影响我从a.exe中调用notepad.exe。
2014-5-18 09:03
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
确实是,从WINDOWS各种组件的角度来看确实不应该和session扯上关系的。不过我以前分析的时候,倒觉得一个奇妙的地方就是,map的时候用的control area这些东西是从fs文件系统返回的section pointer(FCB)中找到的,换个说法是当一个执行模块最后的物理内存还存在的信息/原因 是在fs记住?,这样的跨组件交互,略觉奇怪,继续探讨
2014-5-18 10:53
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
都是一份,你的不少疑问的答案是在cow机制
2014-5-18 10:54
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
跟fs没关系,是cc(Cache manager).
2014-5-18 21:34
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
嗯,是cc。不过查找对应的section是通过fs返回了,map一个模块,有对应的文件嘛,肯定要和FS交互,最后CC在里面做支撑
2014-5-18 22:31
0
游客
登录 | 注册 方可回帖
返回
//