
Esta ferramenta extrai e exibe dados do recurso Recall no Windows 11, fornecendo uma maneira fácil de acessar informações sobre os instantâneos de atividade do seu PC.
Quebrando o Windows Recall. Novamente.
image
Quando a Microsoft redesenhou o Recall com enclaves VBS, criptografia AES-256-GCM, autenticação do Windows Hello e um host Protected Process Light, a mensagem foi clara: os dados estão trancados em um cofre.
O cofre é sólido. O caminhão de entrega não é.
AIXHost.exe, o processo que renderiza a linha do tempo do Recall, não possui PPL, nem AppContainer, nem verificação de integridade de código. Qualquer processo executado como o usuário logado pode injetar código nele e chamar as mesmas APIs COM que a interface legítima usa. Uma vez que o usuário se autentica com o Windows Hello, capturas de tela descriptografadas, texto OCR e metadados fluem através do AIXHost.exe como objetos COM ativos. O TotalRecall Reloaded reside dentro desse processo e extrai tudo.
Nenhum admin necessário. Usuário padrão. Sem exploit de kernel. Sem bypass criptográfico. Apenas chamadas COM.
O TotalRecall Reloaded consiste em dois arquivos: um injetor (totalrecall.exe) e uma DLL de payload (totalrecall_payload.dll).
O injetor encontra o AIXHost.exe via CreateToolhelp32Snapshot, aloca memória no alvo com VirtualAllocEx, escreve o caminho da DLL com WriteProcessMemory e cria uma thread remota apontando para LoadLibraryW. Injeção clássica de DLL. Nada sofisticado, porque nada sofisticado é necessário. O AIXHost.exe não tem proteção alguma contra isso.
Isso funciona com privilégio de usuário padrão. Sem elevação, sem SeDebugPrivilege. A DACL padrão do Windows permite que processos do mesmo usuário tenham acesso total entre si. Verificado: o token é executado no nível obrigatório Medium com BUILTIN\Administrators definido como deny-only.
O enclave VBS não descriptografa nada sem o Windows Hello. A ferramenta não contorna isso. Ela faz o usuário fazer, acompanha silenciosamente quando o usuário faz ou espera que o usuário faça.
--launch simula Win+J via keybd_event, o atalho de teclado que abre a linha do tempo do Recall. O usuário vê um prompt do Hello (rosto, impressão digital ou PIN), autentica-se e o enclave começa a fornecer dados descriptografados. Da perspectiva do usuário, o Recall abriu normalmente. Da nossa, o payload já está dentro, esperando.
--stealth é o modo totalmente silencioso. Funciona assim:
AIXHost.exe (sempre em execução) e aplica um patch em DiscardDataAccess para um no-opAIXHost.exe morre e reinicia. A ferramenta detecta a reinicialização e reinjeta no novo processoaihost.exe (a revogação foi bloqueada). A extração começa imediatamente--wait é a contraparte passiva de --launch. Em vez de simular Win+J, a ferramenta fica ociosa enquanto o usuário abre o Recall por conta própria — da barra de tarefas, um atalho ou qualquer outro caminho. Quando AIXHost.exe aparece e o usuário completa o Hello naturalmente, o payload é injetado e a extração começa. Útil em uma máquina sendo observada, ou quando a sessão do Recall precisa parecer totalmente iniciada pelo usuário, sem entrada de teclado sintética.
Uma vez dentro de AIXHost.exe, o payload inicializa um apartamento COM com CoInitializeEx(COINIT_APARTMENTTHREADED) e configura o encaminhamento de identidade do proxy com CoSetProxyBlanket(EOAC_DYNAMIC_CLOAKING). Isso é crítico. Sem o cloaking dinâmico, o proxy COM não carrega a identidade autenticada para o servidor.
A extração segue o mesmo caminho que a interface legítima do Recall usa:
Inicialização do enclave: DataManager.Load() aciona o carregamento da chave do enclave. DataStoreManager.DecryptDatabase() (slot 37) prepara visualizações descriptografadas. O payload consulta DataManager.DataStatus até retornar 3 (desbloqueado).
Enumeração de entidades: MemoryEntityStatics.GetLightMemoryItemsBefore() (slot 9) retorna um vetor de referências de entidades leves. Cada uma carrega um ID de contexto no offset +8. Em uma máquina típica, isso retorna centenas de entidades abrangendo dias ou semanas de atividade.
Extração por entidade: Para cada ID de contexto, o payload carrega a entidade completa via ContextEngine2.TryGetEntityForId() (slot 6), desempacota-a através de IEntityWrapper (slot 6) e QueryInterface para IMemoryEntity. A partir daí:
TryGetBitmapCaptureAsync() (slot 19) retorna um SoftwareBitmap. QueryInterface para ISoftwareBitmapNative, chame GetData(IID_IWICBitmap) para obter um bitmap WIC, codifique como PNG via IWICBitmapEncoderContextEngine2.TryGetMemoryEntityDetailsForIdAsync() (slot 8) retorna detalhes da entidade. QI para IMemoryEntityDetails para OcrLines (slot 7), IMemoryEntityDetails2 para entidades de texto NER (pessoas, e-mails, endereços) e IMemoryEntityDetails4 para descrições de atividades da IARodadas de repetição: Baker.dll (a biblioteca da interface do Recall) preenche o cache do ContextEngine de forma assíncrona. Após a passagem inicial, o payload bombeia mensagens do Windows por 3 segundos (loop PeekMessage/DispatchMessage) e tenta novamente quaisquer entidades que não estavam disponíveis. Cada rodada normalmente produz ~12 entidades adicionais. Até 10 rodadas de repetição.
Cada chamada é encapsulada em __try/__except porque uma única violação de acesso em uma chamada proxy COM mata permanentemente o canal RPC para aihost.exe. Não há recuperação. Você teria que reiniciar o AIXHost.exe. Os wrappers SEH capturam travamentos de tipos de parâmetros errados e mantêm a sessão ativa.
Várias operações funcionam sem qualquer autenticação do Hello:
Extração de Captura de Tela: RecallPrivacyIndicatorSettings (CLSID {42C63551-...}) expõe GetRecentCaptureThumbnail(width, height) no slot 13. O nome do método diz "thumbnail", mas o servidor não impõe um limite de resolução. Passar 3840x3840 retorna a captura mais recente do Recall em resolução total. O resultado IRandomAccessStream é convertido para um IStream via CreateStreamOverRandomAccessStream (shcore.dll) e salvo como BMP.
Destruição de Dados: IDataStoreManager::DeleteEvents() (slot 12) limpa todo o histórico de capturas. Sem parâmetros, sem autenticação. A análise do Ghidra confirmou: o manipulador de exclusão em FUN_1802ddd10 não contém chamadas para a função de gate de autorização. A verificação de autenticação nunca foi conectada.
Divulgação de Metadados: Caminhos de armazenamento (incluindo o GUID UKP específico do usuário), tamanho do banco de dados, política de retenção, estado da captura e o ID de contexto da captura mais recente são todos legíveis sem autenticação via IDataStoreManagerStatics e RecallPrivacyIndicatorSettings.