4.1.WRK
1.Project-->New Project-->选择wrk目录-->ok
3.搜索
4.2.KPCR
kpcr:cpu核控制块,cpu一个核一个kpcr结构 fs=0x30 在内核中的时候,指向的是kpcr结构 fs=0x3b 在应用层的时候,指向的是当前线程的TEB
1.kpcr结构
+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 //KPCR扩展块
2.KiProcessorBlock
扩展块
3.+0x000 NtTib
4.3.函数类型
Windows是微内核,分内核结构和执行体结构
内核结构:只在内核中使用(KPROCESS属于内核结构) 执行体结构:专门用于和R3打交道 (EPROCESS属于执行体)
函数类型
Ex:执行体函数,进程、线程、链表、对象属性、赋值、取值、加锁相关 Ke:内核函数,大部分是导出
Ki:微内核函数,不导出,内部自己使用。进程、线程、cpu、调度相关
Ps:执行体函数,进程、线程相关
Mm:内存相关函数,一般导出
Mi:内存相关函数,Mm函数底层就是调用Mi,不导出
Io:文件、设备相关,导出
CC:文件缓存
Rtl:导出函数,一般是运行库,字符串操作等
Zw:SSDT,但是Zw不需要修改线程的先前模式
Nt:Zw函数会调用到Nt,本身Zw函数不实现功能
CM:注册表
hal:硬件函数
Ob:对象管理器,句柄,创建内核对象,查询内核对象等
Pnp:电源管理
Psp:执行体函数,进程、线程。Ps函数实现复杂功能的时候,都是调用Psp
4.4.KPROCESS
KPROCESS
4.5.EPROCESS
//线程链表
DriverEntry.c
4.7.保护进程
#include
PEPROCESS FindProcessByName(PWCH name)
PEPROCESS Process = NULL; PEPROCESS findProcess = NULL;
}
VOID DriverUnload(PDRIVER_OBJECT pDriver)
//当前线程切换的次数
+0x028 InitialStack
+0x02c StackLimit
+0x030 KernelStack
+0x028 InitialStack
+0x02c StackLimit
+0x030 KernelStack
: 0xa4ea7ed0 Void
: 0xa4ea5000 Void
: 0xa4ea7a60 Void
4.10.ETHREAD
//就绪线程
dt nt!_KPRCB
KiFindReadyThread函数逆向分析,首先按x,进到KiSerachForNewThread,找到KiFindReadyThread
的三个参数
然后开始分析KiFindReadyThread
4.12.线程主动切换
KiSwapThread
'
.text:0045BE97
.text:0045ce71 @KiSwapThread@8 endp
.text:0045ce71
LAL.
五、句柄表