
Cet outil extrait et affiche les données de la fonctionnalité Recall de Windows 11, offrant un moyen facile d'accéder aux informations sur les instantanés d'activité de votre PC.
Briser Windows Recall. Encore.
image
Lorsque Microsoft a repensé Recall avec des enclaves VBS, le chiffrement AES-256-GCM, l'authentification Windows Hello et un hôte Protected Process Light, le message était clair : les données sont verrouillées dans un coffre-fort.
Le coffre-fort est solide. Le camion de livraison ne l'est pas.
AIXHost.exe, le processus qui rend la timeline Recall, n'a pas de PPL, ni d'AppContainer, ni de vérification de l'intégrité du code. Tout processus s'exécutant sous l'utilisateur connecté peut y injecter du code et appeler les mêmes API COM que l'interface légitime. Une fois que l'utilisateur s'authentifie avec Windows Hello, les captures d'écran déchiffrées, le texte OCR et les métadonnées circulent dans AIXHost.exe sous forme d'objets COM vivants. TotalRecall Reloaded se place dans ce processus et extrait tout.
Aucun administrateur requis. Utilisateur standard. Pas d'exploit noyau. Pas de contournement crypto. Juste des appels COM.
TotalRecall Reloaded se compose de deux fichiers : un injecteur (totalrecall.exe) et une DLL de charge utile (totalrecall_payload.dll).
L'injecteur trouve AIXHost.exe via CreateToolhelp32Snapshot, alloue de la mémoire dans la cible avec VirtualAllocEx, écrit le chemin de la DLL avec WriteProcessMemory, et crée un thread distant pointant vers LoadLibraryW. Injection DLL classique. Rien de sophistiqué, car rien de sophistiqué n'est nécessaire. AIXHost.exe n'a aucune protection contre cela.
Cela fonctionne avec un privilège d'utilisateur standard. Pas d'élévation, pas de SeDebugPrivilege. La DACL Windows par défaut permet aux processus du même utilisateur un accès complet entre eux. Vérifié : le jeton s'exécute au niveau obligatoire Medium avec BUILTIN\Administrators configuré en refus seul.
L'enclave VBS ne déchiffrera rien sans Windows Hello. L'outil ne contourne pas cela. Il oblige l'utilisateur à le faire, suit silencieusement lorsque l'utilisateur le fait, ou attend que l'utilisateur le fasse.
--launch simule Win+J via keybd_event, le raccourci clavier qui ouvre la timeline Recall. L'utilisateur voit une invite Hello (visage, empreinte digitale ou code PIN), s'authentifie, et l'enclave commence à servir les données déchiffrées. Du point de vue de l'utilisateur, Recall s'est ouvert normalement. Du nôtre, la charge utile est déjà à l'intérieur, en attente.
--stealth est le mode entièrement silencieux. Il fonctionne comme suit :
AIXHost.exe (toujours en cours d'exécution) et patche DiscardDataAccess en un no-opAIXHost.exe se termine et redémarre. L'outil détecte le redémarrage et réinjecte dans le nouveau processusaihost.exe (la révocation a été bloquée). L'extraction commence immédiatement--wait est la contrepartie passive de --launch. Au lieu de simuler Win+J, l'outil reste inactif pendant que l'utilisateur ouvre Recall lui-même — depuis la barre des tâches, un raccourci ou tout autre chemin. Lorsque AIXHost.exe apparaît et que l'utilisateur termine Hello naturellement, la charge utile est injectée et l'extraction commence. Utile sur une machine observée, ou lorsque la session Recall doit sembler entièrement initiée par l'utilisateur sans aucune saisie clavier synthétique.
Une fois à l'intérieur de AIXHost.exe, la charge utile initialise un appartement COM avec CoInitializeEx(COINIT_APARTMENTTHREADED) et configure le transfert d'identité proxy avec CoSetProxyBlanket(EOAC_DYNAMIC_CLOAKING). C'est critique. Sans le masquage dynamique, le proxy COM ne transporte pas l'identité authentifiée vers le serveur.
L'extraction suit le même chemin que l'interface Recall légitime :
Initialisation de l'enclave : DataManager.Load() déclenche le chargement de la clé de l'enclave. DataStoreManager.DecryptDatabase() (slot 37) prépare les vues déchiffrées. La charge utile interroge DataManager.DataStatus jusqu'à ce qu'il retourne 3 (déverrouillé).
Énumération des entités : MemoryEntityStatics.GetLightMemoryItemsBefore() (slot 9) retourne un vecteur de références d'entités légères. Chacune porte un ID de contexte à l'offset +8. Sur une machine typique, cela retourne des centaines d'entités couvrant des jours ou des semaines d'activité.
Extraction par entité : Pour chaque ID de contexte, la charge utile charge l'entité complète via ContextEngine2.TryGetEntityForId() (slot 6), la déballage via IEntityWrapper (slot 6), et QueryInterface vers IMemoryEntity. De là :
TryGetBitmapCaptureAsync() (slot 19) retourne un SoftwareBitmap. QueryInterface vers ISoftwareBitmapNative, appelle GetData(IID_IWICBitmap) pour obtenir un bitmap WIC, encoder en PNG via IWICBitmapEncoderContextEngine2.TryGetMemoryEntityDetailsForIdAsync() (slot 8) retourne les détails de l'entité. QI vers IMemoryEntityDetails pour OcrLines (slot 7), IMemoryEntityDetails2 pour les entités textuelles NER (personnes, emails, adresses), et IMemoryEntityDetails4 pour les descriptions d'activité IATours de reprise : Baker.dll (la bibliothèque d'interface Recall) remplit le cache ContextEngine de manière asynchrone. Après le passage initial, la charge utile pompe les messages Windows pendant 3 secondes (boucle PeekMessage/DispatchMessage) et réessaie toute entité qui n'était pas disponible. Chaque tour donne généralement ~12 entités supplémentaires. Jusqu'à 10 tours de reprise.
Chaque appel est encapsulé dans __try/__except car une seule violation d'accès sur un appel de proxy COM tue définitivement le canal RPC vers aihost.exe. Il n'y a pas de récupération. Vous devriez redémarrer AIXHost.exe. Les wrappers SEH attrapent les plantages dus à des types de paramètres incorrects et maintiennent la session en vie.
Plusieurs opérations fonctionnent sans aucune authentification Hello :
Extraction de capture d'écran : RecallPrivacyIndicatorSettings (CLSID {42C63551-...}) expose GetRecentCaptureThumbnail(width, height) au slot 13. Le nom de la méthode dit "thumbnail" mais le serveur n'impose pas de limite de résolution. Passer 3840x3840 retourne la capture Recall la plus récente en pleine résolution. Le résultat IRandomAccessStream est converti en IStream via CreateStreamOverRandomAccessStream (shcore.dll) et sauvegardé en BMP.
Destruction de données : IDataStoreManager::DeleteEvents() (slot 12) efface tout l'historique des captures. Aucun paramètre, aucune authentification. L'analyse Ghidra a confirmé : le gestionnaire de suppression à FUN_1802ddd10 ne contient aucun appel à la fonction de porte d'autorisation. La vérification d'authentification n'a jamais été câblée.