首页
社区
课程
招聘
[求助]枚举进程所有线程的一个蓝屏信息
发表于: 2010-8-27 20:14 5720

[求助]枚举进程所有线程的一个蓝屏信息

2010-8-27 20:14
5720
PETHREAD NTAPI GetNextProcessThread(
                                                                        IN PEPROCESS Process,
                                                                        IN PETHREAD Thread OPTIONAL
                                                                        )
{
        PETHREAD FoundThread = NULL;
        PLIST_ENTRY ListHead, Entry;
       
       
        if (Thread)
        {
                Entry = (PLIST_ENTRY)((ULONG)(Thread)+uThreadListEntryOffset);
       
                        Entry=Entry->Flink;       
               
        }
        else
        {
                Entry = (PLIST_ENTRY)((ULONG)(Process)+uThreadListHeadOffset);
                Entry = Entry->Flink;
        }
        ListHead = (PLIST_ENTRY)((ULONG)Process + uThreadListHeadOffset);
        while (ListHead != Entry)
        {
                FoundThread = (PETHREAD)((ULONG)Entry - uThreadListEntryOffset);
                if (ObReferenceObject(FoundThread))
                        break;
                FoundThread = NULL;
                Entry = Entry->Flink;
        }
        if (Thread) ObDereferenceObject(Thread);
        return FoundThread;
}
我的一个函数枚举进程的所有线程 然后杀掉 在测试记事本的时候没有问题 但是杀电驴和DbgView都会蓝屏 我单步调试是执行家黑的那个语句的时候蓝的 下面附蓝屏信息 请教各位
STACK_TEXT:  
80e12fd4 83cec6d5 00000003 8d0fbbc1 00000065 nt!RtlpBreakWithStatusInstruction
80e13024 83ced1d1 00000003 80e13a74 8fe3b138 nt!KiBugCheckDebugBreak+0x1c
80e133e8 83cec574 000000f7 0682561c 8fe3d929 nt!KeBugCheck2+0x68b
80e1340c 8fe3a683 000000f7 0682561c 8fe3d929 nt!KeBugCheckEx+0x1e
80e1342c 8fe3a6e9 00000000 00000000 00000000 HelloDDK!__report_gsfailure+0x25 [d:\w7rtm\minkernel\tools\gs_support\kmode\gs_report.c @ 46]
80e13454 83c70c62 80e13968 80e13a64 80e13540 HelloDDK!_except_handler4+0x49 [d:\winmain\minkernel\crts\crtw32\misc\i386\chandler4.c @ 321]
80e13478 83c70c34 80e13968 80e13a64 80e13540 nt!ExecuteHandler2+0x26
80e13530 83cc28b9 80e13968 80e13540 0001003f nt!ExecuteHandler+0x24
80e1394c 83c51386 80e13968 00000000 80e139bc nt!KiDispatchException+0x17c
80e139b4 83c5133a 80e13a44 83e49424 badb0d00 nt!CommonDispatchException+0x4a
80e139dc 83cbeed4 83d3cd20 00000000 00000000 nt!KiExceptionExit+0x192
80e13a44 8fe3a227 00000000 00000000 00000000 nt!KeInsertQueueApc+0xb9
80e13a74 8fe3a2eb 8660bac8 0f02e3ed 8576a000 HelloDDK!PspTerminateThread+0x87 [f:\linklist\nt_driver\2\process.cpp @ 257]
80e13ac4 8fe3e09f 00000550 00000000 00000000 HelloDDK!KillProcess+0x7b [f:\linklist\nt_driver\2\process.cpp @ 289]
80e13ad8 83dd3f93 85770178 8576a000 00000000 HelloDDK!DriverEntry+0x8f [f:\linklist\nt_driver\2\driver.cpp @ 224]
80e13cbc 83dbc344 00000001 00000000 80e13ce4 nt!IopLoadDriver+0x7ed
80e13d00 83c76043 8f3b7cd0 00000000 856e34c0 nt!IopLoadUnloadDriver+0x70
80e13d50 83e02d16 00000001 8d0fb675 00000000 nt!ExpWorkerThread+0x10d
80e13d90 83ca4159 83c75f36 00000001 00000000 nt!PspSystemThreadStartup+0x9e
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x19

STACK_COMMAND:  kb

FOLLOWUP_IP:
HelloDDK!__report_gsfailure+25 [d:\w7rtm\minkernel\tools\gs_support\kmode\gs_report.c @ 46]
8fe3a683 cc              int     3

FAULTING_SOURCE_CODE:  
No source found for 'd:\w7rtm\minkernel\tools\gs_support\kmode\gs_report.c'

SYMBOL_STACK_INDEX:  4

SYMBOL_NAME:  HelloDDK!__report_gsfailure+25

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: HelloDDK

IMAGE_NAME:  HelloDDK.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4c77aa2f

FAILURE_BUCKET_ID:  0xF7_MISSING_GSFRAME_HelloDDK!__report_gsfailure+25

BUCKET_ID:  0xF7_MISSING_GSFRAME_HelloDDK!__report_gsfailure+25

Followup: MachineOwner

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
调试的时候看下Entry里面的值就知道了
2010-8-27 22:16
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上 我看了里面的值 是有的地方是无效地址,经过我的修改,之前的地方不蓝屏了 但是又有了新的问题,比如杀一个电驴的进程 程序单步运行可以把电驴的界面杀掉,但是后台进程仍在,且如果不单步运行,就会蓝屏。附改进后的代码,求教各位。小弟搞了好几天了,
PETHREAD NTAPI GetNextProcessThread(
                                                                        IN PEPROCESS Process,
                                                                        IN PETHREAD Thread OPTIONAL
                                                                        )
{
        PETHREAD FoundThread = NULL;
        PLIST_ENTRY ListHead, Entry;
        KSPIN_LOCK QLock;
        KIRQL oldirql;
        //PAGEDCODE
        KeInitializeSpinLock(&QLock);
        KeAcquireSpinLock(&QLock, &oldirql);
//        KeEnterCriticalRegionThread(&Thread->Tcb);
        if (Thread)
        {
                Entry = (PLIST_ENTRY)((ULONG)(Thread)+uThreadListEntryOffset);
                if (MmIsAddressValid(Entry))
                {
                        Entry=Entry->Flink;
                }
               
               
        }
        else
        {
               
                Entry = (PLIST_ENTRY)((ULONG)(Process)+uThreadListHeadOffset);
                if (MmIsAddressValid(Entry))
                {
                                Entry = Entry->Flink;
                }
               
       
        }
        ListHead = (PLIST_ENTRY)((ULONG)Process + uThreadListHeadOffset);
        while (ListHead != Entry)
        {
                FoundThread = (PETHREAD)((ULONG)Entry - uThreadListEntryOffset);
               
               
                if (MmIsAddressValid(FoundThread))
                {
                        if (ObReferenceObject(FoundThread))
                                //Entry = Entry->Flink;
                                break;
                       
               
                }else
                {
                        FoundThread = NULL;
                        if (MmIsAddressValid(Entry))
                        {
                                Entry = Entry->Flink;
                        }
                       
                    break;
                        //Entry = Entry->Flink;
                }
                //if (MmIsAddressValid(Entry))
                //{
                        //Entry = Entry->Flink;
                //}
       
               
        }
        KeReleaseSpinLock(&QLock, oldirql);
        //Entry = Entry->Flink;
        if (Thread&&MmIsAddressValid(Thread))
                ObDereferenceObject(Thread);
        return FoundThread;
}
外边的调用是:
__try
        {
                for(Thread = GetNextProcessThread(pObjEpro,NULL);
                MmIsAddressValid(Thread);
                //Thread != NULL;
                Thread = GetNextProcessThread(pObjEpro, Thread))
                {  
                        Status        = (NTSTATUS)(PspTerminateThreadByPt)(Thread,0);
                }
                //        __asm int 3
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
        }
2010-8-30 08:51
0
游客
登录 | 注册 方可回帖
返回
//