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.DAT por 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 -Descending

Esto 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 -Descending

Para 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:

  1. Desde DeviceContainers.csv, filtra a categorías de almacenamiento.
  2. Ordena por KeyLastWriteTimestamp descendente.
  3. Identifica cualquier dispositivo cuyo tiempo de última-visto caiga en la ventana de sospecha.
  4. Pivota a USBSTOR para el número de serie, luego a la historia de mount-point de NTUSER.DAT para ese serial para confirmar la cuenta de usuario que lo montó.
  5. 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, KeyLastWriteTimestamp

Ajusta 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#

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

Volver a todos los artículos