能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
最后的那个while是我后来加上去的,我看process32next没有取到,我就自己加个while循环,然后再调试的
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不好意思,是我自己没有说清楚。
我想知道为什么调用API后ecx会改变,哪个API会影响ecx?
invoke CloseHandle这里确实有问题,不过我最想知道的就是为什么process32next没有正常工作,是哪里影响了他它。在我这里出现的问题是Process32First首先会取到system process这个进程,它的ID为0,我想去掉这个进程,然后我又重新申请了一个PROCESSENTRY32 结构给process32next调用,发现它还是填了system process这个进程的信息,然后我再让他继续调用下去的话,就取不到进程了,不知道怎么回事?
不过还是很感谢你的回答!
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我再试试看
非常感谢!
|