Skip to content

Commit 931f2ed

Browse files
committed
Fix #756 - Support running NpcapHelper.exe as a different user.
1 parent 92faf25 commit 931f2ed

File tree

1 file changed

+83
-1
lines changed

1 file changed

+83
-1
lines changed

packetWin7/Helper/NpcapHelper/NpcapHelper.cpp

+83-1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,60 @@ void terminateSelf() noexcept
115115
TerminateProcess(hself, 0);
116116
}
117117

118+
// Slightly modified from:
119+
// https://learn.microsoft.com/en-us/windows/win32/secauthz/enabling-and-disabling-privileges-in-c--
120+
BOOL SetPrivilege(
121+
HANDLE hToken, // access token handle
122+
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
123+
BOOL bEnablePrivilege // to enable or disable privilege
124+
)
125+
{
126+
TOKEN_PRIVILEGES tp;
127+
LUID luid;
128+
129+
if (!LookupPrivilegeValue(
130+
NULL, // lookup privilege on local system
131+
lpszPrivilege, // privilege to lookup
132+
&luid)) // receives LUID of privilege
133+
{
134+
TRACE_PRINT1("LookupPrivilegeValue error: %u\n", GetLastError());
135+
return FALSE;
136+
}
137+
138+
tp.PrivilegeCount = 1;
139+
tp.Privileges[0].Luid = luid;
140+
if (bEnablePrivilege)
141+
{
142+
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
143+
}
144+
else
145+
{
146+
tp.Privileges[0].Attributes = 0;
147+
}
148+
149+
// Enable the privilege or disable all privileges.
150+
151+
if (!AdjustTokenPrivileges(
152+
hToken,
153+
FALSE,
154+
&tp,
155+
sizeof(TOKEN_PRIVILEGES),
156+
(PTOKEN_PRIVILEGES)NULL,
157+
(PDWORD)NULL))
158+
{
159+
TRACE_PRINT1("AdjustTokenPrivileges error: %u\n", GetLastError());
160+
return FALSE;
161+
}
162+
163+
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
164+
{
165+
TRACE_PRINT("The token does not have the specified privilege.\n");
166+
return FALSE;
167+
}
168+
169+
return TRUE;
170+
}
171+
118172
_Must_inspect_result_
119173
_Success_(return != INVALID_HANDLE_VALUE)
120174
HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Out_range_(1,MAXDWORD)) DWORD *pdwError)
@@ -124,6 +178,7 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
124178
DWORD dwError;
125179
BOOL bResult;
126180
HANDLE hClientProcess;
181+
HANDLE hMyToken;
127182

128183
TRACE_PRINT1("Original handle: %08p.\n", hFile);
129184
if (hFile == INVALID_HANDLE_VALUE)
@@ -132,6 +187,23 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
132187
TRACE_PRINT1("CreateFileA failed, GLE=%d.\n", dwError);
133188
return INVALID_HANDLE_VALUE;
134189
}
190+
191+
bResult = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hMyToken);
192+
if (!bResult)
193+
{
194+
*pdwError = dwError = GetLastError();
195+
TRACE_PRINT1("OpenProcessToken failed, GLE=%d.\n", dwError);
196+
return INVALID_HANDLE_VALUE;
197+
}
198+
199+
bResult = SetPrivilege(hMyToken, SE_DEBUG_NAME, TRUE);
200+
if (!bResult)
201+
{
202+
*pdwError = dwError = GetLastError();
203+
TRACE_PRINT1("SetPrivilege failed, GLE=%d.\n", dwError);
204+
return INVALID_HANDLE_VALUE;
205+
}
206+
135207
hClientProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, g_sourcePID);
136208
if (hClientProcess == NULL)
137209
{
@@ -208,13 +280,17 @@ BOOL createPipe(LPCSTR pipeName) noexcept
208280
TRACE_PRINT("Invalid owner SID\n");
209281
return FALSE;
210282
}
283+
284+
SID creatorOwnerRightsSid{ 1, 1, SECURITY_CREATOR_SID_AUTHORITY, {SECURITY_CREATOR_OWNER_RIGHTS_RID} };
285+
211286
SECURITY_DESCRIPTOR sd;
212287
if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
213288
{
214289
TRACE_PRINT1("InitializeSecurityDescriptor failed: %#x\n", GetLastError());
215290
return FALSE;
216291
}
217-
DWORD cbDacl = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD);
292+
DWORD cbDacl = sizeof(ACL) + 2 * sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD);
293+
cbDacl += GetLengthSid(&creatorOwnerRightsSid);
218294
cbDacl += GetLengthSid(tokenInfoBuffer.tokenUser.User.Sid);
219295
PACL pDacl = (PACL) HeapAlloc(hHeap, 0, cbDacl);
220296
if (pDacl == NULL)
@@ -228,6 +304,12 @@ BOOL createPipe(LPCSTR pipeName) noexcept
228304
HeapFree(hHeap, 0, pDacl);
229305
return FALSE;
230306
}
307+
if (!AddAccessAllowedAce(pDacl, ACL_REVISION, GENERIC_ALL, &creatorOwnerRightsSid))
308+
{
309+
TRACE_PRINT1("AddAccessAllowedAce failed: %#x\n", GetLastError());
310+
HeapFree(hHeap, 0, pDacl);
311+
return FALSE;
312+
}
231313
if (!AddAccessAllowedAce(pDacl, ACL_REVISION, GENERIC_ALL, tokenInfoBuffer.tokenUser.User.Sid))
232314
{
233315
TRACE_PRINT1("AddAccessAllowedAce failed: %#x\n", GetLastError());

0 commit comments

Comments
 (0)