본문 바로가기
카테고리 없음

SetPrivilege 함수 공부

by nroses-taek 2020. 3. 2.
반응형

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--

 

Enabling and Disabling Privileges in C++ - Win32 apps

Enabling and Disabling Privileges in C++ In this article --> Enabling a privilege in an access token allows the process to perform system-level actions that it could not previously. Your application should thoroughly verify that the privilege is appropriat

docs.microsoft.com

◆ 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

반응형

댓글