WINDOWS을 공부하다보면 너무 자주 만나는 친구 SetPrivilege 이 참에 공부좀 해보자.
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;
// 현재 프로세스의 핸들을 가져와 관련된 액세스토큰을 가져옴.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken))
{
printf("OpenProcessToken error: %u\n", GetLastError());
return FALSE;
}
// 로컬 시스템에 대한 LUID를 가져옴.
if (!LookupPrivilegeValue(NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid)) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(hToken, // 액세스 토큰 핸들
FALSE, // TURE일 경우 모든 권한 비활성화
&tp, // TOKEN_PRIBILEGES 구조체 포인터
sizeof(TOKEN_PRIVILEGES), // 다음에 오는 버퍼의 사이즈
(PTOKEN_PRIVILEGES)NULL, // 이전 상태 없어도 됨
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
SetPrivilege 소스코드는 이미 MSDN에서 그대로 제공하고 있다.
https://docs.microsoft.com/en-us/windows/win32/secauthz/enabling-and-disabling-privileges-in-c--
◆ OpenProcessToken : 프로세스의 토큰핸들값을 획득
HANDLE ProcessHandle - 접근하고자하는 프로세스 핸들
DWORD DesiredAccess - 접근권한
PHANDLE TokenHandle - 함수가 반환 될 때 새로 열린 액세스 토큰을 식별하는 핸들에 대한 포인터
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocesstoken
◆ LookupPrivilegeValue : 명시된 권한을 표현할 LUID 검색
LPCSTR lpSystemName
LPCSTR lpName
PLUID lpLuid
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lookupprivilegevaluea
◆ AdjustTokenPrivileges : 권한 조정
HANDLE TokenHandle
BOOL DisableAllPrivileges
PTOKEN_PRIVILEGES NewState
DWORD BufferLength
PTOKEN_PRIVILEGES PreviousState
PDWORD ReturnLength
https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-adjusttokenprivileges
댓글