게임해킹/게임해킹 ,c++

프로세스 아이디 가져오는 방법

cp_good: 2022. 11. 15. 23:16
반응형

 

메모리에 접근하기 위해 OpenProcess를 사용하려면 프로세스 아이디가 필요하기 때문에 알아보겠습니다.

  1. CreateToolhelp32Snapshot 함수를 사용해 가져오는 방법
  2. FindWindow와 GetWindowThreadProcessId 함수를 사용해 가져오는 방법

CreateToolhelp32Snapshot 함수 사용

 

HANDLE CreateToolhelp32Snapshot(
  [in] DWORD dwFlags,
  [in] DWORD th32ProcessID
);
  • _In_DWORD dwFlags
    스냅샷에 포함할 정보, 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.(MSDN 참고)
  • _In_DWORD th32ProcessID
    스냅샷에 포함할 프로세스의 프로세스 식별자 (0을 넣으면 모든 프로세스 스냅샷)

 

편하게 비주얼 스튜디오에 복사해서 보시면 됩니다.

디버깅도 하고요.

 

CreateToolhelp32Snapshot 예제 코드

#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>

uint32_t get_process_id(const char* process)
{
	DWORD pid = 0; // 아이디를 받아올 변수

	// TH32CS_SNAPPROCESS와 0을 넘겨 모든프로세스 스냅샷
	HANDLE hPorcessShap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	
	if (hPorcessShap == INVALID_HANDLE_VALUE) {
		printf("CreateToolhelp32Snapshot 실패\n");
	}
	PROCESSENTRY32 pe32; // 프로세스 정보를 담을 구조체
	
	// MODULEENTRY32를 사용하기 위해 구조체 크기 만큼 초기화
	pe32.dwSize = sizeof(MODULEENTRY32);

	// Process32Next로 스냅샷한 첫번째 프로세스정보 가져오기
	while (Process32Next(hPorcessShap, &pe32) == TRUE)
	{
		// 스냅샷 프로세스와 내가 찾는 프로세스 이름비교
		if (strcmp(process, pe32.szExeFile) == 0)
		{
			// 맞으면 프로세스 아이디 저장
			pid = pe32.th32ProcessID;
			break;
		}
	}
	// 핸들닫고 프로세스 아이디 리턴
	CloseHandle(hPorcessShap);
	return pid;
}

int main()
{
	DWORD pid = get_process_id("notepad.exe") // 원하는 프로세스
	return 0;
}
  • CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)으로 프로세스 스냅샷
  • MODULEENTRY32를 사용하기 위해 구조체 크기만큼 초기화
  • Process32Next로 PROCESSENTRY32에 프로세스 정보를 담고 이름 비교
  • 반복 찾으면 프로세스 아이디 리턴

 

간단한 코드라서 설명 없이도 디버깅 한 번만 해보면 바로 알 수 있습니다.


GetWindowThreadProcessId 함수 사용

 

DWORD GetWindowThreadProcessId(
  [in]            HWND    hWnd,
  [out, optional] LPDWORD lpdwProcessId
);
  • _In_HWND hWnd
    창에 대한 핸들입니다. (FindWindow로 찾은 창 핸들)
  • _In_LPDWORD lpdwProcessId
    프로세스 식별자를 받는 변수에 대한 포인터입니다 (아이디 받을 변수, &pid 형태로 사용하면 됨)

 

GetWindowThreadProcessId 예제 코드

int main()
{
	DWORD pid;
	HWND hwnd = FindWindow(0, "제목 없음 - Windows 메모장");
	GetWindowThreadProcessId(hwnd, &pid);

	return 0;
}

FindWindow 함수는 첫 번째 인자로 창 클래스 이름을 두 번째 인자로 창 제목 이름을 사용하고

 

프로세스 해커 프로그램으로 창 클래스, 제목을 확인할 수 있습니다.

 

View -> Windows
창클래스와 창제목 확인

 

예제에서는 메모장 창 제목을 사용했습니다.

 

육안으로도 확인가능

 

다른 글 : 프로세스 베이스 주소 가져오는 방법

 

반응형