目录
KernelBase.dll - TerminateThread
Ntkrnlpa.exe - NtTerminateThread
PspTerminateThreadByPointer
前言
线程不会因异步调用而结束,线程会自己结束自己。 逆向分析TerminateThread论证
KernelBase.dll - TerminateThread
参数检查、环境检查后,按NtTerminateThread
Ntkrnlpa.exe - NtTerminateThread
线程handle为0时从线程KTHREAD结构的成员ApcState.Process中获取当前线程所属的进程,确定进程中的活动线程数,然后将活动线程数设置为1 (例如如果活动线程数大于或等于1 ),则运行PSPPPPS
线程handle非0时首先从handle获取线程内核对象,然后退出线程以执行当前内核的线程,或者退出自身的执行的PspTerminateThreadByPointer参数
PspTerminateThreadByPointer
函数原型
nstatuspspterminatethreadbypointer (inpethreadthread,//线程内核结构IN NTSTATUS ExitStatus,//退出代码in boolean direct termin atus
当参数DirectTerminate为1时,在当前执行线程和结束线程相同的情况下运行PspExitThread。
据当参数DirectTerminate为0时报道,找不到结束线程代码,通过ExAllocatePoolWithTag申请KAPC的内存存储,调用KeInitializeApc初始化APC,然后单击Keke
线程切换和系统调用检查线程是否有APC等待处理。 如果a线程调用TerminateThread退出b线程,并且在b线程运行时检查APC队列,如果有“退出APC”,则自己退出。
从上述分析可以看出线程会自己杀自己……。