WinApi에서 프로세스를 이름이 아닌 다른 방법으로 구분하는 방법?

msglsj의 이미지

WinApi를 공부하는 겸 현재 실행되고 있는 프로세스들의 정보를 전부 불러와서 콘솔창에 출력해주는 프로그램을 하나 만들어 보았습니다.

프로세스를 불러오는 구조체인 PROCESSENTRY32의 멤버변수에
프로세스의 이름을 저장해두는 szExeFile을 보니 특정 프로세스만을 종료시킬 수 있겠다 싶어서
반복루틴에 특정 이름의 프로세스가 발견되면 핸들을 얻어와 종료메세지를 보냈더니 아주 잘 작동 했습니다.

이 쯤에서 궁금해진 것이 똑같은 프로그램이라도 실행파일의 이름이나 프로세스 이름은 얼마든지 바뀔 수 있을텐데
프로세스 이름이 바뀐 한 프로그램을 전부 종료시켜보고 싶을 때는 프로세스의 이름이 아닌 어떤 정보를 기준으로 종료 시켜야 할지 궁금합니다.

모자란 햇병아리에게 조언 부탁드립니다.

익명 사용자의 이미지

윈도우 상에서 tasklist 명령어를 cmd 창에서 실행 해보면
프로세스별 고유 식별자인 PID 가 윈도우 에도 존재 합니다.

구조체 자세히 살펴보면 있지 않을 까요?

msglsj의 이미지

프로세스별 고유 식별자인 PID는 매번 실행할 때 마다 변경될 뿐더러
각각 실행된 프로그램의 PID는 전부 달라서 하나의 PID로는 같은 프로그램이 여러개 실행됐을 때 전부 종료시킬 수 없을 것 같습니다.

ps) 살펴보니 PID는 th32ThreadID에 저장되네요

mirheekl의 이미지

원본파일을 알고 있을 경우 파일 리소스라든지 CRC체크 등으로 알 수 있지만, 그래도 몇 가지 문제가 있습니다.

- 일단 리네임이 되었다고 가정하면 파일 이름을 모르기 때문에 모든 프로세스의 파일 정보를 다 뒤져야 합니다.
- 파일이 살짝만 업데이트되어도 찾을 수 없게 됩니다. 리소스의 특정 정보를 가지고 찾아낼 수도 있지만 (OriginalFileName 이랄지..) 그마저도 조작이 가능하기 때문에 말이죠.

다만 디지털 시그니처를 지닌 프로그램이거나 닷넷 모듈인 경우 변화의 폭을 줄일 수는 있습니다.

--