首页
社区
课程
招聘
[求助]用ZwQuerySystemInformation枚举进程时遇到的一个小问题,(请教!)
发表于: 2008-12-27 03:05 7678

[求助]用ZwQuerySystemInformation枚举进程时遇到的一个小问题,(请教!)

2008-12-27 03:05
7678
下面这段代码是我在网上找到的,实现的功能是循环枚举进程,找到对应的进程结束掉
有个很闷的问题:
    我用记事本进程测试,如果我在运行程序前先运行十个notepad.exe,则十个notepad.exe都能被结束掉。但如果我先运行程序,再运行十个notepad.exe,却只能结束九个,余下的那个notepad.exe进程只有要系统产生新的进程时才能被结束。。。好几天了,哪位前辈如果有空帮看看,感激不尽
;_____________________________________________________
不好意思啊,刚学,可能对有些问题理解得不正确
照6楼的qihoocom前辈所说的我把那个循环改成了.repeat    .until。。。。这个循环会先执行一次循环体内的代码再判断,可结束还是一样啊。。。。
我理解错了吗?

.386
.model flat, stdcall
option casemap:none

include         windows.inc
include         kernel32.inc
include         user32.inc
include         masm32.inc
include         advapi32.inc
include                shlwapi.inc
includelib         kernel32.lib
includelib         user32.lib
includelib         advapi32.lib
includelib         masm32.lib
includelib        shlwapi.lib

UNICODE_STRING                 STRUCT
_Length                 WORD         ?
MaximumLength                 WORD         ?
Buffer PWSTR                 ?
UNICODE_STRING                 ENDS

SYSTEMTHREADS                 struct
KernelTime                 db             8 dup(?)
UserTime                 db             8 dup(?)
CreateTime                 db             8 dup(?)
WaitTime                 ULONG         ?           
StartAddress                 PVOID         ?         
ClientIs                 dd         ?
Priority                 dd         ?
BasePriority                 dd         ?
ContextSwitchCount         ULONG         ?           
ThreadState                 ULONG         ?
WaitReason                 dd           ?  
SYSTEMTHREADS                 ends

SYSTEMPROCESSES         struct
NextEntryDelta                 ULONG         ?
ThreadCount                 ULONG         ?
Reserved1                 dd         6 DUP(?)
CreateTime                 db             8 dup(?)
UserTime                 db             8 dup(?)
KernelTime                 db             8 dup(?)
ProcessName         UNICODE_STRING  <>   
BasePriority                 dd         ?     
ProcessId                 ULONG         ?         
InheritedFromProcessId         ULONG         ?
HandleCount                 ULONG         ?
Reserved2                 ULONG         2 DUP (?)
VmCounters                 dd         ?
IoCounters                 dd         ?
Threads         SYSTEMTHREADS         <>
SYSTEMPROCESSES         ends

.const
NT_PROCESSTHREAD_INFO         equ         5
_Name                        db        "notepad.exe",0

.data
ZwQuerySystemInformation db         "ZwQuerySystemInformation",0
Ntdll                   db         "ntdll.dll",0
Apiaddr                   dd         ?
Pprocessinfo                   dd         ?
ReturnLength                   dd         ?
_Process                dd        ?
hFileName                dd        ?
ProcessNameFormat        db        "%ws",13,10,0
buffer                   db         50 dup (?)

.data?
processinfo                   db         10000h dup (?)

.code
;________________________________________
_Processa         proc
                pushad
               
               
                mov         eax,offset processinfo
                mov        Pprocessinfo,eax
                mov         ecx,offset ReturnLength
                push         ecx
                push         10000h
                push         Pprocessinfo
                push         NT_PROCESSTHREAD_INFO
                call         Apiaddr
               
                mov         edi,Pprocessinfo
                assume         edi:ptr SYSTEMPROCESSES
        .repeat
               
                invoke         wsprintf,addr buffer,addr ProcessNameFormat,[edi].ProcessName.Buffer,0
                lea        eax,offset buffer
                .if        eax
               
                invoke        StrStrI,eax,offset _Name
                        .if        eax
               
                        invoke        OpenProcess,PROCESS_ALL_ACCESS,TRUE,[edi].ProcessId
                       
                        invoke        TerminateProcess,eax,-1
                       
                        .endif       
               
                .endif
                add         edi,[edi].NextEntryDelta
               
               
        .until        [edi].NextEntryDelta == 0
                assume         edi:nothing
                popad
        ret
_Processa         endp
;_____________________________________
start:
                invoke         LoadLibrary,offset Ntdll
                invoke         GetProcAddress,eax,offset ZwQuerySystemInformation
                mov         Apiaddr,eax
               
                .while        TRUE
                invoke        Sleep,1000
               
               
                call        _Processa
               
                .endw
                invoke        ExitProcess,NULL

end         start

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
貌似是ZwQuerySystemInformation 函数的问题, 这个函数只是向系统拿一个"快照",  并没有真正地实时监测系统; 何时何种情况下, 才更新这个"快照", 可能视系统与这个函数的查询类型有关;

我简单地测试了一下, 发现运行程序后, 再运行记事本程序, 程序根本没有"发现"记事本的进程, 再任意地运行任何一个进程, 程序就"发现"记事本的进程了, 貌似是"快照"已经被系统更新;

ZwQuerySystemInformation 函数具体的细节不是很清楚;
2008-12-27 08:27
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯, 可能至少创建了2个新进程, 系统才会去更新这个"快照", ZwQuerySystemInformation 函数才能得到新的信息;
2008-12-27 08:30
0
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
就是这问题
哪位前辈有空帮看下呀
2008-12-27 17:39
0
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
似乎所有论坛都一样,高手都不屑于回答这种比较弱的问题
但就是这种比较弱的问题,对于我来说却是一道不可逾越的坎。。。。。。。。。。。。。。。
2008-12-28 04:04
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
呵呵 怎么可能列举不到进程,是楼主的程序逻辑有问题,即便是ProcInfo.NextEntryDelta == 0,也应该处理这个entry的,处理完了再判断NextEntryDelta 是否为0,为0跳出,否则如果按楼主的逻辑,总会漏掉最后一个进程

还是练好基本功比较重要啊。。

用汇编写这个看得太恶心,下面是C的:

procinfo = (PSYSTEM_PROCESS_INFORMATION)SystemInformation ;
do {

procinfo = (PSYSTEM_PROCESS_INFORMATION)((ULONG)procinfo + procinfo->NextEntryDelta );

//处理procinfo
//...
}while(procinfo->NextEntryDelta )
2008-12-28 11:10
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
有史以来,MJ同学对菜鸟们最温情的话语诞生了
2008-12-28 11:36
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=sudami;557144]有史以来,MJ同学对菜鸟们最温情的话语诞生了[/QUOTE]

赶快跟着膜拜1下
2008-12-28 11:40
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=sudami;557144]有史以来,MJ同学对菜鸟们最温情的话语诞生了[/QUOTE]

MJ现在淡定了啊~~
2008-12-28 12:35
0
雪    币: 6857
活跃值: (3348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
同学对菜鸟们最温情的话语诞生了  有这时间,给我等菜鸟解说一下 SYSTEMPROCESSES这个结构的没一项,意思,谢谢!
2008-12-28 21:49
0
雪    币: 7309
活跃值: (3778)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
11
那个不一定是mj,也许是王小姐
2008-12-30 00:18
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
12
id.....
2008-12-30 00:22
0
游客
登录 | 注册 方可回帖
返回
//