首页
社区
课程
招聘
[讨论]问个问题,简单,可我就不懂!有关Plink,PID
发表于: 2008-12-13 15:24 4996

[讨论]问个问题,简单,可我就不懂!有关Plink,PID

2008-12-13 15:24
4996

大家都知道PsGetCurrentProcess()获得当前进程的指针;
可现在我想获得下一个进程的指针,怎么办?
看了很多文章,好像有什么偏移加来加去得出的,但是这里所谓的偏移是什么东西,若有怎么得出的啊。 ??
“别用砖头砸我!”

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
PsGetCurrentProcess(XP SP3)的实现很简单:
lkd> u PsGetCurrentProcess
nt!PsGetCurrentProcess:
8052c2e2 64a124010000    mov     eax,dword ptr fs:[00000124h]
8052c2e8 8b4044          mov     eax,dword ptr [eax+44h]
8052c2eb c3              ret

fs:[00000124h]处是自身进程KTHREAD结构的指针
KTHREAD结构的0x44偏移处则是KTHREAD结构中ApcState.Process成员,这里保存的就是自身进程的EPROCESS结构的指针。

至于你指的“下一个进程”,既然称为“下一个”,首先就有一个问题,就是这个“下一个”是按什么顺序排的,也就是你依照的是什么链表,你首先应该把这个搞清楚。
把这个搞清楚了,知道你依照的是哪个链表了,那么方法是显然的:查这个链表啊!

假设你依照的链表是ActiveProcessLinks,那么就通过遍历这个链表找到下一项。
在XP中ActiveProcessLinks在EPROCESS结构的偏移是0x88
ActiveProcessLinks是个双向链表,现在假设你查找的是Flink。
那么在XP下你只要这么做:
call PsGetCurrentProcess
lea ebx, dword ptr[eax+88h]
mov eax,dword ptr[ebx]
sub eax,88h

这样eax就是ActiveProcessLinks链表中下一个EPROCESS项的指针了。

更详细的资料,楼主需要了解_EPROCESS结构及遍历进程的相关知识。
2008-12-13 22:22
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
太感谢了。。。。。。。
2008-12-14 10:17
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我这样怎么还不找指定的进程:
           eproc=(DWORD)PsGetCurrentProcess();
                 PID=*((DWORD *)(eproc+0x84));
           while(1)
        {
                if(my_PID==PID) return eproc;//my_PID自己指定的ID
                        __asm        //
                        {
                                lea eax,dword ptr[eproc+0x88]//Flink
                                mov        ebx,dword ptr[eax]
                                sub        ebx,0x88
                                mov        eproc,ebx
                                     /*add        ebx,0x84//Pid
                                mov        eax,dword ptr[ebx]
                                mov current_PID,eax*/
                        }
                                               PID=*((DWORD *)(eproc+0x84));//Pid
                        i_count++;
        }
        return 0;
}
2008-12-14 17:10
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
感觉好像在C语言里面嵌入汇编时,不要去保存寄存器的呀?不怕当退也的时候寄存器被破坏了吗?或是不是编译器自动已保存了?
2008-12-14 17:53
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢了,不过问题我已经找出来了,,
就是编译器问题,
lea eax,dword ptr[eproc+0x88]////它(编译器)这句搞成add eax,0x80了,真不懂为什么?改成两步走就OK了。呵呵。。
太感谢你们了。
2008-12-14 19:32
0
游客
登录 | 注册 方可回帖
返回
//