原文发表于百度空间,2009-05-13
==========================================================================
Idle进程和System进程一样,也是系统中的一个特殊进程,严格讲它不算是一个进程,但是它有自己的EPROCESS,并有一个IdleThread.
若说它算一个进程,它的进程空间、句柄表、Token等却又和System进程一样,即共享了System的内核数据,所以不能以常理对待之.
关于Idle进程的两个问题:
一.活动进程链上为何找不到Idle进程?
事实上是因为Idle进程根本就不在活动进程链上挂着.
有人在遍历ActiveProcessLink时总会看到一个很奇怪的进程,PID很离奇,也得不到映像名,便以为是Idle进程了.
其实那是PsActiveProcessHead,就是活动进程链的链表头,它只是一个LIST_ENTRY结构而已,读取它后面的数据是没有意义的.
二.如何找到Idle进程?
似乎看到过一种暴搜法,但是事实上完全没有必要.
在处理器控制块中保存着IdleThread,当处理器空闲时,它就会调度这个线程来完成一些工作(零页面处理?).
因此从处理器控制域KPRCB中找Idle进程是最方便快捷的.
过程如下:
lkd> dt _KPRCB ffdff120 nt!_KPRCB +0x000 MinorVersion : 1 +0x002 MajorVersion : 1 +0x004 CurrentThread : 0x8958fda8 _KTHREAD +0x008 NextThread : (null) +0x00c IdleThread : 0x80561c20 _KTHREAD //Idle线程 lkd> dt _KTHREAD 0x80561c20 nt!_KTHREAD +0x000 Header : _DISPATCHER_HEADER +0x010 MutantListHead : _LIST_ENTRY [ 0x80561c30 - 0x80561c30 ] +0x018 InitialStack : 0x80559480 +0x01c StackLimit : 0x80556480 +0x020 Teb : (null) +0x024 TlsArray : (null) +0x028 KernelStack : 0x805591cc .... +0x034 ApcState : _KAPC_STATE lkd> dt _KAPC_STATE 0x80561c20+34 nt!_KAPC_STATE +0x000 ApcListHead : [2] _LIST_ENTRY [ 0x80561c54 - 0x80561c54 ] +0x010 Process : 0x80561e80 _KPROCESS //这个就是Idle进程了 +0x014 KernelApcInProgress : 0 ‘‘ +0x015 KernelApcPending : 0 ‘‘ +0x016 UserApcPending : 0 ‘‘
获取IdleProcess的代码如下:
VOID GetIdleProcess() { PEPROCESS IdleProcess; _asm { mov eax,fs:[0x20] //取KPCR mov eax,[eax+0xC] //取IdleThread mov eax,[eax+0x44]//取ApcState->Process mov IdleProcess,eax } DbgPrint("IdleProcess=0x%08X\n",IdleProcess); }
四行代码搞定~~
原文地址:https://www.cnblogs.com/achillis/p/10181622.html
时间: 2024-10-08 10:12:14