能力值:
( 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结构及遍历进程的相关知识。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
太感谢了。。。。。。。
|
能力值:
( 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;
}
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
感觉好像在C语言里面嵌入汇编时,不要去保存寄存器的呀?不怕当退也的时候寄存器被破坏了吗?或是不是编译器自动已保存了?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢了,不过问题我已经找出来了,,
就是编译器问题,
lea eax,dword ptr[eproc+0x88]////它(编译器)这句搞成add eax,0x80了,真不懂为什么?改成两步走就OK了。呵呵。。
太感谢你们了。
|
|
|