【舊文章搬運】Idle進程相關的一些東西
阿新 • • 發佈:2018-12-26
表頭 arr ffd 共享 如何 initials pro == ogre 其實那是PsActiveProcessHead,就是活動進程鏈的鏈表頭,它只是一個LIST_ENTRY結構而已,讀取它後面的數據是沒有意義的.
二.如何找到Idle進程?
似乎看到過一種暴搜法,但是事實上完全沒有必要.
在處理器控制塊中保存著IdleThread,當處理器空閑時,它就會調度這個線程來完成一些工作(零頁面處理?).
因此從處理器控制域KPRCB中找Idle進程是最方便快捷的.
過程如下:
原文發表於百度空間,2009-05-13
==========================================================================
Idle進程和System進程一樣,也是系統中的一個特殊進程,嚴格講它不算是一個進程,但是它有自己的EPROCESS,並有一個IdleThread.
若說它算一個進程,它的進程空間、句柄表、Token等卻又和System進程一樣,即共享了System的內核數據,所以不能以常理對待之.
關於Idle進程的兩個問題:
一.活動進程鏈上為何找不到Idle進程?
事實上是因為Idle進程根本就不在活動進程鏈上掛著.
有人在遍歷ActiveProcessLink時總會看到一個很奇怪的進程,PID很離奇,也得不到映像名,便以為是Idle進程了.
二.如何找到Idle進程?
似乎看到過一種暴搜法,但是事實上完全沒有必要.
在處理器控制塊中保存著IdleThread,當處理器空閑時,它就會調度這個線程來完成一些工作(零頁面處理?).
因此從處理器控制域KPRCB中找Idle進程是最方便快捷的.
過程如下:
lkd> dt _KPRCB ffdff120 nt!_KPRCB +0x000 MinorVersion : 1 +0x002 MajorVersion : 1 +0x004CurrentThread : 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進程相關的一些東西