Skip to content

Commit 6974785

Browse files
committed
Fix #756 - Support running NpcapHelper.exe as a different user.
1 parent 3a0ab29 commit 6974785

1 file changed

Lines changed: 83 additions & 1 deletion

File tree

packetWin7/Helper/NpcapHelper/NpcapHelper.cpp

Lines changed: 83 additions & 1 deletion
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)
@@ -123,6 +177,7 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
123177
HANDLE hFileDup;
124178
BOOL bResult;
125179
HANDLE hClientProcess;
180+
HANDLE hMyToken;
126181

127182
TRACE_PRINT1("Original handle: %08p.\n", hFile);
128183
if (hFile == INVALID_HANDLE_VALUE)
@@ -131,6 +186,23 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
131186
TRACE_PRINT1("CreateFileA failed, GLE=%d.\n", *pdwError);
132187
return INVALID_HANDLE_VALUE;
133188
}
189+
190+
bResult = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hMyToken);
191+
if (!bResult)
192+
{
193+
*pdwError = dwError = GetLastError();
194+
TRACE_PRINT1("OpenProcessToken failed, GLE=%d.\n", dwError);
195+
return INVALID_HANDLE_VALUE;
196+
}
197+
198+
bResult = SetPrivilege(hMyToken, SE_DEBUG_NAME, TRUE);
199+
if (!bResult)
200+
{
201+
*pdwError = dwError = GetLastError();
202+
TRACE_PRINT1("SetPrivilege failed, GLE=%d.\n", dwError);
203+
return INVALID_HANDLE_VALUE;
204+
}
205+
134206
hClientProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, g_sourcePID);
135207
if (hClientProcess == NULL)
136208
{
@@ -206,13 +278,17 @@ BOOL createPipe(LPCSTR pipeName) noexcept
206278
TRACE_PRINT("Invalid owner SID\n");
207279
return FALSE;
208280
}
281+
282+
SID creatorOwnerRightsSid{ 1, 1, SECURITY_CREATOR_SID_AUTHORITY, {SECURITY_CREATOR_OWNER_RIGHTS_RID} };
283+
209284
SECURITY_DESCRIPTOR sd;
210285
if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
211286
{
212287
TRACE_PRINT1("InitializeSecurityDescriptor failed: %#x\n", GetLastError());
213288
return FALSE;
214289
}
215-
DWORD cbDacl = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD);
290+
DWORD cbDacl = sizeof(ACL) + 2 * sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD);
291+
cbDacl += GetLengthSid(&creatorOwnerRightsSid);
216292
cbDacl += GetLengthSid(tokenInfoBuffer.tokenUser.User.Sid);
217293
PACL pDacl = (PACL) HeapAlloc(hHeap, 0, cbDacl);
218294
if (pDacl == NULL)
@@ -226,6 +302,12 @@ BOOL createPipe(LPCSTR pipeName) noexcept
226302
HeapFree(hHeap, 0, pDacl);
227303
return FALSE;
228304
}
305+
if (!AddAccessAllowedAce(pDacl, ACL_REVISION, GENERIC_ALL, &creatorOwnerRightsSid))
306+
{
307+
TRACE_PRINT1("AddAccessAllowedAce failed: %#x\n", GetLastError());
308+
HeapFree(hHeap, 0, pDacl);
309+
return FALSE;
310+
}
229311
if (!AddAccessAllowedAce(pDacl, ACL_REVISION, GENERIC_ALL, tokenInfoBuffer.tokenUser.User.Sid))
230312
{
231313
TRACE_PRINT1("AddAccessAllowedAce failed: %#x\n", GetLastError());

0 commit comments

Comments
 (0)