LuvSea

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

sTudy

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

사랑海 2009. 10. 8. 14:03
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
프로세스에 대한 정보를 읽어오는데 보호된 프로세스라서 읽어오지 못하는 경우가 있다.
그럴 경우에는 아래의 함수를 추가해주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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;···¬
}··¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CreateToolhelp32Snapshot() 같은 함수로 프로세스나 모듈을 열기전에,
AdjustDebugPrivilege() 함수로 권한을 획득해주고, 핸들을 닫은 후에 RestorePrivilege() 함수로 권한을 반환해 주면 된다.