KPCR进程概念

news/2024/11/18 7:28:21/文章来源:https://www.cnblogs.com/murkuo/p/18199528

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继续就行

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708310.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驱动断链

03驱动断链获取驱动信息的途径是从Driver和FileSystem两个目录下获得的正常情况下我们自己做驱动遍历只能便利Driver下的所有驱动,也就是驱动链表里的驱动 分析 这里我们F12进去找一下DRIVER_OBJECT的结构 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; WinDbg里dt一下 kd&…

蓝屏分析

04蓝屏分析 直接上蓝屏代码 #include <ntifs.h>VOID Unload(PDRIVER_OBJECT pDriver) {DbgPrint("Driver Unload\r\n"); }NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg) {pDriver->DriverUnload = Unload;//DbgBreakPoint();DbgPrin…

Qt学习第二篇(基本小组件的使用)

Qt_2 小部件是 GUI 的基本元素。 它也称为UI 控件。 它接受来自底层平台的不同用户事件,如鼠标和键盘事件(以及其他事件)。 我们使用不同的小部件创建 UI。 曾经有一段时间,所有的 GUI 控件都是从头开始编写的。 Qt 小部件通过开发具有现成的 GUI 控件的桌面 GUI 来缩短时间,…

Weblogic T3反序列化漏洞(CVE-2018-2628)

在Weblogic中RMI通信的实现是使用T3协议,并且在T3的传输过程中,和RMI一样,会进行序列化和反序列化的操作。目录前言T3协议概述漏洞复现修复方案 前言 WebLogic Server 是一个企业级的应用服务器,由Oracle公司开发,支持完整的Java EE规范,包括EJB、JSP、Servlet、JMS等,适…

方方方的数据结构

总算给我看懂到底是什么意思了。。。 首先我们来考虑按照时间+扫描线进行处理,假设操作如下黑色是加操作,黄色是乘操作,绿色是加操作,对于红色那条线所代表的点,随着时间的流逝,首先在刚刚进入黑色的时候,这一点的值就被加上了一个数,然后刚刚进入黄色的时候,这一点的…

手机硬件检测:-DeviceTest

手机硬件检测:Z-DeviceTest官方版是款针对手机硬件所打造的检测工具。手机硬件检测:Z-DeviceTest能够检测硬件和OS,硬件上不仅仅是电池、cpu、内存、OS,甚至连usb、扬声器、指南针、摄像头、GPS、听筒等都能检测。并且手机硬件检测:Z-DeviceTest还能够对市面众多的机型进行检…

OutOfMemoryError

以下的这段代码应该是报错的才对,但是我在运行了之后,程序一直卡在那里。最后请教老师了解到,原来jvm如果不指定运行参数,是会进行自动扩容的。 package com.coding.jvm.oom;public class NativeErrorDemo {public static void main(String[] args) {for (; ; ) {new Threa…

【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码

1 前言 电脑重置了或者新的项目代码,仓库里二三十个,一个一个拉属实有点拉跨,今儿空了整了个脚本,可以拉下所有的仓库代码。 2 前置 需要装一个解析 json的,windows 的话可以直接下载:下载,mac的话可以再官网下载:官网地址。 然后加入到 PATH 下,效果如下:3 脚本 …

app测试工具monkey

Monkey是Android中的一个命令行工具,可以运行在模拟器或者实际设备中向系统发送伪随机的用户事件流(按键输入、触摸屏输入、手势输入等) 实现对正在开发的应用程序进行测试; Monkey测试之一种为了测试软件的稳定性、健壮性的快速有效的方式 一、什么是Monkey 顾名思义,M…

Markdown的学习笔记

Markdown (#+空格输入后回车自动形成大标题) 字体 (##+空格输入回车形成二级标题,以此类推,最多6级) hello world!(两边加两个*好为粗体) hello world!(两边一个*号为斜体) hello world!(三个*号斜体加粗) hello world!(两边两个~号删除线) 引用(大于>+空格形…

关于idea部署本地项目的问题

因为我部署问题的时忘记把问题截图,所以我这边使用网上的截图。 这个错误信息表明,你正在尝试运行一个由更高版本的Java编译的Spring Boot应用程序,而你当前使用的Java运行时(JRE)版本过低,无法识别这个应用程序的类文件版本。 它这边提示应用程序中的类文件版本是61.0,…

GmSSL3.X编译iOS和Android动态库

一、环境准备 我用的Mac电脑编译,Xcode版本15.2,安卓的NDK版本是android-ndk-r21e。 1.1、下载国密源码 下载最新的国密SDK源码到本地。 1.2、安装Xcode 前往Mac系统的AppStore下载安装最新Xcode。 1.3、安卓NDK下载 下载NDK到本地,选择一个比较新的版本下载即可,我选择的是…