SeAuditProcessCreation

VOID __fastcall SeAuditProcessCreation(_EPROCESS *Process, _UNICODE_STRING *CommandLine){
  unsigned __int16 *p_Length; 
  unsigned int v4; 
  void *v5; 
  int AllocatedFullProcessImageName; 
  _EPROCESS *v7; 
  _QWORD *v8; 
  _QWORD *v9; 
  int v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  ULONG_PTR v13; 
  WCHAR v14; 
  unsigned __int8 *v15; 
  bool v16; 
  int v17; 
  ULONG v18; 
  ULONG v19; 
  WCHAR v20; 
  char v21; 
  unsigned int NumberOfBytes[3]; 
  PVOID P; 
  _EPROCESS *Processa; 
  unsigned __int8 *v25; 
  struct _UNICODE_STRING DestinationString; 
  _UNICODE_STRING *v27; 
  ULONG_PTR v28; 
  ULONG_PTR v29; 
  ULONG_PTR v30; 
  struct _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  _SE_ADT_PARAMETER_ARRAY Src; 
  char DestinationSid[80]; 
  v27 = CommandLine;
  memset(NumberOfBytes, 0, sizeof(NumberOfBytes));
  p_Length = 0i64;
  Processa = 0i64;
  v4 = 0;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  P = 0i64;
  v21 = 0;
  DestinationString = 0i64;
  v25 = (unsigned __int8 *)DestinationSid;
  if( !*((_QWORD *)Process + 184) )
    return;
  v5 = (void *)*((_QWORD *)Process + 168);
  v29 = *((_QWORD *)Process + 136);
  v30 = (ULONG_PTR)v5;
  AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageNameEx((__int64)Process, &NumberOfBytes[1]);
  if( AllocatedFullProcessImageName >= 0 )
  {
    if( PsLookupProcessByProcessId(v5, (PEPROCESS *)&Processa) < 0 )
    {
      v4 = 1845;
    }
    else
    {
      v7 = Processa;
      if( *((_QWORD *)Processa + 184) )
        PsGetAllocatedFullProcessImageNameEx((__int64)Processa, &P);
      else
        v4 = 1844;
      ObfDereferenceObjectWithTag(v7, 0x746C6644ui64);
    }
    v8 = PsReferencePrimaryToken((PEPROCESS)Process);
    v9 = v8;
    if( v8 )
    {
      v10 = *(_DWORD *)(v8[27] + 32i64);
      if( (v10 & 4) != 0 )
        v11 = 1938i64;
      else
        v11 = (v10 & 2 | 0xF20ui64) >> 1;
      v12 = *((unsigned int *)v8 + 52);
      v13 = v9[3];
      v28 = v13;
      if( (unsigned int)v12 >= *((_DWORD *)v9 + 31) )
        v25 = (unsigned __int8 *)SeNullSid;
      else
        AllocatedFullProcessImageName = RtlCopySid(0x44u, DestinationSid, *(PSID *)(v9[19] + 16 * v12));
      HalPutDmaAdapter((PADAPTER_OBJECT)v9);
      if( AllocatedFullProcessImageName >= 0 )
      {
        if( SepRmAuditProcessCommandLine )
        {
          if( v27 )
          {
            p_Length = &v27->Length;
            goto LABEL_16;
          }
          if( (unsigned int)PsQueryProcessCommandLine((struct _EX_RUNDOWN_REF *)Process, 0i64, 0, 0, NumberOfBytes) == -1073741820 )
          {
            p_Length = (unsigned __int16 *)ExAllocatePoolWithTag(PagedPool, NumberOfBytes[0], 0x4C436553ui64);
            if( p_Length )
            {
              if( (int)PsQueryProcessCommandLine(
                          (struct _EX_RUNDOWN_REF *)Process,
                          (__int64)p_Length,
                          NumberOfBytes[0],
                          0,
                          NumberOfBytes) >= 0 )
              {
                v21 = 1;
                goto LABEL_16;
              }
              ExFreePoolWithTag(p_Length, 0);
            }
          }
          RtlInitUnicodeString(&DestinationString, &word_1407CF120, v20);
        }
        else
        {
          RtlInitUnicodeString(&DestinationString, &word_1407CF120, v14);
        }
        p_Length = (unsigned __int16 *)&DestinationString;
LABEL_16:
        SeCaptureSubjectContext(&SubjectContext);
        memset((INT64)&Src, 0i64);
        Src.CategoryId = 5;
        *(_DWORD *)&Src.FlatSubCategoryId = 524421;
        Src.AuditId = 4688;
        v15 = (unsigned __int8 *)**((_QWORD **)SubjectContext.PrimaryToken + 19);
        v16 = *((_QWORD *)SubjectContext.PrimaryToken + 3) != __PAIR64__(HIDWORD(v28), v13);
        v17 = v15[1];
        Src.Parameters[2].Data[0] = *((_QWORD *)SubjectContext.PrimaryToken + 3);
        Src.Parameters[3].Data[0] = v29;
        Src.Parameters[0].Address = v15;
        Src.Parameters[0].Length = 4 * v17 + 8;
        Src.Parameters[0].Type = SeAdtParmTypeSid;
        Src.Parameters[1].Address = &SeSubsystemName;
        Src.Parameters[4].Address = *(PVOID *)&NumberOfBytes[1];
        Src.Parameters[1].Type = SeAdtParmTypeString;
        Src.Parameters[1].Length = 32;
        v18 = (unsigned __int16)**(_WORD **)&NumberOfBytes[1] + 16;
        Src.Parameters[2].Type = SeAdtParmTypeLogonId;
        Src.Parameters[4].Length = v18;
        Src.Parameters[6].Data[0] = v30;
        v19 = *p_Length + 16;
        Src.Parameters[2].Length = 8;
        Src.Parameters[3].Type = SeAdtParmTypePtr;
        Src.Parameters[3].Length = 8;
        Src.Parameters[4].Type = SeAdtParmTypeFileSpec;
        Src.Parameters[5].Type = SeAdtParmTypeMessage;
        Src.Parameters[5].Length = 4;
        Src.Parameters[5].Data[0] = v11;
        Src.Parameters[6].Type = SeAdtParmTypePtr;
        Src.Parameters[6].Length = 8;
        Src.Parameters[7].Type = SeAdtParmTypeMultiSzString;
        Src.Parameters[7].Length = v19;
        Src.Parameters[7].Address = p_Length;
        if( v16 )
        {
          Src.Parameters[8].Type = SeAdtParmTypeLogonIdEx;
          Src.Parameters[8].Length = 8;
          Src.Parameters[8].Data[0] = v13;
        }
        else
        {
          Src.Parameters[8].Type = SeAdtParmTypeNoLogonId;
        }
        if( v4 )
        {
          Src.Parameters[9].Data[0] = v4;
          Src.Parameters[9].Type = SeAdtParmTypeMessage;
          Src.Parameters[9].Length = 4;
        }
        else
        {
          Src.Parameters[9].Type = SeAdtParmTypeFileSpec;
          Src.Parameters[9].Address = P;
          Src.Parameters[9].Length = *(unsigned __int16 *)P + 16;
        }
        Src.Parameters[10].Address = v25;
        Src.Parameters[10].Type = SeAdtParmTypeSid;
        Src.ParameterCount = 11;
        Src.Parameters[10].Length = 4 * v25[1] + 8;
        SepAdtLogAuditRecord(&Src);
        SeReleaseSubjectContext(&SubjectContext);
        goto LABEL_21;
      }
    }
    else
    {
      AllocatedFullProcessImageName = -1073741700;
    }
  }
  SepAuditFailed((unsigned int)AllocatedFullProcessImageName);
LABEL_21:
  if( *(_QWORD *)&NumberOfBytes[1] )
    ExFreePoolWithTag(*(PVOID *)&NumberOfBytes[1], 0);
  if( P )
    ExFreePoolWithTag(P, 0);
  if( v21 )
  {
    if( p_Length )
      ExFreePoolWithTag(p_Length, 0);
  }
}

Referenced by:

No references.