NT内核级进程隐藏3-线程调度链表及Hook 内核函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NT内核级进程隐藏3-线程调度链表及Hook内核函数
基于线程调度链表的检测和隐藏技术
1.什么是ETHREAD和KTHREAD块
学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。
Windows2000是由执行程序线程(ETHREAD)块表示的,ETHREAD成员都是指向的系统空间,进程环境块(TEB)除外。ETHREAD块中的第一个结构体就是内核线程(KTHREAD)块。在KTHREAD块中包含了windows2000内核需要访问的信息。这些信息用于执行线程的调度和同步正在运行的线程。
kd>!kthread
struct_KTHREAD(sizeof=432)
+000struct_DISPA TCHER_HEADER Header
+010struct_LIST_ENTRY MutantListHead
+018void*InitialStack
+01c void*StackLimit
+020void*Teb
+024void*TlsArray
+028void*KernelStack
+02c byte DebugActive
+02d byte State
+02e byte Alerted[2]
+030byte Iopl
+031byte NpxState
+032char Saturation
+033char Priority
+034struct_KAPC_STATE ApcState
+034struct_LIST_ENTRY ApcListHead[2] +044struct_KPROCESS*Process
+04c uint32ContextSwitches
+050int32WaitStatus
+054byte WaitIrql
+055char WaitMode
+056byte WaitNext
+057byte WaitReason
+058struct_KWAIT_BLOCK*WaitBlockList +05c struct_LIST_ENTRY WaitListEntry
+064uint32WaitTime
+068char BasePriority
+069byte DecrementCount
+06a char PriorityDecrement
+06b char Quantum
+06c struct_KWAIT_BLOCK WaitBlock[4] +0cc void*LegoData
+0d0uint32KernelApcDisable
+0d4uint32UserAffinity
+0d8byte SystemAffinityActive
+0d9byte PowerState
+0da byte NpxIrql
+0db byte Pad[1]
+0dc void*ServiceTable
+0e0struct_KQUEUE*Queue
+0e4uint32ApcQueueLock
+0e8struct_KTIMER Timer
+110struct_LIST_ENTRY QueueListEntry
+118uint32Affinity
+11c byte Preempted
+11d byte ProcessReadyQueue
+11e byte KernelStackResident
+11f byte NextProcessor
+120void*CallbackStack
+124void*Win32Thread
+128struct_KTRAP_FRAME*TrapFrame
+12c struct_KAPC_STATE*ApcStatePointer[2] +134char PreviousMode
+135byte EnableStackSwap
+136byte LargeStack
+137byte ResourceIndex
+138uint32KernelTime
+13c uint32UserTime
+140struct_KAPC_STATE SavedApcState
+158byte Alertable
+159byte ApcStateIndex
+15a byte ApcQueueable
+15b byte AutoAlignment
+15c void*StackBase
+160struct_KAPC SuspendApc
+190struct_KSEMAPHORE SuspendSemaphore
+1a4struct_LIST_ENTRY ThreadListEntry
+1ac char FreezeCount
+1ad char SuspendCount
+1ae byte IdealProcessor
+1af byte DisableBoost
在偏移0x5c处有一个WaitListEntry成员,这个就是用来链接到线程调度链表的。在偏移0x34处有一个ApcState成员结构,在ApcState中的Process域就是指向当前线程关联的进程的KPROCESS块,由于KPROCESS块是EPROCESS块的第一个元素,所以找到了KPROCESS块指针也就是找到了EPROCESS块的指针。找到了EPROCESS就不用多少了,就可以取得当前线程的进程的名字,ID号等。
2.线程调度
在windows系统中,线程调度主要分成三条主要的调度链表。分别是KiWaitInListHead,
KiWaitOutListhead,KiDispatcherReadyListHead,分别是两条阻塞链,一条就绪链表,当线程获得CPU执行的时候,系统分配一个时间片给线程,当发生一次时钟中断就从分配的时间片上减去一个时钟中断的值,如果这个值小于零了也就是时间片用完了,那么这个线程根