首页
社区
课程
招聘
[求助]HOOK shadow ssdt 一个小问题!
发表于: 2008-12-12 22:25 6673

[求助]HOOK shadow ssdt 一个小问题!

2008-12-12 22:25
6673
win32k.sys不是常在内存的,如果不是GUI线程,shadow ssdt地址无效
win32k.sys只有在GUI线程中才加载,一般情况下是不加载的


这个到底是什么意思啊,我琢磨了好久就是没想通

这句话说 win32k.sys只有在GUI线程中才加载,win32k.sys不是加载到0x80000000后面的内存(即内核内存)中的吗?跟线程有什么关系呢?

换个角度想下,win32k.sys如果不是常在内存,那么意思就是说当内核中有GUI线程系统才会加载这个模块,当内核中没有GUI线程系统就卸载这个模块吗?
如果这样的话,当我们HOOK完 shadow ssdt,然后GUI线程没了,系统就卸载win32k.sys模块,那么当系统下次再加载win32k.sys模块,HOOK 不就没用了?

真是百思不得其解啊,哪位兄台能给我具体整体的解释一下呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
所谓0x80000000内存,还是线性地址也就是虚拟地址,而不是物理地址。在非GUI线程中win32k.sys没有映射到虚拟地址,所以这样的线程寻址不到它。
至于HOOK,不存在“HOOK不就没用了”的问题。
要说清这个问题,首先应该说明用户态情况下的模块和内核模块的内存映射上的不同。
用户态模块如ntdll.dll,是有Copy on Write机制的,也就是当在用户态写ntdll.dll等dll模块的内存(对函数进行HOOK)时,系统“拷贝”一份DLL模块映像的新“备份”,把这个“备份”映像给程序,所以程序对这个“备份”的写入效果只对自身进程有效,其他进程所访问的ntdll.dll在物理地址上是另一个“备份”,所以不受影响。
而内核模块如ntoskrnl.exe和win32k.sys等,没有Copy On Write机制,也就是说所有内核线程访问到的ntoskrnl.exe模块,都对应于物理地址上同一个区域,因此对这个区域的写入操作,影响的就是所有线程。win32k.sys也是同样的。只不过对非GUI线程,由于其没有加载win32k.sys,所以win32k.sys没有映射到其线性地址中,所以访问不到。而对于GUI线程,win32k.sys有被映像到其线性地址中,可以访问到,而对它的写入操作影响也是全局性的。
2008-12-13 00:02
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
也就是说
ntoskrnl.exe和win32k.sys等内核模块都实际存在与物理地址中,只有他们映射到虚拟地址了,线程才能访问到他们,如果没有映射的话,就访问不到是吧?
多谢小聪朋友
2008-12-13 00:15
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
这些东西不需要映射到虚拟内存,他们只能通过系统服务来调用。所谓的win2k.sys没有加载,看一下ntdll.dll和user32.dll、gdi32.dll的那些int 2E,就应该明白。ntdll.dll中的int 2E最后是在ntoskrnl.exe中实现的,而user32.dll、gdi32.dll是在对应的winxx.sys中实现的。
2008-12-13 16:54
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
5
你所说的是用户态怎么切换进内核态,而楼主问的是内核态如何访问内核文件,因此你的回答不完全切题。
“这些东西不需要映射到虚拟内存”,注意虚拟内存和虚拟地址是两码事。这里说的是虚拟地址,也就是程序访问的线性地址。
是否GUI线程与是否调用win32k.sys中的系统服务函数密切相关。
每个线程初始化时都是非GUI线程,当第一次调用到win32k.sys中的相关服务函数时(与一般int 2E一样,都是由KiSystemService处理的),内核调用PsConvertToGuiThread将其转化为GUI线程,这时线程KTHREAD结构中的ServiceTable就从原来指向KeServiceDescriptorTable变为指向KeServiceDescriptorTableShadow了。
2008-12-13 21:40
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最近在看书, 关于这方面有不少疑问, 借地问个问题
当访问某线性地址时, 操作系统是将该页从物理内存映射到线性地址, 还是从线性地址中映射到物理内存中进行运算?  一直没搞清,书上也没讲清.  哪位兄台能点拨一下啊.
2008-12-13 23:08
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
多谢指点。尤其是转换为GUI线程的那个问题,我还是第一次知道。
我只是觉得lz的问题有点怪,winxx.sys不是dll,不会随着应用程序的加载和卸载而变化的,所以hook后winxx.sys又被卸载的问题就很怪了。不过到底winxx.sys是在线性地址中还是在未分页的地址中,我也不知道。但我认为winxx.sys应该不存在被卸载的问题,是否是这样,请指教一下。
2008-12-16 11:42
0
游客
登录 | 注册 方可回帖
返回
//