NtDuplicateToken

NTSTATUS __fastcall NtDuplicateToken(UINT64 a1, INT64 a2, INT64 a3, INT8 a4, INT64 TokenType, UINT64 NewTokenHandle){
  unsigned int v7; 
  char PreviousMode; 
  _QWORD *v10; 
  _TOKEN_TYPE v11; 
  NTSTATUS result; 
  unsigned int GrantedAccess; 
  _ADAPTER_OBJECT *v14; 
  _SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; 
  int inserted; 
  UINT64 v17; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v19; 
  PVOID *Object; 
  UINT8 NewTokenAsRestrictedAsProcessToken; 
  UINT8 SecurityQosPresent; 
  char SecurityDescriptorPresent[6]; 
  PVOID NewToken; 
  PVOID Token; 
  _OBJECT_HANDLE_INFORMATION HandleInformation; 
  PVOID Handle; 
  _SECURITY_QUALITY_OF_SERVICE CapturedSecurityQos; 
  _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  _KNOWN_CONTROLLER_TYPE v30[4]; 
  __int128 v31; 

  v7 = a2;
  *(_QWORD *)&CapturedSecurityQos.Length = 0i64;
  *(_DWORD *)&CapturedSecurityQos.ContextTrackingMode = 0;
  SecurityQosPresent = 0;
  SecurityDescriptorPresent[0] = 0;
  Handle = 0i64;
  HandleInformation = 0i64;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  NewTokenAsRestrictedAsProcessToken = 0;
  *(_OWORD *)v30 = 0i64;
  v31 = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    v11 = (int)TokenType;
    if( (unsigned int)(TokenType - 1) > 1 )
      return -1073741811;
    v10 = (_QWORD *)NewTokenHandle;
    v17 = NewTokenHandle;
    if( NewTokenHandle >= 0x7FFFFFFF0000i64 )
      v17 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v17 = *(_QWORD *)v17;
  }
  else
  {
    v10 = (_QWORD *)NewTokenHandle;
    v11 = (int)TokenType;
  }
  result = SeCaptureSecurityQos((_OBJECT_ATTRIBUTES *)a3, PreviousMode, &SecurityQosPresent, &CapturedSecurityQos);
  if( result >= 0 )
  {
    result = SeCaptureObjectAttributeSecurityDescriptorPresent(
               (_OBJECT_ATTRIBUTES *)a3,
               PreviousMode,
               (UINT8 *)SecurityDescriptorPresent);
    if( result >= 0 )
    {
      NewToken = 0i64;
      result = ObReferenceObjectByHandle(
                 (VOID *)a1,
                 2ui64,
                 (_OBJECT_TYPE *)SeTokenObjectType,
                 PreviousMode,
                 &NewToken,
                 &HandleInformation);
      if( result >= 0 )
      {
        if( v7 )
        {
          SeCaptureSubjectContextEx(
            (PETHREAD)KeGetCurrentThread(),
            KeGetCurrentThread()->ApcState.Process,
            &SubjectContext);
          *(_QWORD *)&v31 = SubjectContext.PrimaryToken;
          if( (unsigned __int8)RtlIsSandboxedToken((_KNOWN_CONTROLLER_TYPE)&SubjectContext)
            && (unsigned __int8)RtlIsSandboxedToken((_KNOWN_CONTROLLER_TYPE)v30) )
          {
            CurrentThread = (_ETHREAD *)KeGetCurrentThread();
            --CurrentThread->Tcb.KernelApcDisable;
            ExAcquireResourceSharedLite(*((_QWORD *)SubjectContext.PrimaryToken + 6), 1);
            v19 = SepNewTokenAsRestrictedAsProcessToken(
                    NewToken,
                    SubjectContext.PrimaryToken,
                    &NewTokenAsRestrictedAsProcessToken);
            if( NewToken == SubjectContext.PrimaryToken || v19 >= 0 && NewTokenAsRestrictedAsProcessToken )
              GrantedAccess = v7;
            else
              GrantedAccess = v7 & (HandleInformation.GrantedAccess | 0x2001F);
            ExReleaseResourceLite(*((PERESOURCE *)SubjectContext.PrimaryToken + 6));
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
          }
          else
          {
            GrantedAccess = v7;
          }
          SeReleaseSubjectContext(&SubjectContext);
        }
        else
        {
          GrantedAccess = HandleInformation.GrantedAccess;
        }
        v14 = (_ADAPTER_OBJECT *)NewToken;
        if( SecurityQosPresent )
          ImpersonationLevel = CapturedSecurityQos.ImpersonationLevel;
        else
          ImpersonationLevel = *((_DWORD *)NewToken + 49);
        if( *((_DWORD *)NewToken + 48) == 2
          && (v11 == TokenImpersonation && ImpersonationLevel > *((_DWORD *)NewToken + 49)
           || v11 == TokenPrimary && *((int *)NewToken + 49) < 2) )
        {
          HalPutDmaAdapter((PADAPTER_OBJECT)NewToken);
          return -1073741659;
        }
        else
        {
          Token = 0i64;
          inserted = SepDuplicateToken(
                       (_TOKEN *)NewToken,
                       (_OBJECT_ATTRIBUTES *)a3,
                       a4,
                       v11,
                       ImpersonationLevel,
                       PreviousMode,
                       0,
                       (_TOKEN **)&Token);
          if( inserted >= 0 )
          {
            LODWORD(Object) = 0;
            inserted = ObInsertObjectEx(Token, 0i64, GrantedAccess, 1ui64, (UINT64)Object, 0i64, &Handle);
            if( inserted >= 0 )
            {
              if( !SecurityDescriptorPresent[0] )
                SepAppendAceToTokenObjectAcl(Token, 8ui64, SeAliasAdminsSid);
              HalPutDmaAdapter((PADAPTER_OBJECT)Token);
            }
          }
          HalPutDmaAdapter(v14);
          if( inserted >= 0 )
            *v10 = Handle;
          return inserted;
        }
      }
    }
  }
  return result;
}

Referenced by:

No references.