Skip to content

¿Quién usaba el Mac? Método con knowledgeC y Biome

Reconstruya las sesiones desbloqueadas de un Mac con los registros de bloqueo, pantalla, alimentación y apps de knowledgeC.db y Biome, y sepa qué no prueban.

Publicado el 9 min de lectura

Resumen. Para responder a "¿alguien usaba este Mac, y cuándo?", construya sesiones desbloqueadas a partir de /device/isLocked (0 = desbloqueado), contrástelas con /display/isBacklit y /device/isPluggedIn, y después rellene cada sesión con el foco de apps (Biome App.InFocus, knowledgeC /app/usage y /app/inFocus) y el uso web. Separe los registros sincronizados desde otros dispositivos, convierta a hora local con ZSECONDSFROMGMT y deje claro lo que los datos no prueban: muestran actividad bajo una cuenta, no la identidad de la persona ante el teclado.

Este artículo es el paso de interpretación de la serie. Para el recorrido por la herramienta, vea cómo analizar knowledgeC.db y Biome en el navegador; para los archivos en sí, la guía de análisis forense de knowledgeC.db.

La pregunta que se puede responder

knowledgeC.db y Biome registran eventos de "patrón de vida": estados a lo largo del tiempo (bloqueado, pantalla encendida, conectado a la corriente) y actividad de apps. Juntos responden a una pregunta más acotada que "¿quién?":

¿Durante qué intervalos estuvo este Mac desbloqueado con la pantalla encendida, y qué había en primer plano bajo esta cuenta?

Eso suele bastar para confirmar o descartar una cronología, y le indica dónde buscar en otros artefactos.

Los flujos

PreguntaknowledgeC.db (ZOBJECT.ZSTREAMNAME)Biome
¿Bloqueado o desbloqueado?/device/isLocked (ZVALUEINTEGER 1 bloqueado, 0 desbloqueado)
¿Pantalla encendida?/display/isBacklit (1 = encendida)Flujos de retroiluminación, si existen
¿Conectado a la corriente?/device/isPluggedIn (1 = conectado)
¿Qué app en primer plano?/app/usage, /app/inFocus (ZVALUESTRING = bundle ID)App.InFocus (estado 1 / 0, bundle ID)
¿Qué sitios?/app/webUsage, /safari/historyApp.WebUsage, Safari.*

El significado de los valores sigue a APOLLO y a la investigación publicada; los números de campo de Biome proceden de mac_apt y de iLEAPP (vea la referencia del formato SEGB). En las versiones recientes de macOS, el foco de apps pasa a Biome y /app/inFocus puede estar casi vacío o vacío: es lo esperado, no una señal de borrado (knowledgeC frente a Biome). No todos los Mac tienen todos los flujos, así que enumere los flujos presentes en su evidencia antes de planificar el análisis.

Recolecte knowledgeC.db-wal junto con la base de datos. Los eventos más recientes, que a menudo son los que importan, pueden existir solo en el WAL (recuperación del WAL de knowledgeC).

Paso 1: Construir las sesiones desbloqueadas

Los eventos de knowledgeC son intervalos con ZSTARTDATE y ZENDDATE en tiempo absoluto de Mac. Una sesión desbloqueada es un intervalo de /device/isLocked con valor 0:

SELECT datetime(o.ZSTARTDATE + 978307200, 'unixepoch') AS start_utc,
       datetime(o.ZENDDATE + 978307200, 'unixepoch') AS end_utc,
       datetime(o.ZSTARTDATE + o.ZSECONDSFROMGMT + 978307200, 'unixepoch') AS start_local,
       round(o.ZENDDATE - o.ZSTARTDATE) AS seconds,
       s.ZDEVICEID AS device_id
FROM ZOBJECT o LEFT JOIN ZSOURCE s ON o.ZSOURCE = s.Z_PK
WHERE o.ZSTREAMNAME = '/device/isLocked' AND o.ZVALUEINTEGER = 0
ORDER BY o.ZSTARTDATE;

Después, contraste cada sesión con /display/isBacklit. Un intervalo desbloqueado con la pantalla encendida es el núcleo de una sesión. Una pantalla encendida con el Mac bloqueado es alguien (o algo) que activa la pantalla sin desbloquear. /device/isPluggedIn aporta contexto: un portátil que pasa todo el día conectado a la corriente muy probablemente se quedó en su mesa, aunque eso no lo prueba.

Si falta /device/isLocked, los intervalos de retroiluminación junto con el foco de apps dan una aproximación más débil. Indíquelo en el informe.

Paso 2: Situar el foco de apps dentro de cada sesión

Biome App.InFocus guarda por separado registros "en primer plano" y "fuera de primer plano". Emparéjelos por app para obtener intervalos: un registro en primer plano termina en el siguiente registro fuera de primer plano del mismo bundle ID. Las filas de knowledgeC /app/usage y /app/inFocus ya son intervalos.

Lea el foco dentro de las sesiones desbloqueadas, nunca de forma aislada:

  • el foco durante una sesión desbloqueada y con la pantalla encendida es la señal de uso más fuerte que ofrecen estas fuentes;
  • el foco que continúa después de la hora de bloqueo es una app que se quedó delante, no actividad;
  • un único intervalo de foco largo sin ningún otro cambio puede ser una pantalla inactiva con una ventana abierta.

Paso 3: Añadir el uso web

/app/webUsage contiene el bundle ID con el dominio y la URL en ZSTRUCTUREDMETADATA; /safari/history guarda la URL, con el título en los metadatos. En Biome, App.WebUsage tiene URL, dominio y bundle ID. Examine los registros eliminados (estado 3) y los archivos de tombstone/: un historial borrado puede dejar registros de Biome marcados como eliminados con el payload todavía legible.

Paso 4: Separar los dispositivos sincronizados

Los dispositivos con la misma cuenta de Apple sincronizan algunos registros. No deben atribuirse al Mac:

  • en knowledgeC.db, agrupe las filas por ZSOURCE.ZDEVICEID (APOLLO lo interpreta como el UUID de hardware del dispositivo de origen);
  • en Biome, los archivos bajo .../<Stream>/remote/<device UUID>/ proceden de otro dispositivo; local/ es el propio Mac.

Los registros sincronizados siguen siendo útiles: muestran qué hacía el otro dispositivo al mismo tiempo.

Paso 5: Convertir a hora local con cuidado

Las horas guardadas están en UTC. ZSECONDSFROMGMT es el desfase que usaba el dispositivo en el momento de cada evento, así que start + ZSECONDSFROMGMT da la hora local de esa fila. Los registros de Biome no tienen esa columna: aplique el desfase que haya establecido a partir de knowledgeC o de los ajustes del sistema, y anote cuál usó. Un cambio de ZSECONDSFROMGMT entre eventos indica un cambio de zona horaria.

Ejemplo práctico: FIN-MBP-03 (sintético)

El ejemplo integrado es sintético y ficticio, generado para esta herramienta. MacBook FIN-MBP-03, usuaria dana.whitlock, lunes 2026-09-14. El desfase del Mac es +02:00 (ZSECONDSFROMGMT = 7200). En el escenario, Dana bloquea el Mac y sale a comer a las 11:58 hora local; la siguiente sesión habitual empieza a las 14:58 hora local.

UTCLocalFuenteObservación
09:58:0211:58/device/isLockedBloqueado: empieza la pausa para comer
10:04:3112:04/device/isLockedDesbloqueado; la pantalla se encendió unos diez segundos antes
10:05:1012:05App.InFocus, /app/webUsageSafari, files.example/dl/tools.zip
10:07:0212:07App.InFocusArchive Utility
10:08:0012:08App.InFocusTerminal: ningún foco anterior de Terminal en los datos conservados
10:12:1012:12App.InFocus, App.MenuItemAjustes del Sistema; elementos de menú con los textos Privacy & Security y Full Disk Access
10:31:2012:31App.InFocus, App.MenuItemFinder; un elemento de menú con el texto Eject "EXFIL"
10:38:1012:38App.WebUsageSafari, transfer.example/upload
10:48:3012:48App.WebUsageLos registros de transfer.example marcados como eliminados (estado 3), con el payload intacto
10:49:3812:49/device/isLockedBloqueado

Otras dos observaciones cambian la lectura:

  • Registros sincronizados del iPhone. App.InFocus bajo remote/<iPhone UUID>/ y filas de knowledgeC con otro ZDEVICEID muestran Maps de 10:12 a 10:19 UTC y Messages de 10:27 a 10:29 UTC. No son actividad del Mac. Son coherentes con que Dana usara su teléfono en otro lugar, lo que encaja con el escenario, pero no prueban dónde estaba: otra persona podría tener su teléfono, o ella podría usar ambos dispositivos.
  • Una sesión nocturna. Un desbloqueo de tres minutos a las 01:12 UTC, 03:12 hora local, con Safari en files.example. Es la conversión a hora local lo que la hace destacar.

Los valores de App.MenuItem proceden de una decodificación sin esquema: el flujo no tiene un mapa de campos público, así que la tabla cita las cadenas visibles y no asigna significado a los números de campo. En el ejemplo, todas las filas posteriores a las 10:00 UTC de la knowledgeC.db del sistema existen solo en el -wal: sin él, la ventana del incidente está vacía.

Lo que esto respalda: el Mac estuvo desbloqueado bajo dana.whitlock de 10:04:31 a 10:49:38 UTC con la pantalla encendida, y la secuencia de apps y sitios anterior estuvo en primer plano. Lo que no respalda por sí solo: que Dana, o una persona concreta, estuviera ante el teclado.

Lo que los datos no prueban

  • Identidad. Los registros pertenecen a una cuenta y a un dispositivo. Una contraseña compartida, un Mac desbloqueado y desatendido o un control remoto producen los mismos registros.
  • Atención. Una app en primer plano delante de una pantalla inactiva parece uso.
  • Exhaustividad. La retención es de unas cuatro semanas en knowledgeC (Sarah Edwards) y de unos 28 días para la mayoría de los flujos de Biome (investigación sobre iOS); mida el registro más antiguo de cada flujo en su evidencia. "Primer uso" significa "primer uso en los datos conservados".
  • Intención. Una visita web o un elemento de menú dicen qué había en pantalla, no por qué.

Corroborar con otros artefactos

Use estas sesiones como esqueleto y busque apoyo independiente en las mismas ventanas:

  • Unified logs: entradas relacionadas con el inicio de sesión y el bloqueo de pantalla en torno a los bordes de la sesión, dentro de la retención de los logs.
  • TCC.db: registros de permisos, por ejemplo un cambio de «Acceso total al disco» cerca del intervalo de Ajustes del Sistema.
  • Eventos de cuarentena: descargas y su origen, por ejemplo el archivo comprimido descargado en Safari.
  • FSEvents: cambios en el sistema de archivos, por ejemplo en un volumen externo durante el intervalo de Finder.

Cada uno tiene sus propias salvedades; trátelos como corroboración, y deje que las pruebas del mundo físico (tarjetas de acceso, cámaras, testigos) aborden la identidad.

Lista de comprobación para el informe

  • Flujos presentes, registro más antiguo y más reciente de cada flujo, y si se recolectaron los archivos -wal.
  • Sesiones desbloqueadas con horas UTC y locales y el desfase utilizado.
  • Actividad de foco y web por sesión, con los registros de dispositivos sincronizados separados.
  • Registros de Biome eliminados, de tombstone y con CRC fallido, identificados como tales.
  • Una frase que indique que los datos muestran actividad de una cuenta, no identidad.

Preguntas frecuentes

¿Puede knowledgeC.db probar quién usaba un Mac?

No. Muestra que el Mac estaba desbloqueado, que la pantalla estaba encendida y qué apps estaban en primer plano, bajo una cuenta de usuario concreta. No identifica a la persona que estaba ante el teclado. La atribución requiere otras pruebas, como registros de acceso con tarjeta, CCTV, declaraciones de testigos o registros de autenticación.

¿Qué flujos de knowledgeC muestran cuándo estaba desbloqueado un Mac?

/device/isLocked, donde ZVALUEINTEGER 0 marca un intervalo desbloqueado y 1 uno bloqueado, junto con /display/isBacklit (1 = encendida). No todos los Mac tienen todos los flujos, así que compruebe primero cuáles existen en su evidencia.

¿Por qué aparecen apps de iPhone en la knowledgeC.db o en la carpeta de Biome de un Mac?

Los dispositivos con la misma cuenta de Apple pueden sincronizar registros. En knowledgeC.db llevan un ZSOURCE.ZDEVICEID distinto; en Biome están en remote/<device UUID>. Describen el otro dispositivo, no el Mac examinado.

¿Una app en primer plano prueba que alguien la estaba usando?

No. Una app sigue en primer plano delante de una pantalla inactiva hasta que otra toma el foco o la pantalla se bloquea. Contraste los intervalos de foco con los intervalos de bloqueo y de retroiluminación y con la actividad dentro de la app.

Artículos relacionados

Artículos relacionados

Paso a paso: cargue knowledgeC.db con su -wal y los flujos SEGB de Biome en un parser gratuito en el navegador, fije un rango, revise sesiones y exporte.
Qué registra knowledgeC.db en macOS, dónde está, cómo funcionan ZOBJECT y sus flujos, cómo convertir sus marcas de tiempo y qué no demuestran los datos.
¿knowledgeC.db o Biome? En qué se diferencian los dos almacenes de actividad de macOS, qué flujo de Biome equivale a cada flujo de knowledgeC y qué esperar hoy.