SepAdtOpenObjectAuditAlarm
bool __fastcall SepAdtOpenObjectAuditAlarm(
__int16 a1,
__int64 a2,
PVOID *a3,
unsigned __int16 *a4,
__int64 a5,
PVOID P,
__int64 a7,
__int64 a8,
int a9,
int a10,
__int64 a11,
UINT8 AccessGranted,
__int64 a13,
int a14,
__int64 a15,
int a16,
__int64 a17,
__int64 a18,
__int64 a19){
_SECURITY_DESCRIPTOR *v19;
unsigned __int64 v21;
_SECURITY_DESCRIPTOR *v22;
__int128 *v24;
_EPROCESS *CurrentThreadProcess;
NTSTATUS AllocatedFullProcessImageName;
unsigned __int8 **v27;
unsigned __int64 v28;
UINT8 v29;
unsigned int v30;
_UNICODE_STRING *v31;
unsigned __int64 v32;
int v33;
unsigned int v34;
unsigned int v35;
int v36;
UINT8 IsKernelHandle;
unsigned __int64 v38;
__int64 v39;
unsigned __int64 v40;
unsigned __int64 v41;
__int64 v42;
__int64 v43;
_SECURITY_DESCRIPTOR *v44;
int v45;
__int64 v46;
size_t v47;
VOID **PoolWithTag;
VOID **v49;
int v50;
__int64 v51;
unsigned __int64 v52;
int v53;
unsigned int v54;
unsigned int v55;
__int64 v56;
unsigned __int16 v57;
_WORD *v58;
VOID **v59;
_OWORD *v60;
__int64 v61;
unsigned int v62;
_DWORD *v63;
VOID **v64;
__int64 v65;
int v66;
__int64 v67;
_UNICODE_STRING *v68;
int v69;
unsigned int ParameterCount;
int v71;
NTSTATUS v72;
_SECURITY_DESCRIPTOR *v73;
unsigned int v74;
UINT8 NeedToFree[8];
_SECURITY_DESCRIPTOR *SecurityDescriptorOut;
UINT64 SDLength;
PVOID Src;
_UNICODE_STRING *v79;
__int64 v80;
_SECURITY_DESCRIPTOR *v81;
PVOID v82;
_UNICODE_STRING *ImageName;
__int64 v84;
unsigned __int8 *v85;
PVOID *v86;
__int128 *v87;
_SECURITY_DESCRIPTOR *v88;
_SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
_SE_ADT_PARAMETER_ARRAY AuditParameters;
__int128 v91;
v19 = (_SECURITY_DESCRIPTOR *)P;
*(_WORD *)&NeedToFree[4] = a1;
v21 = 0i64;
v84 = a19;
v22 = 0i64;
v86 = a3;
v79 = (_UNICODE_STRING *)a2;
v80 = a8;
SubjectSecurityContext.PrimaryToken = (void *)a8;
v88 = (_SECURITY_DESCRIPTOR *)P;
v81 = (_SECURITY_DESCRIPTOR *)P;
v82 = 0i64;
ImageName = 0i64;
*(_QWORD *)&SubjectSecurityContext.ImpersonationLevel = 0i64;
SubjectSecurityContext.ProcessAuditId = 0i64;
v91 = 0i64;
SDLength = 0i64;
SecurityDescriptorOut = 0i64;
Src = 0i64;
NeedToFree[1] = 0;
NeedToFree[2] = 0;
NeedToFree[0] = 0;
SubjectSecurityContext.ClientToken = (void *)a7;
if( !SepAdtAuditThisEventWithContext(0x7Bui64, AccessGranted, AccessGranted == 0, &SubjectSecurityContext) )
return 1;
v24 = &v91;
if( a18 )
v24 = (__int128 *)a18;
v87 = v24;
CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageNameEx(CurrentThreadProcess, &ImageName);
if( AllocatedFullProcessImageName >= 0 )
{
if( a7 )
{
v21 = *(_QWORD *)(a7 + 24);
v27 = *(unsigned __int8 ***)(a7 + 152);
}
else
{
v27 = *(unsigned __int8 ***)(v80 + 152);
}
v28 = *(_QWORD *)(v80 + 24);
v85 = *v27;
memset(&AuditParameters, 0i64, sizeof(AuditParameters));
v29 = AccessGranted;
v30 = 8;
AuditParameters.AuditId = 4656;
AuditParameters.FlatSubCategoryId = *(_WORD *)&NeedToFree[4];
AuditParameters.Type = 8;
if( a14 == 2 )
v30 = 3;
AuditParameters.CategoryId = v30;
if( !AccessGranted )
AuditParameters.Type = 16;
v31 = (_UNICODE_STRING *)&SeSubsystemName;
v32 = 4i64;
AuditParameters.Parameters[0].Address = v85;
if( v79 )
v31 = v79;
AuditParameters.Parameters[0].Type = SeAdtParmTypeSid;
AuditParameters.Parameters[1].Type = SeAdtParmTypeString;
v33 = v85[1];
AuditParameters.Parameters[1].Address = v31;
AuditParameters.Parameters[2].Type = SeAdtParmTypeLogonId;
AuditParameters.Parameters[2].Length = 8;
AuditParameters.Parameters[2].Data[0] = v21;
AuditParameters.Parameters[0].Length = 4 * v33 + 8;
v34 = v31->Length + 16;
AuditParameters.Parameters[1].Length = v34;
if( !a7 )
AuditParameters.Parameters[2].Data[0] = v28;
AuditParameters.Parameters[3].Type = SeAdtParmTypeString;
AuditParameters.Parameters[3].Length = v34;
AuditParameters.Parameters[3].Address = v31;
if( !a4 )
{
AllocatedFullProcessImageName = -1073741811;
LABEL_19:
v22 = SecurityDescriptorOut;
goto LABEL_20;
}
v35 = *a4 + 16;
AuditParameters.Parameters[4].Address = a4;
AuditParameters.Parameters[4].Length = v35;
AuditParameters.Parameters[4].Type = SeAdtParmTypeString;
if( a5 )
{
if( *(_WORD *)&NeedToFree[4] == 116
|| (AuditParameters.Parameters[5].Type = SeAdtParmTypeString, *(_WORD *)&NeedToFree[4] == 128) )
{
AuditParameters.Parameters[5].Type = SeAdtParmTypeFileSpec;
}
v36 = *(unsigned __int16 *)a5;
AuditParameters.Parameters[5].Address = (void *)a5;
AuditParameters.Parameters[5].Length = v36 + 16;
}
AuditParameters.Parameters[6].Type = SeAdtParmTypePtr;
AuditParameters.Parameters[6].Length = 8;
if( v86 )
{
IsKernelHandle = ObpIsKernelHandle(*v86, 0);
v40 = v39 ^ 0xFFFFFFFF80000000ui64;
if( !IsKernelHandle )
v40 = v38;
AuditParameters.Parameters[6].Data[0] = v40 & 0xFFFFFFFFFFFFFFFCui64;
}
else
{
AuditParameters.Parameters[6].Data[0] = 0i64;
}
AuditParameters.Parameters[7].Address = v87;
v41 = (unsigned int)a10;
AuditParameters.Parameters[7].Type = SeAdtParmTypeGuid;
AuditParameters.Parameters[7].Length = 16;
AuditParameters.Parameters[8].Type = SeAdtParmTypeAccessMask;
AuditParameters.Parameters[8].Length = v32;
AuditParameters.Parameters[8].Data[1] = v32;
if( !v29 )
v41 = (unsigned int)a9;
v42 = v84;
AuditParameters.Parameters[8].Data[0] = v41;
if( v84 && (v43 = *(_QWORD *)(v84 + 72)) != 0 )
{
AllocatedFullProcessImageName = SepCheckAndCopySelfRelativeSD(
*(_SECURITY_DESCRIPTOR **)(v43 + 56),
&SecurityDescriptorOut,
(UINT64 *)((char *)&SDLength + 4),
&NeedToFree[1]);
if( AllocatedFullProcessImageName < 0 )
goto LABEL_102;
AllocatedFullProcessImageName = SepCheckAndCopySelfRelativeSD(
*(_SECURITY_DESCRIPTOR **)(*(_QWORD *)(v42 + 72) + 64i64),
(_SECURITY_DESCRIPTOR **)&Src,
&SDLength,
&NeedToFree[2]);
if( AllocatedFullProcessImageName < 0 )
goto LABEL_102;
v44 = SecurityDescriptorOut;
if( SecurityDescriptorOut || Src )
{
v45 = 8;
goto LABEL_55;
}
}
else
{
v44 = SecurityDescriptorOut;
}
v45 = 0;
LABEL_55:
v46 = HIDWORD(SDLength);
LODWORD(v79) = HIDWORD(SDLength) + SDLength - v45 + 152;
v47 = (unsigned int)v79;
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)v79, 1883333971i64);
v49 = PoolWithTag;
if( !PoolWithTag )
{
AllocatedFullProcessImageName = -1073741670;
goto LABEL_19;
}
memset(PoolWithTag, 0i64, v47);
v50 = a10;
*((_DWORD *)v49 + 34) = AccessGranted;
if( !AccessGranted )
v50 = a9;
*((_DWORD *)v49 + 33) = 4;
*(_DWORD *)v49 = v50 & 0xFDFFFFFF;
if( v84 )
{
v51 = *(_QWORD *)(v84 + 72);
if( v51 )
{
*(_OWORD *)((char *)v49 + 4) = *(_OWORD *)(v51 + 88);
*(_OWORD *)((char *)v49 + 20) = *(_OWORD *)(v51 + 104);
*(_OWORD *)((char *)v49 + 36) = *(_OWORD *)(v51 + 120);
*(_OWORD *)((char *)v49 + 52) = *(_OWORD *)(v51 + 136);
*(_OWORD *)((char *)v49 + 68) = *(_OWORD *)(v51 + 152);
*(_OWORD *)((char *)v49 + 84) = *(_OWORD *)(v51 + 168);
*(_OWORD *)((char *)v49 + 100) = *(_OWORD *)(v51 + 184);
*(_OWORD *)((char *)v49 + 116) = *(_OWORD *)(v51 + 200);
}
}
if( v44 )
memmove(v49 + 18, v44, v46);
if( Src )
memmove((char *)v49 + v46 + 144, Src, SDLength);
AuditParameters.Parameters[9].Length = (unsigned int)v79;
v52 = (unsigned int)a10;
AuditParameters.Parameters[9].Type = SeAdtParmTypeAccessReason;
AuditParameters.Parameters[9].Address = v49;
AuditParameters.Parameters[10].Type = SeAdtParmTypeHexUlong;
AuditParameters.Parameters[10].Length = 4;
if( !AccessGranted )
v52 = (unsigned int)a9;
AuditParameters.Parameters[10].Data[0] = v52;
if( a11 )
{
v53 = *(_DWORD *)a11;
if( *(_DWORD *)a11 )
{
AuditParameters.Parameters[11].Type = SeAdtParmTypePrivs;
AuditParameters.Parameters[11].Address = (void *)a11;
AuditParameters.Parameters[11].Length = 12 * v53 + 8;
}
}
v54 = 12;
AuditParameters.ParameterCount = 12;
if( a16 )
{
v55 = 0;
v56 = 0i64;
v57 = 2 - (AccessGranted != 0);
v58 = (_WORD *)(a15 + 2);
do
{
if( !v55 || (v57 & *v58) != 0 )
v56 = (unsigned int)(v56 + 1);
++v55;
v58 += 24;
}
while( v55 < a16 );
if( (_DWORD)v56 )
{
v59 = ExAllocatePoolWithTag(1ui64, 24 * v56, 1883333971i64);
v82 = v59;
if( !v59 )
{
AllocatedFullProcessImageName = -1073741670;
LABEL_101:
ExFreePoolWithTag(v49, 0);
LABEL_102:
v22 = SecurityDescriptorOut;
goto LABEL_20;
}
v60 = (_OWORD *)(a15 + 4);
v61 = 0i64;
v62 = 0;
v63 = (_DWORD *)a17;
v64 = v59;
do
{
if( !v62 || (v57 & *((_WORD *)v60 - 1)) != 0 )
{
v65 = 3 * v61;
*(_OWORD *)&v59[v65] = *v60;
WORD1(v59[v65 + 2]) = *((_WORD *)v60 - 2);
if( v62 )
{
LOWORD(v59[3 * v61 + 2]) = 0;
if( a17 && AccessGranted )
HIDWORD(v59[3 * v61 + 2]) = *v63;
}
else
{
LOWORD(v59[3 * v61 + 2]) = 1;
HIDWORD(v59[3 * v61 + 2]) = 0;
}
v61 = (unsigned int)(v61 + 1);
}
++v62;
v60 += 3;
++v63;
}
while( v62 < a16 );
v66 = 3 * v61;
AuditParameters.Parameters[12].Address = v64;
v19 = v88;
v54 = 13;
AuditParameters.Parameters[12].Length = 8 * v66;
AuditParameters.Parameters[12].Type = SeAdtParmTypeObjectTypes;
AuditParameters.Parameters[12].Data[1] = 4i64;
AuditParameters.ParameterCount = 13;
AuditParameters.AuditId = 4661;
}
}
v67 = v54;
v68 = ImageName;
AuditParameters.Parameters[v67].Type = SeAdtParmTypeUlongNoConv;
AuditParameters.Parameters[AuditParameters.ParameterCount].Length = 4;
AuditParameters.Parameters[AuditParameters.ParameterCount++].Data[0] = *(unsigned int *)(v80 + 128);
AuditParameters.Parameters[AuditParameters.ParameterCount].Type = SeAdtParmTypePtr;
AuditParameters.Parameters[AuditParameters.ParameterCount].Length = 8;
AuditParameters.Parameters[AuditParameters.ParameterCount++].Data[0] = a13;
AuditParameters.Parameters[AuditParameters.ParameterCount].Type = SeAdtParmTypeFileSpec;
AuditParameters.Parameters[AuditParameters.ParameterCount].Length = v68->Length + 16;
v69 = *(unsigned __int16 *)&NeedToFree[4];
AuditParameters.Parameters[AuditParameters.ParameterCount].Address = v68;
ParameterCount = ++AuditParameters.ParameterCount;
v71 = v69 - 116;
if( (!v71 || v71 == 12) && v19 && AuditParameters.AuditId == 4656 && SepSDContainsAttributeACE(v19) )
{
v72 = SepCheckAndCopySelfRelativeSD(v19, &v81, (UINT64 *)((char *)&SDLength + 4), NeedToFree);
v19 = v81;
AllocatedFullProcessImageName = v72;
if( v72 < 0 )
goto LABEL_99;
v73 = v81;
AuditParameters.Parameters[ParameterCount].Type = SeAdtParmTypeResourceAttribute;
v74 = SepSecurityDescriptorStrictLength(v73);
AuditParameters.Parameters[AuditParameters.ParameterCount].Length = v74;
AuditParameters.Parameters[AuditParameters.ParameterCount].Address = v19;
AuditParameters.Parameters[AuditParameters.ParameterCount].Data[0] = 32i64;
AuditParameters.Parameters[AuditParameters.ParameterCount].Data[1] = 0i64;
ParameterCount = AuditParameters.ParameterCount;
}
AuditParameters.ParameterCount = ParameterCount + 1;
SepAdtLogAuditRecord(&AuditParameters);
LABEL_99:
if( v82 )
ExFreePoolWithTag(v82, 0);
goto LABEL_101;
}
LABEL_20:
if( ImageName )
ExFreePoolWithTag(ImageName, 0);
if( NeedToFree[0] && v19 )
ExFreePoolWithTag(v19, 0);
if( NeedToFree[1] && v22 )
ExFreePoolWithTag(v22, 0);
if( NeedToFree[2] && Src )
ExFreePoolWithTag(Src, 0);
if( AllocatedFullProcessImageName < 0 )
SepAuditFailed((unsigned int)AllocatedFullProcessImageName);
return AllocatedFullProcessImageName >= 0;
}Referenced by:
NtOpenObjectAuditAlarm
ObpCreateHandle
SeAuditHandleCreation
SeOpenObjectAuditAlarmForNonObObject
SeOpenObjectAuditAlarmWithTransaction
SeOpenObjectForDeleteAuditAlarmWithTransaction
SepAccessCheckAndAuditAlarmWithAdminlessChecks