Windows/API2018.01.30 15:46

[개요]

Windows OS에서 실행되는 Process의 Integrity Level을 체크해 봅시다. 

Integrity Level이란?

https://msdn.microsoft.com/en-us/library/bb625957.aspx


[코딩]

* Windows SDK 8.1 설치 및 사용 유무에 따라 코딩이 다릅니다. 

#include "stdafx.h" #include <windows.h> #include <Tlhelp32.h> #include <process.h> #define WIN81SDK 0 #ifndef WIN81SDK typedef struct _TOKEN_MANDATORY_LABEL { SID_AND_ATTRIBUTES Label; } TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL; #define ECURITY_MANDATORY_UNTRUSTED_RID 0x00000000 #define SECURITY_MANDATORY_LOW_RID 0x00001000 #define SECURITY_MANDATORY_MEDIUM_RID 0x00002000 #define SECURITY_MANDATORY_MEDIUM_PLUS_RID SECURITY_MANDATORY_MEDIUM_RID + 0x100 #define SECURITY_MANDATORY_HIGH_RID 0X00003000 #define SECURITY_MANDATORY_SYSTEM_RID 0x00004000 #define SECURITY_MANDATORY_PROTECTED_PROCESS_RID 0x00005000 #define TokenIsAppContainer (TOKEN_INFORMATION_CLASS)29 #define TokenIntegrityLevel (TOKEN_INFORMATION_CLASS)25 #endif    

BOOL SetPrivilege(LPCTSTR lpszPrivilege)
{
	TOKEN_PRIVILEGES TokenPrivileges;
	TOKEN_PRIVILEGES PreviousTokenPrivileges;
	LUID luid;
	HANDLE hToken = NULL;
	DWORD dwPreviousTokenPrivilegesSize = sizeof(TOKEN_PRIVILEGES);

	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
		return FALSE;
	}

	if(!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) {
		return FALSE;
	}

	TokenPrivileges.PrivilegeCount = 1;
	TokenPrivileges.Privileges[0].Luid = luid;
	TokenPrivileges.Privileges[0].Attributes = 0;

	if(ERROR_NOT_ALL_ASSIGNED == AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), &PreviousTokenPrivileges, &dwPreviousTokenPrivilegesSize)) {
		return FALSE;
	}

	PreviousTokenPrivileges.PrivilegeCount = 1;
	PreviousTokenPrivileges.Privileges[0].Luid = luid;
	PreviousTokenPrivileges.Privileges[0].Attributes |= SE_PRIVILEGE_ENABLED;

	if(ERROR_NOT_ALL_ASSIGNED==AdjustTokenPrivileges(hToken, FALSE, &PreviousTokenPrivileges, dwPreviousTokenPrivilegesSize, NULL, NULL))
	{
		return FALSE;
	}

	::CloseHandle(hToken);

	return TRUE;
}

void ShowProcessIntegrityLevel(TCHAR* szProccessName, HANDLE hProcess, DWORD dwProcessId)
{
	HANDLE hToken;
	
	DWORD dwLengthNeeded;
	DWORD dwError = ERROR_SUCCESS;
	
	PTOKEN_MANDATORY_LABEL pTIL = NULL;
	DWORD dwIntegrityLevel;


	if (OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) 
	{
		// Get the Integrity level.
		if (!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLengthNeeded))
		{
			dwError = GetLastError();
			if (dwError == ERROR_INSUFFICIENT_BUFFER)
			{
				pTIL = (PTOKEN_MANDATORY_LABEL)LocalAlloc(0,dwLengthNeeded);
				if (pTIL != NULL)
				{
					if (GetTokenInformation(hToken, TokenIntegrityLevel, pTIL, dwLengthNeeded, &dwLengthNeeded))
					{
						dwIntegrityLevel = *GetSidSubAuthority(pTIL->Label.Sid,	(DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTIL->Label.Sid)-1));
						if(dwIntegrityLevel < SECURITY_MANDATORY_LOW_RID)
						{
							wprintf(L"[%d][%s][%x]  Error \n",dwProcessId,szProccessName,dwIntegrityLevel);
						}
						else if (dwIntegrityLevel == SECURITY_MANDATORY_LOW_RID)
						{
							// Low Integrity		
							DWORD dwAppContainer = 0;
							DWORD dwDummy = 0;
							if (::GetTokenInformation(hToken, TokenIsAppContainer, &dwAppContainer, sizeof(dwAppContainer), &dwDummy))
							{
								if( dwAppContainer == 1 )
								{
									wprintf(L"[%d][%s]	This Process AppContanier \r\n",dwProcessId,szProccessName);
								}
								else
								{
									wprintf(L"[%d][%s]	Low Process \r\n",dwProcessId,szProccessName);
								}
							}
						}
						else if (dwIntegrityLevel >= SECURITY_MANDATORY_MEDIUM_RID && dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID)
						{
							// Medium Integrity
							wprintf(L"[%d][%s][%x]  Medium Process\r\n",dwProcessId,szProccessName,dwIntegrityLevel);
						}
						else if (dwIntegrityLevel >= SECURITY_MANDATORY_HIGH_RID && dwIntegrityLevel < SECURITY_MANDATORY_SYSTEM_RID )
						{
							// High Integrity
							wprintf(L"[%d][%s][%x]  High Integrity Process\r\n",dwProcessId,szProccessName,dwIntegrityLevel);
						}
						else if (dwIntegrityLevel >= SECURITY_MANDATORY_SYSTEM_RID)
						{
							// System Integrity
							wprintf(L"[%d][%s][%x]  System Integrity Process\r\n",dwProcessId,szProccessName,dwIntegrityLevel);
						}
						else
						{
							wprintf(L"[%d][%s][%d] /2t ==================== Process\r\n",dwProcessId,szProccessName,dwIntegrityLevel);
						}
					}
					LocalFree(pTIL);
				}
			}
		}
		CloseHandle(hToken);
	}
}

[사용법]

int _tmain(int argc, _TCHAR* argv[]) { SetPrivilege(SE_DEBUG_NAME); HANDLE hModuleShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if(hModuleShot == NULL || hModuleShot == INVALID_HANDLE_VALUE) { return FALSE; } PROCESSENTRY32W pe; ZeroMemory(&pe, sizeof(PROCESSENTRY32W)); pe.dwSize = sizeof(PROCESSENTRY32W); if(!Process32First(hModuleShot, &pe)) { CloseHandle(hModuleShot); return FALSE; } do { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); if( hProcess != NULL && hProcess != INVALID_HANDLE_VALUE) { ShowProcessIntegrityLevel(pe.szExeFile,hProcess,pe.th32ProcessID); CloseHandle(hProcess); } else { //wprintf(L"[%s][%d] Open FAIL Process\r\n",pe.szExeFile,pe.th32ProcessID); } } while(Process32Next(hModuleShot, &pe)); CloseHandle(hModuleShot); hModuleShot = NULL; system("pause"); return 0; }        


Posted by 최우림 -=HaeJuK=-
Windows/API2015.06.15 18:39

Name이 지정된 MUTEX를 검사하는 방법입니다.

전역 뮤텍스는 Global\\ 을 이용하요 이름 앞에 추가합니다. 


사용법 입니다.

#include "stdafx.h"
#include 
#include 
#pragma comment(lib, "shlwapi.lib")
#define RETURN(X, Y) { X = Y; goto Exit; }

int main()
{
	while(TRUE)
	{
		system("cls");
		bool bResult = FALSE;
		const TCHAR szSecureMutex[] = {_T("뮤텍스 이름") }; 

		HANDLE hHandle = ::OpenMutex(MUTEX_ALL_ACCESS,FALSE,szSecureMutex);
		if( hHandle == NULL || hHandle == INVALID_HANDLE_VALUE)
		{
			printf("FALSE \r\n");
		}
		else
		{
			::CloseHandle( hHandle );
			hHandle = NULL;
			printf("TRUE \r\n");
		}

	}

	return TRUE;
}



Posted by 최우림 -=HaeJuK=-
Windows/API2015.06.15 18:36

간단한 마우스 이벤트 발생 코드 입니다. 


Header 파일 입니다.

void ClickMouse(int parm_x, int parm_y, char parm_left_flag)

Source 파일 입니다.

void ClickMouse(int parm_x, int parm_y, char parm_left_flag) 
{ 
	int x_pos = parm_x*65535/GetSystemMetrics(SM_CXSCREEN); 
	int y_pos = parm_y*65535/GetSystemMetrics(SM_CYSCREEN); 

	::mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x_pos, y_pos, 
		0, ::GetMessageExtraInfo()); 

	if(parm_left_flag){ 
		::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
		::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
	} else { 
		::mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
		::mouse_event(MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
	} 
} 

사용법 입니다.

int main()
{
    Sleep(1000);
	POINT MousePos;
	::GetCursorPos(&MousePos);

    // 0,0, 으로 이동 후 왼쪽 버튼을 클립합니다.
	ClickMouse(0, 0, 1); 

    // 0,0, 기존 마우스 포인트로 복귀 하여 왼쪽을 클릭 합니다.
	ClickMouse(MousePos.x, MousePos.y, 1); 
	return 0;					
}
Posted by 최우림 -=HaeJuK=-
Windows/API2011.02.11 13:39

프로그램을 만들고 실행을 하다 보먄 자신의 경로 및 디렉토리 프로세스의 경로등이 필요한 경우가 상당히 많다.

우리가 흔히 알고 있는 WIN32 API 인 ::GetModuleFileName()을 사용하면 된다. 사용법은 아래와 같다. 

1. Point 연산으로 강제로 디렉토리 구하기 

#ifdef _UNICODE

TCHAR * SplitPath = NULL;
TCHAR FilePath[MAX_PATH] = {NULL,};
  ::GetModuleFileName(::GetModuleHandle(0),FilePath,MAX_PATH);
SplitPath  = _tcsrchr(FilePath,'\\');
if(SplitPath != NULL)
 *SplitPath = 0;
#else
CHAR * SplitPath = NULL;
CHAR FilePath[MAX_PATH] = {NULL,};
  ::GetModuleFileNameA(::GetModuleHandle(0),FilePath,MAX_PATH);
SplitPath  = _strrchr(FilePath,'\\');
if(SplitPath != NULL)
 *SplitPath = 0;

#endfi


2. 좀 더 안전하게 이것을 해결 해봅시다.. 역시나 포인터 연산에 의한 작업은 좀 무리가 있조..
 
#include <shlwapi.h>
TCHAR FilePath[MAX_PATH] = {NULL,};
::GetModuleFileName(::GetModuleHandle(0),FilePath,MAX_PATH);
::PathRemoveFileSpec(FilePath);
::PathRemoveBackslash(FilePath);



자. 그럼 DLL에서 자신이 경로!! 즉 DLL PATH는 어떻게 구할까?

::GetModuleFileName()의 1번째 인자인 HMODULE의 값이 0일 경우는 자신 프로세스의 경로가 리턴된다.

MFC일 경우 AFX 계열의 함수를 이용하면 DLL의 경로를 구할 수 있지만 WIN32면 이야기는 달라진다. 

어떻게 할까?

Posted by 최우림 -=HaeJuK=-
Windows/API2010.09.28 20:13
ConvertStringSecurityDescriptorToSecurityDescriptor() 함수를 쓰다보면 어디선가

언디파인 에러가 날것이다.

바로 해더파일의 함수와 호한 OS 설정을 한 디파인 값과 차이가 나기 때문이다.

간단하게 해더 파일(최 상위) 에

#define _WIN32_WINNT 0x500

요렇게 해주고 빌드하면 된다.

Posted by 최우림 -=HaeJuK=-

티스토리 툴바