Notice
Recent Posts
Recent Comments
LuvSea
[MFC] 프로세스 접근 권한 얻어오기 본문
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
프로세스에 대한 정보를 읽어오는데 보호된 프로세스라서 읽어오지 못하는 경우가 있다.
그럴 경우에는 아래의 함수를 추가해주면 된다.
AdjustDebugPrivilege() 함수로 권한을 획득해주고, 핸들을 닫은 후에 RestorePrivilege() 함수로 권한을 반환해 주면 된다.
그럴 경우에는 아래의 함수를 추가해주면 된다.
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() 함수로 권한을 반환해 주면 된다.
'sTudy' 카테고리의 다른 글
[MFC 기초] 자동생성 클래스 분석 - CWinApp (0) | 2009.10.13 |
---|---|
[MFC 기초] AppWizard (0) | 2009.10.13 |
Tistory에 syntaxHighlighter 적용 (0) | 2009.10.06 |
VMWare에서 Window - 가상Window간 폴더 공유 (0) | 2009.10.06 |
[MFC] Register Hotkey 사용 (0) | 2009.09.24 |
Comments