본문 바로가기

Programming/Win32&MFC&COM

다중 실행 방지 코드(CreateMutex)

반응형

프로그램을 보면 하나의 프로세스(실행되어진 프로그램)만 허용하는 경우가 있습니다.

보통 게임에서 물가 안정 등의 이유로 다중 실행 방지를 많이 사용합니다.

그래서 그걸 깨는 멀티로더들도 암암리에 제작이 됩니다.

다중 실행을 방지하는 코드는 뮤텍스라는 걸 사용합니다.

물론 뮤텍스가 아닌 다른 커널 오브젝트를 사용해도 가능합니다.

뮤텍스는 커널 오브젝트기 때문에 모든 프로세스를 통틀어서 하나만 존재합니다.

이 뮤텍스가 중복되는 지 확인(이미 존재하는가 확인)하면 되는것이죠.

이 뮤텍스를 이용한 방법을 알아보도록 하겠습니다.

#include <iostream>
#include <windows.h>

HANDLE hMutex = nullptr;

int main()
{
	hMutex = ::CreateMutex(nullptr, TRUE, _T("Unique_Name_of_Mutex"));
	if (ERROR_ALREADY_EXISTS == GetLastError())
	{ 
		std::cout << "Already Ruuning" << std::endl;
		::CloseHandle(hMutex);

		return 0;
	}

	Sleep(10000);

	::CloseHandle(hMutex);

	return 0;
}

먼저 뮤텍스를 생성하는 코드를 작성합니다.

Unique Name of Mutex에 고유한 이름을 넣어주면 됩니다.

그 이후에 GetLastError() 라는 함수로 가장 마지막에 나온 에러를 확인합니다.

마지막의 에러가 ERROR_ALREADY_EXISTS일 때 열려 있는 핸들을 닫아주고 프로그램을 종료시킵니다.

처음 프로그램이 켜지게 되면 종료되기 전까지 뮤텍스가 존재하게 됩니다.

다음에 뮤텍스를 생성하려 하면 ERROR_ALREADY_EXISTS라는 에러가 나오는 것입니다.

리버싱에서는 저 부분을 건너 뛰면 다중 실행을 가능하게 할 수 있습니다.

Sleep(10000);을 추가했기 때문에 10초 동안 프로세스가 존재하고 그 동안에 새로운 프로세스는 생성이 불가능합니다.

Windows 개발에서는 WinMain에 입력하면 됩니다.

MFC에서는 InitInstance()에 CreateMutex와 에러처리를 넣고, ExitInstance()에 CloseHandle()을 넣어주면 됩니다.

반응형