首页
社区
课程
招聘
[求助]Process32Next为什么取不到进程?
发表于: 2008-3-6 10:12 6525

[求助]Process32Next为什么取不到进程?

2008-3-6 10:12
6525
.386
                                .model flat,stdcall
                                option casemap:none
                                ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                                ;Include文件定义
                                ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                                include windows.inc
                                include user32.inc
                                includelib user32.lib
                                
                                include kernel32.inc
                                includelib kernel32.lib
                                ;include Macro.inc
                                ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                                ;数据段
                                ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                                .data
                                FirstProcess db MAX_PATH dup(0)
                                SecondProcess db MAX_PATH dup(0)
                                ThirdProcess db MAX_PATH dup(0)
                                ForthProcess db MAX_PATH dup(0)
                                FifthProcess db MAX_PATH dup(0)
                                .data?
                                PathArray dd 5 dup(?);存放上面5个路径地址的数组
                                _Handle dd ?
                                Pe  PROCESSENTRY32 <>
                              
                                .code
                     
                      start:   
                               invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
                               mov ebx,INVALID_HANDLE_VALUE
                               cmp eax,ebx
                               je _Error;创建快照是否成功
                               mov _Handle,eax
                               mov Pe.dwSize,sizeof Pe
                               lea ebx,PathArray
                               mov [ebx],offset FirstProcess
                               mov [ebx + 4],offset SecondProcess
                               mov [ebx + 8],offset ThirdProcess
                               mov [ebx + 12],offset ForthProcess
                               mov [ebx + 16],offset FifthProcess
                               invoke Process32First,_Handle,offset Pe
                               mov ecx,1
                          .repeat
                               .if (eax && Pe.th32ProcessID)
                                    inc ecx
                                    lea esi,Pe.szExeFile
                                    mov edi,[ebx]
                                    add ebx,4
                                    @@:
                                    lodsb;将ESI中的一个字节装入AL
                                    or al,al
                                    je _end;为0就结束,否则就放入EDI中
                                    stosb
                                    jmp @B
                               .endif
                               _end:
                              .while(Pe.th32ProcessID == 0);这里想去掉 system process这个进;程,但是我用OD调试,发现process32Next根本没有取到进程,eax的值总是为0,用getlasterror函数查看,错误号为0
                              invoke Process32Next,_Handle,offset Pe
                              .endw
                              
                              .until ecx <= 5
                               _Error:
                               invoke CloseHandle,eax
                               end             start   
                                
整个程序就是想从系统中取出5个进程,我实在弄不明白是怎么回事。还有如果用C语言直接调用Process32next就可以取到,
我的系统的配置为:windows xp sp2
谢谢各位的帮助!

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 424
活跃值: (2509)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
这算法太复杂了吧,用得着.while吗,而且算法本身都有问题
.if (eax && Pe.th32ProcessID)      [COLOR="Red"];Pe.th32ProcessID!=0[/COLOR]
inc ecx
lea esi,Pe.szExeFile
mov edi,[ebx]
add ebx,4
@@:
lodsb;将ESI中的一个字节装入AL
or al,al                        [COLOR="Red"];<--------[/COLOR]
je _end;为0就结束,否则就放入EDI中
stosb
jmp @B
.endif
_end:                   [COLOR="Red"];当取过一次进程名后再运行到这里的时候eax=0,而Pe.th32ProcessID!=0,下面的Process32Next没机会再次运行,而eax=0导致前面的.if (eax && Pe.th32ProcessID)无法再满足,ecx也无法得到inc,导致死循环,就算不死也不能取得5个进程[/COLOR]
.while(Pe.th32ProcessID == 0);这里想去掉 system process这个进;程,但是我用OD调试,发现process32Next根本没有取到进程,eax的值总是为0,用getlasterror函数查看,错误号为0
invoke Process32Next,_Handle,offset Pe
.endw
2008-3-6 11:23
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最后的那个while是我后来加上去的,我看process32next没有取到,我就自己加个while循环,然后再调试的
2008-3-6 11:50
0
雪    币: 424
活跃值: (2509)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
晕,麻烦下次问问题时把问题描述清楚一点,省得浪费别人的回答

去掉.while一样有问题,调用API后ecx会改变,所以最后的.until ecx <= 5就没意义了,同理invoke CloseHandle,eax一样会有问题,Process32Next倒是应该能正常工作
2008-3-6 12:57
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不好意思,是我自己没有说清楚。
我想知道为什么调用API后ecx会改变,哪个API会影响ecx?
invoke CloseHandle这里确实有问题,不过我最想知道的就是为什么process32next没有正常工作,是哪里影响了他它。在我这里出现的问题是Process32First首先会取到system process这个进程,它的ID为0,我想去掉这个进程,然后我又重新申请了一个PROCESSENTRY32 结构给process32next调用,发现它还是填了system process这个进程的信息,然后我再让他继续调用下去的话,就取不到进程了,不知道怎么回事?
不过还是很感谢你的回答!
2008-3-6 13:23
0
雪    币: 424
活跃值: (2509)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
所有代码就上面那些了?上面的代码Process32Next应该是工作正常的
绝大多数Win32 API调用后只有ebx,esi,edi是不会变的,其它寄存器不确定(一般还有ebp,esp也不变),了解编译器是怎么生成函数的话就会明白为什么这样,《Windows 环境下32位汇编语言程序设计》中讲有一些。

下面是修改过的比较简洁的代码,应该能正常工作:
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
includelib user32.lib
                                
include kernel32.inc
includelib kernel32.lib
                                
.data
	FirstProcess db MAX_PATH dup(0)
	SecondProcess db MAX_PATH dup(0)
	ThirdProcess db MAX_PATH dup(0)
	ForthProcess db MAX_PATH dup(0)
	FifthProcess db MAX_PATH dup(0)
	
.data?
	PathArray dd 5 dup(?);存放上面5个路径地址的数组
	_Handle dd ?
	Pe  PROCESSENTRY32 <>
                               
.code

start:

	invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
	.if eax != INVALID_HANDLE_VALUE               [COLOR="Green"];改用.if更简洁[/COLOR]
		mov _Handle,eax
		mov Pe.dwSize,sizeof Pe
		lea ebx,PathArray
		mov [ebx],offset FirstProcess 
		mov [ebx + 4],offset SecondProcess 
		mov [ebx + 8],offset ThirdProcess 
		mov [ebx + 12],offset ForthProcess
		mov [ebx + 16],offset FifthProcess
		invoke Process32First,_Handle,offset Pe
		mov esi,0                                  [COLOR="Green"];改用esi计数,从0计起方便后面访问数组[/COLOR]
		.repeat
			.if (eax && Pe.th32ProcessID)
				invoke lstrcpy,[ebx+esi*4],offset Pe.szExeFile       [COLOR="Green"];直接用API实现复制[/COLOR]
				inc esi
			.endif
			invoke Process32Next,_Handle,offset Pe
		[COLOR="Red"].until esi > 4     ;注意MASM里.until是为假时循环,所以这里用大于>[/COLOR]
		invoke CloseHandle,_Handle
		
		;invoke MessageBox,0,offset FirstProcess,offset FirstProcess,MB_OK
		;invoke MessageBox,0,offset SecondProcess,offset SecondProcess,MB_OK
		;invoke MessageBox,0,offset ThirdProcess,offset ThirdProcess,MB_OK
		;invoke MessageBox,0,offset ForthProcess,offset ForthProcess,MB_OK
		;invoke MessageBox,0,offset FifthProcess,offset FifthProcess,MB_OK
	.endif
	[COLOR="Red"]ret     ;不要忘记正常结束[/COLOR]
end start
2008-3-6 14:15
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我再试试看
非常感谢!
2008-3-6 15:09
0
游客
登录 | 注册 方可回帖
返回