能力值:
( LV9,RANK:610 )
2 楼
判断ExitTime或者ObjectTable等~~
能力值:
( LV3,RANK:20 )
3 楼
多谢achillis大牛~
经过实验,若是已终结的进程,ExitTime会不为0,而ObjectTable会等于0,如此可以判断。
那么是不是说windows会定期或不定期地清理ActiveProcessLinks链表呢?
能力值:
( LV2,RANK:10 )
4 楼
不懂帮顶。。
能力值:
( LV3,RANK:20 )
5 楼
所谓进程.也是一个对象而已.
对象存在一个引用计数的问题.
而删除一个进程在PsActiveProcessHead链表中的项是在
进程对象的删除例程里面[PspProcessDelete]执行的.
但是对象管理器只有在这个对象引用计数为0的时候才会去销毁这个对象.
而销毁这个对象的时候才会去调用这个对象的删除例程(如果存在).
所以答案很明显.某些不规范的程序.增加了程序的引用计数.却忘了去减少引用.
导致在进程被PspTerminateProcess结束了之后进程对象本身引用计数还不符合
删除的标准.这就导致僵死进程的出现..(对象没被销毁.对象删除例程没有被调用.链表内自然就显示的有)
能力值:
( LV3,RANK:20 )
6 楼
[QUOTE=傷遺忘;846945]所谓进程.也是一个对象而已.
对象存在一个引用计数的问题.
而删除一个进程在PsActiveProcessHead链表中的项是在
进程对象的删除例程里面[PspProcessDelete]执行的.
但是对象管理器只有在这个对象引用计数为0的时候才会去销毁这个对象.
而销...[/QUOTE]
这么分析也有道理,但是我实验的程序中不乏notepad.exe这样的程序啊
启动notepad后:
Process Name: notepad.exe ID: 1208 Parent Process ID: 1496
Image File Path: \Device\HarddiskVolume1\WINDOWS\system32\notepad.exe
ObjectTable: e1196af0
关闭notepad后:
Process Name: notepad.exe ID: 1208 Parent Process ID: 1496
Image File Path: \Device\HarddiskVolume1\WINDOWS\system32\notepad.exe
ObjectTable: 0
能力值:
( LV3,RANK:20 )
7 楼
不是的..
你误会了.
某些不规范的程序.
并不一定指的是这个程序它自身.
你比如说.随便建立一个驱动工程.
然后在入口内调用如下函数.
VOID BadFunctionTest()
{
ULONG i=0;
PEPROCESS ProcessPointer=NULL;
NTSTATUS status=STATUS_UNSUCCESSFUL;
for (;i<65535;i+=4)
{
status=PsLookupProcessByProcessId((HANDLE)i,&ProcessPointer);
if (NT_SUCCESS(status))
{
DbgPrint(" This Process Count Add...\n");
}
} }
就会造成已经创建的进程的进程对象引用计数不平衡.
说简单一点就是说.系统中运行的第三方程序.都有可能设计不够完善.从而造成这种情况出现..
能力值:
( LV3,RANK:20 )
8 楼
是这样啊……这么说不规范的程序就是我的驱动
看了下WDK的文档,在PsLookupProcessByProcessId之后应该ObDereferenceObject一下……都怪自己平时不仔细啊,多谢指点了~