11. [pywin32] EnumProcess 관련 함수

pywin32/win32process|2020. 12. 27. 00:42

1. (long,....) = EnumProcesses()

 

현재 동작하는 프로세스를 열거하는 함수입니다.

 

리턴값은 현재 동작하는 프로세스 아이디 목록입니다.

 

 

2. (long,....) = EnumProcessModules(hProcess)

 

특정 프로세스가 사용하는 모듈의 목록을 반환합니다.

 

인자로는 hProcess : PyHANDLE 가 있습니다.

 

hProcess: 프로세스 핸들값입니다.

 

리턴값은 프로세스가 사용하는 모듈의 핸들값 목록입니다.

 

 

3. (long,....) = EnumProcessModulesEx(hProcess, FilterFlag )

 

EnumProcessModules 처럼 특정 프로세스가 사용하는 모듈의 목록을 반환합니다. 하지만 FilterFlag 변수를 이용해 특정 모듈만 반환할 수 있습니다.

 

인자로는 hProcess : PyHANDLE, FilterFlag=LIST_MODULES_DEFAULT : int 가 있습니다.

 

hProcess: 프로세스 핸들값입니다.

 

FilterFlag: 32bit와 64bit 모듈 중 어떤걸 혹은 다 반환할 지 정하는 값입니다.

이름 의미
0x01 win32process.LIST_MODULES_32BIT 32bit 모듈만을 반환합니다.
0x02 win32process.LIST_MODULES_64BIT 64bit 모듈만을 반환합니다.
0x03 win32process.LIST_MODULES_ALL 모든 모듈을 반환합니다.
0x0 win32process.LIST_MODULES_DEFAULT 기본 동작입니다.

리턴값은 프로세스가 사용하는 모듈의 핸들값 목록입니다. 

 

 

4. PyUNICODE = GetModuleFileNameEx(hProcess, hModule )

 

프로세스나 모듈의 이름을 반환합니다.

 

인자로는 hProcess : PyHANDLE, hModule : PyHANDLE 가 있습니다.

 

hProcess: 프로세스 핸들값입니다.

 

hModule: 모듈의 핸들값입니다.

 - 만약, 이 값은 None으로 준다면 hProcess의 프로세스 이름을 반환합니다.

 

리턴값은 프로세스 혹은 모듈의 이름입니다.

 

 

import win32process
import win32api
import win32con


enumProcesses = win32process.EnumProcesses()

for pid in enumProcesses:
    try:        
        if pid==0 or pid==4:
            print(f"{pid} is system process!!")
        else:
            psHandle = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED, \
                                 win32con.FALSE, \
                                 pid)
            
            #enumModule = win32process.EnumProcessModules(psHandle)
            enumModule = win32process.EnumProcessModulesEx(psHandle, win32process.LIST_MODULES_DEFAULT)
   
            psName = win32process.GetModuleFileNameEx(psHandle, None)

            for mod in enumModule:
                mdName = win32process.GetModuleFileNameEx(psHandle, mod)

                print(f"{pid} processName: {psName} module Name : {mdName}")


            win32api.CloseHandle(psHandle)

    except Exception as e:
        print(f"{pid} is error : {e}")

프로세스 핸들값을 얻기 위해 OpenProcess를 사용했으며, 이에 대한 설명은 win32api에서 다루겠습니다. 0과 4의 경우는 시스템 프로세스라 따로 뺐고, 이 외에도 OpenProcess를 통해 프로세스 핸들값은 얻어오지 못하는 프로세스들이 많더라구요... 일단을 핸들값을 얻을 수 있는 애들로만 진행했습니다. 위 예제는 파이썬을 관리자 권한으로 실행시킨 후 진행하셔야 합니다.

 

아래는 결과입니다.

 

 

 

 

 

반응형

댓글()