
이 도구는 Windows 11의 Recall 기능에서 데이터를 추출하여 표시하며, PC 활동 스냅샷 정보에 쉽게 접근할 수 있는 방법을 제공합니다.
Breaking Windows Recall. Again.
image
Microsoft가 VBS 엔클레이브, AES-256-GCM 암호화, Windows Hello 인증, Protected Process Light 호스트를 사용하여 Recall을 재설계했을 때, 메시지는 분명했습니다: 데이터는 금고에 잠겨 있다는 것입니다.
금고는 견고합니다. 그러나 배달 트럭은 그렇지 않습니다.
Recall 타임라인을 렌더링하는 프로세스인 AIXHost.exe에는 PPL, AppContainer, 코드 무결성 강화 기능이 없습니다. 로그인한 사용자로 실행되는 모든 프로세스는 이 프로세스에 코드를 주입하고 합법적인 UI가 사용하는 동일한 COM API를 호출할 수 있습니다. 사용자가 Windows Hello로 인증하면, 복호화된 스크린샷, OCR 텍스트 및 메타데이터가 라이브 COM 객체로 AIXHost.exe를 통해 흐릅니다. TotalRecall Reloaded는 해당 프로세스 내부에 위치하여 모든 것을 추출합니다.
관리자 권한 불필요. 표준 사용자. 커널 익스플로잇 없음. 암호화 우회 없음. 단지 COM 호출만으로 가능합니다.
TotalRecall Reloaded는 두 개의 파일로 구성됩니다: 인젝터(totalrecall.exe)와 페이로드 DLL(totalrecall_payload.dll).
인젝터는 CreateToolhelp32Snapshot을 통해 AIXHost.exe를 찾고, VirtualAllocEx로 대상 프로세스에 메모리를 할당하고, WriteProcessMemory로 DLL 경로를 작성한 다음, LoadLibraryW를 가리키는 원격 스레드를 생성합니다. 고전적인 DLL 인젝션입니다. 특별할 것 없는 방식인데, 특별한 것이 필요하지 않기 때문입니다. AIXHost.exe는 이에 대한 어떤 보호 조치도 갖추고 있지 않습니다.
이는 표준 사용자 권한으로 작동합니다. 상승된 권한이나 SeDebugPrivilege가 필요하지 않습니다. 기본 Windows DACL은 동일한 사용자 프로세스가 서로에 대해 완전한 접근 권한을 갖도록 허용합니다. 확인 결과: 토큰은 Medium 필수 수준에서 실행되며 BUILTIN\Administrators는 거부 전용으로 설정됩니다.
VBS 엔클레이브는 Windows Hello 없이는 어떤 것도 복호화하지 않습니다. 이 도구는 이를 우회하지 않습니다. 사용자가 인증하도록 하거나, 사용자가 인증할 때 조용히 따라가거나, 사용자가 인증할 때까지 기다립니다.
--launch는 keybd_event를 통해 Win+J를 시뮬레이션합니다. Recall 타임라인을 여는 키보드 단축키입니다. 사용자는 Hello 프롬프트(얼굴, 지문 또는 PIN)를 보고 인증하며, 엔클레이브는 복호화된 데이터를 제공하기 시작합니다. 사용자 관점에서는 Recall이 정상적으로 열린 것처럼 보입니다. 우리 관점에서는 페이로드가 이미 내부에 있으며 대기 중입니다.
--stealth는 완전 무음 모드입니다. 다음과 같이 작동합니다:
AIXHost.exe(항상 실행 중)에 인젝션하고 DiscardDataAccess를 No-op으로 패치합니다.AIXHost.exe가 종료되고 다시 생성됩니다. 도구가 재시작을 감지하고 새 프로세스에 다시 인젝션합니다.aihost.exe에 인증 권한이 지속됩니다(취소가 차단됨). 추출이 즉시 시작됩니다.--wait는 --launch의 수동적 대응 모드입니다. Win+J를 시뮬레이션하는 대신, 도구는 사용자가 작업 표시줄, 바로 가기 또는 다른 경로를 통해 직접 Recall을 열 때까지 대기합니다. AIXHost.exe가 나타나고 사용자가 자연스럽게 Hello를 완료하면 페이로드가 인젝션되고 추출이 시작됩니다. 관찰 중인 시스템에서 유용하거나, 합성 키보드 입력 없이 Recall 세션이 전적으로 사용자에 의해 시작된 것처럼 보여야 하는 경우에 적합합니다.
일단 AIXHost.exe 내부에 들어가면, 페이로드는 CoInitializeEx(COINIT_APARTMENTTHREADED)로 COM 아파트먼트를 초기화하고 CoSetProxyBlanket(EOAC_DYNAMIC_CLOAKING)으로 프록시 ID 전달을 설정합니다. 이는 매우 중요합니다. 동적 클로킹이 없으면 COM 프록시가 인증된 ID를 서버로 전달하지 않습니다.
추출은 합법적인 Recall UI가 사용하는 동일한 경로를 따릅니다:
엔클레이브 초기화: DataManager.Load()가 엔클레이브 키 로딩을 트리거합니다. DataStoreManager.DecryptDatabase()(슬롯 37)가 복호화된 뷰를 준비합니다. 페이로드는 DataManager.DataStatus를 폴링하여 3(잠금 해제됨)이 반환될 때까지 기다립니다.
엔티티 열거: MemoryEntityStatics.GetLightMemoryItemsBefore() (슬롯 9)가 경량 엔티티 참조의 벡터를 반환합니다. 각 참조는 오프셋 +8에 컨텍스트 ID를 가지고 있습니다. 일반적인 시스템에서는 수백 개의 엔티티가 반환되며, 며칠 또는 몇 주 간의 활동을 포괄합니다.
엔티티별 추출: 각 컨텍스트 ID에 대해 페이로드는 ContextEngine2.TryGetEntityForId()(슬롯 6)를 통해 전체 엔티티를 로드하고, IEntityWrapper(슬롯 6)를 통해 언랩한 다음, QueryInterface로 IMemoryEntity를 얻습니다. 그런 다음:
TryGetBitmapCaptureAsync()(슬롯 19)가 SoftwareBitmap을 반환합니다. ISoftwareBitmapNative로 QueryInterface하고, GetData(IID_IWICBitmap)를 호출하여 WIC 비트맵을 얻은 다음, IWICBitmapEncoder를 통해 PNG로 인코딩합니다.ContextEngine2.TryGetMemoryEntityDetailsForIdAsync()(슬롯 8)가 엔티티 세부 정보를 반환합니다. IMemoryEntityDetails로 QI하여 OcrLines(슬롯 7), IMemoryEntityDetails2로 QI하여 NER 텍스트 엔티티(사람, 이메일, 주소), IMemoryEntityDetails4로 QI하여 AI 활동 설명을 얻습니다.재시도 라운드: Baker.dll(Recall UI 라이브러리)은 ContextEngine 캐시를 비동기식으로 채웁니다. 초기 패스 후, 페이로드는 3초 동안 Windows 메시지를 펌핑(PeekMessage/DispatchMessage 루프)하고 사용할 수 없었던 엔티티를 재시도합니다. 각 라운드는 일반적으로 약 12개의 추가 엔티티를 생성합니다. 최대 10회 재시도 라운드.
모든 호출은 __try/__except로 래핑됩니다. 그 이유는 COM 프록시 호출에서 단일 액세스 위반이 발생하면 aihost.exe에 대한 RPC 채널이 영구적으로 끊어지기 때문입니다. 복구 방법이 없습니다. AIXHost.exe를 다시 시작해야 합니다. SEH 래퍼는 잘못된 매개변수 유형으로 인한 충돌을 포착하고 세션을 유지합니다.
여러 작업은 Hello 인증 없이도 작동합니다:
스크린샷 추출: RecallPrivacyIndicatorSettings(CLSID {42C63551-...})는 슬롯 13에서 GetRecentCaptureThumbnail(width, height)를 노출합니다. 메서드 이름은 "썸네일"이라고 되어 있지만 서버는 해상도 상한을 적용하지 않습니다. 3840x3840을 전달하면 최근 Recall 캡처가 전체 해상도로 반환됩니다. IRandomAccessStream 결과는 CreateStreamOverRandomAccessStream(shcore.dll)을 통해 IStream으로 변환되어 BMP로 덤프됩니다.
데이터 파괴: IDataStoreManager::DeleteEvents()(슬롯 12)는 전체 캡처 기록을 지웁니다. 매개변수 없음, 인증 불필요. Ghidra 분석 결과: FUN_1802ddd10의 삭제 핸들러에는 권한 부여 게이트 함수에 대한 호출이 전혀 포함되어 있지 않습니다. 인증 검사는 원래부터 연결되지 않았습니다.
메타데이터 공개: 저장 경로(사용자 특정 UKP GUID 포함), 데이터베이스 크기, 보존 정책, 캡처 상태, 최근 캡처 컨텍스트 ID는 모두 인증 없이 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)
| Mode | Auth Required | What It Does |
|------|:---:|-------------|
| `--launch` | Hello | Win+J 시뮬레이션, 사용자 인증, 전체 추출 |
| `--stealth` | Passive | 인증 취소 패치, 사용자가 Recall 인증할 때까지 대기, 자동 추출 |
| `--wait` | Hello | 사용자가 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
EXTRACTION COMPLETE 6 min 51 sec
Screenshots 192 328.8 MB
OCR Text 184 535.2 KB
Metadata (CSV) 384 97.4 KB
--stealth (후속 실행, 캐시된 세션):```
[+] 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 (Hello 필요 없음):```
[+] 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