
تستخرج هذه الأداة وتعرض البيانات من ميزة "الاسترجاع" في ويندوز 11، مما يوفر طريقة سهلة للوصول إلى معلومات حول لقطات نشاط جهاز الكمبيوتر الخاص بك.
Breaking Windows Recall. Again.
image
عندما أعادت Microsoft تصميم Recall باستخدام VBS enclaves وتشفير AES-256-GCM ومصادقة Windows Hello ومضيف Protected Process Light، كانت الرسالة واضحة: البيانات محصورة في خزنة.
الخزنة متينة. لكن شاحنة التوصيل ليست كذلك.
AIXHost.exe، العملية التي تعرض الجدول الزمني لـ Recall، لا تحتوي على PPL أو AppContainer أو تطبيق سلامة الكود. أي عملية تعمل كمستخدم مسجل الدخول يمكنها حقن كود فيها واستدعاء نفس واجهات COM API التي تستخدمها واجهة المستخدم المشروعة. بمجرد أن يوثق المستخدم باستخدام Windows Hello، تتدفق لقطات الشاشة المفكوكة والنص المستخرج من OCR والبيانات الوصفية عبر AIXHost.exe ككائنات COM حية. يجلس TotalRecall Reloaded داخل تلك العملية ويستخرج كل شيء.
لا يتطلب صلاحيات المسؤول. مستخدم عادي. لا استغلال kernel. لا تجاوز تشفير. مجرد استدعاءات COM.
TotalRecall Reloaded يتكون من ملفين: محقن (totalrecall.exe) و DLL حمولة (totalrecall_payload.dll).
يجد المحقن AIXHost.exe عبر CreateToolhelp32Snapshot، ويخصص ذاكرة في الهدف باستخدام VirtualAllocEx، ويكتب مسار DLL باستخدام WriteProcessMemory، ويطلق مؤشر ترابط عن بعد يشير إلى LoadLibraryW. حقن DLL كلاسيكي. لا شيء معقد، لأن لا شيء معقد مطلوب. AIXHost.exe لا يحتوي على أي حماية ضده.
يعمل هذا من مستخدم عادي. لا رفع صلاحيات، لا SeDebugPrivilege. يسمح DACL الافتراضي لنظام Windows بعمليات المستخدم نفسه بالوصول الكامل لبعضها البعض. تم التحقق: يعمل الرمز المميز بمستوى إلزامي Medium مع BUILTIN\Administrators مضبوطًا على deny-only.
لن يفك تشفير VBS enclave أي شيء بدون Windows Hello. لا يتجاوز الأداة ذلك. بل تجبر المستخدم على القيام بذلك، أو تركب بصمت عندما يفعل المستخدم ذلك، أو تنتظر حتى يفعل المستخدم ذلك.
يقوم --launch بمحاكاة Win+J عبر keybd_event، اختصار لوحة المفاتيح الذي يفتح الجدول الزمني لـ Recall. يرى المستخدم موجه Hello (وجه، بصمة إصبع، أو PIN)، يوثق، ويبدأ الـ enclave في تقديم البيانات المفكوكة. من منظور المستخدم، فتحت Recall بشكل طبيعي فقط. من منظورنا، الحمولة موجودة بالفعل بالداخل، تنتظر.
وضع --stealth هو الوضع الصامت تمامًا. يعمل كالتالي:
AIXHost.exe (يعمل دائمًا) ويصحح DiscardDataAccess بحيث يصبح no-opAIXHost.exe ويعاد تشغيله. تكتشف الأداة إعادة التشغيل وتعيد الحقن في العملية الجديدةaihost.exe (تم منع الإلغاء). يبدأ الاستخراج فورًا--wait هو النظير السلبي لـ --launch. بدلاً من محاكاة Win+J، تبقى الأداة خاملة بينما يفتح المستخدم Recall بنفسه — من شريط المهام، اختصار، أو أي مسار آخر. عندما يظهر AIXHost.exe ويكمل المستخدم Hello بشكل طبيعي، يتم حقن الحمولة ويبدأ الاستخراج. مفيد على جهاز يتم مراقبته، أو عندما تحتاج جلسة Recall إلى أن تبدو بالكامل من بدء المستخدم بدون إدخال لوحة مفاتيح اصطناعي.
بمجرد الدخول إلى AIXHost.exe، تقوم الحمولة بتهيئة شقة COM باستخدام CoInitializeEx(COINIT_APARTMENTTHREADED) وإعداد توجيه هوية الوكيل باستخدام CoSetProxyBlanket(EOAC_DYNAMIC_CLOAKING). هذا أمر بالغ الأهمية. بدون الإخفاء الديناميكي، لا يحمل وكيل COM الهوية الموثقة إلى الخادم.
يتبع الاستخراج نفس المسار الذي تستخدمه واجهة المستخدم المشروعة لـ Recall:
تهيئة enclave: يؤدي DataManager.Load() إلى تحميل مفتاح enclave. يقوم DataStoreManager.DecryptDatabase() (الفتحة 37) بإعداد عروض مفكوكة. تتحقق الحمولة من DataManager.DataStatus حتى يعيد 3 (مفكوك).
تعداد الكيانات: يقوم MemoryEntityStatics.GetLightMemoryItemsBefore() (الفتحة 9) بإرجاع متجه من مراجع كيانات خفيفة. كل منها يحمل معرف سياق في الإزاحة +8. على جهاز نموذجي، يعيد هذا مئات الكيانات التي تغطي أيامًا أو أسابيع من النشاط.
استخراج لكل كيان: لكل معرف سياق، تقوم الحمولة بتحميل الكيان الكامل عبر ContextEngine2.TryGetEntityForId() (الفتحة 6)، وتفكيكه عبر IEntityWrapper (الفتحة 6)، و QueryInterface إلى IMemoryEntity. من هناك:
TryGetBitmapCaptureAsync() (الفتحة 19) SoftwareBitmap. QueryInterface إلى ISoftwareBitmapNative، استدعاء GetData(IID_IWICBitmap) للحصول على WIC bitmap، تشفير كـ PNG عبر IWICBitmapEncoder.ContextEngine2.TryGetMemoryEntityDetailsForIdAsync() (الفتحة 8) تفاصيل الكيان. QI إلى IMemoryEntityDetails من أجل OcrLines (الفتحة 7)، و IMemoryEntityDetails2 من أجل كيانات النص NER (أشخاص، بريد إلكتروني، عناوين)، و IMemoryEntityDetails4 من أجل أوصاف نشاط AI.جولات إعادة المحاولة: يملأ Baker.dll (مكتبة واجهة Recall) ذاكرة التخزين المؤقت لـ ContextEngine بشكل غير متزامن. بعد المرور الأولي، تضخ الحمولة رسائل Windows لمدة 3 ثوانٍ (حلقة PeekMessage/DispatchMessage) وتعيد المحاولة لأي كيانات لم تكن متاحة. كل جولة تنتج عادةً حوالي 12 كيانًا إضافيًا. حتى 10 جولات إعادة محاولة.
كل استدعاء ملفوف بـ __try/__except لأن خطأ وصول واحد على استدعاء وكيل COM يقتل قناة RPC بشكل دائم إلى aihost.exe. لا يوجد استرداد. سيتعين عليك إعادة تشغيل AIXHost.exe. تلتقط معالجات SEH الأعطال من أنواع المعاملات الخاطئة وتبقي الجلسة حية.
تعمل عدة عمليات بدون أي مصادقة Hello:
استخراج لقطة الشاشة: يعرض RecallPrivacyIndicatorSettings (CLSID {42C63551-...}) GetRecentCaptureThumbnail(width, height) في الفتحة 13. اسم الطريقة يقول "thumbnail" لكن الخادم لا يفرض حدًا للدقة. تمرير 3840x3840 يعيد أحدث لقطة Recall بدقة كاملة. يتم تحويل نتيجة IRandomAccessStream إلى IStream عبر CreateStreamOverRandomAccessStream (shcore.dll) وتفريغها كـ BMP.
تدمير البيانات: يمسح IDataStoreManager::DeleteEvents() (الفتحة 12) سجل الالتقاط بالكامل. لا معاملات، لا مصادقة. أكد تحليل Ghidra: معالج الحذف في FUN_1802ddd10 يحتوي على صفر استدعاءات لوظيفة بوابة التفويض. لم يتم توصيل فحص المصادقة مطلقًا.
الكشف عن البيانات الوصفية: مسارات التخزين (بما في ذلك GUID UKP الخاص بالمستخدم)، حجم قاعدة البيانات، سياسة الاحتفاظ، حالة الالتقاط، ومعرف سياق أحدث التقاط كلها قابلة للقراءة بدون مصادقة عبر IDataStoreManagerStatics و 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)
| الوضع | مطلوب توثيق | ما يفعله |
|------|:---:|-------------|
| `--launch` | مرحبا | محاكاة Win+J، يصادق المستخدم، استخراج كامل |
| `--stealth` | سلبي | يصحح إلغاء التوثيق، ينتظر حتى يصادق المستخدم على Recall، يستخرج بصمت |
| `--wait` | مرحبا | انتظار فتح المستخدم لتطبيق Recall بشكل طبيعي، ثم استخراج |
| `--preauth` | **لا** | أحدث لقطة شاشة + جميع الإعدادات |
| `--search` | لا | بحث نصي OCR غير حساس لحالة الأحرف عبر أحدث استخراج |
| `--destroy` | **لا** | `DeleteEvents()`، لا رجعة فيه، يتطلب كتابة DESTROY للتأكيد |
### مثال الإخراج
**`--stealth` (التشغيل الأول، انتظار المستخدم):**```
[+] 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