NtImpersonateAnonymousToken

INT64 __fastcall NtImpersonateAnonymousToken(VOID *ThreadHandle){
  KPROCESSOR_MODE v1; 
  INT64 result; 
  UINT64 *v3; 
  _DWORD *PrimaryToken; 
  _DWORD *ClientToken; 
  int AnonymousToken; 
  _TOKEN *v7; 
  _EJOB *CurrentServerSilo; 
  __int64 v9; 
  struct _DMA_ADAPTER *v10; 
  struct _DMA_ADAPTER *v11; 
  PADAPTER_OBJECT DmaAdapter; 
  PACCESS_TOKEN v13; 
  struct _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  PVOID Object; 
  PVOID Token; 
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  DmaAdapter = 0i64;
  Token = 0i64;
  v1 = *((_BYTE *)KeGetCurrentThread() + 562);
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  v13 = 0i64;
  Object = 0i64;
  LODWORD(result) = ObReferenceObjectByHandle(ThreadHandle, 0x100u, (POBJECT_TYPE)PsThreadType, v1, &Object, 0i64);
  if( (int)result < 0 )
    return result;
  SeCaptureSubjectContext(&SubjectContext);
  PrimaryToken = SubjectContext.PrimaryToken;
  ClientToken = SubjectContext.PrimaryToken;
  if( SubjectContext.ClientToken )
    ClientToken = SubjectContext.ClientToken;
  SepRegQueryDwordValue(v3);
  if( ClientToken[48] == 1 || (PrimaryToken[50] & 0x4000) == 0 || (int)ClientToken[49] >= 2 )
  {
    if( (ClientToken[50] & 0x4000) != 0 )
    {
      AnonymousToken = SepGetAnonymousToken((INT64)ClientToken, (PADAPTER_OBJECT *)&v13);
      if( AnonymousToken >= 0 )
      {
        AnonymousToken = PsImpersonateClient((_ETHREAD *)Object, v13, 1u, 0, SecurityImpersonation);
        HalPutDmaAdapter((PADAPTER_OBJECT)v13);
      }
      goto LABEL_24;
    }
    SepRegQueryDwordValue((UINT64 *)0x4000);
    v7 = (_TOKEN *)SeAnonymousLogonTokenNoEveryone;
    if( PsIsCurrentThreadInServerSilo() )
    {
      CurrentServerSilo = PsGetCurrentServerSilo();
      AnonymousToken = SepCopyAnonymousTokenAndSetSilo(CurrentServerSilo, (PADAPTER_OBJECT *)&Token);
      if( AnonymousToken < 0 )
        goto LABEL_24;
      v7 = (_TOKEN *)Token;
    }
    else if( (ClientToken[50] & 0x380000) != 0 )
    {
      ObjectAttributes.Length = 48;
      memset(&ObjectAttributes.RootDirectory, 0, 20);
      *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
      AnonymousToken = SepDuplicateToken(
                         v7,
                         &ObjectAttributes,
                         1u,
                         TokenImpersonation,
                         SecurityImpersonation,
                         0,
                         1u,
                         (_TOKEN **)&DmaAdapter);
      if( AnonymousToken < 0 )
        goto LABEL_24;
      LODWORD(DmaAdapter[12].DmaOperations) |= ClientToken[50] & 0x380000;
      v7 = (_TOKEN *)DmaAdapter;
    }
    AnonymousToken = ObReferenceObjectByPointer(
                       v7,
                       4u,
                       (POBJECT_TYPE)SeTokenObjectType,
                       *((_BYTE *)KeGetCurrentThread() + 562));
    if( AnonymousToken >= 0 )
    {
      HalPutDmaAdapter((PADAPTER_OBJECT)v7);
      v9 = *((_QWORD *)KeGetCurrentThread() + 23);
      v10 = (struct _DMA_ADAPTER *)PsReferencePrimaryToken((PEPROCESS)v9);
      v11 = v10;
      if( v10 )
      {
        if( !SeTokenIsRestricted(v10) || SeTokenIsWriteRestricted(v11) )
        {
          ObFastDereferenceObject((INT64 *)(v9 + 1208), v11);
          AnonymousToken = PsImpersonateClient((_ETHREAD *)Object, v7, Token == 0i64, 0, SecurityImpersonation);
        }
        else
        {
          HalPutDmaAdapter(v11);
          AnonymousToken = -1073741790;
        }
      }
      else
      {
        AnonymousToken = -1073741823;
      }
    }
    goto LABEL_24;
  }
  AnonymousToken = -1073741659;
LABEL_24:
  SeReleaseSubjectContext(&SubjectContext);
  if( Object )
    HalPutDmaAdapter((PADAPTER_OBJECT)Object);
  if( Token )
    HalPutDmaAdapter((PADAPTER_OBJECT)Token);
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  return(unsigned int)AnonymousToken;
}

Referenced by:

No references.