进程线程001 进程线程结构体和KPCR
文章目錄
- 前言
- EPROCESS
- KPROCESS主要成員
- EPROCESS其他成員
- ETHREAD
- KTHREAD主要成員介紹
- ETHREAD其他成員介紹
- KPCR
- KPCR介紹
- _NT_TIB主要成員介紹
- KPCR的其他成員介紹
- KPRCB成員介紹
- KPRCB成員介紹
前言
進程線程的知識點很多,如果我們想了解問題的本質,就要從一些關鍵的結構體學起,先來介紹一個與進程密切相關的結構體
EPROCESS
每個進程在零環都有一個對應的結構體:EPROCESS,這個結構體包含了進程的所有重要信息。
這個結構體我們可以在windbg里面看到
kd> dt _EPROCESS nt!_EPROCESS+0x000 Pcb : _KPROCESS+0x098 ProcessLock : _EX_PUSH_LOCK+0x0a0 CreateTime : _LARGE_INTEGER+0x0a8 ExitTime : _LARGE_INTEGER+0x0b0 RundownProtect : _EX_RUNDOWN_REF+0x0b4 UniqueProcessId : Ptr32 Void+0x0b8 ActiveProcessLinks : _LIST_ENTRY+0x0c0 ProcessQuotaUsage : [2] Uint4B+0x0c8 ProcessQuotaPeak : [2] Uint4B+0x0d0 CommitCharge : Uint4B+0x0d4 QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK+0x0d8 CpuQuotaBlock : Ptr32 _PS_CPU_QUOTA_BLOCK+0x0dc PeakVirtualSize : Uint4B+0x0e0 VirtualSize : Uint4B+0x0e4 SessionProcessLinks : _LIST_ENTRY+0x0ec DebugPort : Ptr32 Void+0x0f0 ExceptionPortData : Ptr32 Void+0x0f0 ExceptionPortValue : Uint4B+0x0f0 ExceptionPortState : Pos 0, 3 Bits+0x0f4 ObjectTable : Ptr32 _HANDLE_TABLE+0x0f8 Token : _EX_FAST_REF+0x0fc WorkingSetPage : Uint4B+0x100 AddressCreationLock : _EX_PUSH_LOCK+0x104 RotateInProgress : Ptr32 _ETHREAD+0x108 ForkInProgress : Ptr32 _ETHREAD+0x10c HardwareTrigger : Uint4B+0x110 PhysicalVadRoot : Ptr32 _MM_AVL_TABLE+0x114 CloneRoot : Ptr32 Void+0x118 NumberOfPrivatePages : Uint4B+0x11c NumberOfLockedPages : Uint4B+0x120 Win32Process : Ptr32 Void+0x124 Job : Ptr32 _EJOB+0x128 SectionObject : Ptr32 Void+0x12c SectionBaseAddress : Ptr32 Void+0x130 Cookie : Uint4B+0x134 Spare8 : Uint4B+0x138 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY+0x13c Win32WindowStation : Ptr32 Void+0x140 InheritedFromUniqueProcessId : Ptr32 Void+0x144 LdtInformation : Ptr32 Void+0x148 VdmObjects : Ptr32 Void+0x14c ConsoleHostProcess : Uint4B+0x150 DeviceMap : Ptr32 Void+0x154 EtwDataSource : Ptr32 Void+0x158 FreeTebHint : Ptr32 Void+0x160 PageDirectoryPte : _HARDWARE_PTE+0x160 Filler : Uint8B+0x168 Session : Ptr32 Void+0x16c ImageFileName : [15] UChar+0x17b PriorityClass : UChar+0x17c JobLinks : _LIST_ENTRY+0x184 LockedPagesList : Ptr32 Void+0x188 ThreadListHead : _LIST_ENTRY+0x190 SecurityPort : Ptr32 Void+0x194 PaeTop : Ptr32 Void+0x198 ActiveThreads : Uint4B+0x19c ImagePathHash : Uint4B+0x1a0 DefaultHardErrorProcessing : Uint4B+0x1a4 LastThreadExitStatus : Int4B+0x1a8 Peb : Ptr32 _PEB+0x1ac PrefetchTrace : _EX_FAST_REF+0x1b0 ReadOperationCount : _LARGE_INTEGER+0x1b8 WriteOperationCount : _LARGE_INTEGER+0x1c0 OtherOperationCount : _LARGE_INTEGER+0x1c8 ReadTransferCount : _LARGE_INTEGER+0x1d0 WriteTransferCount : _LARGE_INTEGER+0x1d8 OtherTransferCount : _LARGE_INTEGER+0x1e0 CommitChargeLimit : Uint4B+0x1e4 CommitChargePeak : Uint4B+0x1e8 AweInfo : Ptr32 Void+0x1ec SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO+0x1f0 Vm : _MMSUPPORT+0x25c MmProcessLinks : _LIST_ENTRY+0x264 HighestUserAddress : Ptr32 Void+0x268 ModifiedPageCount : Uint4B+0x26c Flags2 : Uint4B+0x26c JobNotReallyActive : Pos 0, 1 Bit+0x26c AccountingFolded : Pos 1, 1 Bit+0x26c NewProcessReported : Pos 2, 1 Bit+0x26c ExitProcessReported : Pos 3, 1 Bit+0x26c ReportCommitChanges : Pos 4, 1 Bit+0x26c LastReportMemory : Pos 5, 1 Bit+0x26c ReportPhysicalPageChanges : Pos 6, 1 Bit+0x26c HandleTableRundown : Pos 7, 1 Bit+0x26c NeedsHandleRundown : Pos 8, 1 Bit+0x26c RefTraceEnabled : Pos 9, 1 Bit+0x26c NumaAware : Pos 10, 1 Bit+0x26c ProtectedProcess : Pos 11, 1 Bit+0x26c DefaultPagePriority : Pos 12, 3 Bits+0x26c PrimaryTokenFrozen : Pos 15, 1 Bit+0x26c ProcessVerifierTarget : Pos 16, 1 Bit+0x26c StackRandomizationDisabled : Pos 17, 1 Bit+0x26c AffinityPermanent : Pos 18, 1 Bit+0x26c AffinityUpdateEnable : Pos 19, 1 Bit+0x26c PropagateNode : Pos 20, 1 Bit+0x26c ExplicitAffinity : Pos 21, 1 Bit+0x270 Flags : Uint4B+0x270 CreateReported : Pos 0, 1 Bit+0x270 NoDebugInherit : Pos 1, 1 Bit+0x270 ProcessExiting : Pos 2, 1 Bit+0x270 ProcessDelete : Pos 3, 1 Bit+0x270 Wow64SplitPages : Pos 4, 1 Bit+0x270 VmDeleted : Pos 5, 1 Bit+0x270 OutswapEnabled : Pos 6, 1 Bit+0x270 Outswapped : Pos 7, 1 Bit+0x270 ForkFailed : Pos 8, 1 Bit+0x270 Wow64VaSpace4Gb : Pos 9, 1 Bit+0x270 AddressSpaceInitialized : Pos 10, 2 Bits+0x270 SetTimerResolution : Pos 12, 1 Bit+0x270 BreakOnTermination : Pos 13, 1 Bit+0x270 DeprioritizeViews : Pos 14, 1 Bit+0x270 WriteWatch : Pos 15, 1 Bit+0x270 ProcessInSession : Pos 16, 1 Bit+0x270 OverrideAddressSpace : Pos 17, 1 Bit+0x270 HasAddressSpace : Pos 18, 1 Bit+0x270 LaunchPrefetched : Pos 19, 1 Bit+0x270 InjectInpageErrors : Pos 20, 1 Bit+0x270 VmTopDown : Pos 21, 1 Bit+0x270 ImageNotifyDone : Pos 22, 1 Bit+0x270 PdeUpdateNeeded : Pos 23, 1 Bit+0x270 VdmAllowed : Pos 24, 1 Bit+0x270 CrossSessionCreate : Pos 25, 1 Bit+0x270 ProcessInserted : Pos 26, 1 Bit+0x270 DefaultIoPriority : Pos 27, 3 Bits+0x270 ProcessSelfDelete : Pos 30, 1 Bit+0x270 SetTimerResolutionLink : Pos 31, 1 Bit+0x274 ExitStatus : Int4B+0x278 VadRoot : _MM_AVL_TABLE+0x298 AlpcContext : _ALPC_PROCESS_CONTEXT+0x2a8 TimerResolutionLink : _LIST_ENTRY+0x2b0 RequestedTimerResolution : Uint4B+0x2b4 ActiveThreadsHighWatermark : Uint4B+0x2b8 SmallestTimerResolution : Uint4B+0x2bc TimerResolutionStackRecord : Ptr32 _PO_DIAG_STACK_RECORD這個結構體里面有太多的成員,我們并不需要了解其中的每一個細節,下面介紹幾個重要的成員
KPROCESS主要成員
EPROCESS偏移為0的地方是_KPROCESS結構體
kd> dt _EPROCESS nt!_EPROCESS+0x000 Pcb : _KPROCESS+0x000 Header
我們查看一下這個_KPROCESS結構體的內容
kd> dt _KPROCESS nt!_KPROCESS+0x000 Header : _DISPATCHER_HEADER_KPROCESS第一個成員叫Header,這個成員的類型是_DISPATCHER_HEADER。只有結構體里包含這個_DISPATCHER_HEADER數據類型,那么它就可以成為可等待對象。比如Mutex互斥體、Event事件等等(WaitForSingleObject)
**+0x018 DirectoryTableBase **
kd> dt _KPROCESS nt!_KPROCESS+0x000 Header : _DISPATCHER_HEADER+0x010 ProfileListHead : _LIST_ENTRY+0x018 DirectoryTableBase : Uint4B這個字段保存的是頁目錄表的基址,也就是CR3寄存器的值
+0x038 KernelTime&+0x03c UserTime : Uint4B
統計信息,記錄了一個進程在內核模式/用戶模式下所花的時間
+0x05c Affinity : Uint4B
在多核環境下,規定進程里面的所有線程能在哪個CPU上跑,如果值為1,那么這個進程的所有線程只能在0號CPU上跑(00000001)
如果值為3,那這個進程的所有線程能在0 1號CPU上跑(00000011)
如果值為4,那這個進程的所有線程能在2號CPU上跑(00000100)
如果值為5,那這個進程的所有線程能在0 2號CPU上跑(00000101)
4個字節共32位,所以最多32核,如果是Windows64位的操作系統,最多就64核
如果只有一個CPU,把這個設置為4,那么這個進程就死了
+0x062 BasePriority : Char
基礎優先級或最低優先級,該進程中所有線程最起碼的優先級。這個值設置成多少,那么這個進程下所有的線程默認的優先級就是多少。
EPROCESS其他成員
+0x070 CreateTime &+0x078 ExitTime : _LARGE_INTEGER
進程的創建/退出時間
+0x084 UniqueProcessId : Ptr32 Void
進程的編號 任務管理器中的PID
+0x088 ActiveProcessLinks : _LIST_ENTRY
在操作系統里,有一個全局變量PsActiveProcessHead
kd> dd PsActiveProcessHead 83f60f18 85edb9d8 884498b0 00000000 00000000 83f60f28 83ed448c 00000000 00000000 8ae01108 83f60f38 00000000 80000020 00000101 800002e4 83f60f48 80000024 00000000 00000000 00000000 83f60f58 00000000 00000000 00000113 00000000 83f60f68 00000000 83f1135a 00000000 00000000 83f60f78 00000000 00000000 00000008 00000000 83f60f88 83f60f88 83f60f88 00000000 00000000這個全局變量是所有活動進程的鏈表頭。而 ActiveProcessLinks : _LIST_ENTRY這個字段是一個雙向鏈表,將所有的活動進程連接在一起。
PsActiveProcessHead就是鏈表頭的位置。遍歷進程的API,查的就是這個鏈表。如果將當前進程從鏈表中移除,就可以實現進程隱藏,這種技術稱為斷鏈。
+0x090 QuotaUsage&+0x09c QuotaPeak: [3] Uint4B
? 物理頁相關的統計信息
+0x0a8 CommitCharge&+0x0ac PeakVirtualSize&+0x0b0 VirtualSize : Uint4B
虛擬內存相關的統計信息
+0x11c VadRoot : Ptr32 Void
標識0-2G哪些地址沒占用了
+0x0bc DebugPort&+0x0c0 ExceptionPort: Ptr32 Void
調試相關
**+0x0c4 ObjectTable: Ptr32 _HANDLE_TABLE **
句柄表
+0x174 ImageFileName : [16] UChar
進程鏡像文件名 最多16個字節
+0x1a0 ActiveThreads : Uint4B
活動線程的數量
+0x1b0 Peb : Ptr32 _PEB
PEB((Process Environment Block 進程環境塊):進程在3環的一個結構體,里面包含了進程的模塊列表、是否處于調試狀態等信息
ETHREAD
每個Windows線程在0環都有一個對應的結構體:ETHREAD,這個結構體包含了線程所有重要的信息
KTHREAD主要成員介紹
kd> dt _ETHREAD nt!_ETHREAD+0x000 Tcb : _KTHREADETHREAD結構體的第一個成員就是KTHREAD,下面介紹KTHREAD的主要成員
+0x000 Header: _DISPATCHER_HEADER
“可等待”對象,比如Mutex互斥體、Event事件等(WaitForSingleObject)
+0x018 InitialStack : Ptr32 Void
+0x01c StackLimit : Ptr32 Void
+0x028 KernelStack : Ptr32 Void
線程切換相關
- InitialStack:初始堆棧
- StackLimit: 零環線程堆棧的界限
- KernelStack:記錄當前零環的堆棧棧頂
+0x020 Teb : Ptr32 Void
TEB,Thread Environment Block,線程環境塊。
大小4KB,位于用戶地址空間。
FS:[0] -> TEB(3環時 0環時FS執行KPCR)
+0x02c DebugActive : UChar
如果值為-1 不能使用調試寄存器:Dr0 - Dr7
+0x034 ApcState : _KAPC_STATE
+0x0e8 ApcQueueLock : Uint4B
+0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE
+0x14c SavedApcState : _KAPC_STATE
APC相關
+0x02d State : UChar
線程狀態:就緒、等待還是運行
+0x06c BasePriority : Char
其初始值是所屬進程的BasePriority值(KPROCESS->BasePriority),以后可以通過KeSetBasePriorityThread()函數重新設定
**+0x070 WaitBlock : [4] _KWAIT_BLOCK **
等待哪個對象(WaitForSingleObject)
**+0x0e0 ServiceTable : Ptr32 Void **
指向系統服務表基址
+0x134 TrapFrame
進0環時保存環境
+0x140 PreviousMode : Char
先前模式:某些內核函數會判斷程序是0環調用還是3環調用的
**+0x1b0 ThreadListEntry : _LIST_ENTRY **
雙向鏈表:當前進程所有的線程 都掛在一個鏈表中 掛的就是這個位置
一共有兩個這樣的鏈表,如圖:
ETHREAD其他成員介紹
+0x1ec Cid:_CLIENT_ID
這個結構體里面保存有進程ID和線程ID
+0x220 ThreadsProcess:Ptr32 _EPROCESS
指向當前線程的所屬進程
+0x22C ThreadListEntry:_LIST_ENTRY
雙向鏈表,一個進程所有的線程,都掛在一個鏈表中
KPCR
KPCR:CPU控制區(Kernel Processor Control Region)
KPCR介紹
_NT_TIB主要成員介紹
kd> dt _KPCR nt!_KPCR+0x000 NtTib : _NT_TIB_NT_TIB是KPCR的第一個成員,來查看一下這個結構體的成員
kd> dt _NT_TIB nt!_NT_TIB+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD+0x004 StackBase : Ptr32 Void+0x008 StackLimit : Ptr32 Void+0x00c SubSystemTib : Ptr32 Void+0x010 FiberData : Ptr32 Void+0x010 Version : Uint4B+0x014 ArbitraryUserPointer : Ptr32 Void+0x018 Self : Ptr32 _NT_TIB+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
當前線程的SEH鏈表
+0x004 StackBase : Ptr32 Void
當前線程內核棧的基址
+0x008 StackLimit : Ptr32 Void
當前線程內核棧的大小
+0x018 Self : Ptr32 _NT_TIB
指向自己(也就是指向KPCR結構) 這樣設計的目的是為了查找方便
KPCR的其他成員介紹
+0x01c SelfPcr : Ptr32 _KPCR
指向自己,方便尋址
+0x020 Prcb : Ptr32 _KPRCB
指向拓展結構體PRCB
+0x038 IDT : Ptr32 _KIDTENTRY
IDT表基址
**+0x03c GDT : Ptr32 _KGDTENTRY **
GDT表基址
**+0x040 TSS : Ptr32 _KTSS **
指針,指向TSS,每個CPU都有一個TSS
+0x051 Number : UChar
CPU編號:0 1 2 3 4 5。。。
**+0x120 PrcbData : _KPRCB **
拓展結構體
KPRCB成員介紹
KPRCB是KPCR的拓展結構體
**+0x004 CurrentThread : Ptr32 _KTHREAD:**當前線程
+0x008 NextThread : Ptr32 _KTHREAD: 即將切換的下一個線程
+0x00c IdleThread : Ptr32 _KTHREAD : 空閑線程
IDTENTRY**
IDT表基址
**+0x03c GDT : Ptr32 _KGDTENTRY **
GDT表基址
**+0x040 TSS : Ptr32 _KTSS **
指針,指向TSS,每個CPU都有一個TSS
+0x051 Number : UChar
CPU編號:0 1 2 3 4 5。。。
**+0x120 PrcbData : _KPRCB **
拓展結構體
KPRCB成員介紹
KPRCB是KPCR的拓展結構體
**+0x004 CurrentThread : Ptr32 _KTHREAD:**當前線程
+0x008 NextThread : Ptr32 _KTHREAD: 即將切換的下一個線程
+0x00c IdleThread : Ptr32 _KTHREAD : 空閑線程
總結
以上是生活随笔為你收集整理的进程线程001 进程线程结构体和KPCR的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统调用004 SSDT
- 下一篇: 进程线程002 等待链表 调度链表