0环的几个结构体

在哪里找这几个结构体

_trab_frame 3环进0环 保存3环的寄存器值 位置在esp0=(_trab_frame +0x7c)
_KPCR KPCR相当于一个副本,存储着线程相关的一些重要信息,这样CPU在处理时就不用查线程了。
1) 当线程进入0环时,FS:[0]指向KPCR(3环时FS:[0] -> TEB)
2) 每个CPU都有一个KPCR结构体(一个核一个)
3) KPCR中存储了CPU本身要用的一些重要数据:GDT、IDT以及线程相关的一些信息。 位置在fs:0 0环中的fs=0x30
_Ethread 当前线程的信息 位置在_KPCR+0x124

函数从3环到0环时的保存现场

操作系统维护了一个结构 _Ktrap_frame ,在该结构里保存了一个线程3环的寄存器的值。每一个线程有一个该结构体

kd> dt _Ktrap_frame
nt!_KTRAP_FRAME
+0x000 DbgEbp : Uint4B
+0x004 DbgEip : Uint4B
+0x008 DbgArgMark : Uint4B
+0x00c DbgArgPointer : Uint4B
+0x010 TempSegCs : Uint4B
+0x014 TempEsp : Uint4B
+0x018 Dr0 : Uint4B
+0x01c Dr1 : Uint4B
+0x020 Dr2 : Uint4B
+0x024 Dr3 : Uint4B
+0x028 Dr6 : Uint4B
+0x02c Dr7 : Uint4B
+0x030 SegGs : Uint4B
+0x034 SegEs : Uint4B
+0x038 SegDs : Uint4B
+0x03c Edx : Uint4B
+0x040 Ecx : Uint4B
+0x044 Eax : Uint4B
+0x048 PreviousPreviousMode : Uint4B
+0x04c ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x050 SegFs : Uint4B
+0x054 Edi : Uint4B
+0x058 Esi : Uint4B
+0x05c Ebx : Uint4B
+0x060 Ebp : Uint4B
+0x064 ErrCode : Uint4B // KiSystemService会压入一个0 .具体见白皮书 KiSystemService 开始的push 0 就是压入的ErrCode
+0x068 Eip : Uint4B // 中断发生时,会压入这5个值
+0x06c SegCs : Uint4B
+0x070 EFlags : Uint4B
+0x074 HardwareEsp : Uint4B
+0x078 HardwareSegSs : Uint4B //
+0x07c V86Es : Uint4B // 保护模式中 TSS提供的ESP0指向7c 以下4个值在虚拟8086模式使用 ,然后中断门压入5个寄存器的值。
+0x080 V86Ds : Uint4B //
+0x084 V86Fs : Uint4B
+0x088 V86Gs : Uint4B

Trap Frame是指中断、自陷、异常进入内核后,在堆栈上形成的一种数据结构。用来存储三环的寄存器。

线程在0环的结构体

kd> dt _ETHREAD
ntdll!_ETHREAD
+0x000 Tcb : _KTHREAD//子结构(微内核)
+0x1c0 CreateTime : _LARGE_INTEGER//线程的创建时间
+0x1c0 NestedFaultCount : Pos 0, 2 Bits
+0x1c0 ApcNeeded : Pos 2, 1 Bit
+0x1c8 ExitTime : _LARGE_INTEGER//线程的退出时间
+0x1c8 LpcReplyChain : _LIST_ENTRY//跨进程通信双链表
+0x1c8 KeyedWaitChain : _LIST_ENTRY//带键值事件的等待双链表
+0x1d0 ExitStatus : Int4B//线程退出状态
+0x1d0 OfsChain : Ptr32 Void
+0x1d4 PostBlockList : _LIST_ENTRY//双链表头节点 (用于向配置管理器登录注册表键值的变化通知)
+0x1dc TerminationPort : Ptr32 _TERMINATION_PORT//链表头(当一个线程退出时,系统会通知所有已经登记过,要接收其终止事件的那些端口)
+0x1dc ReaperLink : Ptr32 _ETHREAD//单链表节点 (线程退出时会被挂上去)
+0x1dc KeyedWaitValue : Ptr32 Void//带键值事件的键值
+0x1e0 ActiveTimerListLock : Uint4B//操作下面那个链表的自旋锁
+0x1e4 ActiveTimerListHead : _LIST_ENTRY//双链表头(当前线程的所有定时器)
+0x1ec Cid : _CLIENT_ID//线程id,进程id都在里面
+0x1f4 LpcReplySemaphore : _KSEMAPHORE//LPC应答通知
+0x1f4 KeyedWaitSemaphore : _KSEMAPHORE//处理带键值的事件
+0x208 LpcReplyMessage : Ptr32 Void//LPC应答消息(其中包含了LPC应答通知)
+0x208 LpcWaitingOnPort : Ptr32 Void//在那个端口对象上等待
+0x20c ImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION//线程的模仿信息
+0x210 IrpList : _LIST_ENTRY//当前线程所有正在处理尚未完成的IO请求 (双链表头)
+0x218 TopLevelIrp : Uint4B//指向线程的顶级的IRP
+0x21c DeviceToVerify : Ptr32 _DEVICE_OBJECT//指向一个待校验的设备对象
+0x220 ThreadsProcess : Ptr32 _EPROCESS//自身进程结构体
+0x224 StartAddress : Ptr32 Void//线程的启动地址(系统DLL)
+0x228 Win32StartAddress : Ptr32 Void//子系统接收到的线程启动的地址(CreateThread接收到的线程函数)
+0x228 LpcReceivedMessageId : Uint4B//LPC接收到的消息ID
+0x22c ThreadListEntry : _LIST_ENTRY/*双向链表一个进程所有的线程都挂在一个链表中
挂的就是这个位置一共有两个这样的链表
*/

+0x234 RundownProtect : _EX_RUNDOWN_REF//线程的停止保护锁
+0x238 ThreadLock : _EX_PUSH_LOCK//推锁 (保护线程的数据属性)
+0x23c LpcReplyMessageId : Uint4B//指明当前线程正在等待的一个消息应答
+0x240 ReadClusterSize : Uint4B//指明了在一次io操作中读取了多少个页面
+0x244 GrantedAccess : Uint4B//线程的访问权限

+0x248 CrossThreadFlags : Uint4B//一些针对跨线程访问的标志位
+0x248 Terminated : Pos 0, 1 Bit//线程已经执行终止操作
+0x248 DeadThread : Pos 1, 1 Bit//创建失败
+0x248 HideFromDebugger : Pos 2, 1 Bit//该线程对于调试器不可见
+0x248 ActiveImpersonationInfo : Pos 3, 1 Bit//线程正在模仿
+0x248 SystemThread : Pos 4, 1 Bit//是一个系统线程
+0x248 HardErrorsAreDisabled : Pos 5, 1 Bit//对于该线程硬件错误无效
+0x248 BreakOnTermination : Pos 6, 1 Bit//调试器在线程终止时停下该线程
+0x248 SkipCreationMsg : Pos 7, 1 Bit//不向调试器发送创建消息
+0x248 SkipTerminationMsg : Pos 8, 1 Bit//不向调试器发送终止消息

+0x24c SameThreadPassiveFlags : Uint4B//只有在最底中断级别才可访问的标志位,并且只能被该线程自身访问
+0x24c ActiveExWorker : Pos 0, 1 Bit
+0x24c ExWorkerCanWaitUser : Pos 1, 1 Bit
+0x24c MemoryMaker : Pos 2, 1 Bit

+0x250 SameThreadApcFlags : Uint4B//是一些在apc中断级别上,被该线程自身访问的标志位
+0x250 LpcReceivedMsgIdValid : Pos 0, 1 Bit
+0x250 LpcExitThreadCalled : Pos 1, 1 Bit
+0x250 AddressSpaceOwner : Pos 2, 1 Bit
+0x254 ForwardClusterOnly : UChar//是否仅仅前向聚集?
+0x255 DisablePageFaultClustering : UChar//控制页面交换的聚集与否
_ETHREAD-> +0x000 Tcb : _KTHREAD

KTHREAD
kd> dt _KTHREAD
ntdll!_KTHREAD
+0x000 Header : _DISPATCHER_HEADER//可等待对象
+0x010 MutantListHead : _LIST_ENTRY//突变体对象链表
+0x018 InitialStack : Ptr32 Void//记录原始栈的位置(高地址) (线程切换相关)
+0x01c StackLimit : Ptr32 Void//记录栈的低地址 (线程切换相关)
+0x020 Teb : Ptr32 Void//线程环境块,大小4KB,位于用户地址空间。用户层FS:[0]就是teb
+0x024 TlsArray : Ptr32 Void//
+0x028 KernelStack : Ptr32 Void/内核调用栈的开始位置,由于顶部还记录了陷阱帧,浮点寄存器,
它比InitialStack要低(KTRAP_FRAME_LENGTH+sizeof(FX_SAVE_AREA)) (线程切换相关)/
+0x02c DebugActive : UChar//如果值为0,不能使用dr0~dr7,不能下硬件断点
+0x02d State : UChar//线程状态:就绪、等待要是运行
+0x02e Alerted : [2] UChar//数组 用户/内核模式下是否可以被唤醒
+0x030 Iopl : UChar
+0x031 NpxState : UChar//浮点处理器状态
+0x032 Saturation : Char//线程基本优先级
+0x033 Priority : Char//动态优先级
+0x034 ApcState : _KAPC_STATE//APC相关信息结构
+0x04c ContextSwitches : Uint4B//该线程进行了多少次切换
+0x050 IdleSwapBlock : UChar
+0x051 Spare0 : [3] UChar
+0x054 WaitStatus : Int4B//线程等待的结果状态
+0x058 WaitIrql : UChar//WaitNext为TRUE,记录原先IRQL
+0x059 WaitMode : Char
+0x05a WaitNext : UChar//TRUE:这个线程马上要调用一个内核等待函数
+0x05b WaitReason : UChar//线程的等待理由
+0x05c WaitBlockList : Ptr32 _KWAIT_BLOCK//线程在等待那个等待对象
+0x060 WaitListEntry : _LIST_ENTRY//等待链表(双链表) dd KiWaitListHead
+0x060 SwapListEntry : _SINGLE_LIST_ENTRY//调度链表(单链表) dd KiWaitListHead
+0x068 WaitTime : Uint4B
+0x06c BasePriority : Char/静态优先级,可以通过KeSetBasePriorityThread()函数重新设定/
+0x06d DecrementCount : UChar
+0x06e PriorityDecrement : Char//记录线程动态调整优先级的递减值
+0x06f Quantum : Char//当线程的时间片限制
+0x070 WaitBlock : [4] _KWAIT_BLOCK//等待哪个对象(WaitForSingleObject)
+0x0d0 LegoData : Ptr32 Void
+0x0d4 KernelApcDisable : Uint4B 禁止运行内核APC
+0x0d8 UserAffinity : Uint4B//线程的用户亲和性
+0x0dc SystemAffinityActive : UChar
+0x0dd PowerState : UChar
+0x0de NpxIrql : UChar
+0x0df InitialNode : UChar
+0x0e0 ServiceTable : Ptr32 Void//该线程使用的系统服务表的基址(参考消息机制章节)
+0x0e4 Queue : Ptr32 _KQUEUE//队列分发器对象
+0x0e8 ApcQueueLock : Uint4B//APC队列自旋锁
+0x0f0 Timer : _KTIMER//附在线程的定时器
+0x118 QueueListEntry : _LIST_ENTRY//加入到队列对象的线程链表中节点的地址
+0x120 SoftAffinity : Uint4B
+0x124 Affinity : Uint4B//线程的处理器的亲和性
+0x128 Preempted : UChar//TRUE:被优先级高的线程抢占了
+0x129 ProcessReadyQueue : UChar//TRUE:线程在KPROCESS->ReadyListHead链表中
+0x12a KernelStackResident : UChar//线程的内核栈是否在内存中 FALSE:被换出内存了 -282页
+0x12b NextProcessor : UChar//处理器调度选择
+0x12c CallbackStack : Ptr32 Void
+0x130 Win32Thread : Ptr32 Void//指向Windows子系统的管理区域
+0x134 TrapFrame : Ptr32 _KTRAP_FRAME//进0环时保存环境(寄存器)
+0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE// 正常情况ApcStatePointer[0]指向ApcState ApcStatePointer[1] 指向SavedApcState 当前线程处于挂靠时相反 这里面存的就是APC 和备用APC
+0x140 PreviousMode : Char//(先前模式)某些内核函数会判断程序是0环调用还是3环调用的
+0x141 EnableStackSwap : UChar//本线程内核栈是否允许被换出到外储存 -282页
+0x142 LargeStack : UChar
+0x143 ResourceIndex : UChar
+0x144 KernelTime : Uint4B
+0x148 UserTime : Uint4B
+0x14c SavedApcState : _KAPC_STATE//APC相关
+0x164 Alertable : UChar//线程是否可以被唤醒 SheepEx WatiForSingleObjectEx 可以设置这个值为1,APC才可以被执行。
+0x165 ApcStateIndex : UChar// 正常状态 0 挂靠状态1
+0x166 ApcQueueable : UChar//是否可以插入APC
+0x167 AutoAlignment : UChar//
+0x168 StackBase : Ptr32 Void//当前栈的基址(高地址)(线程切换相关)
+0x16c SuspendApc : _KAPC//挂起APC (163)
+0x19c SuspendSemaphore : _KSEMAPHORE//信号量状态
+0x1b0 ThreadListEntry : _LIST_ENTRY 双向链表,一个进程所有的线程都挂在一个链表中
,一共有两个这样的链表 链表指向ETHREAD+0x1b0的位置
+0x1b8 FreezeCount : 在调用SuspendThread时,SuspendCount 自加1;如果大于0表示挂起了。调用ResumeThread时,SuspendCount 自减1;如果等于0,系统会恢复线程。
当挂起和恢复时,FreezeCount必须为0,否则挂起和恢复操作都直接pass了 .所以,可以修改 SuspendCount 和 FreezeCount来达到反挂起的目的。
+0x1b9 SuspendCount : Char//当调试器调试目标进程,被中断时,由于目标进程线程的SuspendCount不为零,所以目标进程的线程就无法被暂停。
+0x1ba IdealProcessor : UChar
+0x1bb DisableBoost : UChar//

查看CPU数量

dd KeNumberProcessors

KPCR (CPU控制区)

在这里插入图片描述

查看KPCR

dd KiProcessorBlock得到的值减去120就是KPCR的地址

CPU控制区

KPCR

kd> dt _kpcr ffdff120-120
nt!_KPCR
+0x000 NtTib : _NT_TIB
+0x01c SelfPcr : 0xffdff000
+0x020 Prcb : 0xffdff120
+0x024 Irql : 0 ‘’
+0x028 IRR : 0
+0x02c IrrActive : 0
+0x030 IDR : 0xffffffff
+0x034 KdVersionBlock : 0x8054de38
+0x038 IDT : 0x8003f400
+0x03c GDT : 0x8003f000
+0x040 TSS : 0x80042000
+0x044 MajorVersion : 1
+0x046 MinorVersion : 1
+0x048 SetMember : 1
+0x04c StallScaleFactor : 0xa86
+0x050 DebugActive : 0 ‘’
+0x051 Number : 0 ‘’
+0x052 Spare0 : 0 ‘’
+0x053 SecondLevelCacheAssociativity : 0 ‘’
+0x054 VdmAlert : 0
+0x058 KernelReserved : [14] 0 char WaitIrql
+0x090 SecondLevelCacheSize : 0
+0x094 HalReserved : [16] 0
+0x0d4 InterruptMode : 0
+0x0d8 Spare1 : 0 ‘’
+0x0dc KernelReserved2 : [17] 0
+0x120 PrcbData : _KPRCB

KPCR的120是一个结构体_KPRCB
dt _KPRCB
kd> dt _KPRCB

ntdll!_KPRCB

+0x000 MinorVersion : Uint2B

+0x002 MajorVersion : Uint2B

+0x004 CurrentThread : Ptr32 _KTHREAD //当前CPU所执行线程的_ETHREAD

+0x008 NextThread : Ptr32 _KTHREAD //下一个_ETHREAD

+0x00c IdleThread : Ptr32 _KTHREAD //当所以线程都执行完了CPU就可以执行这个

+0x010 Number : Char //CPU编号

+0x011 Reserved : Char

+0x012 BuildType : Uint2B

+0x014 SetMember : Uint4B

+0x018 CpuType : Char

+0x019 CpuID : Char

+0x01a CpuStep : Uint2B //CPU子版本号

+0x01c ProcessorState : _KPROCESSOR_STATE //CPU状态

+0x33c KernelReserved : [16] Uint4B

+0x37c HalReserved : [16] Uint4B

+0x3bc PrcbPad0 : [92] UChar

+0x418 LockQueue : [16] _KSPIN_LOCK_QUEUE

+0x498 PrcbPad1 : [8] UChar

+0x4a0 NpxThread : Ptr32 _KTHREAD //Npx浮点处理器 最后一次用过浮点的线程

+0x4a4 InterruptCount : Uint4B //中断计数 统计信息 没什么实际意义 自己调试用的

+0x4a8 KernelTime : Uint4B //统计信息

+0x4ac UserTime : Uint4B //统计信息

+0x4b0 DpcTime : Uint4B //统计信息

+0x4b4 DebugDpcTime : Uint4B //统计信息

+0x4b8 InterruptTime : Uint4B //统计信息

+0x4bc AdjustDpcThreshold : Uint4B

+0x4c0 PageColor : Uint4B

+0x4c4 SkipTick : Uint4B

+0x4c8 MultiThreadSetBusy : UChar

+0x4c9 Spare2 : [3] UChar

+0x4cc ParentNode : Ptr32 _KNODE

+0x4d0 MultiThreadProcessorSet : Uint4B

+0x4d4 MultiThreadSetMaster : Ptr32 _KPRCB

+0x4d8 ThreadStartCount : [2] Uint4B

+0x4e0 CcFastReadNoWait : Uint4B

+0x4e4 CcFastReadWait : Uint4B

+0x4e8 CcFastReadNotPossible : Uint4B

+0x4ec CcCopyReadNoWait : Uint4B

+0x4f0 CcCopyReadWait : Uint4B

+0x4f4 CcCopyReadNoWaitMiss : Uint4B

+0x4f8 KeAlignmentFixupCount : Uint4B

+0x4fc KeContextSwitches : Uint4B 当前线程切换了多少次

+0x500 KeDcacheFlushCount : Uint4B

+0x504 KeExceptionDispatchCount : Uint4B

+0x508 KeFirstLevelTbFills : Uint4B

+0x50c KeFloatingEmulationCount : Uint4B

+0x510 KeIcacheFlushCount : Uint4B

+0x514 KeSecondLevelTbFills : Uint4B

+0x518 KeSystemCalls : Uint4B

+0x51c SpareCounter0 : [1] Uint4B

+0x520 PPLookasideList : [16] _PP_LOOKASIDE_LIST

+0x5a0 PPNPagedLookasideList : [32] _PP_LOOKASIDE_LIST

+0x6a0 PPPagedLookasideList : [32] _PP_LOOKASIDE_LIST

+0x7a0 PacketBarrier : Uint4B

+0x7a4 ReverseStall : Uint4B

+0x7a8 IpiFrame : Ptr32 Void

+0x7ac PrcbPad2 : [52] UChar

+0x7e0 CurrentPacket : [3] Ptr32 Void

+0x7ec TargetSet : Uint4B

+0x7f0 WorkerRoutine : Ptr32 void

+0x7f4 IpiFrozen : Uint4B

+0x7f8 PrcbPad3 : [40] UChar

+0x820 RequestSummary : Uint4B 32个就绪链表对应的优先级

+0x824 SignalDone : Ptr32 _KPRCB

+0x828 PrcbPad4 : [56] UChar

+0x860 DpcListHead : _LIST_ENTRY

+0x868 DpcStack : Ptr32 Void DPC栈顶

+0x86c DpcCount : Uint4B

+0x870 DpcQueueDepth : Uint4B dpc队列的深度 也就是DPC个数

+0x874 DpcRoutineActive : Uint4B

+0x878 DpcInterruptRequested : Uint4B

+0x87c DpcLastCount : Uint4B

+0x880 DpcRequestRate : Uint4B

+0x884 MaximumDpcQueueDepth : Uint4B

+0x888 MinimumDpcRate : Uint4B

+0x88c QuantumEnd : Uint4B

+0x890 PrcbPad5 : [16] UChar

+0x8a0 DpcLock : Uint4B

+0x8a4 PrcbPad6 : [28] UChar

+0x8c0 CallDpc : _KDPC

+0x8e0 ChainedInterruptList : Ptr32 Void

+0x8e4 LookasideIrpFloat : Int4B

+0x8e8 SpareFields0 : [6] Uint4B

+0x900 VendorString : [13] UChar

+0x90d InitialApicId : UChar

+0x90e LogicalProcessorsPerPhysicalProcessor : UChar//每个物理处理器有几个逻辑处理器

+0x910 MHz : Uint4B//频率

+0x914 FeatureBits : Uint4B

+0x918 UpdateSignature : _LARGE_INTEGER

+0x920 NpxSaveArea : _FX_SAVE_AREA

+0xb30 PowerState : _PROCESSOR_POWER_STATE
KPCR第一个成员是一个结构体
kd> dt _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 指向TEB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值