Tuuna Computer Science

HANDLE(커널 오브젝트) 와 HWND(유저 오브젝트) 특정 프로세스 종료 시키기 본문

windows programing

HANDLE(커널 오브젝트) 와 HWND(유저 오브젝트) 특정 프로세스 종료 시키기

GuTTe 2018. 8. 18. 19:34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <windows.h>
#include <string.h>
int main(int argc, char** argv)
{
        while (1)
        {
               HWND hWnd = FindWindow(NULL, TEXT("Steam"));
               if (hWnd)
               {
                       DWORD Processid;
                       GetWindowThreadProcessId(hWnd, &Processid); //hwnd로 프로세스 ID를 얻어옴
                       printf("\n탐지 성공\n\n");
                       printf("\n불법 프로그램을 강제종료 합니다. ");
                       HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Processid);
                       //The handle returned by the OpenProcess function can be used in any function that requires a handle to a process,
                       //such as the wait functions, provided the appropriate access rights were requested.
                       if (hProcess)
                       {
                              TerminateProcess(hProcess, 0);
                              Sleep(3000);
                       }
               }
               else
               {
                       printf("\n탐지실패");
                       Sleep(3000);
               }
        }
        return 0;
}
cs

코드 설명

일단 FindWindow(NULL, TEXT("찾고자 하는 프로세스"));

이를 통해서 만약 프로세스가 현재 실행중이라면 그 프로세스의 핸들 값(유저 오브젝트)을 리턴한다.

만약 그 프로세스가 실행중이지 않다면 FindWindow는 NULL을 리턴한다.

NULL이란? 무슨값이 들어있는지 모르는 상태 즉, 값이 없음을 의미한다.

FIndWindow의 인자 설명 : 첫 번째 인자로 NULL을 주면 모든 프로세스를 대상으로 조사

두 번째 인자로 찾고자 하는 프로세스를 조사한다.

즉, 현재 Steam이라는 프로세스가 실행중이라면 Steam의 핸들 값을 리턴한다.



핸들이란? 그림판을 예시로 들때 이 그림판에는 붓도 있고 펜도 있고 폰트도 있다.

만약 우리가 붓을 통해 그림판에 그림을 그릴려고 한다. 이때 우리는 붓이라는 오브젝트를 사용하는 것이 아니라

이 붓에 대응하는 핸들값을 통해 사용한다.

즉, 붓이라는 오브젝트를 직접 사용하지 않고 이 붓(오브젝트)와 같은 기능을 가진 운영체제가 부여한 핸들값을 통해

오브젝트를 사용한다.

다시 본론으로 돌아와서 핸들이란 붓,펜, 폰트등의 오브젝트를 사용하기 위한 식별번호이다.


왜 이러한 방식을 취하는가 : 예를 들어 정부가 여러분에게 체육시설을 지으라고 돈을 직접 주면 어떻게 될까. 이때부터 횡령이 시작된다.

그래서 정부라는 운영체제는 체육시설을 지으라고 준 돈(오브젝트)를 공공계좌(핸들)을 계설해서 이 계좌(핸들)을 통해서만 돈을 인출할 수 있도록 하면 횡령이 불가하다.

이 예시를 통해서 오브젝트를 직접 사용하지 않고 이 오브젝트에 대응하는 핸들을 사용하는 이유를 이해하자.

====================================================

여기까지 해서 if(hWnd)의 hWnd변수에는 Steam의 핸들 값(0이상의 값)이 들어있다.

그럼 if문은 0이상의 값은 참으로 인식하기 때문에 if문의 루틴으로 들어온다.

여기서 GetWindowThreadProcessId함수를 만나는데 이 함수의 첫 번째 인자(핸들)을 통해서

두 번째 인자의 변수에 그 핸들에 대한 프로세스의 ID(유일한 번호(구분을 위한))를 얻어온다.

이제 OpenProcess함수( 접근권한, FALSE, 접근할 프로세스 ID)를 통해서 커널 오브젝트를 얻게 되고

TerminateProcess(커널 오브젝트(핸들), 0(탈출코드)) 이렇게해서 커널 오브젝트를 (프로세스가 사용하고 있는 자원)을 종료시킨다.



To elaborate on what parksie said: HANDLE is a handle to any Kernel32 object, while HWND is a handle to a specific User32 object (window).
They're not parts of the same Win32 library, so I would say the chance that you can use a HANDLE value as a HWND and vice versa is pretty, well, tiny




'windows programing' 카테고리의 다른 글

[WinAPI] 편집 스크롤(Edit Scroll) 방법  (2) 2019.04.22
Comments