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
然后偏移0x038
和0x03c
找到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
这个是1
个0
(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
个就可以
这个就是第3
个0
再向下2
个就到了我们需要的BreakOnTermination
标志位这里
+0x270 SetTimerResolution : 0y0
+0x270 BreakOnTermination : 0y0
由于我们的flags
就代表了他向下的所有数据,所以我们是通过更改flags
的值来改变对应的标志位
的
所以我们要改的位置是3个0+2
,也就是2000
所以我们要将flags
从0x144d0801
改成0x144d2801
我们通过ed 86f20ac8+270 0x144d2801
指令将86f20ac8+270
位置的标志位flags
改成0x144d2801
可以看一下下面这个对比图
最终效果
然后尝试一下关闭
发现直接出现了断点
bi
继续就行
不过这种保护存在弊端,自己也没法创建新的线程了