日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程线程001 进程线程结构体和KPCR

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程线程001 进程线程结构体和KPCR 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 前言
    • EPROCESS
      • KPROCESS主要成員
      • EPROCESS其他成員
    • ETHREAD
      • KTHREAD主要成員介紹
      • ETHREAD其他成員介紹
    • KPCR
      • KPCR介紹
      • _NT_TIB主要成員介紹
      • KPCR的其他成員介紹
      • KPRCB成員介紹
      • KPRCB成員介紹

前言

進程線程的知識點很多,如果我們想了解問題的本質(zhì),就要從一些關(guān)鍵的結(jié)構(gòu)體學起,先來介紹一個與進程密切相關(guān)的結(jié)構(gòu)體

EPROCESS

每個進程在零環(huán)都有一個對應(yīng)的結(jié)構(gòu)體:EPROCESS,這個結(jié)構(gòu)體包含了進程的所有重要信息。

這個結(jié)構(gòu)體我們可以在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

這個結(jié)構(gòu)體里面有太多的成員,我們并不需要了解其中的每一個細節(jié),下面介紹幾個重要的成員

KPROCESS主要成員

EPROCESS偏移為0的地方是_KPROCESS結(jié)構(gòu)體

kd> dt _EPROCESS nt!_EPROCESS+0x000 Pcb : _KPROCESS

+0x000 Header

我們查看一下這個_KPROCESS結(jié)構(gòu)體的內(nèi)容

kd> dt _KPROCESS nt!_KPROCESS+0x000 Header : _DISPATCHER_HEADER

_KPROCESS第一個成員叫Header,這個成員的類型是_DISPATCHER_HEADER。只有結(jié)構(gòu)體里包含這個_DISPATCHER_HEADER數(shù)據(jù)類型,那么它就可以成為可等待對象。比如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

統(tǒng)計信息,記錄了一個進程在內(nèi)核模式/用戶模式下所花的時間

+0x05c Affinity : Uint4B

在多核環(huán)境下,規(guī)定進程里面的所有線程能在哪個CPU上跑,如果值為1,那么這個進程的所有線程只能在0號CPU上跑(00000001)

如果值為3,那這個進程的所有線程能在0 1號CPU上跑(00000011)

如果值為4,那這個進程的所有線程能在2號CPU上跑(00000100)

如果值為5,那這個進程的所有線程能在0 2號CPU上跑(00000101)

4個字節(jié)共32位,所以最多32核,如果是Windows64位的操作系統(tǒng),最多就64核

如果只有一個CPU,把這個設(shè)置為4,那么這個進程就死了

+0x062 BasePriority : Char

基礎(chǔ)優(yōu)先級或最低優(yōu)先級,該進程中所有線程最起碼的優(yōu)先級。這個值設(shè)置成多少,那么這個進程下所有的線程默認的優(yōu)先級就是多少。

EPROCESS其他成員

+0x070 CreateTime &+0x078 ExitTime : _LARGE_INTEGER

進程的創(chuàng)建/退出時間

+0x084 UniqueProcessId : Ptr32 Void

進程的編號 任務(wù)管理器中的PID

+0x088 ActiveProcessLinks : _LIST_ENTRY

在操作系統(tǒng)里,有一個全局變量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,查的就是這個鏈表。如果將當前進程從鏈表中移除,就可以實現(xiàn)進程隱藏,這種技術(shù)稱為斷鏈。

+0x090 QuotaUsage&+0x09c QuotaPeak: [3] Uint4B

? 物理頁相關(guān)的統(tǒng)計信息

+0x0a8 CommitCharge&+0x0ac PeakVirtualSize&+0x0b0 VirtualSize : Uint4B

虛擬內(nèi)存相關(guān)的統(tǒng)計信息

+0x11c VadRoot : Ptr32 Void

標識0-2G哪些地址沒占用了

+0x0bc DebugPort&+0x0c0 ExceptionPort: Ptr32 Void

調(diào)試相關(guān)

**+0x0c4 ObjectTable: Ptr32 _HANDLE_TABLE **

句柄表

+0x174 ImageFileName : [16] UChar

進程鏡像文件名 最多16個字節(jié)

+0x1a0 ActiveThreads : Uint4B

活動線程的數(shù)量

+0x1b0 Peb : Ptr32 _PEB

PEB((Process Environment Block 進程環(huán)境塊):進程在3環(huán)的一個結(jié)構(gòu)體,里面包含了進程的模塊列表、是否處于調(diào)試狀態(tài)等信息

ETHREAD

每個Windows線程在0環(huán)都有一個對應(yīng)的結(jié)構(gòu)體:ETHREAD,這個結(jié)構(gòu)體包含了線程所有重要的信息

KTHREAD主要成員介紹

kd> dt _ETHREAD nt!_ETHREAD+0x000 Tcb : _KTHREAD

ETHREAD結(jié)構(gòu)體的第一個成員就是KTHREAD,下面介紹KTHREAD的主要成員

+0x000 Header: _DISPATCHER_HEADER

“可等待”對象,比如Mutex互斥體、Event事件等(WaitForSingleObject)

+0x018 InitialStack : Ptr32 Void

+0x01c StackLimit : Ptr32 Void

+0x028 KernelStack : Ptr32 Void

線程切換相關(guān)

  • InitialStack:初始堆棧
  • StackLimit: 零環(huán)線程堆棧的界限
  • KernelStack:記錄當前零環(huán)的堆棧棧頂

+0x020 Teb : Ptr32 Void

TEB,Thread Environment Block,線程環(huán)境塊。

大小4KB,位于用戶地址空間。

FS:[0] -> TEB(3環(huán)時 0環(huán)時FS執(zhí)行KPCR)

+0x02c DebugActive : UChar

如果值為-1 不能使用調(diào)試寄存器:Dr0 - Dr7

+0x034 ApcState : _KAPC_STATE

+0x0e8 ApcQueueLock : Uint4B

+0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE

+0x14c SavedApcState : _KAPC_STATE

APC相關(guān)

+0x02d State : UChar

線程狀態(tài):就緒、等待還是運行

+0x06c BasePriority : Char

其初始值是所屬進程的BasePriority值(KPROCESS->BasePriority),以后可以通過KeSetBasePriorityThread()函數(shù)重新設(shè)定

**+0x070 WaitBlock : [4] _KWAIT_BLOCK **

等待哪個對象(WaitForSingleObject)

**+0x0e0 ServiceTable : Ptr32 Void **

指向系統(tǒng)服務(wù)表基址

+0x134 TrapFrame

進0環(huán)時保存環(huán)境

+0x140 PreviousMode : Char

先前模式:某些內(nèi)核函數(shù)會判斷程序是0環(huán)調(diào)用還是3環(huán)調(diào)用的

**+0x1b0 ThreadListEntry : _LIST_ENTRY **

雙向鏈表:當前進程所有的線程 都掛在一個鏈表中 掛的就是這個位置

一共有兩個這樣的鏈表,如圖:

ETHREAD其他成員介紹

+0x1ec Cid:_CLIENT_ID

這個結(jié)構(gòu)體里面保存有進程ID和線程ID

+0x220 ThreadsProcess:Ptr32 _EPROCESS

指向當前線程的所屬進程

+0x22C ThreadListEntry:_LIST_ENTRY

雙向鏈表,一個進程所有的線程,都掛在一個鏈表中

KPCR

KPCR:CPU控制區(qū)(Kernel Processor Control Region)

KPCR介紹

  • 當線程進入0環(huán)時,FS:[0]指向KPCR
  • 每個CPU都有一個KPCR結(jié)構(gòu)體(一個核一個)
  • KPCR中存儲了CPU本身要用到的一些重要的數(shù)據(jù):GDT IDT以及線程相關(guān)的一些信息
  • _NT_TIB主要成員介紹

    kd> dt _KPCR nt!_KPCR+0x000 NtTib : _NT_TIB

    _NT_TIB是KPCR的第一個成員,來查看一下這個結(jié)構(gòu)體的成員

    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

    當前線程內(nèi)核棧的基址

    +0x008 StackLimit : Ptr32 Void

    當前線程內(nèi)核棧的大小

    +0x018 Self : Ptr32 _NT_TIB

    指向自己(也就是指向KPCR結(jié)構(gòu)) 這樣設(shè)計的目的是為了查找方便

    KPCR的其他成員介紹

    +0x01c SelfPcr : Ptr32 _KPCR

    指向自己,方便尋址

    +0x020 Prcb : Ptr32 _KPRCB

    指向拓展結(jié)構(gòu)體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 **

    拓展結(jié)構(gòu)體

    KPRCB成員介紹

    KPRCB是KPCR的拓展結(jié)構(gòu)體

    **+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 **

    拓展結(jié)構(gòu)體

    KPRCB成員介紹

    KPRCB是KPCR的拓展結(jié)構(gòu)體

    **+0x004 CurrentThread : Ptr32 _KTHREAD:**當前線程

    +0x008 NextThread : Ptr32 _KTHREAD: 即將切換的下一個線程

    +0x00c IdleThread : Ptr32 _KTHREAD : 空閑線程

    總結(jié)

    以上是生活随笔為你收集整理的进程线程001 进程线程结构体和KPCR的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。