Skip to content

Analyse forensique des fichiers .job : C:\Windows\Tasks

Lire les fichiers .job hérités : sections fixe et variable de MS-TSCH, déclencheurs, SYSTEMTIME de dernière exécution en heure locale, présence sur Windows récent.

Publié le 6 min de lecture

En bref. Les fichiers .job sont le format du Planificateur de tâches 1.0, rangés dans C:\Windows\Tasks. Microsoft les spécifie dans MS-TSCH : une section fixe de 68 octets (versions, UUID du job, priorité, statut, flags, heure de dernière exécution sous forme de SYSTEMTIME) et une section variable (commande, paramètres, répertoire de travail, auteur, commentaire, déclencheurs). Ils sont rares sur les Windows récents, et c'est précisément pour cela qu'un fichier .job qui y apparaît mérite de l'attention.

Cet article fait partie de la série sur les fondamentaux qui commence avec le guide d'analyse forensique des tâches planifiées.

D'où viennent les fichiers .job

ÉpoqueStockage principal des tâchesFichiers .job
Windows 2000, XP, Server 2003C:\Windows\Tasks\*.jobToutes les tâches
Vista, 7, Server 2008 (R2)XML dans System32\Tasks + TaskCacheLes tâches créées via l'API 1.0 ou at.exe peuvent aussi recevoir un .job pour compatibilité
Windows 8 et ultérieursXML + TaskCachePeu courants ; at.exe est déprécié au profit de schtasks

La présentation de Cyber Triage décrit la même évolution. Sur une machine Windows 10 ou 11, un fichier .job signifie donc l'une de ces trois choses : une très vieille application qui utilise encore l'interface 1.0, un reliquat d'une mise à niveau sur place, ou l'usage délibéré d'outils hérités. Aucune n'est malveillante en soi ; toutes méritent une explication.

La cible KapeFiles ScheduledTasks collecte C:\Windows\Tasks\*.job et son équivalent dans Windows.old, ainsi que SchedLgU.txt, le journal texte du planificateur 1.0.

La section de longueur fixe

MS-TSCH la nomme FIXDLEN_DATA. La documentation du format Job file de libyal la décrit sur 68 octets :

OffsetTailleChampIntérêt forensique
02Version du produitOS qui a écrit le fichier (par ex. 0x0501 XP, 0x0600 Vista, 0x0a00 Windows 10)
22Version du format de fichier
416UUID du jobUnique pour chaque job
202Offset du nom d'applicationDébut de la section variable
222Offset des déclencheurs
244Nombre et intervalle de nouvelles tentatives en cas d'erreur
284Délai et attente d'inactivité
324Classe de prioritéNormale, haute, inactive, temps réel
364Durée maximale d'exécution (ms)
404Code de sortieDernier code de sortie du programme
444StatutPrêt, en cours, désactivé, jamais exécuté...
484FlagsContient notamment les bits désactivé et caché
5216Heure de dernière exécutionSYSTEMTIME

La version du produit permet un contrôle rapide de provenance : un fichier .job présent sur une machine Windows 10 dont la version du produit indique XP a probablement été copié depuis ailleurs plutôt que créé localement.

L'heure de dernière exécution

L'heure de dernière exécution est un SYSTEMTIME (année, mois, jour de la semaine, jour, heure, minute, seconde, milliseconde), et non un FILETIME. Elle ne porte aucun fuseau horaire. On la traite généralement comme une heure locale, et la documentation de libyal indique explicitement que ce point reste à confirmer. Consignez-la telle qu'elle est stockée, énoncez l'hypothèse, et corroborez-la avec une autre source avant d'en faire la base d'une chronologie. Une valeur nulle signifie que le job ne s'est jamais exécuté.

La section de longueur variable

Après la section fixe viennent, dans l'ordre :

  1. Le nombre d'instances en cours d'exécution.
  2. Le nom de l'application (la commande), en UTF-16 précédé de sa longueur.
  3. Les paramètres.
  4. Le répertoire de travail.
  5. L'auteur.
  6. Le commentaire.
  7. Les données utilisateur et les données réservées (blobs opaques).
  8. Les déclencheurs : un compteur, puis des enregistrements de taille fixe avec date de début, date de fin, heure de début, durée, intervalle, flags et un type (une fois, quotidien, hebdomadaire, mensuel, en cas d'inactivité, au démarrage, à l'ouverture de session).
  9. Éventuellement, une signature du job.

Les déclencheurs stockent les dates sous forme de mots séparés pour l'année, le mois et le jour, sans fuseau horaire. Même réserve que plus haut : heure locale par convention.

Lire un fichier .job en pratique

Voici ce que le Scheduled Tasks Parser extrait de chaque fichier .job : la commande, les paramètres, le répertoire de travail, l'auteur, le commentaire, les flags (désactivé, caché), le statut, le code de sortie, les déclencheurs avec leurs dates de début et de fin, et l'heure de dernière exécution telle que stockée, étiquetée comme locale. Les lignes .job apparaissent aux côtés des tâches XML et TaskCache, et sont signalées comme actions héritées pour ressortir sur un système moderne.

Les questions à se poser pour chaque fichier :

  • La commande se trouve-t-elle dans un chemin accessible en écriture par l'utilisateur ? Même règle que pour les tâches XML, voir détecter les tâches planifiées malveillantes.
  • L'auteur correspond-il à un compte réel ? Comme l'Author du XML, c'est du texte libre.
  • Existe-t-il une tâche XML correspondante ? Sous Vista et 7, un job enregistré via la couche de compatibilité devrait en avoir une. Un .job sans XML ni entrée TaskCache n'a pas été enregistré par le service actuel, ou a été partiellement nettoyé.
  • Les horodatages du système de fichiers concordent-ils ? Les horodatages $MFT du fichier .job, et de C:\Windows\Tasks lui-même, encadrent sa création et sa dernière modification. Le planificateur met à jour le fichier quand le job s'exécute, si bien que l'heure de modification suit souvent l'heure de dernière exécution. Un journal USN peut montrer quand le fichier a été créé ou supprimé.

Outils hérités et détections modernes

at.exe existe toujours sur les Windows actuels pour la rétrocompatibilité, mais il est déprécié ; Microsoft renvoie vers schtasks. Voir at.exe dans des traces d'exécution (Prefetch, Amcache) sur un poste de travail moderne est inhabituel, et doit vous amener à examiner C:\Windows\Tasks et TaskCache à la recherche de noms de tâches du type At1.

FAQ

Qu'est-ce qu'un fichier .job ?

Un fichier binaire de tâche planifiée utilisé par le Planificateur de tâches 1.0, stocké dans C:\Windows\Tasks. Microsoft documente le format dans MS-TSCH : une section de longueur fixe suivie d'une section de longueur variable contenant la commande, les arguments, l'auteur, le commentaire et les déclencheurs.

Windows 10 et 11 utilisent-ils encore les fichiers .job ?

Rarement. Les tâches modernes reposent sur le XML et TaskCache. Un fichier .job peut encore apparaître pour des tâches enregistrées via les interfaces héritées du Planificateur de tâches 1.0 ou la commande at, dépréciée, ainsi que sur des systèmes mis à niveau depuis d'anciennes versions. Collectez quand même C:\Windows\Tasks.

L'heure de dernière exécution d'un fichier .job est-elle en UTC ?

Elle est stockée sous forme de structure SYSTEMTIME sans information de fuseau horaire, et on considère généralement qu'il s'agit de l'heure locale. La documentation de libyal indique encore ce point comme à confirmer : corroborez-le avant de vous appuyer dessus.

Articles liés

Pas à pas : chargez XML, fichiers .job et ruche SOFTWARE dans un parser gratuit, lisez tâches cachées et registre seul, corrigez le fuseau et exportez. Cas fictif.
Checklist pour repérer les tâches planifiées malveillantes : chemins inscriptibles, PowerShell encodé, LOLBins, SYSTEM, tâches cachées, écarts XML/registre.
Ce que la clé TaskCache de la ruche SOFTWARE stocke pour chaque tâche planifiée : Id/Index/SD, DynamicInfo, blobs Actions et Triggers, et Hash.