KPCR进程概念

1.KPCR进程概念

KPCR 介绍

KPCR 是CPU的控制结构

FS段寄存器在R0(FS=0x30)的时候指向KPCR结构

FS 段寄存器在R3(FS=0x3b)的时候指向 当前线程的TEB(线程)

线程结构是运行在CPU上面,所以线程结构是放在CPU上的

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//指向0x120的PrcbData
   +0x024 Irql             : UChar//IRQP等级
   +0x028 IRR              : Uint4B//中断相关,待派发的中断
   +0x02c IrrActive        : Uint4B//中断控制寄存器,标志有几个中断正在派发中,是个掩码
   +0x030 IDR              : Uint4B//已经派发的中断
   +0x034 KdVersionBlock   : Ptr32 Void//kd的版本块(win7 x32之后用不到)
   +0x038 IDT              : Ptr32 _KIDTENTRY//IDT表
   +0x03c GDT              : Ptr32 _KGDTENTRY//GDT表
   +0x040 TSS              : Ptr32 _KTSS//TSS
   +0x044 MajorVersion     : Uint2B//拓展用的,通常都是1,跟CPU的版本没有关系
   +0x046 MinorVersion     : Uint2B//拓展用的,通常都是1,跟CPU的版本没有关系
   +0x048 SetMember        : Uint4B//多核的时候和线程相关
   +0x04c StallScaleFactor : Uint4B
   +0x050 SpareUnused      : UChar
   +0x051 Number           : UChar//当前的核数,当前跑在第几核(从0开始)
   +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结构中0x1C 偏移的位置有一个SelfPcr这个指针指向自己,所以找KPCR可以这么写 kpcr * pcr = fs:[0x18]

下面四个和中断相关

+0x024 Irql             : UChar//IRQP等级
+0x028 IRR              : Uint4B//中断相关
+0x02c IrrActive        : Uint4B//中断控制寄存器
+0x030 IDR              : Uint4B

可以通过找到KPCR然后偏移0x0380x03c找到GDT表和IDT表

Win7 x64及向下中PrcbData的偏移是0x140或者180

其中 +0x120 PrcbData: _KPRCB拓展快非常庞大,具体内容使用kd> dt _KPRCB查看,因为篇幅问题就不在这里贴出

再看一下TIB

kd> dt _NT_TIB
ntdll!_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//指向自身

其中StackBase/StackLimit 这两个值是动态的,当前这个上跑的线程的栈顶和栈底,也就是记录当前线程的栈

进程

每一个进程都有一个进程结构

进程中会有活动单位线程,但是线程不一定只在一个进程中,线程可以去任何地方,例如内核,其他的进程等,也就是进程是固定的,但是线程不是固定的

进程大小是根据地址宽度(位数宽度)决定的,这个说的是虚拟地址,不是物理地址,物理地址是跟总线相关的,进程多大是跟操作系统相关的,也就是虚拟地址相关的,而不是跟物理地址相关的。例如:物理地址大小只有1G但是理论上任然是可以运行32位的系统,就是为每一个进程分配4G大小的空间

EPROCESS

EPROCESS包含KPROCESS

kd> DT _eprocess
ntdll!_EPROCESS
   +0x000 Pcb              : _KPROCESS//EPROCESS包含KPROCESS
   +0x098 ProcessLock      : _EX_PUSH_LOCK
   +0x0a0 CreateTime       : _LARGE_INTEGER
   +0x0a8 ExitTime         : _LARGE_INTEGER
   +0x0b0 RundownProtect   : _EX_RUNDOWN_REF
   +0x0b4 UniqueProcessId  : Ptr32 Void
   +0x0b8 ActiveProcessLinks : _LIST_ENTRY
   +0x0c0 ProcessQuotaUsage : [2] Uint4B
   +0x0c8 ProcessQuotaPeak : [2] Uint4B
   +0x0d0 CommitCharge     : Uint4B
   +0x0d4 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK
   +0x0d8 CpuQuotaBlock    : Ptr32 _PS_CPU_QUOTA_BLOCK
   +0x0dc PeakVirtualSize  : Uint4B
   +0x0e0 VirtualSize      : Uint4B
   +0x0e4 SessionProcessLinks : _LIST_ENTRY
   +0x0ec DebugPort        : Ptr32 Void
   +0x0f0 ExceptionPortData : Ptr32 Void
   +0x0f0 ExceptionPortValue : Uint4B
   +0x0f0 ExceptionPortState : Pos 0, 3 Bits
   +0x0f4 ObjectTable      : Ptr32 _HANDLE_TABLE
   +0x0f8 Token            : _EX_FAST_REF
   +0x0fc WorkingSetPage   : Uint4B
   +0x100 AddressCreationLock : _EX_PUSH_LOCK
   +0x104 RotateInProgress : Ptr32 _ETHREAD
   +0x108 ForkInProgress   : Ptr32 _ETHREAD
   +0x10c HardwareTrigger  : Uint4B
   +0x110 PhysicalVadRoot  : Ptr32 _MM_AVL_TABLE
   +0x114 CloneRoot        : Ptr32 Void
   +0x118 NumberOfPrivatePages : Uint4B
   +0x11c NumberOfLockedPages : Uint4B
   +0x120 Win32Process     : Ptr32 Void
   +0x124 Job              : Ptr32 _EJOB
   +0x128 SectionObject    : Ptr32 Void
   +0x12c SectionBaseAddress : Ptr32 Void
   +0x130 Cookie           : Uint4B
   +0x134 Spare8           : Uint4B
   +0x138 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY
   +0x13c Win32WindowStation : Ptr32 Void
   +0x140 InheritedFromUniqueProcessId : Ptr32 Void
   +0x144 LdtInformation   : Ptr32 Void
   +0x148 VdmObjects       : Ptr32 Void
   +0x14c ConsoleHostProcess : Uint4B
   +0x150 DeviceMap        : Ptr32 Void
   +0x154 EtwDataSource    : Ptr32 Void
   +0x158 FreeTebHint      : Ptr32 Void
   +0x160 PageDirectoryPte : _HARDWARE_PTE_X86
   +0x160 Filler           : Uint8B
   +0x168 Session          : Ptr32 Void
   +0x16c ImageFileName    : [15] UChar
   +0x17b PriorityClass    : UChar
   +0x17c JobLinks         : _LIST_ENTRY
   +0x184 LockedPagesList  : Ptr32 Void
   +0x188 ThreadListHead   : _LIST_ENTRY
   +0x190 SecurityPort     : Ptr32 Void
   +0x194 PaeTop           : Ptr32 Void
   +0x198 ActiveThreads    : Uint4B
   +0x19c ImagePathHash    : Uint4B
   +0x1a0 DefaultHardErrorProcessing : Uint4B
   +0x1a4 LastThreadExitStatus : Int4B
   +0x1a8 Peb              : Ptr32 _PEB
   +0x1ac PrefetchTrace    : _EX_FAST_REF
   +0x1b0 ReadOperationCount : _LARGE_INTEGER
   +0x1b8 WriteOperationCount : _LARGE_INTEGER
   +0x1c0 OtherOperationCount : _LARGE_INTEGER
   +0x1c8 ReadTransferCount : _LARGE_INTEGER
   +0x1d0 WriteTransferCount : _LARGE_INTEGER
   +0x1d8 OtherTransferCount : _LARGE_INTEGER
   +0x1e0 CommitChargeLimit : Uint4B
   +0x1e4 CommitChargePeak : Uint4B
   +0x1e8 AweInfo          : Ptr32 Void
   +0x1ec SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x1f0 Vm               : _MMSUPPORT
   +0x25c MmProcessLinks   : _LIST_ENTRY
   +0x264 HighestUserAddress : Ptr32 Void
   +0x268 ModifiedPageCount : Uint4B
   +0x26c Flags2           : Uint4B
   +0x26c JobNotReallyActive : Pos 0, 1 Bit
   +0x26c AccountingFolded : Pos 1, 1 Bit
   +0x26c NewProcessReported : Pos 2, 1 Bit
   +0x26c ExitProcessReported : Pos 3, 1 Bit
   +0x26c ReportCommitChanges : Pos 4, 1 Bit
   +0x26c LastReportMemory : Pos 5, 1 Bit
   +0x26c ReportPhysicalPageChanges : Pos 6, 1 Bit
   +0x26c HandleTableRundown : Pos 7, 1 Bit
   +0x26c NeedsHandleRundown : Pos 8, 1 Bit
   +0x26c RefTraceEnabled  : Pos 9, 1 Bit
   +0x26c NumaAware        : Pos 10, 1 Bit
   +0x26c ProtectedProcess : Pos 11, 1 Bit
   +0x26c DefaultPagePriority : Pos 12, 3 Bits
   +0x26c PrimaryTokenFrozen : Pos 15, 1 Bit
   +0x26c ProcessVerifierTarget : Pos 16, 1 Bit
   +0x26c StackRandomizationDisabled : Pos 17, 1 Bit
   +0x26c AffinityPermanent : Pos 18, 1 Bit
   +0x26c AffinityUpdateEnable : Pos 19, 1 Bit
   +0x26c PropagateNode    : Pos 20, 1 Bit
   +0x26c ExplicitAffinity : Pos 21, 1 Bit
   +0x26c Spare1           : Pos 22, 1 Bit
   +0x26c ForceRelocateImages : Pos 23, 1 Bit
   +0x26c DisallowStrippedImages : Pos 24, 1 Bit
   +0x26c LowVaAccessible  : Pos 25, 1 Bit
   +0x26c RestrictIndirectBranchPrediction : Pos 26, 1 Bit
   +0x26c AddressPolicyFrozen : Pos 27, 1 Bit
   +0x270 Flags            : Uint4B
   +0x270 CreateReported   : Pos 0, 1 Bit
   +0x270 NoDebugInherit   : Pos 1, 1 Bit
   +0x270 ProcessExiting   : Pos 2, 1 Bit
   +0x270 ProcessDelete    : Pos 3, 1 Bit
   +0x270 Wow64SplitPages  : Pos 4, 1 Bit
   +0x270 VmDeleted        : Pos 5, 1 Bit
   +0x270 OutswapEnabled   : Pos 6, 1 Bit
   +0x270 Outswapped       : Pos 7, 1 Bit
   +0x270 ForkFailed       : Pos 8, 1 Bit
   +0x270 Wow64VaSpace4Gb  : Pos 9, 1 Bit
   +0x270 AddressSpaceInitialized : Pos 10, 2 Bits
   +0x270 SetTimerResolution : Pos 12, 1 Bit
   +0x270 BreakOnTermination : Pos 13, 1 Bit
   +0x270 DeprioritizeViews : Pos 14, 1 Bit
   +0x270 WriteWatch       : Pos 15, 1 Bit
   +0x270 ProcessInSession : Pos 16, 1 Bit
   +0x270 OverrideAddressSpace : Pos 17, 1 Bit
   +0x270 HasAddressSpace  : Pos 18, 1 Bit
   +0x270 LaunchPrefetched : Pos 19, 1 Bit
   +0x270 InjectInpageErrors : Pos 20, 1 Bit
   +0x270 VmTopDown        : Pos 21, 1 Bit
   +0x270 ImageNotifyDone  : Pos 22, 1 Bit
   +0x270 PdeUpdateNeeded  : Pos 23, 1 Bit
   +0x270 VdmAllowed       : Pos 24, 1 Bit
   +0x270 CrossSessionCreate : Pos 25, 1 Bit
   +0x270 ProcessInserted  : Pos 26, 1 Bit
   +0x270 DefaultIoPriority : Pos 27, 3 Bits
   +0x270 ProcessSelfDelete : Pos 30, 1 Bit
   +0x270 SetTimerResolutionLink : Pos 31, 1 Bit
   +0x274 ExitStatus       : Int4B
   +0x278 VadRoot          : _MM_AVL_TABLE
   +0x298 AlpcContext      : _ALPC_PROCESS_CONTEXT
   +0x2a8 TimerResolutionLink : _LIST_ENTRY
   +0x2b0 RequestedTimerResolution : Uint4B
   +0x2b4 ActiveThreadsHighWatermark : Uint4B
   +0x2b8 SmallestTimerResolution : Uint4B
   +0x2bc TimerResolutionStackRecord : Ptr32 _PO_DIAG_STACK_RECORD
   +0x2c0 SequenceNumber   : Uint8B
   +0x2c8 CreateInterruptTime : Uint8B
   +0x2d0 CreateUnbiasedInterruptTime : Uint8B
   +0x2d8 SecurityDomain   : Uint8B

Linux是宏内核,R0和R3本质上共用同一个结构体

Windows 属于不完全的微内核结构,微内核分为内核结构执行体结构,其中内核结构只在内核中使用,而执行体结构是专门执行与R3相关的内容

所以,EPROCESS 是执行体结构,KPROCESS是内核结构

KPROCESS只跟内核打交道,也就是内存,线程,进程调度,设备之类

例如R3想要查询当前进程的ID,但是内核中没有这个概念,内核中所有进程都是一个提供统一调度的内核结构体,只有R3中的EPROCESS有这个概念,但是操作还是要执行的,所以通过让EPROCESS包含KPROCESS提供一个同时满足多种需求的结构体

所以KPROCESS可以几乎一成不变,如果有新添加的功能可以直接在EPROCESS上新增

所以函数以Ex开头的大多是比较顶层的执行体相关的函数,而Ke开头的是比较底层的内核层相关的函数,Ki开头的是提供给操作系统自己用的函数,这种函数通常是不导出的

总结

  • Ex 执行体函数进程线程链表对象属性赋值,取值,加锁相关
  • Ke 内核函数大部分是导出
  • Ki 微内核函数不导出内部自己使用进程线程CPU调度相关
  • Ps 执行体函数,进程线程相关Mm内存相关函数一般导出
  • Mm 内存相关函数Mm函数底层就是调用Mi不导出
  • Io 文件设备相关,导出
  • CC 文件缓存
  • Rtl 导出函数,一般是运行库字符串 执行体
  • Zw SSDT 本身Zw函数不实现功能,但是Zw不需要修改线程的先前模式
  • Nt 函数就是zw函数会调用到NT
  • CM 注册表
  • hal 这个是硬件函数
  • Ob 对象管理器 (句柄,查询内核对象,创建内核对象)
  • Pnp 电源管理
  • Psp 执行体函数,Ps函数实现复杂功能的时候都是调用Psp

KPROCESS

kd> DT _KPROCESS
ntdll!_KPROCESS
   +0x000 Header           : _DISPATCHER_HEADER//所有内核对象(进程线程互斥体信号量各种对象等)
   +0x010 ProfileListHead  : _LIST_ENTRY//性能分析
   +0x018 DirectoryTableBase : Uint4B//每一个进程的CR3
   +0x01c LdtDescriptor    : _KGDTENTRY
   +0x024 Int21Descriptor  : _KIDTENTRY
   +0x02c ThreadListHead   : _LIST_ENTRY//当前的进程有多少个线程
   +0x034 ProcessLock      : Uint4B
   +0x038 Affinity         : _KAFFINITY_EX
   +0x044 ReadyListHead    : _LIST_ENTRY
   +0x04c SwapListEntry    : _SINGLE_LIST_ENTRY
   +0x050 ActiveProcessors : _KAFFINITY_EX
   +0x05c AutoAlignment    : Pos 0, 1 Bit
   +0x05c DisableBoost     : Pos 1, 1 Bit
   +0x05c DisableQuantum   : Pos 2, 1 Bit
   +0x05c ActiveGroupsMask : Pos 3, 1 Bit
   +0x05c ReservedFlags    : Pos 4, 28 Bits
   +0x05c ProcessFlags     : Int4B
   +0x060 BasePriority     : Char
   +0x061 QuantumReset     : Char
   +0x062 Visited          : UChar
   +0x063 Unused3          : UChar
   +0x064 ThreadSeed       : [1] Uint4B
   +0x068 IdealNode        : [1] Uint2B
   +0x06a IdealGlobalNode  : Uint2B
   +0x06c Flags            : _KEXECUTE_OPTIONS
   +0x06d AddressPolicy    : UChar
   +0x06e IopmOffset       : Uint2B
   +0x070 Unused4          : Uint4B
   +0x074 StackCount       : _KSTACK_COUNT
   +0x078 ProcessListEntry : _LIST_ENTRY
   +0x080 CycleTime        : Uint8B
   +0x088 KernelTime       : Uint4B
   +0x08c UserTime         : Uint4B
   +0x090 VdmTrapcHandler  : Ptr32 Void

没讲完,做个实验

让一个普通进程在被结束的时候有像系统进程一样的效果

本质上修改结构,这里我们用驱动加载器做实验

process 0 0获取这个进程的信息

然后dt _eprocess 86f20ac8 一下

kd> dt _EPROCESS 86f20ac8  
ntdll!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x098 ProcessLock      : _EX_PUSH_LOCK
   +0x0a0 CreateTime       : _LARGE_INTEGER 0x01d93353`dfbac96e
   +0x0a8 ExitTime         : _LARGE_INTEGER 0x0
   +0x0b0 RundownProtect   : _EX_RUNDOWN_REF
   +0x0b4 UniqueProcessId  : 0x00000e2c Void
   +0x0b8 ActiveProcessLinks : _LIST_ENTRY [ 0x8414fd90 - 0x86f4ca68 ]
   +0x0c0 ProcessQuotaUsage : [2] 0xca8
   +0x0c8 ProcessQuotaPeak : [2] 0xca8
   +0x0d0 CommitCharge     : 0xec
   +0x0d4 QuotaBlock       : 0x889acd80 _EPROCESS_QUOTA_BLOCK
   +0x0d8 CpuQuotaBlock    : (null) 
   +0x0dc PeakVirtualSize  : 0x341e000
   +0x0e0 VirtualSize      : 0x341e000
   +0x0e4 SessionProcessLinks : _LIST_ENTRY [ 0x96472010 - 0x88c38114 ]
   +0x0ec DebugPort        : (null) 
   +0x0f0 ExceptionPortData : 0x8a207570 Void
   +0x0f0 ExceptionPortValue : 0x8a207570
   +0x0f0 ExceptionPortState : 0y000
   +0x0f4 ObjectTable      : 0xb2b24970 _HANDLE_TABLE
   +0x0f8 Token            : _EX_FAST_REF
   +0x0fc WorkingSetPage   : 0x20609
   +0x100 AddressCreationLock : _EX_PUSH_LOCK
   +0x104 RotateInProgress : (null) 
   +0x108 ForkInProgress   : (null) 
   +0x10c HardwareTrigger  : 0
   +0x110 PhysicalVadRoot  : (null) 
   +0x114 CloneRoot        : (null) 
   +0x118 NumberOfPrivatePages : 0xc0
   +0x11c NumberOfLockedPages : 0
   +0x120 Win32Process     : 0xfe8a9be0 Void
   +0x124 Job              : (null) 
   +0x128 SectionObject    : 0xaa2e7c10 Void
   +0x12c SectionBaseAddress : 0x00400000 Void
   +0x130 Cookie           : 0x48eac92b
   +0x134 Spare8           : 0
   +0x138 WorkingSetWatch  : (null) 
   +0x13c Win32WindowStation : 0x0000002c Void
   +0x140 InheritedFromUniqueProcessId : 0x0000057c Void
   +0x144 LdtInformation   : (null) 
   +0x148 VdmObjects       : (null) 
   +0x14c ConsoleHostProcess : 0
   +0x150 DeviceMap        : 0x8f748470 Void
   +0x154 EtwDataSource    : (null) 
   +0x158 FreeTebHint      : 0x7ffdf000 Void
   +0x160 PageDirectoryPte : _HARDWARE_PTE_X86
   +0x160 Filler           : 0
   +0x168 Session          : 0x96472000 Void
   +0x16c ImageFileName    : [15]  "q???"
   +0x17b PriorityClass    : 0x2 ''
   +0x17c JobLinks         : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x184 LockedPagesList  : (null) 
   +0x188 ThreadListHead   : _LIST_ENTRY [ 0x86cdc908 - 0x86cdc908 ]
   +0x190 SecurityPort     : (null) 
   +0x194 PaeTop           : 0x87da71e0 Void
   +0x198 ActiveThreads    : 1
   +0x19c ImagePathHash    : 0xfff0af2
   +0x1a0 DefaultHardErrorProcessing : 1
   +0x1a4 LastThreadExitStatus : 0n0
   +0x1a8 Peb              : 0x7ffdc000 _PEB
   +0x1ac PrefetchTrace    : _EX_FAST_REF
   +0x1b0 ReadOperationCount : _LARGE_INTEGER 0x0
   +0x1b8 WriteOperationCount : _LARGE_INTEGER 0x0
   +0x1c0 OtherOperationCount : _LARGE_INTEGER 0x4b
   +0x1c8 ReadTransferCount : _LARGE_INTEGER 0x0
   +0x1d0 WriteTransferCount : _LARGE_INTEGER 0x0
   +0x1d8 OtherTransferCount : _LARGE_INTEGER 0xac
   +0x1e0 CommitChargeLimit : 0
   +0x1e4 CommitChargePeak : 0xec
   +0x1e8 AweInfo          : (null) 
   +0x1ec SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x1f0 Vm               : _MMSUPPORT
   +0x25c MmProcessLinks   : _LIST_ENTRY [ 0x84156290 - 0x86f4cc0c ]
   +0x264 HighestUserAddress : 0x7fff0000 Void
   +0x268 ModifiedPageCount : 2
   +0x26c Flags2           : 0x202d000
   +0x26c JobNotReallyActive : 0y0
   +0x26c AccountingFolded : 0y0
   +0x26c NewProcessReported : 0y0
   +0x26c ExitProcessReported : 0y0
   +0x26c ReportCommitChanges : 0y0
   +0x26c LastReportMemory : 0y0
   +0x26c ReportPhysicalPageChanges : 0y0
   +0x26c HandleTableRundown : 0y0
   +0x26c NeedsHandleRundown : 0y0
   +0x26c RefTraceEnabled  : 0y0
   +0x26c NumaAware        : 0y0
   +0x26c ProtectedProcess : 0y0
   +0x26c DefaultPagePriority : 0y101
   +0x26c PrimaryTokenFrozen : 0y1
   +0x26c ProcessVerifierTarget : 0y0
   +0x26c StackRandomizationDisabled : 0y1
   +0x26c AffinityPermanent : 0y0
   +0x26c AffinityUpdateEnable : 0y0
   +0x26c PropagateNode    : 0y0
   +0x26c ExplicitAffinity : 0y0
   +0x26c Spare1           : 0y0
   +0x26c ForceRelocateImages : 0y0
   +0x26c DisallowStrippedImages : 0y0
   +0x26c LowVaAccessible  : 0y1
   +0x26c RestrictIndirectBranchPrediction : 0y0
   +0x26c AddressPolicyFrozen : 0y0
   +0x270 Flags            : 0x144d0801
   +0x270 CreateReported   : 0y1
   +0x270 NoDebugInherit   : 0y0
   +0x270 ProcessExiting   : 0y0
   +0x270 ProcessDelete    : 0y0
   +0x270 Wow64SplitPages  : 0y0
   +0x270 VmDeleted        : 0y0
   +0x270 OutswapEnabled   : 0y0
   +0x270 Outswapped       : 0y0
   +0x270 ForkFailed       : 0y0
   +0x270 Wow64VaSpace4Gb  : 0y0
   +0x270 AddressSpaceInitialized : 0y10
   +0x270 SetTimerResolution : 0y0
   +0x270 BreakOnTermination : 0y0
   +0x270 DeprioritizeViews : 0y0
   +0x270 WriteWatch       : 0y0
   +0x270 ProcessInSession : 0y1
   +0x270 OverrideAddressSpace : 0y0
   +0x270 HasAddressSpace  : 0y1
   +0x270 LaunchPrefetched : 0y1
   +0x270 InjectInpageErrors : 0y0
   +0x270 VmTopDown        : 0y0
   +0x270 ImageNotifyDone  : 0y1
   +0x270 PdeUpdateNeeded  : 0y0
   +0x270 VdmAllowed       : 0y0
   +0x270 CrossSessionCreate : 0y0
   +0x270 ProcessInserted  : 0y1
   +0x270 DefaultIoPriority : 0y010
   +0x270 ProcessSelfDelete : 0y0
   +0x270 SetTimerResolutionLink : 0y0
   +0x274 ExitStatus       : 0n259
   +0x278 VadRoot          : _MM_AVL_TABLE
   +0x298 AlpcContext      : _ALPC_PROCESS_CONTEXT
   +0x2a8 TimerResolutionLink : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x2b0 RequestedTimerResolution : 0
   +0x2b4 ActiveThreadsHighWatermark : 1
   +0x2b8 SmallestTimerResolution : 0
   +0x2bc TimerResolutionStackRecord : (null) 
   +0x2c0 SequenceNumber   : 0x69
   +0x2c8 CreateInterruptTime : 0x00000012`8b2b30f6
   +0x2d0 CreateUnbiasedInterruptTime : 0x00000012`8b2b30f6
   +0x2d8 SecurityDomain   : 0x00000001`0000000a

0x270的偏移的位置有一个+0x270 BreakOnTermination : 0y0也就是在这个进程退出的时候让他中断下来

我们的目标是改这个标志位让他变成1

我们先将从0x270偏移开始的FLAG往下的内容复制出来

 +0x270 Flags            : 0x144d0801
   +0x270 CreateReported   : 0y1
   +0x270 NoDebugInherit   : 0y0
   +0x270 ProcessExiting   : 0y0
   +0x270 ProcessDelete    : 0y0
   +0x270 Wow64SplitPages  : 0y0
   +0x270 VmDeleted        : 0y0
   +0x270 OutswapEnabled   : 0y0
   +0x270 Outswapped       : 0y0
   +0x270 ForkFailed       : 0y0
   +0x270 Wow64VaSpace4Gb  : 0y0
   +0x270 AddressSpaceInitialized : 0y10 //算2个
   +0x270 SetTimerResolution : 0y0
   +0x270 BreakOnTermination : 0y0
   +0x270 DeprioritizeViews : 0y0

我们从FLags开始向下先数4

+0x270 CreateReported   : 0y1
+0x270 NoDebugInherit   : 0y0
+0x270 ProcessExiting   : 0y0
+0x270 ProcessDelete    : 0y0

这个是10(4位*4=16)

再向下4

+0x270 Wow64SplitPages  : 0y0
+0x270 VmDeleted        : 0y0
+0x270 OutswapEnabled   : 0y0
+0x270 Outswapped       : 0y0

0

再向下4

+0x270 ForkFailed       : 0y0
+0x270 Wow64VaSpace4Gb  : 0y0
+0x270 AddressSpaceInitialized : 0y10 //算2个

本该向下数4个,但是因为这个AddressSpaceInitialized后面是0y10代表了2个,所以这次数3个就可以

这个就是第30

再向下2个就到了我们需要的BreakOnTermination标志位这里

+0x270 SetTimerResolution : 0y0
+0x270 BreakOnTermination : 0y0

由于我们的flags就代表了他向下的所有数据,所以我们是通过更改flags的值来改变对应的标志位

所以我们要改的位置是3个0+2,也就是2000

所以我们要将flags0x144d0801改成0x144d2801

我们通过ed 86f20ac8+270 0x144d2801 指令将86f20ac8+270位置的标志位flags改成0x144d2801

可以看一下下面这个对比图

最终效果

然后尝试一下关闭

发现直接出现了断点

bi继续就行

不过这种保护存在弊端,自己也没法创建新的线程了

posted @ 2024-05-18 17:23  MuRKuo  阅读(10)  评论(0编辑  收藏  举报