2.逆向分析KiFastCallEntry(填充 _KTRAP_FRAME 部分)

一、问题

  1. 进0环后,原来的寄存器存在哪里?
  2. 如何根据系统调用号(eax中存储)找到要执行的内核函数?
  3. 调用时参数是存储到3环的堆栈,如何传递给内核函数?
  4. 2种调用方式是如何返回到3环的?

在开始分析之前必须了解以下结构

二、TRAP_FRAME

_KTRAP_FRAME(每个线程一个) 用于进0环时保存环境
在这里插入图片描述

三、_KPCR

_KPCR(存储在CPU中)并且一个核一个

kd> dt _KPCR					
nt!_KPCR					
   +0x000 NtTib            : _NT_TIB					
   +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 DebugActive      : 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					

其中NtTib(第一个成员)和_KPRCB(最后一个成员)KPCR的子结构

kd> dt _NT_TIB					
ntdll!_NT_TIB					
   +0x000 ExceptionList    : Ptr32 _EXCEPTION_REGISTRATION_RECORD //ExceptionList是指向异常处理链表(EXCEPTION_REGISTRATION结构)的一个指针。					
   +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			//结构体指针 指向自己
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					
   +0x824 SignalDone       : Ptr32 _KPRCB					
   +0x828 PrcbPad4         : [56] UChar					
   +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值