LuvSea

[MFC] 프로세스 접근 권한 얻어오기 본문

sTudy

[MFC] 프로세스 접근 권한 얻어오기

사랑海 2009. 10. 8. 14:03
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
프로세스에 대한 정보를 읽어오는데 보호된 프로세스라서 읽어오지 못하는 경우가 있다.
그럴 경우에는 아래의 함수를 추가해주면 된다.
BOOL SetPrivilege(HANDLE hToken,LPCTSTR Privilege, BOOL bEnablePrivilege)    
{    

    TOKEN_PRIVILEGES    tp;   
    LUID                        luid;   
    TOKEN_PRIVILEGES    tpPrevious;   
    DWORD cbPrevious    =sizeof(TOKEN_PRIVILEGES);   
       
    if(FALSE == LookupPrivilegeValue( NULL, Privilege, &luid ))   
    {   
        return FALSE;   
    }   
       
    tp.PrivilegeCount               = 1;   
    tp.Privileges[0].Luid           = luid;   
    tp.Privileges[0].Attributes   = 0;   
       
    AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious);   

    if (GetLastError() != ERROR_SUCCESS)   
    {   
        return FALSE;   
    }   
       
    tpPrevious.PrivilegeCount       = 1;   
    tpPrevious.Privileges[0].Luid   = luid;   
       
    if(bEnablePrivilege)   
    {   
        tpPrevious.Privileges[0].Attributes = tpPrevious.Privileges[0].Attributes | (SE_PRIVILEGE_ENABLED);   
    }   
    else  
    {   
        tpPrevious.Privileges[0].Attributes = tpPrevious.Privileges[0].Attributes ^   
            (SE_PRIVILEGE_ENABLED &   
            tpPrevious.Privileges[0].Attributes);   
    }   
       
    AdjustTokenPrivileges(hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL);   
       
    if (GetLastError() != ERROR_SUCCESS)   
    {   
        return FALSE;   
    }   
       
    return TRUE;   
}   
  
BOOL AdjustDebugPrivilege()   
{   
    HANDLE hToken;   
    if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))   
    {   
        if (GetLastError() == ERROR_NO_TOKEN)   
        {   
            if (FALSE == ImpersonateSelf(SecurityImpersonation))   
            {   
                return FALSE;   
            }   
               
            if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))   
            {   
                AfxMessageBox("OpenThreadToken Error");   
                return FALSE;   
            }   
        }   
           
        else  
        {   
            return FALSE;   
        }   
           
    }   
    SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);   
    if(hToken != NULL)   
    {   
        CloseHandle(hToken);   
    }   
    return TRUE;       
}   
  
BOOL RestorePrivilege()   
{   
    HANDLE hToken;   
    if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))   
    {   
        if (GetLastError() == ERROR_NO_TOKEN)   
        {   
            if (FALSE == ImpersonateSelf(SecurityImpersonation))   
            {   
                return FALSE;   
            }   
               
            if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))   
            {   
                AfxMessageBox("OpenThreadToken Error");   
                return FALSE;   
            }   
        }   
           
        else  
        {   
            return FALSE;   
        }   
           
    }   
       
    SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);   
    if(hToken != NULL)   
    {   
        CloseHandle(hToken);   
    }   
    return TRUE;   
}  
CreateToolhelp32Snapshot() 같은 함수로 프로세스나 모듈을 열기전에,
AdjustDebugPrivilege() 함수로 권한을 획득해주고, 핸들을 닫은 후에 RestorePrivilege() 함수로 권한을 반환해 주면 된다.
Comments