首页
社区
课程
招聘
[求助]为什么ntOpenProcess获取到的“进程句柄” 和进程的PID值不一样(pid是pspcidtable的句柄,那么这api返回的是哪个句柄表里的句柄?)
发表于: 2010-1-28 16:11 9213

[求助]为什么ntOpenProcess获取到的“进程句柄” 和进程的PID值不一样(pid是pspcidtable的句柄,那么这api返回的是哪个句柄表里的句柄?)

2010-1-28 16:11
9213
“句柄”就是 “对象” 在“句柄表”的“索引”-----------------这是我在网上学到的。

进程的PID就是进程的EPROCESS对象在 pspcidtable句柄表的索引。
我以为仅仅是 “csrss.exe进程的句柄表” 和 “pspcidtable句柄表”里有所有进程EPROCESS对象。 因为PID已经是pspcidtable句柄表里的句柄了,所以后者排除。 前者几率也不大。
问:
ntOpenProcess这个api返回的 所谓 “进程句柄”(还有ring3经常传来传去那个“进程句柄”)是 “哪种对象” 在“什么句柄表”(是pspcidtable 还是哪个进程句柄表)的偏移呢?

因为这里有些容易晕 所以我特意在 比较长的名字加“”符号, 方便大家看懂我的问题。

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
PID是EPROCESS对象指针在PspCidTable表里的索引,而NtOpenProcess获得的进程句柄是相应的HANDLE_TABLE_ENTRY结构在发起这个调用的进程的句柄表中的索引。
另外PspCidTable根本不是句柄表,就是EPROCESS和ETHREAD的索引表。

一般来说,如果NtOpenProcess指定的是PID的话,那么流程是:
PsLookupProcessByProcessId->ObOpenObjectByPointer
PsLookupProcessByProcessId是在PspCidTable里通过这个PID索引找EPROCESS指针。
ObOpenObjectByPointer调用ObpCreateHandle获得句柄,ObpCreateHandle准备好新的HANDLE_TABLE_ENTRY结构的内容,然后调用ExCreateHandle,ExCreateHandle调用ExpAllocateHandleTableEntry在相应的句柄表中创建新的表项,并把ObpCreateHandle传进来的HANDLE_TABLE_ENTRY结构中的内容copy到新的表项中。
这些在wrk看一下就知道了。

PS:你很久以前就说自己在看wrk,如果是真的,那么这些问题你完全可以自己解决而不需要傻傻的询问。除非你自己根本看不懂wrk。要不你就承认你真的看不懂wrk而且真的不会找资料,否则如果你认为自己看得懂却一直这样懒得自己动手,那终究有一天我也会失去回答你问题的耐心。
2010-1-28 16:19
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你是我明白了:
1.PID不算句柄。
2.ntopenprocess确定进程,最终也是通过pspcidtable来获取的。(实际上我要的就是这一条)
3.让我看wrk

我没弄明白的:
1.你说了一系列用来创建HANDLE_TABLE_ENTRY的函数。 不过是在哪个进程的句柄表里创建的呢?

PS:看你的态度的话呢。。╭(╯3╰)╮。。。“没弄明白的”看来要自己弄明白了。。。。。
2010-1-28 17:23
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
而NtOpenProcess获得的进程句柄是相应的HANDLE_TABLE_ENTRY结构在发起这个调用的进程的句柄表中的索引
我都说得很明确了,哪个进程调用了NtOpenProcess,加入的表项就是在这个进程的句柄表里(得到的句柄就是给这个进程用的),我每一次回答问题都是字斟句酌的,如果你仔细咀嚼是完全可以理解的。
2010-1-28 23:45
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
啊啊 果然不愧轩辕小葱。
我终于找到了ObpCreateHandle调用的是ObpGetObjectTable来获取ObjectTable变量
然后  NewHandle = ExCreateHandle( ObjectTable, &ObjectTableEntry );

而单单从ObpGetObjectTable的定义来看 已经很明显了呢!
#define ObpGetObjectTable() (PsGetCurrentProcess()->ObjectTable)

谢谢! 轩辕小葱!
2010-1-29 12:46
0
游客
登录 | 注册 方可回帖
返回
//