Adquirir RecentFileCache.bcf desde sistemas en vivo y offline
Guía práctica para extraer RecentFileCache.bcf en tres entornos: un endpoint Windows 7 en marcha, una imagen forense de disco y una Volume Shadow Copy.
No puedes analizar RecentFileCache.bcf hasta tener una copia. El archivo tiene una vida útil corta (el siguiente pase de ProgramDataUpdater lo reescribe), así que cógelo pronto. Este post cubre los tres entornos que realmente vas a encontrar y las trampas que muerden a cada uno.
Sistema en vivo: el archivo está abierto
En una máquina Windows 7 corriendo, RecentFileCache.bcf lo mantiene abierto el servicio Application Experience. Una copia ingenua falla:
PS C:\> copy C:\Windows\AppCompat\Programs\RecentFileCache.bcf C:\tmp\
Access to the path 'C:\Windows\AppCompat\Programs\RecentFileCache.bcf' is denied.
Tres enfoques que funcionan:
-
Lectura cruda con FTK Imager (GUI o CLI). Salta la cerradura Win32 hablando con el volumen a nivel de dispositivo. La copia captura los bytes que están en disco en el momento de la lectura.
-
Volume Shadow Copy.
vssadmin list shadowspara encontrar un snapshot reciente, luego lee el archivo desde la ruta del snapshot:$sc = (vssadmin list shadows | Select-String 'Shadow Copy Volume:').Line.Split(' ')[-1] Copy-Item "$sc\Windows\AppCompat\Programs\RecentFileCache.bcf" C:\triage\ -
KAPE con el target
RecentFileCache. Preferido para triage a escala. El archivo de target vive enTargets/Windows/RecentFileCache.tkapeen la distribución de Kroll KAPE. Ejecutar KAPE con--target RecentFileCacheextrae el archivo más sus metadatos NTFS usando lecturas crudas.
Los tres preservan el LastWriteTime del archivo, que (según el post de ciclo de vida) es lo más cercano que tienes a una marca temporal de "última actualización" para el artefacto en conjunto.
Una nota que me ha salvado un par de veces: si eres el respondedor primero en un host sospechoso, no esperes. Mañana habrá corrido el appraiser y tu evidencia será una lista mucho más corta. Es uno de los pocos artefactos donde diez minutos de retraso pueden costarte la pista.
Offline: imágenes de disco
Para una imagen E01, VHD o dd, el archivo vive en la misma ruta dentro de la partición Windows:
<partition root>/Windows/AppCompat/Programs/RecentFileCache.bcf
Workflows comunes:
-
libewf + partición montada — leer la ruta directamente:
ewfmount image.E01 /mnt/ewf mmls /mnt/ewf/ewf1 # encontrar el offset de la partición NTFS mount -o ro,offset=$((2048*512)) /mnt/ewf/ewf1 /mnt/win cp /mnt/win/Windows/AppCompat/Programs/RecentFileCache.bcf ./ -
Sleuth Kit sin montar, útil cuando la imagen es grande o cuando quieres copias recuperables vía
$LogFile:fls -r -p -o 2048 image.dd | grep -i RecentFileCache.bcf # usa el inodo que reporta fls: icat -o 2048 image.dd <inode> > RecentFileCache.bcf -
FTK Imager / X-Ways / EnCase. Apuntar y clic. Las tres manejan archivos bloqueados dentro de una imagen sin problema.
Las Volume Shadow Copies son tu amiga
Los sistemas Windows 7 suelen llevar semanas de historial VSS con la configuración por defecto. Cada shadow copy contiene su propio RecentFileCache.bcf, y como el archivo se reescribe (no se anexa), los shadows antiguos suelen guardar entradas que ya han sido purgadas del archivo vivo.
Workflow:
- Enumera snapshots:
vssadmin list shadows(en vivo) o saca\System Volume Information\de una imagen. - Para cada snapshot, extrae la BCF desde
<shadow root>\Windows\AppCompat\Programs\. - Diferencia las entradas parseadas entre snapshots. Entradas que existen en snapshots antiguos pero no en el archivo vivo son especialmente interesantes. O bien fueron promocionadas a Amcache.hve o caducaron.
El parser de este sitio no tiene diff integrado, pero el JSON que emite es pequeño y estable. jq hace el resto:
jq -r '.entries[].path' rfc_2026-05-20.json | sort > old.txt
jq -r '.entries[].path' rfc_2026-05-26.json | sort > new.txt
comm -23 old.txt new.txt # rutas que se esfumaron
comm -13 old.txt new.txt # rutas que aparecieron
La lista de desaparecidos es donde viven las cosas interesantes. Una ruta presente hace tres días y ausente hoy o se ejecutó y fue promocionada, o alguien limpió. La cadena de corroboración vía MFT y USN journal te dice cuál.
Trampas a tener presentes
- El archivo puede no existir. En una máquina recién imageada o donde
AeLookupSvcestá deshabilitado, la BCF puede faltar. La ausencia es dato. Mira Detectar manipulación de RecentFileCache. - Las marcas temporales de adquisición no son las de entrada. Sacar el archivo a las 14:00 no significa que la última entrada aterrizara a las 14:00. El propio
LastWriteTimedel archivo es el reloj relevante, y rastrea el pase del appraiser, no una ejecución individual. - Server 2008 R2 se comporta como Win7. Mismo archivo, mismo servicio, misma tarea programada
Microsoft\Windows\Application Experience\ProgramDataUpdater. No te saltes un servidor 2008 R2 porque "es un servidor, no una estación". - Win8 y posteriores no lo tienen. Si tu imagen es Windows 8 o más nueva, deja de buscar. Quieres Amcache.hve.
- Semántica de rutas. Las entradas se registran con el prefijo NT
\??\. Los parsers decentes lo quitan. Si haces scripting contra bytes crudos, hazlo tú.
Siguiente
Tienes el archivo. El siguiente post cubre qué mirar realmente una vez parseado.
Lecturas adicionales
- Triage: detectar entradas sospechosas en RecentFileCache
- Validar hallazgos de RecentFileCache
- USN journal y MFT para confirmar el ciclo de vida del archivo en disco