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 :
116 :
117 :
118 :
119 :
120 :
121 :
122 :
123 :
124 :
125 :
126 :
127 :
128 :
129 :
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 :
138 :
139 :
140 :
141 :
142 :
143 :
144 :
145 :
146 :
147 :
148 :
149 :
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 :
158 :
159 :
160 :
161 :
162 :
163 :
164 :
165 :
166 :
167 :
168 :
169 :
170 :
171 :
172 :
173 :
174 :
175 :
176 :
177 :
178 :
179 :
180 :
181 :
182 :
183 :
184 :
185 :
186 :
187 :
188 :
189 :
190 :
191 :
192 :
193 :
194 :
195 :
196 :
197 :
198 :
199 :
200 :
201 :
202 :
203 :
204 :
205 :
206 :
207 :
208 :
209 :
210 :
211 :
|
#include
#include
#include
#include
#include
commentaire de #pragma (bibliothèque, « kernel32.lib »)
commentaire de #pragma (bibliothèque, « user32.lib »)
commentaire de #pragma (bibliothèque, « advapi32.lib »)
vide
__cdecl
DbgReport (__pszFormat de char*,…) {
s_acBuf statique de char [2048] ;
_args de va_list ;
va_start (_args, __pszFormat) ;
vsprintf (s_acBuf, __pszFormat, _args) ;
OutputDebugStringA (s_acBuf) ;
va_end (_args) ;
}
DWORD ExecuteCmd ( le pszCmd de LPSTR, bShow de BOOL, POIGNÉE hToken)
{
STARTUPINFO SI ;
PROCESS_INFORMATION pi ;
bRes de BOOL ;
dwCode de DWORD = 0 ;
Msg de MSG ;
ZeroMemory ( &si, sizeof ( STARTUPINFO));
si.cb = sizeof ( STARTUPINFO) ;
si.dwFlags = STARTF_USESHOWWINDOW ;
si.wShowWindow = bShow ? SW_SHOWNORMAL : SW_HIDE ;
bRes = CreateProcessAsUser ( hToken,
ANNULER,
pszCmd,
NULLE,
NULLE,
VRAI,
NORMAL_PRIORITY_CLASS,
NULLE,
NULLE,
&si,
π
) ;
CloseHandle ( pi.hProcess) ;
CloseHandle ( pi.hThread) ;
retour ( 0) ;
}
DWORD GetExplorerProcessID ()
{
hSnapshot de POIGNÉE ;
PROCESSENTRY32 pe32 ;
ZeroMemory (&pe32, sizeof (pe32));
Temp de DWORD ;
hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, NULLE) ;
pe32.dwSize = sizeof (PROCESSENTRY32) ;
si (Process32First (hSnapshot, &pe32))
{
faire
{
si (! strcmp (pe32.szExeFile, « explorer.exe »))
{
temp = pe32.th32ProcessID ;
coupure ;
}
} tandis que (Process32Next (hSnapshot, &pe32));
}
DbgReport (« explorateur PID : %d \ n », temp) ;
temp de retour ;
}
BOOL EnableDebugPriv ( BOOL bEnable)
{
La POIGNÉE hToken ;
TOKEN_PRIVILEGES tp ;
si ( ! OpenProcessToken ( GetCurrentProcess (),
TOKEN_ADJUST_PRIVILEGES,
&hToken
)
) retour ( FAUX) ;
tp.PrivilegeCount = 1 ;
LookupPrivilegeValue ( NULLE,
SE_DEBUG_NAME,
&tp. Privilèges [ 0]. Luid
) ;
tp. Privilèges [ 0]. Attributs = bEnable
? SE_PRIVILEGE_ENABLED
: 0 ;
AdjustTokenPrivileges ( hToken,
FAUX,
&tp,
sizeof ( tp),
NULLE,
NULLE
) ;
retourner == ERROR_SUCCESS (de GetLastError ( )) ;
}
vider GetSidUser (Psid Psid, le char*pName, DWORD dwNameSize) {
carboniser l'acReferencedDomain [ LM20_DNLEN + 1] ;
DWORD dwDomainBufSize = sizeof ( acReferencedDomain) ;
eUse de SID_NAME_USE ;
nom des textes clairs de consultation de // du propriétaire
si ( ! LookupAccountSid ( NULLE,
Psid,
pName,
&dwNameSize,
acReferencedDomain,
&dwDomainBufSize,
&eUse
)
)
{
dwErr = GetLastError de DWORD () ;
DbgReport (« LookupAccountSid () a échoué : %d \ n », dwErr) ;
} DbgReport d'autre (le « Sid représente \ de %s \ %s \ n », acReferencedDomain, pName) ;
}
ImpersonateInteractiveUser vide (pCmd de LPSTR, bShow de BOOL)
{
La POIGNÉE hToken = NULLE ;
hProcess = NULLE de POIGNÉE ;
acName de char [ LM20_DNLEN + 1] ;
DWORD dwNameSize = sizeof ( acName) ;
processID = GetExplorerProcessID de DWORD () ;
si (processID)
{
hProcess =
OpenProcess (
PROCESS_ALL_ACCESS,
VRAI,
processID) ;
si (hProcess)
{
si (OpenProcessToken (
hProcess,
TOKEN_ALL_ACCESS,
&hToken))
{
Ptu de TOKEN_USER* ;
Dw de DWORD ;
GetTokenInformation (hToken, TokenUser, la NULLE, 0, &dw) ;
ptu = _alloca (TOKEN_USER*) (dw) ;
si (! GetTokenInformation (hToken, TokenUser, ptu, dw, &dw)) DbgReport (« GetTokenInformation () a échoué, raison : %d \ n », GetLastError ());
GetSidUser (ptu->User.Sid, acName, dwNameSize) ;
si (! ImpersonateLoggedOnUser (hToken)) DbgReport (« ImpersonateLoggedOnUser () a échoué, raison : %d \ n », GetLastError ());
DbgReport (« commande de lancement : comme de %s \ « %s \ » \ n ", pCmd, acName) ;
ExecuteCmd (le pCmd, bShow, hToken) ;
CloseHandle (hToken) ;
} DbgReport d'autre (« OpenProcessToken () a échoué, raison : %d \ n », GetLastError ());
CloseHandle (hProcess) ;
} DbgReport d'autre (« OpenProcess () a échoué, raison : %d \ n », GetLastError ());
}
}
force d'international (argc d'international, char ** argv) {
si (2 > argc) retour -1 ;
EnableDebugPriv (VRAI) ;
Le bShow de BOOL = RECTIFIENT ;
si (bShow de == d'argc 3) = strcmp (argv [2], « /HIDE ») ;
ImpersonateInteractiveUser (argv [1], bShow) ;
retour 0 ;
}
|