SepFilterToken
NTSTATUS __stdcall SepFilterToken(
VOID *ExistingToken,
INT8 RequestorMode,
UINT64 Flags,
UINT64 GroupCount,
_SID_AND_ATTRIBUTES *GroupsToDisable,
UINT64 PrivilegeCount,
_LUID_AND_ATTRIBUTES *PrivilegesToDelete,
UINT64 SidCount,
_SID_AND_ATTRIBUTES *RestrictedSids,
UINT64 SidLength,
_TOKEN **FilteredToken){
VOID **v13;
unsigned int v14;
_SID_AND_ATTRIBUTES *v15;
VOID **PoolWithTag;
VOID **v17;
VOID **v18;
VOID **v20;
int v21;
VOID *v22;
VOID **v23;
_QWORD *v24;
_QWORD *v25;
char *v26;
unsigned int v27;
__int128 v28;
unsigned int v29;
_DWORD *v30;
unsigned int v31;
int v32;
_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v33;
__int64 v34;
_KPROCESS *CurrentProcess;
__int64 v36;
_EPROCESS *v37;
_ADAPTER_OBJECT *v38;
_SID_AND_ATTRIBUTES *v39;
int v40;
int v41;
_SID_AND_ATTRIBUTES *v42;
VOID *v43;
NTSTATUS v44;
unsigned int v45;
_SID_AND_ATTRIBUTES *v46;
_SID_AND_ATTRIBUTES *v47;
UINT64 v48;
NTSTATUS v49;
_DWORD *v50;
__int64 v51;
unsigned int v52;
size_t v53;
VOID **v54;
unsigned int *v55;
char v56;
_DWORD *v57;
unsigned int v58;
UINT64 v59;
VOID *v60;
INT64 v61;
INT64 v62;
INT64 v63;
NTSTATUS v64;
_ERESOURCE *v65;
int v66;
UINT64 *PrimaryToken;
__int64 v68;
__int64 v69;
VOID *ParseContext;
UINT64 ObjectBodySize;
UINT64 PagedPoolCharge;
UINT64 NonPagedPoolCharge;
UINT8 IsSystemCode;
UINT8 NewTokenAsRestrictedAsProcessToken;
UINT64 puResult;
VOID *Object;
UINT64 v78;
VOID *NextTargetSid;
int v80;
_DWORD *v81;
char *v82;
_DWORD *v83;
VOID ***v84;
_QWORD *v85;
_QWORD *v86;
_QWORD *v87;
_SID_AND_ATTRIBUTES **v88;
_SID_AND_ATTRIBUTES_HASH *SidAttrHash;
unsigned int *v90;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
int v92;
int v93;
VOID *v94;
VOID *v95;
int v96;
int v97;
__int128 v98;
_KNOWN_CONTROLLER_TYPE v99[4];
__int128 v100;
unsigned int Flagsa;
unsigned int GroupCounta;
GroupCounta = GroupCount;
Flagsa = Flags;
Object = 0i64;
memset(&SubjectContext, 0, sizeof(SubjectContext));
LODWORD(v78) = 0;
*(_OWORD *)v99 = 0i64;
LODWORD(puResult) = 0;
v13 = 0i64;
v100 = 0i64;
v93 = 0;
v97 = 0;
IsSystemCode = 0;
BYTE4(puResult) = KeGetCurrentThread()->PreviousMode;
NewTokenAsRestrictedAsProcessToken = 0;
v80 = Flags & 8;
if( (Flags & 8) != 0 && (*((_DWORD *)ExistingToken + 50) & 0x58) != 0 )
return -1073741811;
v14 = 0;
if( (_DWORD)SidCount )
{
v15 = RestrictedSids;
while( !RtlIsPackageSid(v15->Sid) && !RtlIsCapabilitySid(v15->Sid) )
{
++v14;
++v15;
if( v14 >= (unsigned int)SidCount )
goto LABEL_8;
}
return -1073741811;
}
LABEL_8:
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x30ui64, 1950442835i64);
v17 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
*(_DWORD *)PoolWithTag = 0;
PoolWithTag[2] = PoolWithTag + 1;
PoolWithTag[1] = PoolWithTag + 1;
PoolWithTag[5] = PoolWithTag + 4;
PoolWithTag[4] = PoolWithTag + 4;
*((_DWORD *)PoolWithTag + 6) = 0;
if( SeTokenLeakTracking )
{
v13 = ExAllocatePoolWithTag(1ui64, 0x120ui64, 1950442835i64);
if( !v13 )
{
v18 = v17;
goto LABEL_16;
}
}
v20 = ExAllocatePoolWithTag(0x200ui64, 0x68ui64, 1817470291i64);
if( !v20 )
{
ExFreePoolWithTag(v17, 0);
if( !SeTokenLeakTracking )
return -1073741670;
v18 = v13;
LABEL_16:
ExFreePoolWithTag(v18, 0);
return -1073741670;
}
v21 = RtlULongAdd(*((unsigned int *)ExistingToken + 33), (unsigned int)SidLength, &puResult);
if( v21 < 0
|| (v21 = RtlULongAdd((unsigned int)puResult, 4ui64, &puResult), v21 < 0)
|| (v21 = RtlULongAdd(0x490ui64, (unsigned int)puResult, &v78), v21 < 0) )
{
v23 = v20;
LABEL_101:
ExFreePoolWithTag(v23, 0);
ExFreePoolWithTag(v17, 0);
if( SeTokenLeakTracking )
ExFreePoolWithTag(v13, 0);
return v21;
}
LODWORD(NonPagedPoolCharge) = v78;
LODWORD(PagedPoolCharge) = *((_DWORD *)ExistingToken + 34);
LODWORD(ObjectBodySize) = v78;
v94 = v22;
v96 = (int)v22;
v95 = v22;
v92 = 48;
v98 = 0i64;
v21 = ObCreateObject(
RequestorMode,
(_OBJECT_TYPE *)SeTokenObjectType,
0i64,
RequestorMode,
v22,
ObjectBodySize,
PagedPoolCharge,
NonPagedPoolCharge,
&Object);
v23 = v20;
if( v21 < 0 )
goto LABEL_101;
v24 = Object;
*((_QWORD *)Object + 6) = v20;
ExInitializeResourceLite((INT64)v20);
v25 = Object;
v24[7] = ExpLuidIncrement + _InterlockedExchangeAdd64(&ExpLuid, ExpLuidIncrement);
v26 = (char *)Object;
v27 = puResult;
v25[2] = ExpLuidIncrement + _InterlockedExchangeAdd64(&ExpLuid, ExpLuidIncrement);
v26[204] = 0;
*((_QWORD *)v26 + 3) = *((_QWORD *)ExistingToken + 3);
v28 = *(_OWORD *)ExistingToken;
v81 = v26 + 128;
*(_OWORD *)v26 = v28;
*((_DWORD *)v26 + 35) = 0;
*((_DWORD *)v26 + 32) = 0;
*((_DWORD *)v26 + 33) = v27;
*((_QWORD *)v26 + 4) = *((_QWORD *)ExistingToken + 2);
*((_DWORD *)v26 + 48) = *((_DWORD *)ExistingToken + 48);
*((_DWORD *)v26 + 49) = *((_DWORD *)ExistingToken + 49);
*((_QWORD *)v26 + 5) = *((_QWORD *)ExistingToken + 5);
*((_QWORD *)v26 + 28) = *((_QWORD *)ExistingToken + 28);
*((_QWORD *)v26 + 140) = 0i64;
*((_QWORD *)v26 + 141) = 0i64;
*((_QWORD *)v26 + 137) = 0i64;
*((_QWORD *)v26 + 143) = v13;
*((_DWORD *)v26 + 30) = 0;
*((_QWORD *)v26 + 145) = 0i64;
v82 = v26 + 1144;
if( SeTokenLeakTracking )
{
v29 = RtlWalkFrameChain(*((_QWORD *)v26 + 143) + 40i64, 30i64, 0i64);
if( KeGetCurrentIrql() < 2u )
RtlWalkFrameChain(*(_QWORD *)v82 + 40i64 + 8i64 * v29, 30 - v29, 1ui64);
}
KeEnterCriticalRegion();
ExAcquireResourceSharedLite(*((_QWORD *)ExistingToken + 6), 1);
*((_DWORD *)v26 + 34) = *((_DWORD *)ExistingToken + 34);
*((_DWORD *)v26 + 36) = *((_DWORD *)ExistingToken + 36);
SepSetTokenSessionById((__int64)v26, *((_DWORD *)ExistingToken + 30), 0, 0i64, 0i64);
*((_DWORD *)v26 + 30) = *((_DWORD *)ExistingToken + 30);
v30 = v26 + 200;
v31 = *((_DWORD *)ExistingToken + 50) & 0xFFFFFBD7;
v83 = v26 + 200;
*((_DWORD *)v26 + 50) = v31;
*(_OWORD *)(v26 + 88) = *(_OWORD *)((char *)ExistingToken + 88);
*((_QWORD *)v26 + 13) = *((_QWORD *)ExistingToken + 13);
*((_DWORD *)v26 + 28) = *((_DWORD *)ExistingToken + 28);
*((_WORD *)v26 + 58) = *((_WORD *)ExistingToken + 58);
v26[118] = *((_BYTE *)ExistingToken + 118);
*((_DWORD *)v26 + 52) = *((_DWORD *)ExistingToken + 52);
*((_DWORD *)v26 + 53) = *((_DWORD *)ExistingToken + 53);
*((_OWORD *)v26 + 4) = *((_OWORD *)ExistingToken + 4);
*((_QWORD *)v26 + 10) = *((_QWORD *)ExistingToken + 10);
*((_QWORD *)v26 + 97) = v17;
if( v26[118] == 2 )
SepModifyTokenPolicyCounter((_SEP_AUDIT_POLICY *)(v26 + 88), 1u);
*((_QWORD *)v26 + 135) = 0i64;
v85 = v26 + 1080;
*((_QWORD *)v26 + 136) = 0i64;
v86 = v26 + 1088;
*((_QWORD *)v26 + 144) = 0i64;
v87 = v26 + 1152;
*((_QWORD *)v26 + 99) = 0i64;
v88 = (_SID_AND_ATTRIBUTES **)(v26 + 792);
*((_QWORD *)v26 + 98) = 0i64;
v90 = (unsigned int *)(v26 + 800);
*((_DWORD *)v26 + 200) = 0;
SidAttrHash = (_SID_AND_ATTRIBUTES_HASH *)(v26 + 808);
memset(v26 + 808, 0i64, 0x110u);
*((_QWORD *)v26 + 22) = 0i64;
*((_QWORD *)v26 + 138) = 0i64;
*((_QWORD *)v26 + 139) = 0i64;
*((_QWORD *)v26 + 142) = 0i64;
v84 = (VOID ***)(v26 + 176);
SepDuplicateLogonSessionReference((_TOKEN *)v26, (_TOKEN *)ExistingToken);
v21 = v32;
if( v32 < 0 )
goto LABEL_28;
SepRefDerefLuidToIndexEntryIfNecessary(ExistingToken, 0);
*((_QWORD *)v26 + 142) = *((_QWORD *)ExistingToken + 142);
v33 = (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *)*((_QWORD *)ExistingToken + 97);
if( *(_DWORD *)v33 )
{
v21 = AuthzBasepDuplicateSecurityAttributes(v33, *((_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)v26 + 97), 0);
if( v21 < 0 )
goto LABEL_28;
}
if( *((_QWORD *)ExistingToken + 137) )
{
v21 = SepDuplicateTokenClaims((_TOKEN *)ExistingToken, (_TOKEN *)v26);
if( v21 < 0 )
goto LABEL_28;
}
if( SeTokenLeakTracking )
{
v34 = (__int64)v82;
**(_QWORD **)v82 = KeGetCurrentThread()[1].CycleTime;
*(_QWORD *)(*(_QWORD *)v34 + 8i64) = *(_QWORD *)&KeGetCurrentThread()[1].CurrentRunTime;
*(_DWORD *)(*(_QWORD *)v34 + 32i64) = 15;
*(_DWORD *)(*(_QWORD *)v34 + 280i64) = 0;
*(_DWORD *)(*(_QWORD *)v34 + 284i64) = 0;
CurrentProcess = (_EPROCESS *)PsGetCurrentProcess();
v36 = *(_QWORD *)v34;
v26 = (char *)Object;
*(_QWORD *)(v36 + 16) = *(_QWORD *)CurrentProcess->ImageFileName;
*(_DWORD *)(v36 + 24) = *(_DWORD *)&CurrentProcess->ImageFileName[8];
*(_WORD *)(v36 + 28) = *(_WORD *)&CurrentProcess->ImageFileName[12];
*(_BYTE *)(v36 + 30) = CurrentProcess->ImageFileName[14];
SepAddTokenLogonSession((_TOKEN *)v26);
v27 = puResult;
}
if( (Flagsa & 2) != 0 )
{
v37 = (_EPROCESS *)PsGetCurrentProcess();
v38 = (_ADAPTER_OBJECT *)PsReferencePrimaryToken(v37);
if( SeIsSystemContext(v38, &IsSystemCode) >= 0 && IsSystemCode )
*v30 |= 0x40u;
HalPutDmaAdapter(v38);
}
v39 = (_SID_AND_ATTRIBUTES *)(v26 + 1168);
v40 = ((_BYTE)v26 - 112) & 7;
if( (((_BYTE)v26 - 112) & 7) != 0 )
{
v39 = (_SID_AND_ATTRIBUTES *)((char *)v39 + (unsigned int)(8 - v40));
v27 -= 8 - v40;
LODWORD(puResult) = v27;
}
v41 = SidCount;
if( *((_DWORD *)ExistingToken + 32) > (unsigned int)SidCount )
v41 = *((_DWORD *)ExistingToken + 32);
v42 = &v39[*((_DWORD *)ExistingToken + 31) + v41];
*((_QWORD *)v26 + 19) = v39;
NextTargetSid = v42;
if( SepTokenSidSharingEnabled )
{
v21 = SepDuplicateTokenUserAndGroups((_TOKEN *)ExistingToken, (_TOKEN *)v26);
if( v21 < 0 )
{
*((_QWORD *)v26 + 19) = 0i64;
LABEL_28:
ExReleaseResourceLite(*((PERESOURCE *)ExistingToken + 6));
LABEL_29:
KeLeaveCriticalRegion();
HalPutDmaAdapter((PADAPTER_OBJECT)v26);
return v21;
}
}
else
{
*((_DWORD *)v26 + 31) = *((_DWORD *)ExistingToken + 31);
v44 = RtlCopySidAndAttributesArray(
*((unsigned int *)ExistingToken + 31),
*((_SID_AND_ATTRIBUTES **)ExistingToken + 19),
v27,
v39,
v42,
&NextTargetSid,
&puResult);
v42 = (_SID_AND_ATTRIBUTES *)NextTargetSid;
v21 = v44;
}
v45 = 0;
v46 = (_SID_AND_ATTRIBUTES *)((char *)v39 + (unsigned int)(16 * *((_DWORD *)ExistingToken + 31)));
*((_QWORD *)v26 + 20) = v46;
if( (_DWORD)SidCount )
{
v47 = RestrictedSids;
do
{
v48 = *((unsigned int *)ExistingToken + 32);
if( !(_DWORD)v48 || SepSidInSidAndAttributes(*((_SID_AND_ATTRIBUTES **)ExistingToken + 20), v48, v43, v47->Sid) )
{
v49 = RtlCopySidAndAttributesArray(
1ui64,
&RestrictedSids[v45],
(unsigned int)puResult,
v46,
v42,
&NextTargetSid,
&puResult);
v50 = v81;
v21 = v49;
++v46;
v42 = (_SID_AND_ATTRIBUTES *)NextTargetSid;
*(_DWORD *)(*((_QWORD *)v26 + 20) + 16i64 * (unsigned int)*v81 + 8) = 7;
++*v50;
}
++v45;
++v47;
}
while( v45 < (unsigned int)SidCount );
}
v51 = *((_QWORD *)ExistingToken + 23);
v52 = 4 * *(unsigned __int8 *)(*((_QWORD *)ExistingToken + 21) + 1i64) + 8;
if( v51 )
v52 += *(unsigned __int16 *)(v51 + 2);
v53 = v52;
v54 = ExAllocatePoolWithTag(1ui64, v52, 1683252563i64);
*v84 = v54;
if( !v54 )
{
v21 = -1073741670;
goto LABEL_28;
}
v55 = v81;
if( *((_DWORD *)ExistingToken + 32) && !*v81 )
{
v21 = -1073741811;
goto LABEL_28;
}
v56 = 0;
v57 = v83;
if( *v81 )
{
*v83 |= 0x810u;
v56 = 1;
}
else
{
*((_QWORD *)v26 + 20) = 0i64;
}
if( v80 )
{
*v57 |= 0x18u;
v56 = 1;
}
if( v56 )
SepSetLogonSessionToken((_TOKEN *)ExistingToken);
memmove(v54, *((const VOID **)ExistingToken + 22), v53);
if( *((_QWORD *)ExistingToken + 23) )
*((_QWORD *)v26 + 23) = (char *)v54
+ (unsigned int)(*((_DWORD *)ExistingToken + 46) - *((_DWORD *)ExistingToken + 44));
else
*((_QWORD *)v26 + 23) = 0i64;
v58 = *((_DWORD *)ExistingToken + 42) - *((_DWORD *)ExistingToken + 44);
v59 = *((unsigned int *)ExistingToken + 200);
if( (_DWORD)v59 )
v21 = SepSetTokenCapabilities(v26, *((VOID **)ExistingToken + 98), *((VOID **)ExistingToken + 99), v59);
if( v21 < 0 )
goto LABEL_28;
v60 = (VOID *)*((_QWORD *)ExistingToken + 98);
if( v60 )
v21 = SepSetTokenPackage((_TOKEN *)v26, v60);
if( v21 < 0 )
goto LABEL_28;
v61 = *((_QWORD *)ExistingToken + 135);
if( v61 )
{
SepReferenceLowBoxNumberEntry(v61);
*v85 = *((_QWORD *)ExistingToken + 135);
}
v62 = *((_QWORD *)ExistingToken + 136);
if( v62 )
{
SepReferenceLowBoxNumberEntry(v62);
*v86 = *((_QWORD *)ExistingToken + 136);
}
v63 = *((_QWORD *)ExistingToken + 144);
if( v63 )
{
SepReferenceLowBoxNumberEntry(v63);
*v87 = *((_QWORD *)ExistingToken + 144);
}
v64 = SepSetTokenTrust((_TOKEN *)v26, *((VOID **)ExistingToken + 138));
v65 = (_ERESOURCE *)*((_QWORD *)ExistingToken + 6);
v66 = v64;
if( v64 < 0 )
{
ExReleaseResourceLite(v65);
v21 = v66;
goto LABEL_29;
}
ExReleaseResourceLite(v65);
KeLeaveCriticalRegion();
*((_QWORD *)v26 + 21) = (char *)v54 + v58;
LODWORD(ParseContext) = PrivilegeCount;
SepRemoveDisabledGroupsAndPrivileges(
(_TOKEN *)v26,
Flagsa,
GroupCounta,
GroupsToDisable,
(UINT64)ParseContext,
PrivilegesToDelete);
RtlSidHashInitialize(
*((_SID_AND_ATTRIBUTES **)v26 + 19),
*((unsigned int *)v26 + 31),
(_SID_AND_ATTRIBUTES_HASH *)(v26 + 232));
RtlSidHashInitialize(*((_SID_AND_ATTRIBUTES **)v26 + 20), *v55, (_SID_AND_ATTRIBUTES_HASH *)(v26 + 504));
SeCaptureSubjectContext((INT64)&SubjectContext);
*(_QWORD *)&v100 = SubjectContext.PrimaryToken;
if( (unsigned __int8)RtlIsSandboxedToken((_KNOWN_CONTROLLER_TYPE)&SubjectContext)
&& (unsigned __int8)RtlIsSandboxedToken((_KNOWN_CONTROLLER_TYPE)v99)
&& ((PrimaryToken = (UINT64 *)SubjectContext.PrimaryToken,
KeEnterCriticalRegion(),
ExAcquireResourceSharedLite(PrimaryToken[6], 1),
v66 = SepNewTokenAsRestrictedAsProcessToken(v26, PrimaryToken, &NewTokenAsRestrictedAsProcessToken),
ExReleaseResourceLite((PERESOURCE)PrimaryToken[6]),
KeLeaveCriticalRegion(),
v66 < 0)
|| !NewTokenAsRestrictedAsProcessToken) )
{
HalPutDmaAdapter((PADAPTER_OBJECT)v26);
SeReleaseSubjectContext(&SubjectContext);
}
else
{
SeReleaseSubjectContext(&SubjectContext);
if( *v88 )
RtlSidHashInitialize(*v88, *v90, SidAttrHash);
if( SeTokenLeakTracking
&& SepTokenLeakMethodWatch == 15
&& *(_QWORD *)&PsGetCurrentProcess()[1].gap0[8] == SepTokenLeakProcessCid )
{
v68 = (__int64)v82;
v26 = (char *)Object;
*(_DWORD *)(*(_QWORD *)v82 + 280i64) = _InterlockedIncrement(&SepTokenLeakMethodCount);
v69 = *(unsigned int *)(*(_QWORD *)v68 + 280i64);
if( (int)v69 >= SepTokenLeakBreakCount )
{
DbgPrint("\nToken number 0x%x = 0x%p\n", v69, v26);
__debugbreak();
}
}
*FilteredToken = (_TOKEN *)v26;
}
return v66;
}Referenced by:
NtFilterToken
SeFilterToken