忘了看了那位大虾说的有个断开线程调度链表,看了一下 Windbg ,觉得应该跟断进程链表应该
差不多,就是试验了,有些问题,还望各位大虾指点下。
//**************************************************************************************
//**************************************************************************************
//模块名字:NTSTATUS HideThreadWaitQueueEntry(HANDLE ThreadID)
//模块功能:断开线程调度链表
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
//**************************************************************************************
//**************************************************************************************
NTSTATUS HideThreadWaitQueueEntry(HANDLE ThreadID)
{
KIRQL preIRQL;
PETHREAD EThread;
PLIST_ENTRY pWaitLIST_ENTRY,pQueueLIST_ENTRY;
if(STATUS_SUCCESS!=PsLookupThreadByThreadId(ThreadID,&EThread))
{
DbgPrint("Can't find the EPROCESS in ShowProcessFromEPROCByPID\n");
return STATUS_INVALID_PARAMETER;
}
pWaitLIST_ENTRY = (PLIST_ENTRY)((ULONG)EThread + ETHREAD_KTHREAD + KTHREAD_WaitListEntry);
pQueueLIST_ENTRY = (PLIST_ENTRY)((ULONG)EThread + ETHREAD_KTHREAD + KTHREAD_QueueListEntry);
DbgPrint("ETHREAD:%X;WaitList:%X;QueueList:%X\n",EThread,pWaitLIST_ENTRY,pQueueLIST_ENTRY);
preIRQL=KeRaiseIrqlToDpcLevel();
*((ULONG*)pWaitLIST_ENTRY->Blink) = (ULONG)pWaitLIST_ENTRY->Flink;
*((ULONG*)pWaitLIST_ENTRY->Flink + 1) = (ULONG)pWaitLIST_ENTRY->Blink;
//RemoveEntryList(&pWaitLIST_ENTRY);
//RemoveEntryList(&pQueueLIST_ENTRY);
*((ULONG*)pQueueLIST_ENTRY->Blink) = (ULONG)pQueueLIST_ENTRY->Flink;
*((ULONG*)pQueueLIST_ENTRY->Flink + 1) = (ULONG)pQueueLIST_ENTRY->Blink;
KeLowerIrql(preIRQL);
DbgPrint("KTHREAD in Hide\n");*/
return STATUS_SUCCESS;
}
在虚拟机上试验 断开WaitListEntry,被断链程序如果关闭大概过30秒 就蓝屏了不过有些程序不蓝屏,但是好像断开后主程序还是一样的工作,没有任何反映,需要断开两次才能停止线程,提示为僵死的进程。但是不能断开QueueListEntry,只要一断就蓝屏了。。。。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!