
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à :
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.
Divulgation de métadonnées : Les chemins de stockage (y compris le GUID UKP spécifique à l'utilisateur), la taille de la base de données, la politique de conservation, l'état de capture, et l'ID de contexte de la capture la plus récente sont tous lisibles sans authentification via IDataStoreManagerStatics et RecallPrivacyIndicatorSettings.
image``` totalrecall.exe --launch Open Recall, trigger Hello, extract everything totalrecall.exe --stealth Silent extraction (patches auth revocation, waits) totalrecall.exe --wait Wait for user to manually open Recall totalrecall.exe --preauth Grab latest screenshot + settings (no Hello) totalrecall.exe --search "password" Search OCR text in latest extraction totalrecall.exe --destroy Wipe all Recall data (confirmation required, no Hello)
| Mode | Authentification requise | Ce qu'il fait |
|------|:---:|-------------|
| `--launch` | Hello | Simule Win+J, l'utilisateur s'authentifie, extraction complète |
| `--stealth` | Passif | Corrige la révocation d'authentification, attend que l'utilisateur s'authentifie à Recall, extrait silencieusement |
| `--wait` | Hello | Attend que l'utilisateur ouvre Recall naturellement, puis extrait |
| `--preauth` | **Non** | Dernière capture d'écran + tous les paramètres |
| `--search` | Non | Recherche de texte OCR insensible à la casse sur la dernière extraction |
| `--destroy` | **Non** | `DeleteEvents()`, irréversible, nécessite de taper DESTROY pour confirmer |
### Exemple de sortie
**`--stealth` (premier lancement, en attente de l'utilisateur) :**```
[+] Target: AIXHost.exe PID 8648 (stealth mode)
[*] Patching auth revocation...
[+] Waiting for Recall session...
[+] Recall session detected
[*] Waiting for user to close Recall...
[*] Recall closed, waiting for AIXHost to respawn...
[+] Extracting from AIXHost PID 26208
[+] Payload active
[*] Extracting
[##############################] 384/384 entities
EXTRACTION COMPLETE 6 min 51 sec
Screenshots 192 328.8 MB
OCR Text 184 535.2 KB
Metadata (CSV) 384 97.4 KB
--stealth (exécution ultérieure, session en cache) :```
[+] Target: AIXHost.exe PID 27532 (stealth mode)
[] Patching auth revocation...
[+] Waiting for Recall session...
[+] Cached session found, extracting...
[] Extracting
[##############################] 398/398 entities
**`--launch`:**```
[+] Target: AIXHost.exe PID 14636 Memory 60 MB
[*] Triggering Recall via Win+J...
[*] Waiting for Hello authentication authenticating
[+] Recall ready PID 14636 Memory 242 MB
[*] Extracting
[##############################] 212/212 entities
EXTRACTION COMPLETE 3 min 59 sec
Screenshots 104 184.0 MB
--preauth (pas de Hello requis):```
[+] Target: AIXHost.exe PID 27532 (pre-auth mode)
[*] Injecting payload (pre-auth only)...
[+] Payload active
PRE-AUTH EXTRACTION COMPLETE 0 min 1 sec
Screenshot 4K (3840x2464) 36.1 MB
Settings Storage Path C:\Users<user>\AppData\Local\CoreAIPlatform.00\UKP{...} Storage Size 178.3 MB Capture Count 0 Retention Days 90
**`--search`:**```
Searching for: "password"
In: extraction_20260406_152736
[1] === [12] ctxId=90443 Settings | Chrome ===
Saved passwords and passkeys
[2] === [47] ctxId=91201 inbox | Thunderbird ===
Your temporary password has been reset
extraction_20260404_143052/ screenshots/ Full-resolution decrypted PNGs screenshots/*.txt Per-image OCR text thumbnails/ Thumbnail PNGs (fallback when full screenshot unavailable) ocr_text.txt Combined OCR text for all captures recall_data.csv Structured metadata settings.txt Storage path, size, retention, capture state latest_capture_4k.bmp Pre-auth screenshot of most recent capture extraction.log Detailed extraction log with timing
## Compilation
**Prérequis :** Visual Studio avec les outils C++ ARM64, Windows 11 ARM64 avec Recall activé.```
make.bat
Produit totalrecall.exe et totalrecall_payload.dll. Les deux doivent se trouver dans le même dossier lors de l'exécution.
VTL1 (Secure World) +--------------------------------------------------+ | VBS Enclave: AES-256-GCM, sealed keys | | snapshot_support.dll / storage_support.dll | | Keys never leave here. Crypto is sound. | +--------------------------------------------------+ ^ CallEnclave | VTL0 (Normal World) +--------------------------------------------------+ | aihost.exe (PPL, Signer=5) | | +-- Microsoft.Windows.AI.Platform.dll (6.9 MB) | | 44 methods on IDataStoreManager alone | | Enclave bridge. Protected. Can't touch it. | | | | AIXHost.exe (NO PROTECTION) | | +-- Baker.dll: OCR, NER, AI classification | | +-- Receives decrypted data for rendering | | +-- CreateRemoteThread = game over | +--------------------------------------------------+
The key hierarchy: Hello -> NGC ECDH P-384 (TPM-backed) -> VTL1 mutual auth -> enclave-sealed key material -> per-page AES-256-GCM with random nonces and page-number AAD. Six layers of key derivation. The cryptography is genuinely solid.
The problem is what happens after decryption. The plaintext crosses into `AIXHost.exe`, an unprotected, injectable, same-user process. The enclave doesn't distinguish between `Baker.dll` and injected code. It can't.
---
## Principales conclusions
### La frontière de confiance s'arrête trop tôt
Le [blog d'architecture](https://blogs.windows.com/windowsexperience/2024/09/27/update-on-recall-security-and-privacy-architecture/) de Microsoft indique que « les processus en dehors des enclaves VBS ne reçoivent jamais directement l'accès aux captures d'écran ou aux clés de chiffrement » et que la conception « limite les tentatives de logiciels malveillants latents qui cherchent à profiter d'une authentification utilisateur pour voler des données ».
En pratique, `AIXHost.exe` reçoit chaque capture d'écran déchiffrée ainsi que chaque résultat OCR sous forme d'objet COM en direct. Il n'y a aucune vérification par appelant à l'intérieur du processus. Pas de vérification du type « es-tu `Baker.dll` ? ». Si vous êtes dans le processus, vous êtes considéré comme fiable. La frontière de sécurité est l'enclave VBS et le PPL, pas le processus de rendu. Les données déchiffrées sont à un seul `CreateRemoteThread` de n'importe quelle application du même utilisateur.
### Le contournement du contrôle d'accès d'IResponse4
Une lacune d'autorisation directe.
Lorsque vous appelez `ContextDataSource.Search()` et que vous recevez un `IResponse`, le chemin naturel est `IResponse.get_Items()` (slot 9) pour obtenir les résultats. Sur une session fraîche, cela retourne `0x80005473`, un code d'erreur personnalisé propre à Recall. Le serveur rejette délibérément l'appel. `IResponse2.ItemsAfterIndex()` retourne la même erreur. Le contrôle d'accès fonctionne.
Mais l'objet `IResponse` implémente quatre versions d'interface. `IResponse4.get_UnfilledItems()` (slot 9 sur un IID différent) retourne la même collection de données sous-jacente sans aucun contrôle d'accès.```
IResponse.get_Items() -> 0x80005473 (ACCESS DENIED)
IResponse2.ItemsAfterIndex() -> 0x80005473 (ACCESS DENIED)
IResponse4.get_UnfilledItems() -> S_OK (all entities returned)
Mêmes données. Version d'interface différente. Aucune autorisation. La méthode était destinée au chargement paresseux interne dans le pipeline de recherche. L'examen de sécurité a repéré get_Items et ItemsAfterIndex, mais a manqué get_UnfilledItems. C'est le schéma qui rend la sécurité difficile : la vérification existe sur un chemin de code (ce qui signifie que quelqu'un a décidé qu'elle était nécessaire), et est absente sur un autre.
À partir de ces éléments, l'ID de contexte de chaque entité mène à ContextEngine2.TryGetEntityForId(), qui charge l'entité complète avec captures d'écran, OCR et métadonnées. L'enclave déchiffre tout sur demande.
Lorsque l'utilisateur ferme la fenêtre Recall, Baker.dll appelle IDataProtectionManager3::DiscardDataAccess() pour révoquer explicitement l'autorisation d'accès aux données dans aihost.exe. C'est pourquoi l'authentification ne persiste pas après la session Recall normale de l'utilisateur : Baker.dll nettoie après elle.
La dérogation : le code injecté dans AIXHost.exe peut modifier la table virtuelle du proxy COM pour remplacer DiscardDataAccess (slot 8) par une fonction sans opération. Un appel VirtualProtect, une écriture de pointeur. Lorsque l'utilisateur ferme Recall, Baker.dll appelle le slot modifié, rien ne se passe, et l'autorisation reste active dans aihost.exe. Toute instance ultérieure de AIXHost.exe hérite silencieusement de l'autorisation mise en cache.
En pratique, --stealth déploie le correctif dans AIXHost.exe (qui est toujours en cours d'exécution) et attend. La prochaine fois que l'utilisateur ouvre et ferme Recall normalement, le nettoyage est supprimé et l'autorisation d'accès aux données persiste. L'outil détecte l'accès, gère les redémarrages du processus AIXHost via une réinjection automatique (re-correction de chaque nouvelle instance), et extrait tout silencieusement. La correction est par processus et par exécution : elle protège la session d'extraction en cours. L'utilisation ultérieure de Recall après la sortie de l'outil revient au comportement normal.
IDataStoreManager::DeleteEvents() efface tout l'historique des captures sans Windows Hello. Ghidra a confirmé : le gestionnaire de suppression ne contient aucun appel à la fonction de vérification d'autorisation. La vérification d'authentification n'a jamais été câblée dans le chemin de suppression. Un attaquant qui ne peut pas lire les données peut toujours les détruire. Anti-forensics depuis un utilisateur standard.
RecallPrivacyIndicatorSettings.GetRecentCaptureThumbnail renvoie la capture d'écran Recall la plus récente à la résolution demandée. La méthode est destinée au petit indicateur de confidentialité dans la barre des tâches. Personne n'a limité la résolution. Tout processus du même utilisateur peut récupérer silencieusement ce qui était à l'écran en dernier, sans Hello requis.
GetWindowCaptureCount (slot 26) renvoie E_ACCESSDENIED sans Hello. Mais GetSecureStorageInfo (slot 27) renvoie une structure StorageInfo avec exactement les mêmes données, sans authentification requise. La structure contient NumberOfItems (nombre de captures) et Size (taille totale du stockage crypté en octets). Un attaquant peut surveiller cela pour suivre l'activité de Recall en temps réel sans aucune authentification.
Une fois Hello complété, l'état d'authentification est mis en cache dans aihost.exe (PPL) pour toute la session Windows. Tuer et redémarrer AIXHost.exe ne l'efface pas. Un attaquant peut attendre que l'utilisateur ouvre naturellement Recall, puis extraire silencieusement des données des heures plus tard. Extraction répétée illimitée sans invites supplémentaires, sans fenêtres visibles, sans connaissance de l'utilisateur.
Recall ne prend pas seulement des captures d'écran. Il construit un profil comportemental complet de tout ce que vous faites sur votre ordinateur. Toutes les quelques secondes, il prend une capture d'écran, exécute une OCR et (supposément) une classification IA dessus, et stocke le résultat dans une base de données SQLite cryptée.
Tout ce qui suit est confirmé à partir de deux sources indépendantes : les métadonnées WinRT privées (Microsoft.Windows.AI.Platform.winmd, analysées via cppwinrt.exe) et le binaire de l'enclave VBS (storage_support.dll, qui contient le schéma complet de la base de données en chaînes de texte brut).
Note : les noms de champs ci-dessous sont confirmés à partir des métadonnées WinRT et des chaînes du binaire de l'enclave. Les descriptions de ce que chaque champ contient sont déduites des noms et des types d'API, et n'ont pas toutes été vérifiées dynamiquement au moment de l'exécution.
Note : même avertissement que ci-dessus. Les noms de classes et d'énumérations sont énumérés à partir des métadonnées WinRT et des chaînes de DLL de l'enclave ; les descriptions de ce qu'ils représentent sont déduites des noms et du contexte et n'ont pas toutes été vérifiées dynamiquement pour chaque entrée.
En plus de la capture brute, Recall exécute une classification IA qui produit :
PersonName, Organization, Product, Address, Location, DateTime, Event, Duration, WebUrl, EmailAddress. Chacune extraite du texte OCR avec sa position source.Topic, Person, Emoji, App, FileKind, , , , , , , , , , , , , , , , , , . Chacune avec des scores de confiance et des boîtes englobantes optionnelles.Toutes les quelques secondes, le service de capture de Recall évalue 12 politiques avant de décider de prendre une capture d'écran :
GameModeActive, BatterySaverActive, UserActivityIdle, UserPresenceIdle, StorageLow, PrivateWindow, BlockedByContentProtection, BlockedAppId, BlockedExecutable, BlockedURL, BlockedContentFilePath, BitLockerDisabled
Si aucun d'entre eux ne se déclenche, il capture. La structure d'entrée par capture (d'après les métadonnées WinRT) :``` WindowData { WindowId, Foreground, Title, Bounds, Minimized, PrivateState, InputScopePrivacy AppData { AppUserModelId, ProcessPath, IconUri, AppName, TileId RemoteClient, IsBrowserWindow } RestoreData { WebUrl, FilePath, ActivationUri, ActivityId, WebIconUri FileObjectId, VolumeId // NTFS persistent file identifiers SensitivityLabelData { State, Labels } } }
### La base de données
La base de données principale (`ukg.db`) utilise SQLite SEE avec un chiffrement AES-256-GCM. Schéma confirmé à partir de `storage_support.dll` (le binaire de l'enclave VBS qui contient les instructions CREATE TABLE en texte clair) :
**Tables principales (17) :**```
WindowCapture Id, Name, ImageToken, IsForeground, WindowId, WindowBounds,
WindowTitle, Properties, IsProcessed, Retry, ActivationUri,
ActivityId, FallbackUri, TimeStamp, DwellTime
WindowCaptureAppRelation WindowCaptureId, AppId, IsBackground
WindowCaptureWebRelation WindowCaptureId, WebId, IsBackground
WindowCaptureFileRelation WindowCaptureId, FileId
WindowCaptureTopicRelation WindowCaptureId, TopicId, Score (float)
WindowCaptureTextIndex FTS5 virtual table (WindowCaptureId, WindowTitle, OcrText)
App Id, WindowsAppId, IconUri, Name, Path, TileId, Properties
Web Id, Domain, Uri, IconUri, Properties
File Id, Path, Name, Extension, Kind, Type, ObjectId, VolumeId
Topic Id, Title, Properties
ScreenRegion Id, WindowCaptureId, RegionKind, OcrText, Bounds
AppDwellTime Id, WindowsAppId, HourOfDay, DayOfWeek, HourStartTimestamp, DwellTime
WebDomainDwellTime Domain, HourOfDay, DayOfWeek, HourStartTimestamp, DwellTime
SearchHistory SessionId, CorrelationId, TimeStamp, Kind, Text, Language
SearchFeedback SessionId, CorrelationId, TimeStamp, Kind, Text, Language,
ItemChosenEventId, FeedbackType
IdTable NextId
_MigrationMetadata Id, Version
Index de recherche sémantique (SemanticTextStore.sidb / SemanticImageStore.sidb):``` si_items Core embedding storage si_embedding_metadata Embedding type and source mapping si_diskann_graph DiskANN approximate nearest neighbor graph si_diskann_references Graph edge references si_diskann_config Index configuration si_diskann_info Index statistics si_application_values Application-level settings
Au cours d'une journée de travail typique, des centaines de captures s'accumulent. La conservation par défaut est de 90 jours avec un seuil de stockage de 75 Go. Chaque email ouvert, chaque document modifié, chaque site web visité, chaque commande de terminal à l'écran, chaque conversation de messagerie visible. Le tout traité par OCR, avec extraction d'entités, classification thématique et indexation sémantique.
Votre vie numérique entière, indexée et consultable. Comme prévu.
---
## Ce que Microsoft a bien fait
L'enclave VBS est extrêmement solide. Le matériel de clé ne quitte jamais VTL1. Le chiffrement AES-256-GCM par page avec des nonces aléatoires est correct selon les manuels. La protection PPL de `aihost.exe` est efficace, le noyau bloque l'injection. CFG est complet sur ARM64. Les requêtes SQL sont entièrement paramétrées (dix charges utiles d'injection, zéro effet secondaire). Le modèle d'authentification est sans état et sans conditions de concurrence (des milliers de sondes, zéro contournement).
Le problème fondamental n'est pas le chiffrement, l'enclave, l'authentification ou le PPL. C'est l'envoi du contenu déchiffré à un processus non protégé pour le rendu. La porte du coffre est en titane. Le mur à côté est en placoplâtre.
---
## Divulgation responsable
Cette recherche a été divulguée de manière responsable au Microsoft Security Response Center (MSRC).
### Calendrier
| Date | Événement |
|------|-----------|
| 2024-06-07 | Original [TotalRecall](https://github.com/xaitax/TotalRecall) publié (Recall avant chiffrement) |
| 2024-06-13 | Microsoft retarde le lancement de Recall, annonce une refonte avec des enclaves VBS |
| 2025-04 | Recall relancé avec des enclaves VBS, chiffrement, authentification Hello |
| 2026-03-06 | Rapport soumis à MSRC : documentation complète, code source, instructions de construction |
| 2026-03-09 | MSRC ouvre le dossier 109586, statut : Révision / Repro |
| 2026-03-27 | MSRC : « l'équipe d'ingénierie est actuellement en phase finale d'investigation » |
| 2026-04-03 | MSRC clôt le dossier comme **Pas une vulnérabilité** : « fonctionne dans le cadre de la conception de sécurité documentée actuelle » |
| 2026-04-09 | TotalRecall Reloaded publié publiquement |
### Position de Microsoft
Après examen avec leurs équipes d'ingénierie, le MSRC a déterminé que « le comportement observé fonctionne dans le cadre de la conception de sécurité documentée actuelle de Recall » et que « les schémas d'accès démontrés sont cohérents avec les protections prévues et les contrôles existants ». Ils ont cité leur [blog d'architecture](https://blogs.windows.com/windowsexperience/2024/09/27/update-on-recall-security-and-privacy-architecture/), précisant que l'autorisation « restreint les tentatives de logiciels malveillants latents cherchant à profiter d'une authentification utilisateur pour voler des données » et que « les processus en dehors des enclaves VBS ne reçoivent jamais directement l'accès aux instantanés ou aux clés de chiffrement et ne reçoivent que les données renvoyées par l'enclave après autorisation ».
Le dossier a été clos comme Pas une vulnérabilité.
Les conclusions pré-authentification documentées ici (destruction de données non authentifiée, extraction de captures d'écran) ont été découvertes lors de recherches ultérieures après la clôture du dossier.
---
## Environnement testé
| | Détails |
|---|---|
| **OS** | Windows 11 25H2 (Build 26300.8155) |
| **Architecture** | ARM64 |
| **AIXHost.exe** | v2126.7602.0.0 |
| **Privilège** | Utilisateur standard (intégrité moyenne, aucune élévation) |
---
## Travaux antérieurs
- [TotalRecall](https://github.com/xaitax/TotalRecall) (juin 2024), l'outil Python original pour Recall avant chiffrement
- [L'analyse de Kevin Beaumont](https://doublepulsar.com/recall-stealing-everything-youve-ever-typed-or-viewed-on-your-own-windows-pc-is-now-possible-da3e12e9465e), la recherche qui a tout déclenché
## Remerciements
Merci à [Jeff McJunkin](https://x.com/jeffmcjunkin) et [Kevin Beaumont](https://cyberplace.social/@GossiTheDog) pour les tests et la validation.
---
**Alexander Hagenah ([@xaitax](https://x.com/xaitax))**
TryGetBitmapCaptureAsync()SoftwareBitmapQueryInterfaceISoftwareBitmapNativeGetData(IID_IWICBitmap)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.
| Données | Source | Ce qu'elle contient |
|---|
| Capture d'écran | TryGetBitmapCaptureAsync | PNG pleine résolution de tout votre écran |
| Capture d'écran redimensionnée | TryGetBitmapCaptureAsync(Size, Mode) | Capture d'écran à n'importe quelle résolution demandée avec interpolation configurable |
| Vignette | TryGetBitmapCaptureThumbnailAsync | Image d'aperçu en basse résolution |
| Texte OCR | OcrText (Details3) | OCR complet concaténé de tout ce qui est visible à l'écran |
| Lignes OCR | OcrLines (Details1) | Lignes OCR individuelles sous forme de chaînes séparées |
| Mots OCR | struct OcrWord | Chaque mot avec une boîte englobante pixel-précise (RectInt32) |
| Titre de fenêtre | get_Title | Texte de la barre de titre de la fenêtre active |
| Application | get_AppDisplayName | Quelle application était au premier plan (Chrome, Outlook, Terminal, …) |
| ID de modèle d'application | get_AppUserModelId | Chaîne d'identité UWP/Win32 de l'application |
| Chemin du processus | get_ProcessPath | Chemin complet de l'exécutable (C:\Program Files\...\chrome.exe) |
| Icône d'application | IMemoryEntity2.IconUri | Chemin vers l'icône de l'application |
| URL | get_WebUrl | URL complète dans la barre d'adresse du navigateur |
| Domaine | get_WebDomain | Domaine du site web |
| Favicon | get_WebIconUri | URL du favicon pour le site web actif |
| Chemin de fichier | get_FileUri | Document ou chemin de fichier actif |
| Position de la fenêtre | get_WindowBounds | Coordonnées écran pixel-précises : X, Y, Largeur, Hauteur |
| Horodatage | get_Timestamp | Heure exacte de la capture (précision de 100 nanosecondes) |
| Temps passé dans l'application | IMemoryEntity3 | Combien de temps vous avez passé dans chaque application (millisecondes) |
| Temps passé sur le web | IMemoryEntity3 | Combien de temps vous avez passé sur chaque site web (millisecondes) |
| Étiquette de sensibilité | IMemoryEntity5 | Classification Microsoft Purview/DLP : nom, couleur, info-bulle |
| ID d'activité utilisateur | IMemoryEntity6 | ID de corrélation d'activité du Timeline Windows |
| Capacité de restauration | IMemoryEntity2 | Masque de bits : peut relancer application (0x1), URL (0x2), fichier (0x4), URI (0x8), timeline (0x10) |
| Restauration du contexte | TryRestoreContextAsync | Rouvrir l'application exacte, la page ou le document à partir de n'importe quelle capture |
DomainUserTagOrganizationProductAddressLocationDateTimeEventDurationMemoryDscSensitivityLabelWebVideoMeetingChatMailingPackageTextRatioSkipTopicsAnyText, Image, Table, Container, Menu, ToolBar, AddressBar, Toolpane, TabBar, TitleBar. Chacune avec des boîtes englobantes pixel-précises et du texte OCR intégré.L1Description (résumé en prose généré par IA de ce que vous faisiez), L1Activity (catégorisé : navigation, codage, écriture, lecture de courriels), L1Application (contexte d'application classifié par IA).Meeting (appels de conférence), Chat (messagerie), WebVideo (lecture vidéo), MailingPackage (courriels/newsletters). Regroupe plusieurs captures en sessions d'activité logiques.UserActivity, KMeansCluster, LobeTopicCluster, ApplicationDwellTime, WebsiteDwellTime, ClipboardImageCopied, Topic.IsContentFilteringEnabled sur l'interface IAutomatedCaptureController6.