Análisis forense de archivos .job en C:\Windows\Tasks
Cómo leer los archivos .job heredados: secciones fija y variable de MS-TSCH, desencadenadores, la última ejecución en SYSTEMTIME local y su presencia en Windows actual.
Resumen. Los archivos .job son el formato del Programador de tareas 1.0 y se guardan en C:\Windows\Tasks. Microsoft los especifica en MS-TSCH: una sección fija de 68 bytes (versiones, UUID del job, prioridad, estado, flags, hora de última ejecución como SYSTEMTIME) y una sección variable (comando, parámetros, directorio de trabajo, autor, comentario, desencadenadores). Son poco frecuentes en Windows moderno, y precisamente por eso merece atención que aparezca uno.
Este artículo forma parte de la serie de fundamentos que empieza con la guía de análisis forense de tareas programadas.
De dónde salen los archivos .job
| Época | Almacén principal de tareas | Archivos .job |
|---|---|---|
| Windows 2000, XP, Server 2003 | C:\Windows\Tasks\*.job | Todas las tareas |
| Vista, 7, Server 2008 (R2) | XML en System32\Tasks + TaskCache | Las tareas creadas mediante la API 1.0 o at.exe también pueden tener un .job por compatibilidad |
| Windows 8 y posteriores | XML + TaskCache | Poco habituales; at.exe está obsoleto en favor de schtasks |
El resumen de Cyber Triage describe la misma evolución. En un equipo con Windows 10 u 11, un archivo .job indica por tanto una de estas situaciones: una aplicación muy antigua que sigue usando la interfaz 1.0, un resto de una actualización in situ o el uso deliberado de herramientas heredadas. Ninguna es maliciosa por sí misma; todas merecen una explicación.
El target ScheduledTasks de KapeFiles recopila C:\Windows\Tasks\*.job y su equivalente en Windows.old, junto con SchedLgU.txt, el registro de texto del programador 1.0.
La sección de longitud fija
MS-TSCH la llama FIXDLEN_DATA. La documentación del formato Job de libyal la describe con 68 bytes:
| Desplazamiento | Tamaño | Campo | Uso forense |
|---|---|---|---|
| 0 | 2 | Versión del producto | Sistema operativo que escribió el archivo (p. ej. 0x0501 XP, 0x0600 Vista, 0x0a00 Windows 10) |
| 2 | 2 | Versión del formato de archivo | |
| 4 | 16 | UUID del job | Único para cada job |
| 20 | 2 | Desplazamiento del nombre de aplicación | Dónde empieza la sección variable |
| 22 | 2 | Desplazamiento de los desencadenadores | |
| 24 | 4 | Número de reintentos tras error e intervalo | |
| 28 | 4 | Plazo y espera de inactividad | |
| 32 | 4 | Clase de prioridad | Normal, alta, inactiva, tiempo real |
| 36 | 4 | Tiempo máximo de ejecución (ms) | |
| 40 | 4 | Código de salida | Último código de salida del programa |
| 44 | 4 | Estado | Lista, en ejecución, deshabilitada, no se ha ejecutado... |
| 48 | 4 | Flags | Incluye los bits de deshabilitada y oculta |
| 52 | 16 | Hora de última ejecución | SYSTEMTIME |
La versión del producto sirve para comprobar rápidamente la procedencia: un archivo .job en un equipo con Windows 10 cuya versión de producto indica XP probablemente se copió desde otro sitio en lugar de crearse localmente.
La hora de última ejecución
La hora de última ejecución es un SYSTEMTIME (año, mes, día de la semana, día, hora, minuto, segundo, milisegundo), no un FILETIME. No lleva zona horaria. En general se trata como hora local, y la documentación de libyal indica expresamente que esto está pendiente de confirmar. Anótela tal como está almacenada, explicite la suposición y corrobórela con otra fuente antes de construir una cronología sobre ella. Un valor cero significa que el job nunca se ha ejecutado.
La sección de longitud variable
Tras la sección fija vienen, en este orden:
- Número de instancias en ejecución.
- Nombre de la aplicación (el comando), en UTF-16 precedido de su longitud.
- Parámetros.
- Directorio de trabajo.
- Autor.
- Comentario.
- Datos de usuario y datos reservados (blobs opacos).
- Desencadenadores: un recuento y después registros de desencadenador de tamaño fijo con fecha de inicio, fecha de fin, hora de inicio, duración, intervalo, flags y un tipo (una vez, diario, semanal, mensual, en inactividad, al iniciar, al iniciar sesión).
- Opcionalmente, una firma del job.
Los desencadenadores guardan las fechas como palabras separadas de año, mes y día, sin zona horaria. La misma advertencia que antes: hora local por convención.
Leer un archivo .job en la práctica
Esto es lo que el Scheduled Tasks Parser extrae de cada archivo .job: el comando, los parámetros, el directorio de trabajo, el autor, el comentario, los flags (deshabilitada, oculta), el estado, el código de salida, los desencadenadores con sus fechas de inicio y fin, y la hora de última ejecución tal como está almacenada, etiquetada como local. Las filas .job aparecen junto a las tareas XML y de TaskCache, y se marcan como acciones heredadas para que destaquen en un sistema moderno.
Preguntas que conviene hacerse ante cada archivo:
- ¿El comando está en una ruta en la que el usuario puede escribir? La misma regla que para las tareas XML; consulte detectar tareas programadas maliciosas.
- ¿El autor corresponde a una cuenta real? Igual que el
Authordel XML, es texto libre. - ¿Hay una tarea XML equivalente? En Vista y 7, un job registrado a través de la capa de compatibilidad debería tenerla. Un
.jobsin XML ni entrada en TaskCache no lo registró el servicio actual, o se limpió solo en parte. - ¿Concuerdan las marcas de tiempo del sistema de archivos? Las horas
$MFTdel archivo.job, y de la propia carpetaC:\Windows\Tasks, acotan su creación y su última modificación. El programador actualiza el archivo cuando el job se ejecuta, así que la hora de modificación suele seguir a la de última ejecución. Un diario USN puede mostrar cuándo se creó o se borró el archivo.
Herramientas heredadas y detecciones modernas
at.exe sigue existiendo en las versiones actuales de Windows por compatibilidad con versiones anteriores, pero está obsoleto; Microsoft remite a schtasks en su lugar. Encontrar at.exe en las evidencias de ejecución de procesos (Prefetch, Amcache) en una estación de trabajo moderna es poco habitual, y debería llevarle a revisar C:\Windows\Tasks y TaskCache en busca de nombres de tarea del tipo At1.
Preguntas frecuentes
¿Qué es un archivo .job?
Un archivo binario de tarea programada que usa el Programador de tareas 1.0, almacenado en C:\Windows\Tasks. Microsoft documenta el formato en MS-TSCH como una sección de longitud fija seguida de una sección de longitud variable con el comando, los argumentos, el autor, el comentario y los desencadenadores.
¿Siguen usando Windows 10 y 11 archivos .job?
Rara vez. Las tareas modernas son XML más TaskCache. Aun así, puede aparecer un archivo .job en tareas registradas mediante las interfaces heredadas del Programador de tareas 1.0 o el comando at, ya obsoleto, y en sistemas actualizados desde versiones antiguas. Recopile C:\Windows\Tasks de todos modos.
¿La hora de última ejecución de un archivo .job está en UTC?
Se almacena como una estructura SYSTEMTIME sin información de zona horaria y en general se entiende que es hora local. La documentación de libyal todavía lo marca como pendiente de confirmar, así que corrobórelo antes de basarse en ello.