none
关于explorer.exe父进程的问题,很疑惑 RRS feed

  • 常规讨论

  • 最近在测试explorer.exe父进程,但有个问题很疑惑,同样一断代码,用ASM写出来的结果和用VC6.0里写出来的结果竟然是不同的,希望有懂的朋友给小弟个指示。

    代码也很简单,就是从快照里取出explorer.exe进程的父进程ID和自身进程ID,但ASM编译出来的程序执行结果提示“不等”,VC++编译出来的程序执行结果提示“相等”

    ASM主要代码如下:

    .data
    
    szdeng		db	"相等",0
    szbdeng		db	"不等",0
    szCap		db	"注意",0
    
    
    
    ;----------------------------------------------------------------------------
    
    .data?
    
    dwFather	DWORD ?
    dwSun		DWORD ?
    lpProc		PROCRAV ?
    szProc		DWORD ?
    
    CheckFatherProcessID proc
    
    LOCAL hProc: HANDLE 
    LOCAL pe: PROCESSENTRY32
    mov pe.dwSize,sizeof PROCESSENTRY32
    
    invoke lstrcat,addr szProc1,addr szProc2
    
    invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 
    mov hProc,eax	
    mov eax,INVALID_HANDLE_VALUE 
    .if eax == hProc
    xor eax,eax
    ret
    .endif
    
    invoke Process32First,hProc,addr pe 
    .while (eax)
    invoke StrCmpi,addr szExplorer,addr pe.szExeFile 
    .if (eax == 0)
    push pe.th32ParentProcessID
    pop dwFather
    push pe.th32ProcessID
    pop dwSun
    .endif
    invoke Process32Next,hProc,addr pe 
    .endw
    invoke CloseHandle,hProc
    
    push ebx
    mov eax,dwFather
    mov ebx,dwSun
    
    
    
    .if eax == ebx
    ;xor eax,eax
    invoke MessageBox,NULL,addr szdeng,addr szCap,0
    pop ebx
    ret
    .else
    ;mov eax,1
    invoke MessageBox,NULL,addr szbdeng,addr szCap,0
    pop ebx
    ret
    .endif
    
    ret
    CheckFatherProcessID endp

    VC++主要代码如下:

    #include "stdafx.h"
    
    int APIENTRY WinMain(HINSTANCE hInstance,
               HINSTANCE hPrevInstance,
               LPSTR   lpCmdLine,
               int    nCmdShow)
    {
     	// TODO: Place code here.
    	HANDLE hl;
    	DWORD szfather,szsun;
    	char szexpl[MAX_PATH] = "EXPLORER.EXE";
    	hl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    	if (hl == INVALID_HANDLE_VALUE)
    		return FALSE;
    	
    	PROCESSENTRY32 pe = {0};
    	pe.dwSize = sizeof(PROCESSENTRY32);
    	
    	//res = Process32First(hl,&pe);
    	BOOL res;
    	for (res = Process32First(hl,&pe);res;res = Process32Next(hl,&pe))
    	{
    		if(!lstrcmp(szexpl,pe.szExeFile))
    		{
    			szfather == pe.th32ParentProcessID;
    			szsun == pe.th32ProcessID;
    			
    		}
    		
    	}
    	if (szfather == szsun)
    	{
    		::MessageBox(NULL,"相等","提示",0);
    	}
    	else
    	{
    		::MessageBox(NULL,"不等","提示",0);
    	}
    
    	return 0;
    }
    
    
    2010年8月20日 8:32

全部回复

  • "GeJian" wrote:
    > 但ASM编译出来的程序执行结果提示“不等”,VC++编译出来的程序执行结果提示“相等”
    > invoke StrCmpi,addr szExplorer,addr pe.szExeFile
    > if(!lstrcmp(szexpl,pe.szExeFile))
     
    lstrcmp -> lstrcmpi
     
     


    没有区别的啊,ASM中是判断EAX的值,如果EAX值为零说明找到了explorer.exe进程,则保存相关的ID

    VC++里也一样,取个反是因为0为假么,所以意思是一样的啊,也是判断如果为零了则找到了进程并保存相关的ID

    而且VC++里lstrcmp和lstrcmpi没有区别啊,我用后者也是一样的

    2010年8月20日 8:57