1. 程式人生 > >【舊文章搬運】Idle進程相關的一些東西

【舊文章搬運】Idle進程相關的一些東西

表頭 arr ffd 共享 如何 initials pro == ogre

原文發表於百度空間,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);
}

四行代碼搞定~~

【舊文章搬運】Idle進程相關的一些東西