Historia de USB y dispositivos en Amcache: InventoryDeviceContainer e InventoryDevicePnp
Más allá de los binarios PE, el schema moderno de Amcache registra
cada dispositivo que Windows ha enumerado en el host. Las dos
sub-claves que importan para esto —
Root\InventoryDeviceContainer y Root\InventoryDevicePnp —
juntas dan a los analistas una de las respuestas más limpias a
"¿qué hardware ha tocado alguna vez esta máquina?" que Windows
ofrece.
Esta página es la guía práctica para investigaciones de USB y periféricos usando Amcache: qué registra cada clave, cómo leer las dos juntas y los límites que necesitas conocer.
Para la referencia más amplia del artefacto, ver la referencia completa de Amcache; para el schema circundante, ver Estructura del registro Amcache.
Qué captura Amcache vs las fuentes tradicionales#
Históricamente, las investigaciones de "historia de dispositivos USB" en Windows han confiado en:
HKLM\SYSTEM\CurrentControlSet\Enum\USB— cada dispositivo USB que Windows ha enumerado.HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR— dispositivos USB de almacenamiento masivo específicamente.setupapi.dev.log(C:\Windows\INF\setupapi.dev.log) — log de instalación de driver con marcas de tiempo.NTUSER.DATpor usuario para historia de mount-points.
Esas fuentes siguen siendo las más autoritativas para almacenamiento masivo USB en particular. Amcache añade una vista paralela que a menudo es más rápida de parsear y más rica en nombres amigables:
| Fuente | Mejor para |
|---|---|
Enum\USB / USBSTOR (registro) |
Historia autoritativa de dispositivos, especialmente almacenamiento masivo. |
setupapi.dev.log |
Marcas de tiempo de instalación de driver para primera conexión. |
Mount-points de NTUSER.DAT |
Datos de mount y última conexión por usuario. |
InventoryDeviceContainer de Amcache |
Nombres amigables, vendor / modelo, estado emparejado/conectado. |
InventoryDevicePnp de Amcache |
Registro de enumeración PnP por interfaz. |
En un contexto de triage, Amcache es más rápido — un parseo del hive y tienes una vista tabular de cada dispositivo con nombres amigables. Para evidencia, quieres todas las fuentes, no solo Amcache.
InventoryDeviceContainer#
La vista de cara al usuario. Una sub-clave por "contenedor de dispositivo" que Windows rastrea — un dispositivo lógico, no una interfaz de bajo nivel. Cada entrada tiene:
| Campo | Significado |
|---|---|
FriendlyName |
El nombre de visualización que Windows asigna: "Brother HL-L2350DW", "SanDisk Cruzer Glide", "Logitech BRIO". |
Manufacturer |
Cadena del vendor. |
ModelName |
Identificador de modelo del dispositivo. |
ModelNumber |
Número de modelo, si está separado. |
Categories |
Categorías del dispositivo: Printer, Storage, Display, Network, Bluetooth, MultimediaDevice, ... |
DiscoveryMethod |
Cómo lo enumeró Windows: DeviceEnumeration, Manual, BluetoothPairing, ... |
IsConnected |
1 si está conectado en el último inventario. |
IsPaired |
1 si está emparejado (Bluetooth específicamente). |
IsActive |
1 si Windows lo considera actualmente activo. |
Icon |
Ruta al recurso de icono del dispositivo. |
KeyLastWriteTimestamp |
Cuándo se actualizó por última vez el registro — lo más cercano a "última vez visto" para el dispositivo. |
Esta es la tabla "¿qué hardware ha estado conectado aquí?" más limpia que Windows expone. Nombres amigables, categorías y una marca de tiempo de última actualización por dispositivo, en un único CSV tras AmcacheParser.
InventoryDevicePnp#
La vista técnica. Una sub-clave por interfaz de dispositivo
que el PnP manager ha enumerado. Donde
InventoryDeviceContainer lista "Brother HL-L2350DW" una vez,
InventoryDevicePnp puede listar la interfaz USB de la impresora,
su interfaz de impresión y cualquier interfaz virtual que expuso.
Campos:
| Campo | Significado |
|---|---|
InstanceId |
Identificador de instancia PnP, p. ej. USB\VID_05E0&PID_1701\ABC123. |
BusReportedDescription |
Lo que el dispositivo le dijo a Windows que era. |
DeviceClass |
GUID de la clase del driver. |
DeviceId |
ID de dispositivo PnP. |
Manufacturer |
Cadena del vendor. |
Model |
Cadena del modelo. |
Service |
Servicio del driver. |
DriverName |
Archivo de driver que respalda el dispositivo. |
KeyLastWriteTimestamp |
Cuándo se actualizó por última vez el registro PnP. |
InstanceId es la clave de join entre
InventoryDeviceContainer e InventoryDevicePnp: toma un
InstanceId de uno y encuentra la fila coincidente en el otro
para obtener tanto el nombre de cara al usuario como los IDs
técnicos.
Leer los dos juntos#
Un patrón limpio para "lista cada dispositivo que ha estado alguna vez en este host con nombre amigable, categoría e instancia PnP":
$containers = Import-Csv .\HOST_amcache_DeviceContainers.csv
$pnps = Import-Csv .\HOST_amcache_DevicePnps.csv
# Join por InstanceId donde esté presente
$containers | ForEach-Object {
$c = $_
$pnp = $pnps | Where-Object { $_.InstanceId -eq $c.InstanceId } | Select-Object -First 1
[pscustomobject]@{
FriendlyName = $c.FriendlyName
Categories = $c.Categories
Manufacturer = $c.Manufacturer
InstanceId = $c.InstanceId
BusDesc = $pnp.BusReportedDescription
Service = $pnp.Service
IsConnected = $c.IsConnected
LastSeen = $c.KeyLastWriteTimestamp
}
} | Sort-Object LastSeen -DescendingEsto produce una tabla por dispositivo que es dramáticamente más
fácil de escanear que las exportaciones crudas de Enum\USB.
Foco en almacenamiento masivo USB#
Para la pregunta clásica "¿se conectó una unidad USB a este host en $FECHA?", filtra a categorías de almacenamiento:
Import-Csv .\HOST_amcache_DeviceContainers.csv |
Where-Object {
$_.Categories -match 'Storage|Disk|USB.*Mass'
} |
Select-Object FriendlyName, ModelName, Manufacturer, IsConnected, KeyLastWriteTimestamp |
Sort-Object KeyLastWriteTimestamp -DescendingPara cada fila superviviente, cruza con Enum\USBSTOR para el
número de serie autoritativo y las marcas de tiempo de
primera-/última-conexión. Amcache te da una vista de triage
rápida; USBSTOR te da el detalle de calidad de evidencia.
Casos de uso investigativos#
Triage de exfiltración de datos por amenaza interna#
Un escenario común: sospechas que un empleado copió datos a una unidad USB antes de renunciar. La lista de dispositivos de Amcache te da una vista cronológica de cada dispositivo de almacenamiento que el host ha visto, típicamente durante muchos meses.
Patrón:
- Desde
DeviceContainers.csv, filtra a categorías de almacenamiento. - Ordena por
KeyLastWriteTimestampdescendente. - Identifica cualquier dispositivo cuyo tiempo de última-visto caiga en la ventana de sospecha.
- Pivota a
USBSTORpara el número de serie, luego a la historia de mount-point deNTUSER.DATpara ese serial para confirmar la cuenta de usuario que lo montó. - Cruza con marcas de tiempo de acceso del sistema de archivos para archivos de interés en la misma ventana.
Conexión no autorizada de periféricos#
Para entornos donde los periféricos están restringidos por
política (impresoras, dispositivos de audio, almacenamiento en
red), el InventoryDeviceContainer de Amcache es un escaneo
rápido para dispositivos no conformes:
Import-Csv .\HOST_amcache_DeviceContainers.csv |
Where-Object {
$_.Manufacturer -notmatch '^(YourCompany|YourApprovedVendor)' -and
$_.Categories -match 'Printer|Display'
} |
Select-Object FriendlyName, Manufacturer, Categories, KeyLastWriteTimestampAjusta la allowlist a tu entorno.
Historia de emparejamiento Bluetooth#
Las filas con DiscoveryMethod = BluetoothPairing muestran cada
dispositivo que fue emparejado por Bluetooth, con nombres
amigables. Útil para preguntas como "¿emparejó el usuario su
teléfono / auriculares personales / teclado personal?" en
entornos regulados.
Identificar dispositivos falsificados / desconocidos#
Una fila en DevicePnps.csv cuya BusReportedDescription sea
genérica ("USB Device", "Unknown Device") y cuyo Manufacturer
esté en blanco o sin marca, emparejada con una fila de
DeviceContainers.csv que no tenga FriendlyName, suele ser un
dispositivo HID malicioso o falsificado — una herramienta de
pen-test "BadUSB", un emulador de teclado sin marca o un
cable-de-datos malicioso.
Límites y advertencias#
KeyLastWriteTimestamp no es "primera conexión"#
Es "última actualización". Para un dispositivo que se conecta
regularmente, ves marcas de tiempo recientes. Para un dispositivo
que se conectó una vez hace un año, ves la marca de un año atrás.
Para marcas de tiempo de primera conexión, parsea
setupapi.dev.log.
No todos los dispositivos dejan una entrada en Amcache#
Los dispositivos que se conectan e inmediatamente se desconectan
entre corridas del appraiser pueden no ser inventariados nunca.
Para investigaciones de ventana corta de USB (segundos a
minutos), setupapi.dev.log y USBSTOR son más fiables.
Los nombres amigables están controlados por el vendor#
El FriendlyName es lo que el dispositivo le dice a Windows que
es. Un dispositivo USB malicioso puede afirmar ser "Microsoft
Wireless Mouse" y Windows muestra ese nombre. Empareja con
BusReportedDescription e inspección física.
Algunas categorías son ruidosas#
InventoryDeviceContainer registra dispositivos virtuales,
endpoints de audio de software y dispositivos internos de
plataforma junto a periféricos reales. Filtra por Categories y
por si IsPaired o Manufacturer está establecido para reducir
el ruido.
Ver también#
- Referencia completa de Amcache — el artefacto al completo.
- Estructura del registro Amcache
— dónde se sitúan
InventoryDeviceContainereInventoryDevicePnpen el hive. - Columnas de salida de AmcacheParser explicadas
— cada campo en
*_DeviceContainers.csvy*_DevicePnps.csv. - Amcache para investigación de malware — el playbook de triage centrado en binarios (empareja con historia de dispositivos para triage de host completo).
Para explorar la historia de dispositivos en tu propio hive sin instalar nada, suelta un archivo en la página de inicio del parser — se parsea enteramente en tu navegador.
Artículos relacionados
- Volatility y Amcache: extraer el hive de imágenes de memoria
Una guía práctica para recuperar Amcache de una imagen de memoria de Windows usando Volatility — cuándo la recuperación del lado de memoria es la única opción, qué plugins usar y cómo entregar a AmcacheParser.
- Plugin amcache de RegRipper: qué hace y cuándo usarlo
Una guía práctica del plugin amcache de RegRipper — qué parsea, en qué se diferencia su salida de texto del CSV de AmcacheParser y cuándo recurrir a él en lugar de (o junto con) la herramienta de Zimmerman.
- Las columnas de salida de AmcacheParser explicadas: cada campo CSV decodificado
Referencia campo por campo para la salida CSV de AmcacheParser — FileId, PathHash, ProgramId, LinkDate, BinFileVersion, IsPeFile y cualquier otra columna, con los pivotes que importan en DFIR.
- Guía de descarga de AmcacheParser: fuentes oficiales, mirrors y verificación
Todas las formas de descargar AmcacheParser de Eric Zimmerman — Get-ZimmermanTools, descarga directa, KAPE, Velociraptor — con verificación por suma de control y patrones de instalación en redes aisladas.