-
-
[原创]xp sp3下简单遍历ActiveProcessLinks获取进程
-
发表于:
2011-7-15 12:22
8660
-
[原创]xp sp3下简单遍历ActiveProcessLinks获取进程
先声明~我是小菜,初学windows驱动,欢迎各位大牛拍砖~~
先放代码~
/*
从ActiveProcessLink上遍历进程
*/
VOID GetProcess()
{
//获取EPROCESS结构
ULONG epadr = (ULONG)PsGetCurrentProcess();
if((epadr == 0) || (epadr == 0xffffffff)){
KdPrint(("Can't get the process!\n"));
return;
}
//获取ActiveProcessLink链表,EPROCESS+0X88是ActiveProcessLink节点
LIST_ENTRY* pActPro = (LIST_ENTRY*)(epadr + 0x88);
LIST_ENTRY* bC = pActPro;
//获取保存文件名的ImageFileName数组,EPROCESS+0X174是ImageFileName数组
UCHAR* ImageFileName = (UCHAR*)(epadr + 0x174);
do{
KdPrint(("%s.\n",ImageFileName));
//遍历链表
pActPro = (LIST_ENTRY*)pActPro->Flink;
//获得ImageFileName
_asm{
mov eax,pActPro
add eax,236
mov ImageFileName,eax
}
}while(pActPro->Flink != bC);
}
#pragma LOCKEDCODE
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
#ifdef DBG
_asm int 3
#endif
KdPrint(("进入驱动入口\n"));
GetProcess();
KdPrint(("DriverEntry end\n"));
return STATUS_SUCCESS;
}
在EPROCESS中,ActiveProcessLinks域是一个双链表节点,在windows中,所有活动进程都连接在一起,构成一个双链表,表头是全局变量PsActiveProcessHead。当一个进程创建时,其ActiveProcessLinks域将作为节点加入到此链表中;当进程删除是,则从链表中移除。
但是为什么System Idle Process不能在链表中遍历出来呢?想不通。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课