Skip to content

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.

Publicado el 4 min de lectura

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:

  1. 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.

  2. Volume Shadow Copy. vssadmin list shadows para 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\
    
  3. KAPE con el target RecentFileCache. Preferido para triage a escala. El archivo de target vive en Targets/Windows/RecentFileCache.tkape en la distribución de Kroll KAPE. Ejecutar KAPE con --target RecentFileCache extrae 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:

  1. Enumera snapshots: vssadmin list shadows (en vivo) o saca \System Volume Information\ de una imagen.
  2. Para cada snapshot, extrae la BCF desde <shadow root>\Windows\AppCompat\Programs\.
  3. 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 AeLookupSvc está 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 LastWriteTime del 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

Artículos relacionados

El ciclo de vida del BCF depende de una única tarea programada. Entiende cuándo se ejecuta ProgramDataUpdater, cuándo vacía el archivo y cómo detectar un appraiser deshabilitado.
El formato BCF es una cabecera, una lista de rutas UTF-16LE con prefijo de longitud, y se acabó. Aquí está lo que significa cada byte y por qué nada ha cambiado desde 2009.
Un endpoint Win7 marcado por el SOC, 14 rutas en el BCF, tres dignas de una segunda mirada. Una cadena de corroboración realista y cuánto contribuyó realmente el BCF.