Saltar al contenido

Actividad del usuarioEjecución

knowledgeC.db: uso de apps y actividad del Mac

Base de datos SQLite de CoreDuet que registra uso de apps, foco, pantalla y alimentación en macOS: muestra cuándo y cuánto tiempo se usó cada app.

Ubicación
/private/var/db/CoreDuet/Knowledge/knowledgeC.db
Prueba
Qué apps estaban en uso, cuándo y durante cuánto tiempo, y si la pantalla estaba encendida en ese momento
Marcas de tiempo
Mac absolute time (segundos desde 2001-01-01 UTC), más el desfase ZSECONDSFROMGMT
Acceso
root más las restricciones de SIP (BD del sistema); Full Disk Access (BD del usuario)
Retención
Unas cuatro semanas de eventos en sistemas típicos (varía según el flujo)
Adquisición
UAC, Disk image, cp

Qué es

knowledgeC.db es una base de datos SQLite escrita por el framework CoreDuet de Apple. Registra eventos de "patrón de vida" como intervalos: una aplicación en uso, la pantalla encendida, el Mac conectado a la corriente, un dominio web visitado y más. Cada evento pertenece a un flujo con nombre, como /app/usage, y lleva una hora de inicio y otra de fin, por eso responde a preguntas de duración que las marcas de tiempo del sistema de archivos no pueden resolver.

La base de datos es un almacén de Core Data, así que tablas y columnas llevan el prefijo Z. En las versiones recientes de macOS, Apple ha trasladado muchos flujos a Biome, de modo que un knowledgeC.db moderno puede estar casi vacío. Examina siempre los dos.

Dónde se encuentra

ÁmbitoRutaProtección
Sistema/private/var/db/CoreDuet/Knowledge/knowledgeC.dbPertenece a root, restringido por SIP. UAC documenta que solo recopila este archivo en vivo cuando SIP está desactivado
Usuario~/Library/Application Support/Knowledge/knowledgeC.dbProtegido por TCC: el proceso de adquisición necesita Full Disk Access

Ambas bases de datos funcionan en modo WAL. Recopila knowledgeC.db-wal y knowledgeC.db-shm junto con el archivo principal: los eventos más recientes a menudo solo están en el WAL.

Qué prueba

  • Qué bundle IDs estaban en uso (/app/usage) o en primer plano (/app/inFocus) y durante cuántos segundos.
  • Cuándo estaba encendida la pantalla (/display/isBacklit) y cuándo estaba el Mac conectado a la corriente (/device/isPluggedIn).
  • Uso web y multimedia por app (/app/webUsage, /app/mediaUsage) y entradas del historial de Safari (/safari/history) cuando esos flujos existen.
  • Actividad de otros dispositivos con la misma Apple Account, cuando hay filas sincronizadas (ver consejos).

No prueba que una persona concreta estuviera ante el teclado, y no registra nombres de archivo ni líneas de comandos. Una app "en uso" puede ser una ventana abierta delante de una pantalla inactiva.

Campos clave

Tabla principal ZOBJECT (una fila por evento):

ColumnaSignificado
ZSTREAMNAMEFlujo, p. ej. /app/usage, /display/isBacklit
ZVALUESTRINGValor de texto principal, normalmente un bundle ID o una URL
ZVALUEINTEGER / ZVALUEDOUBLEValor numérico para flujos booleanos o de medida (1 = activo)
ZSTARTDATE / ZENDDATEInicio y fin del intervalo
ZCREATIONDATEMomento en que se escribió la fila
ZSECONDSFROMGMTDesfase UTC del dispositivo en segundos en el momento del evento
ZSTARTDAYOFWEEKDía de la semana, 1 = domingo
ZUUIDUUID del evento
ZSOURCEClave foránea a ZSOURCE.Z_PK
ZSTRUCTUREDMETADATAClave foránea a ZSTRUCTUREDMETADATA.Z_PK

ZSOURCE describe al productor; APOLLO interpreta ZSOURCE.ZDEVICEID como el UUID de hardware del dispositivo de origen. ZSTRUCTUREDMETADATA contiene columnas adicionales específicas de cada flujo que varían según la versión.

Los flujos que cubren los módulos de APOLLO para macOS incluyen /app/usage, /app/inFocus, /app/activity, /app/intents, /app/webUsage, /app/mediaUsage, /safari/history, /display/isBacklit, /device/isPluggedIn, /device/isLocked y /bluetooth/isConnected. No todos los Mac tienen todos los flujos.

Marcas de tiempo

ZSTARTDATE, ZENDDATE y ZCREATIONDATE están en Mac absolute time: segundos (a menudo con decimales) desde 2001-01-01 00:00:00 UTC. Suma 978307200 para obtener segundos Unix. Los valores almacenados están en UTC; ZSECONDSFROMGMT indica el desfase local que usaba el dispositivo.

SELECT datetime(ZSTARTDATE + 978307200, 'unixepoch') AS start_utc,
       datetime(ZSTARTDATE + ZSECONDSFROMGMT + 978307200, 'unixepoch') AS start_local
FROM ZOBJECT LIMIT 5;
date -u -r $((694224000 + 978307200))   # macOS date: Mac absolute 694224000 -> UTC

Retención

Sarah Edwards (mac4n6) documentó aproximadamente cuatro semanas de eventos en ZOBJECT. La depuración se hace por flujo y depende de la versión, así que mídela sobre la evidencia: el ZSTARTDATE más antiguo de cada flujo es la ventana de retención efectiva y debe figurar en tu informe.

Adquisición

En vivo, con Full Disk Access concedido a Terminal o a la herramienta de adquisición:

mkdir -p case/knowledgec_user
cp -p ~/Library/Application\ Support/Knowledge/knowledgeC.db* case/knowledgec_user/
shasum -a 256 case/knowledgec_user/*
  • UAC tiene un artefacto knowledgec para ambas rutas, pero solo recopila knowledgeC.db, sin los archivos -wal y -shm; sus propias notas indican que la copia del sistema solo se recopila con SIP desactivado. No desactives SIP para obtenerla: es preferible una imagen completa del disco o del volumen Data y extraer de ella /private/var/db/CoreDuet/Knowledge/.
  • mac_apt puede exportar archivos desde una imagen; abre la copia, nunca el original, porque abrir una base de datos WAL en su sitio puede hacer un checkpoint y modificarla.

Análisis

  • APOLLO ejecuta módulos SQL (knowledge_app_usage, knowledge_app_inFocus, knowledge_device_is_backlit, etc.) y los fusiona en una línea de tiempo:
python3 apollo.py extract -o csv -p apple -v yolo -k modules/ case/knowledgec_user/
  • Plaso incluye el plugin SQLite mac_knowledgec (--parsers sqlite/mac_knowledgec).
  • SQL directo: primero enumera los flujos y después consulta:
SELECT ZSTREAMNAME, COUNT(*),
       datetime(MIN(ZSTARTDATE)+978307200,'unixepoch') AS first_utc,
       datetime(MAX(ZSTARTDATE)+978307200,'unixepoch') AS last_utc
FROM ZOBJECT GROUP BY ZSTREAMNAME ORDER BY 2 DESC;

SELECT datetime(o.ZSTARTDATE+978307200,'unixepoch') AS start_utc,
       o.ZENDDATE - o.ZSTARTDATE AS seconds,
       o.ZVALUESTRING AS bundle_id,
       s.ZDEVICEID AS device_id
FROM ZOBJECT o LEFT JOIN ZSOURCE s ON o.ZSOURCE = s.Z_PK
WHERE o.ZSTREAMNAME = '/app/usage'
ORDER BY o.ZSTARTDATE;

KnowledgeC Parser lee en el navegador knowledgeC.db con su -wal aplicado (señala las filas que solo existen en el WAL) y los flujos Biome SEGB, con sesiones, totales por app y exportación CSV o Timesketch; no se sube nada.

Consejos para la investigación

  • Revisa .schema ZOBJECT y .schema ZSOURCE antes de lanzar consultas predefinidas; las columnas cambian entre versiones.
  • Un /app/inFocus escaso o vacío en un Mac reciente es lo esperado, no una prueba de borrado. Busca en Biome (App.InFocus) antes de sacar conclusiones. Consulta knowledgeC and Biome.
  • Agrupa los eventos por ZSOURCE.ZDEVICEID: las filas sincronizadas desde un iPhone u otro Mac con la misma cuenta no deben atribuirse al equipo examinado.
  • Cruza los intervalos de apps con /display/isBacklit y con los inicios de sesión de los Unified Logs: una app en primer plano con la pantalla apagada es una prueba débil de uso.
  • La falta de los archivos -wal es la causa más habitual de "no hay actividad reciente". Indica en tu informe si se recopilaron.
  • Un ZSECONDSFROMGMT que cambia entre eventos es un indicador útil de viaje o de cambio de zona horaria.
  • Correlaciona con los totales de uso de Screen Time y con el historial de notificaciones.

Ver también