Windows内核原理与实现--Windows进程线程基本概念(2)

执行体层位于内核层之上,侧重于提供各种管理策略,同时为上层应用程序提供基本的功能接口。下面先来讨论执行体层进程对象的数据结构EPROCESS。

环境 Win7 x64

kd> dt nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x160 ProcessLock      : _EX_PUSH_LOCK
   +0x168 CreateTime       : _LARGE_INTEGER
   +0x170 ExitTime         : _LARGE_INTEGER
   +0x178 RundownProtect   : _EX_RUNDOWN_REF
   +0x180 UniqueProcessId  : Ptr64 Void
   +0x188 ActiveProcessLinks : _LIST_ENTRY
   +0x198 ProcessQuotaUsage : [2] Uint8B
   +0x1a8 ProcessQuotaPeak : [2] Uint8B
   +0x1b8 CommitCharge     : Uint8B
   +0x1c0 QuotaBlock       : Ptr64 _EPROCESS_QUOTA_BLOCK
   +0x1c8 CpuQuotaBlock    : Ptr64 _PS_CPU_QUOTA_BLOCK
   +0x1d0 PeakVirtualSize  : Uint8B
   +0x1d8 VirtualSize      : Uint8B
   +0x1e0 SessionProcessLinks : _LIST_ENTRY
   +0x1f0 DebugPort        : Ptr64 Void
   +0x1f8 ExceptionPortData : Ptr64 Void
   +0x1f8 ExceptionPortValue : Uint8B
   +0x1f8 ExceptionPortState : Pos 0, 3 Bits
   +0x200 ObjectTable      : Ptr64 _HANDLE_TABLE
   +0x208 Token            : _EX_FAST_REF
   +0x210 WorkingSetPage   : Uint8B
   +0x218 AddressCreationLock : _EX_PUSH_LOCK
   +0x220 RotateInProgress : Ptr64 _ETHREAD
   +0x228 ForkInProgress   : Ptr64 _ETHREAD
   +0x230 HardwareTrigger  : Uint8B
   +0x238 PhysicalVadRoot  : Ptr64 _MM_AVL_TABLE
   +0x240 CloneRoot        : Ptr64 Void
   +0x248 NumberOfPrivatePages : Uint8B
   +0x250 NumberOfLockedPages : Uint8B
   +0x258 Win32Process     : Ptr64 Void
   +0x260 Job              : Ptr64 _EJOB
   +0x268 SectionObject    : Ptr64 Void
   +0x270 SectionBaseAddress : Ptr64 Void
   +0x278 Cookie           : Uint4B
   +0x27c UmsScheduledThreads : Uint4B
   +0x280 WorkingSetWatch  : Ptr64 _PAGEFAULT_HISTORY
   +0x288 Win32WindowStation : Ptr64 Void
   +0x290 InheritedFromUniqueProcessId : Ptr64 Void
   +0x298 LdtInformation   : Ptr64 Void
   +0x2a0 Spare            : Ptr64 Void
   +0x2a8 ConsoleHostProcess : Uint8B
   +0x2b0 DeviceMap        : Ptr64 Void
   +0x2b8 EtwDataSource    : Ptr64 Void
   +0x2c0 FreeTebHint      : Ptr64 Void
   +0x2c8 FreeUmsTebHint   : Ptr64 Void
   +0x2d0 PageDirectoryPte : _HARDWARE_PTE
   +0x2d0 Filler           : Uint8B
   +0x2d8 Session          : Ptr64 Void
   +0x2e0 ImageFileName    : [15] UChar
   +0x2ef PriorityClass    : UChar
   +0x2f0 JobLinks         : _LIST_ENTRY
   +0x300 LockedPagesList  : Ptr64 Void
   +0x308 ThreadListHead   : _LIST_ENTRY
   +0x318 SecurityPort     : Ptr64 Void
   +0x320 Wow64Process     : Ptr64 Void
   +0x328 ActiveThreads    : Uint4B
   +0x32c ImagePathHash    : Uint4B
   +0x330 DefaultHardErrorProcessing : Uint4B
   +0x334 LastThreadExitStatus : Int4B
   +0x338 Peb              : Ptr64 _PEB
   +0x340 PrefetchTrace    : _EX_FAST_REF
   +0x348 ReadOperationCount : _LARGE_INTEGER
   +0x350 WriteOperationCount : _LARGE_INTEGER
   +0x358 OtherOperationCount : _LARGE_INTEGER
   +0x360 ReadTransferCount : _LARGE_INTEGER
   +0x368 WriteTransferCount : _LARGE_INTEGER
   +0x370 OtherTransferCount : _LARGE_INTEGER
   +0x378 CommitChargeLimit : Uint8B
   +0x380 CommitChargePeak : Uint8B
   +0x388 AweInfo          : Ptr64 Void
   +0x390 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x398 Vm               : _MMSUPPORT
   +0x420 MmProcessLinks   : _LIST_ENTRY
   +0x430 HighestUserAddress : Ptr64 Void
   +0x438 ModifiedPageCount : Uint4B
   +0x43c Flags2           : Uint4B
   +0x43c JobNotReallyActive : Pos 0, 1 Bit
   +0x43c AccountingFolded : Pos 1, 1 Bit
   +0x43c NewProcessReported : Pos 2, 1 Bit
   +0x43c ExitProcessReported : Pos 3, 1 Bit
   +0x43c ReportCommitChanges : Pos 4, 1 Bit
   +0x43c LastReportMemory : Pos 5, 1 Bit
   +0x43c ReportPhysicalPageChanges : Pos 6, 1 Bit
   +0x43c HandleTableRundown : Pos 7, 1 Bit
   +0x43c NeedsHandleRundown : Pos 8, 1 Bit
   +0x43c RefTraceEnabled  : Pos 9, 1 Bit
   +0x43c NumaAware        : Pos 10, 1 Bit
   +0x43c ProtectedProcess : Pos 11, 1 Bit
   +0x43c DefaultPagePriority : Pos 12, 3 Bits
   +0x43c PrimaryTokenFrozen : Pos 15, 1 Bit
   +0x43c ProcessVerifierTarget : Pos 16, 1 Bit
   +0x43c StackRandomizationDisabled : Pos 17, 1 Bit
   +0x43c AffinityPermanent : Pos 18, 1 Bit
   +0x43c AffinityUpdateEnable : Pos 19, 1 Bit
   +0x43c PropagateNode    : Pos 20, 1 Bit
   +0x43c ExplicitAffinity : Pos 21, 1 Bit
   +0x440 Flags            : Uint4B
   +0x440 CreateReported   : Pos 0, 1 Bit
   +0x440 NoDebugInherit   : Pos 1, 1 Bit
   +0x440 ProcessExiting   : Pos 2, 1 Bit
   +0x440 ProcessDelete    : Pos 3, 1 Bit
   +0x440 Wow64SplitPages  : Pos 4, 1 Bit
   +0x440 VmDeleted        : Pos 5, 1 Bit
   +0x440 OutswapEnabled   : Pos 6, 1 Bit
   +0x440 Outswapped       : Pos 7, 1 Bit
   +0x440 ForkFailed       : Pos 8, 1 Bit
   +0x440 Wow64VaSpace4Gb  : Pos 9, 1 Bit
   +0x440 AddressSpaceInitialized : Pos 10, 2 Bits
   +0x440 SetTimerResolution : Pos 12, 1 Bit
   +0x440 BreakOnTermination : Pos 13, 1 Bit
   +0x440 DeprioritizeViews : Pos 14, 1 Bit
   +0x440 WriteWatch       : Pos 15, 1 Bit
   +0x440 ProcessInSession : Pos 16, 1 Bit
   +0x440 OverrideAddressSpace : Pos 17, 1 Bit
   +0x440 HasAddressSpace  : Pos 18, 1 Bit
   +0x440 LaunchPrefetched : Pos 19, 1 Bit
   +0x440 InjectInpageErrors : Pos 20, 1 Bit
   +0x440 VmTopDown        : Pos 21, 1 Bit
   +0x440 ImageNotifyDone  : Pos 22, 1 Bit
   +0x440 PdeUpdateNeeded  : Pos 23, 1 Bit
   +0x440 VdmAllowed       : Pos 24, 1 Bit
   +0x440 CrossSessionCreate : Pos 25, 1 Bit
   +0x440 ProcessInserted  : Pos 26, 1 Bit
   +0x440 DefaultIoPriority : Pos 27, 3 Bits
   +0x440 ProcessSelfDelete : Pos 30, 1 Bit
   +0x440 SetTimerResolutionLink : Pos 31, 1 Bit
   +0x444 ExitStatus       : Int4B
   +0x448 VadRoot          : _MM_AVL_TABLE
   +0x488 AlpcContext      : _ALPC_PROCESS_CONTEXT
   +0x4a8 TimerResolutionLink : _LIST_ENTRY
   +0x4b8 RequestedTimerResolution : Uint4B
   +0x4bc ActiveThreadsHighWatermark : Uint4B
   +0x4c0 SmallestTimerResolution : Uint4B
   +0x4c8 TimerResolutionStackRecord : Ptr64 _PO_DIAG_STACK_RECORD


几个著名成员:

1、+0x000 Pcb              : _KPROCESS Pcb即为上篇介绍的KPROCESS结构体。

2、UniqueProcessId域是进程的唯一编号,在进程创建时设定。ActiveProcessLinks域是一个双链表节点,表头是一个全局变量PsActiveProcessHead。

3、QuotaUsage和QuotaPeak是指一个进程的内存使用量和尖峰使用量。应用层上的一些相关进程函数实际上读的就是这个。

4、SessionProcessLinks域是一个双链表节点,当进程加入系统的一个会话时,这个域将作为一个节点加入到该会话的进程链表。

5、ObjectTable域是进程的句柄表,句柄是一个抽象概念,代表了进程已打开的一个对象。Windows的进程句柄表有层次结构。例如,对某进程执行一次NtOpenProcess读句柄,在进程句柄表上的相关计数就要加一。

6、Token域是指该进程的访问令牌,用于该进程的安全访问检查。

7、LdtInformation负责维护一个进程的LDT信息。

8、ThreadListHead 包含该进程中的所有线程。 在EPROCESS中包含的是ETHREAD中的ThreadListEntry节点 而在KPROCESS中包含的是KTHREAD中的ThreadListEntry

9、SecurityPort 与lsass进程之间的跨通信端口

10、SeAuditProcessCreationInfo包含创建进程时指定的进程映像全路径名,ImageFileName实质上是从这里提取出来的(ImageFileName有效长度只有15-1)

11、Flags 表示该进程当前的状态 如果flags=0,则NtOpenProcess会失败

13、0x338 Peb              : Ptr64 _PEB  是大家熟知的PEB块,记录了该进程的进程模块。具体在64位下怎么遍历peb我在一篇博文上简介过了。


内核中通过PsGetCurrentProcess来获得EPROCESS块的地址。以WRK为例

PEPROCESS
00041 PsGetCurrentProcess(
00042     VOID
00043     )
00044 {
00045     return _PsGetCurrentProcess();
00046 }

实际上,_PsGetCurrentProcess()是一个宏定义

#define _PsGetCurrentProcess  ( )     (CONTAINING_RECORD(((KeGetCurrentThread())->ApcState.Process),EPROCESS,Pcb)) 


CONTAINING_RECORD的定义大致是这样的:

#define CONTAINING_RECORD(addr,type,field) ((type*)((unsigned char*)addr - (unsigned long)&((type*)0)->field))
  addr:  结构体中某个成员变量的地址
  type:  结构体的原型
  field: 结构体的某个成员(与前面相同)

KeGetCurrentThread的WRK代码如下:

FORCEINLINE  
struct _KTHREAD *  
NTAPI KeGetCurrentThread (VOID)  
{  
#if (_MSC_FULL_VER >= 13012035)  
return (struct _KTHREAD *) (ULONG_PTR) __readfsdword (FIELD_OFFSET  
(KPCR, PrcbData.CurrentThread));  
#else  
__asm { mov eax, fs:[0] KPCR.PrcbData.CurrentThread }  
#endif  
} 

可见,KeGetCurrentThread是通过读取fs寄存器来获得KPCR的。fs寄存器在应用层上指的是PEB块,在内核层上指的是KPCR块。KPCR块是啥呢?

nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x000 GdtBase          : Ptr64 _KGDTENTRY64
   +0x008 TssBase          : Ptr64 _KTSS64
   +0x010 UserRsp          : Uint8B
   +0x018 Self             : Ptr64 _KPCR
   +0x020 CurrentPrcb      : Ptr64 _KPRCB
   +0x028 LockArray        : Ptr64 _KSPIN_LOCK_QUEUE
   +0x030 Used_Self        : Ptr64 Void
   +0x038 IdtBase          : Ptr64 _KIDTENTRY64
   +0x040 Unused           : [2] Uint8B
   +0x050 Irql             : UChar
   +0x051 SecondLevelCacheAssociativity : UChar
   +0x052 ObsoleteNumber   : UChar
   +0x053 Fill0            : UChar
   +0x054 Unused0          : [3] Uint4B
   +0x060 MajorVersion     : Uint2B
   +0x062 MinorVersion     : Uint2B
   +0x064 StallScaleFactor : Uint4B
   +0x068 Unused1          : [3] Ptr64 Void
   +0x080 KernelReserved   : [15] Uint4B
   +0x0bc SecondLevelCacheSize : Uint4B
   +0x0c0 HalReserved      : [16] Uint4B
   +0x100 Unused2          : Uint4B
   +0x108 KdVersionBlock   : Ptr64 Void
   +0x110 Unused3          : Ptr64 Void
   +0x118 PcrAlign1        : [24] Uint4B
   +0x180 Prcb             : _KPRCB

该块包含了TSS IRQL GDT等等信息。最后一个成员,贴出_KPRCB的部分结构:

nt!_KPRCB
   +0x000 MxCsr            : Uint4B
   +0x004 LegacyNumber     : UChar
   +0x005 ReservedMustBeZero : UChar
   +0x006 InterruptRequest : UChar
   +0x007 IdleHalt         : UChar
   +0x008 CurrentThread    : Ptr64 _KTHREAD
   +0x010 NextThread       : Ptr64 _KTHREAD
   +0x018 IdleThread       : Ptr64 _KTHREAD
   +0x020 NestingLevel     : UChar
...

可以看到_KTHREAD的结构。


在内核中,EPROCESS KPROCESS的一些总结是这样:

EPROCESS中第一个成员是KPROCESS,KPROCESS是微内核的进程结构,侧重于进程的基本资源信息。EPROCESS中又有许多结构,例如锁,线程链表等等数据结构来表征一个进程。EPROCESS通过LIST_ENTRY相互串联成一个双向链表。

KTHREAD通过LIST_ENTRY相互串联,要获得当前进程的KPROCESS,可以通过查找KPRCB来找到KTHREAD链,找到KTHREAD后即可找到KPROCESS。在KTHREAD中有TEB(线程环境快)的成员,通过TEB,进而可以获得PEB。











  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Windows内核原理实现》是一本介绍Windows操作系统内核的经典书籍,涵盖了Windows内核的结构、线程管理、进程管理、内存管理、同步机制和驱动程序等方面。 Windows操作系统的内核是操作系统的核心部分,负责管理硬件和软件资源,提供操作系统的基本功能。《Windows内核原理实现》一书介绍了Windows内核的结构,从底层的硬件抽象层到顶层的用户界面,阐述了每个层次的功能和作用。 书中还详细介绍了Windows内核线程管理和进程管理机制,包括线程和进程的创建、调度、撤销、同步和通信等方面。内存管理是操作系统的另一个重要功能,书中详细介绍了Windows内核的内存管理机制,包括虚拟内存的管理和分配等方面。 为了保证并发访问共享资源的正确性,Windows内核还提供了同步机制,书中介绍了Windows内核的同步对象,包括临界区、事件、互斥量和信号量等。 最后,书中还介绍了Windows内核的驱动程序,这是操作系统中的一个重要组成部分。它提供了对硬件的访问、控制和管理,为操作系统提供了丰富的设备支持。书中详细介绍了驱动程序的开发和调试技巧。 总之,《Windows内核原理实现》是一本深入浅出的书籍,适合操作系统、计算机系统结构等相关领域的研究人员和开发人员阅读,可以帮助读者更好地理解Windows操作系统的内核原理及其实现。 ### 回答2: 《Windows内核原理实现》是一本系统地介绍Windows操作系统内核原理实现方法的书籍。书中首先阐述了操作系统的概念内核概念,介绍了Windows内核的结构和机制,讲解了Windows内核进程管理、内存管理、文件系统、网络通信、设备驱动以及安全机制等方面的知识。 在讲解Windows内核进程管理方面,书中详细介绍了进程概念进程调度、线程的概念线程调度、进程线程的同步与通信等知识。在内存管理方面,书中详细介绍了虚拟内存管理的概念以及页式存储管理技术,包括虚拟地址空间的划分、页面置换、内存映射等知识。在文件系统方面,书中介绍了FAT和NTFS两种文件系统的概念实现方法,包括文件的存储结构、文件的读写和管理等方面的知识。 在网络通信方面,书中介绍了Windows内核的网络通信机制,包括TCP/IP协议栈、套接字API、网络设备驱动等方面的知识。在设备驱动方面,书中详细介绍了Windows内核的设备管理机制,包括设备驱动模型、设备对象、设备栈等知识。在安全机制方面,书中介绍了Windows内核的安全机制,包括访问控制、安全标识符、安全描述符等知识。 总之,《Windows内核原理实现》从多个方面全面介绍了Windows操作系统内核原理实现方法,是一本深入学习Windows内核的好书。 ### 回答3: 《Windows 内核原理实现》是一本介绍 Windows 系统内核的经典教材,其讲述了 Windows 内核概念、组成结构、工作原理等方面的内容,是学习 Windows 内核必不可少的参考资料。 该书首先介绍了 Windows 内核基本概念和体系结构,包括内核的启动过程、系统服务、驱动程序等。然后详细介绍了内核对象、同步对象、进程线程管理、内存管理、I/O 子系统等方面的知识。此外,该书还介绍了内核的调试和分析方法,以及针对特定硬件平台的内核开发技术等。 由于每个操作系统的内核都是不同的,因此 Windows 内核原理实现是一个独特的领域。从操作系统的设计到如何调试它,一切都会在这本书中得到解决。 在学习此书时,需掌握相关的编程技术,如 C/C++ 编程、汇编编程等。此外,需具备系统编程的基本知识,如进程线程、内存管理等。 总之,《Windows 内核原理实现》是一本经典的操作系统内核学习参考书,它将帮助人们了解 Windows系统内核原理实现,为我们理解和掌握操作系统内核基本概念和技术打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值