SepMandatorySubProcessToken
INT64 __fastcall SepMandatorySubProcessToken(
_TOKEN *ParentToken,
_TOKEN *Token,
_EPROCESS *Process,
VOID **pNewIntegritySid){
int v4;
VOID **v5;
int v6;
int SecurityObject;
VOID *v10;
char *v11;
__int16 v12;
__int64 v13;
ACL *v14;
__int64 v15;
char *PoolWithTag;
unsigned __int8 *v18;
PVOID *TokenIntegrity;
PVOID *v20;
int v21;
int v22;
PVOID v23;
int v24;
unsigned int v25;
unsigned int TokenFlags;
unsigned int v27;
INT64 v28;
VOID **v29;
void *v30;
__int64 v31;
int v32;
__int64 *v33;
INT64 v34;
__int64 v35;
int v36;
unsigned int v37;
__int64 v38;
int v39;
unsigned int v40;
int v41;
_QWORD *v42;
int v43;
unsigned int v44;
unsigned int v45;
unsigned int v46;
UINT8 pbDominate[4];
char NumberOfBytes[12];
VOID *Object;
char SecurityDescriptor[128];
v4 = 0;
*(_QWORD *)&NumberOfBytes[4] = pNewIntegritySid;
*pNewIntegritySid = 0i64;
v5 = pNewIntegritySid;
v6 = *((_DWORD *)Process + 543);
Object = 0i64;
pbDominate[0] = 0;
SecurityObject = 0;
v10 = 0i64;
v11 = 0i64;
if( (v6 & 1) != 0 || (Token->MandatoryPolicy & 2) == 0 )
goto LABEL_13;
SecurityObject = PsReferenceProcessFilePointer((struct _EX_RUNDOWN_REF *)Process, (unsigned __int64 *)&Object);
if( SecurityObject < 0
|| (*(_DWORD *)NumberOfBytes = 128,
v11 = SecurityDescriptor,
SecurityObject = RtlCreateSecurityDescriptor(SecurityDescriptor, 1ui64),
SecurityObject < 0) )
{
v10 = Object;
goto LABEL_15;
}
v10 = Object;
SecurityObject = ObQuerySecurityObject(Object, 0x10ui64, SecurityDescriptor, 0x80ui64, (UINT64 *)NumberOfBytes);
if( SecurityObject != -1073741789 )
{
LABEL_6:
if( SecurityObject >= 0 && v11 )
{
v12 = *((_WORD *)v11 + 1);
if( (v12 & 0x10) != 0 )
{
if( v12 >= 0 )
{
v14 = (ACL *)*((_QWORD *)v11 + 3);
LABEL_12:
LODWORD(v15) = RtlFindAceByType(v14, 0x11ui64, 0i64);
if( v15 )
{
v18 = (unsigned __int8 *)(v15 + 8);
TokenIntegrity = (PVOID *)SepLocateTokenIntegrity((INT64)Token);
v20 = TokenIntegrity;
if( !TokenIntegrity )
goto LABEL_42;
SecurityObject = RtlSidDominates(*TokenIntegrity, v18, pbDominate);
if( SecurityObject < 0 )
goto LABEL_15;
if( pbDominate[0] )
{
v21 = v18[1];
if( (_BYTE)v21 )
v22 = *(_DWORD *)&v18[4 * (v21 - 1) + 8];
else
v22 = 0;
*((_DWORD *)*v20 + 2) = v22;
v23 = *v20;
v4 = 0;
**(_QWORD **)&NumberOfBytes[4] = v23;
v24 = v18[1];
if( (_BYTE)v24 )
v25 = *(_DWORD *)&v18[4 * (v24 - 1) + 8];
else
v25 = 0;
TokenFlags = Token->TokenFlags;
v5 = *(VOID ***)&NumberOfBytes[4];
if( v25 >= 0x2000 )
v27 = TokenFlags | 0x2000;
else
v27 = TokenFlags & 0xFFFFDFFF;
Token->TokenFlags = v27;
}
else
{
LABEL_42:
v5 = *(VOID ***)&NumberOfBytes[4];
v4 = 0;
}
}
goto LABEL_13;
}
v13 = *((unsigned int *)v11 + 3);
if( (_DWORD)v13 )
{
v14 = (ACL *)&v11[v13];
goto LABEL_12;
}
}
v14 = 0i64;
goto LABEL_12;
}
SecurityObject = 0;
LABEL_13:
if( ParentToken )
{
if( (ParentToken->TokenFlags & 0x1000) != 0 && !SeTokenIsAdmin(ParentToken) )
{
Token->TokenFlags &= ~0x1000u;
v28 = SepLocateTokenIntegrity((INT64)Token);
v29 = (VOID **)v28;
if( v28 )
{
v30 = Token->LogonSession->Token;
if( v30 )
{
v34 = SepLocateTokenIntegrity((INT64)v30);
if( v34 )
{
v35 = *v33;
v36 = *(unsigned __int8 *)(*v33 + 1);
v37 = (_BYTE)v36 ? *(_DWORD *)(v35 + 4i64 * (unsigned int)(v36 - 1) + 8) : 0;
v38 = *(_QWORD *)v34;
v39 = *(unsigned __int8 *)(*(_QWORD *)v34 + 1i64);
if( (_BYTE)v39 )
{
v4 = *(unsigned __int8 *)(*(_QWORD *)v34 + 1i64);
v40 = *(_DWORD *)(v38 + 4i64 * (unsigned int)(v39 - 1) + 8);
}
else
{
v40 = 0;
}
if( v37 > v40 )
{
if( (_BYTE)v39 )
v41 = *(_DWORD *)(v38 + 4i64 * (unsigned int)(v4 - 1) + 8);
else
v41 = 0;
v42 = *(_QWORD **)&NumberOfBytes[4];
*(_DWORD *)(v35 + 8) = v41;
*v42 = *v33;
v43 = *(unsigned __int8 *)(*(_QWORD *)v34 + 1i64);
if( (_BYTE)v43 )
v44 = *(_DWORD *)(*(_QWORD *)v34 + 4i64 * (unsigned int)(v43 - 1) + 8);
else
v44 = 0;
v45 = Token->TokenFlags;
if( v44 >= 0x2000 )
v46 = v45 | 0x2000;
else
v46 = v45 & 0xFFFFDFFF;
Token->TokenFlags = v46;
}
}
}
else
{
v31 = *(_QWORD *)v28;
v32 = *(unsigned __int8 *)(*(_QWORD *)v28 + 1i64);
if( (_BYTE)v32 && *(_DWORD *)(v31 + 4i64 * (unsigned int)(v32 - 1) + 8) > 0x2000u )
{
*(_DWORD *)(v31 + 8) = 0x2000;
*v5 = *v29;
}
}
}
}
}
goto LABEL_15;
}
PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, *(unsigned int *)NumberOfBytes, 0x20206553ui64);
v11 = PoolWithTag;
if( !PoolWithTag )
{
SecurityObject = -1073741801;
goto LABEL_15;
}
SecurityObject = RtlCreateSecurityDescriptor(PoolWithTag, 1ui64);
if( SecurityObject >= 0 )
{
SecurityObject = ObQuerySecurityObject(v10, 0x10ui64, v11, *(unsigned int *)NumberOfBytes, (UINT64 *)NumberOfBytes);
goto LABEL_6;
}
LABEL_15:
if( v10 )
ObfDereferenceObjectWithTag(v10, 0x746C6644ui64);
if( v11 && v11 != SecurityDescriptor )
ExFreePoolWithTag(v11, 0);
return(unsigned int)SecurityObject;
}Referenced by:
SeSubProcessToken