如果想逆向分析操作系统代码的,需要对段页的汇编代码熟悉,还需要知道三个结构体,进程结构体EPROCESS,ETHREAD,KPCR
下面来介绍KPCR
KPCR是描述CPU的,准确说是描述当前正在运行的CPU的数据。
1、KPCR介绍
1) 当线程进入0环时,先切换FS,因为FS指向TEB。FS:[0]指向KPCR(3环时FS:[0] -> TEB)
2) 每个CPU都有一个KPCR结构体(一个核一个)
3) KPCR中存储了CPU本身要用的一些重要数据:GDT、IDT以及线程相关的一些信息。
(在winbbg中查看KPCR结构体)
dt _KPCR
kd> dt _KPCR
ntdll!_KPCR
+0x000 NtTib : _NT_TIB
+0x000 Used_ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 Used_StackBase : Ptr32 Void
+0x008 Spare2 : Ptr32 Void
+0x00c TssCopy : Ptr32 Void
+0x010 ContextSwitches : Uint4B
+0x014 SetMemberCopy : Uint4B
+0x018 Used_Self : Ptr32 Void
+0x01c SelfPcr : Ptr32 _KPCR
+0x020 Prcb : Ptr32 _KPRCB
+0x024 Irql : UChar
+0x028 IRR : Uint4B
+0x02c IrrActive : Uint4B
+0x030 IDR : Uint4B
+0x034 KdVersionBlock : Ptr32 Void
+0x038 IDT : Ptr32 _KIDTENTRY
+0x03c GDT : Ptr32 _KGDTENTRY
+0x040 TSS : Ptr32 _KTSS
+0x044 MajorVersion : Uint2B
+0x046 MinorVersion : Uint2B
+0x048 SetMember : Uint4B
+0x04c StallScaleFactor : Uint4B
+0x050 SpareUnused : UChar
+0x051 Number : UChar
+0x052 Spare0 : UChar
+0x053 SecondLevelCacheAssociativity : UChar
+0x054 VdmAlert : Uint4B
+0x058 KernelReserved : [14] Uint4B
+0x090 SecondLevelCacheSize : Uint4B
+0x094 HalReserved : [16] Uint4B
+0x0d4 InterruptMode : Uint4B
+0x0d8 Spare1 : UChar
+0x0dc KernelReserved2 : [17] Uint4B
+0x120 PrcbData : _KPRCB
dt _NT_TIB
2、_NT_TIB主要成员介绍 (成员与三环的TEB一样,但数据内容不一样)
1) +0x000 ExceptionList : Ptr32_EXCEPTION_REGISTRATION_RECORD
当前线程内核异常链表(SEH)
2) +0x004 StackBase : Ptr32 Void
+0x008 StackLimit : Ptr32 Void
当前线程内核栈的基址和大小
3) +0x018 Self : Ptr32 _NT_TIB
指向自己(也就是指向KPCR结构) 这样设计的目的是为了查找方便.
3、KPCR的其他成员介绍
1) +0x01c SelfPcr : Ptr32 _KPCR
指向自己,方便寻址
2) +0x020 Prcb : Ptr32 _KPRCB
指向拓展结构体PRCB
3) +0x038 IDT : Ptr32 _KIDTENTRY
IDT表基址
4) +0x03c GDT : Ptr32 _KGDTENTRY
GDT表基址
5) +0x040 TSS : Ptr32 _KTSS
指针,指向TSS,每个CPU都有一个TSS.
6) +0x051 Number : UChar
当前CPU编号:0 1 2 3 4 5。。。
7) +0x120 PrcbData : _KPRCB
拓展结构体
dt _KPRCB
5、PRCB成员介绍
+0x004 CurrentThread : Ptr32 _KTHREAD
当前线程
+0x008 NextThread : Ptr32 _KTHREAD
即将切换的下一个线程
+0x00c IdleThread : Ptr32 _KTHREAD
空闲线程