首页
社区
课程
招聘
[旧帖] [求助]关于MmGetSystemRoutineAddress函数获取PspCidTable地址 0.00雪花
发表于: 2009-8-2 14:55 1705

[旧帖] [求助]关于MmGetSystemRoutineAddress函数获取PspCidTable地址 0.00雪花

2009-8-2 14:55
1705
小弟看到网上写的获取PspCidTable的方法。首先是要获得PsLookupProcessByProcessId函数的地址:
RtlInitUnicodeString (&pslookup,L"PsLookupProcessByProcessId");       
addr = (PUCHAR) MmGetSystemRoutineAddress(&pslookup);

对这句我不太理解。在网上搜索了MmGetSystemRoutineAddress函数的用法,很多地方说这个函数与用户态的GetProcessAddress函数雷同。我想,我们用GetProcessAddress的时候,首先要LoadLiabrary将一个dll装在到我们进程的地址空间,那么这个dll中所有函数都已经在我们进程自己的空间中了,再用GetProcessAddress当然可以获取函数地址。但是,我们用MmGetSystemRoutineAddress函数获取PsLookupProcessByProcessId地址的时候,PsLookupProcessByProcessId又不属于我们的进程(网上说这是被ntoskrnl.exe导出的,关于什么叫“导出”我也不太明白)。我们怎么能获取别的进程中函数地址呢?

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 218
活跃值: (11)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
导出就是可以被别人调用
2009-8-2 17:26
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
进程中4GB的内存被分为两个部分,低2GB也就是1-2GB是用户空间,我们的进程运行在这里。高2GB也就是3-4GB是系统空间,这个地方是操作系统的空间,所有的进程的3-4GB空间映射的地址是一样的,也就是说其实所有进程的3-4GB空间是在一起的。
ntoskrnl是内核模块,它应该在进程的高2GB空间中,也就是在系统空间中,所以这个模块不存在说是"哪个进程"的,而是所有进程共享的。你可以打开冰刃验证下这个,看看SSDT,里面的函数地址都在0x80000000以上,也就是都在高2GB空间中,而这些函数就是从ntoskrnl中导出的。
ntoskrnl从名字上就可以看出,它是操作系统的核心级模块,它是在系统启动的时候被运行的。它里面包含了很多的系统服务函数,究竟有多少呢? 我算了一下好像有1487个....
2009-8-2 18:29
0
雪    币: 89
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的解答。我以前一直以为每个进程3-4GB空间都是不同的,现在明白了。
2009-8-2 20:18
0
游客
登录 | 注册 方可回帖
返回
//