能力值:
( LV8,RANK:120 )
|
-
-
2 楼
曾经对这里也有研究过,下面摘录下几句话,可以继续探讨
================================
另外还有win32k这个特殊的模块
首先要提一个观点,一些资料里面说:内核空间对所有的进程都是共享的。
按一般读者的理解,那就是不管哪个进程访问0x80000000(32bit系统下)以上的内存,得到的内容都是一样的。
我想说的是,这句话严格来说是不对的。至少在windows下的session空间是不一样的,不同session的进程访问对应的session空间是不一样的。
其中WIN32K也是在session空间之内,那是不是也说明不同的session对应的win32k模块的物理内存不一样的,一般情况下是一样的,本人通过粗略读了下WRK,
它有点像dll,只要不同session的win32k的默认基地址(准确的说是和第一个win32k加载的基地址)一样的话,那它们对应的物理内存是一样的
|
能力值:
( 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。
|
能力值:
( LV8,RANK:120 )
|
-
-
4 楼
我当时研究过了,代码段一样,对应同一个CA,pfn一样。但数据这个如果是win32k模块空间的,应该也是一样。但貌似还有其它的不同session内核空间(非win32k模块内),为什么说像kernel32也可能是两份呢,
btw:你不是深信服的吧
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我不是深信服的啊。我只是觉得有可能是2份,如果不是,那是我猜想错了。kernel32.dll在两个不同的session里面,应该是两份吧?win32k.sys不也就是个dll吗,不过是R0的dll,所以我觉得也可能有2份。
|
能力值:
( LV8,RANK:120 )
|
-
-
6 楼
关键还是在section(CA)里面,看Map的时候,是怎么使用的,在我印象中,应用层的模块map时候好像都是用同一个section什么的,回头有好点的电脑了,我再调下,比较简单,进入不同2个session后,看它们的PFN就知道了(前提先不触发cow)
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
应用层都是同个control area,代码段共享同样的物理内存。和session没关系。
|
能力值:
( 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?同样,也可能否定自己的猜测。
|
能力值:
( 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。
|
能力值:
( LV8,RANK:120 )
|
-
-
10 楼
确实是,从WINDOWS各种组件的角度来看确实不应该和session扯上关系的。不过我以前分析的时候,倒觉得一个奇妙的地方就是,map的时候用的control area这些东西是从fs文件系统返回的section pointer(FCB)中找到的,换个说法是当一个执行模块最后的物理内存还存在的信息/原因 是在fs记住?,这样的跨组件交互,略觉奇怪,继续探讨
|
能力值:
( LV8,RANK:120 )
|
-
-
11 楼
都是一份,你的不少疑问的答案是在cow机制
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
跟fs没关系,是cc(Cache manager).
|
能力值:
( LV8,RANK:120 )
|
-
-
13 楼
嗯,是cc。不过查找对应的section是通过fs返回了,map一个模块,有对应的文件嘛,肯定要和FS交互,最后CC在里面做支撑
|
|
|