> Windows Syscalls
ntoskrnl.exeT1106T1564

NtCreateJobObject

Erzeugt ein Job Object — den Kernel-Container für Limits, Accounting und Beendigungs-Policy einer Menge von Prozessen.

Prototyp

NTSTATUS NtCreateJobObject(
  PHANDLE            JobHandle,
  ACCESS_MASK        DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes
);

Argumente

NameTypeDirDescription
JobHandlePHANDLEoutErhält das Handle des neu erzeugten Job Objects bei Erfolg.
DesiredAccessACCESS_MASKinZugriffsrechte für das zurückgegebene Handle, typischerweise JOB_OBJECT_ALL_ACCESS für Eigentümer.
ObjectAttributesPOBJECT_ATTRIBUTESinOptionaler Name und Attribute; NULL erzeugt ein anonymes Job (am häufigsten beim Sandboxing).

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070xA1win10-1507
Win10 16070xA3win10-1607
Win10 17030xA6win10-1703
Win10 17090xA7win10-1709
Win10 18030xA8win10-1803
Win10 18090xA8win10-1809
Win10 19030xA9win10-1903
Win10 19090xA9win10-1909
Win10 20040xADwin10-2004
Win10 20H20xADwin10-20h2
Win10 21H10xADwin10-21h1
Win10 21H20xAEwin10-21h2
Win10 22H20xAEwin10-22h2
Win11 21H20xB1win11-21h2
Win11 22H20xB2win11-22h2
Win11 23H20xB2win11-23h2
Win11 24H20xB4win11-24h2
Server 20160xA3winserver-2016
Server 20190xA8winserver-2019
Server 20220xB0winserver-2022
Server 20250xB4winserver-2025

Kernel-Modul

ntoskrnl.exeNtCreateJobObject

Verwandte APIs

CreateJobObjectWOpenJobObjectWIsProcessInJobNtAssignProcessToJobObjectNtSetInformationJobObjectNtQueryInformationJobObject

Syscall-Stub

4C 8B D1            mov r10, rcx
B8 B4 00 00 00      mov eax, 0xB4
F6 04 25 08 03 FE 7F 01   test byte ptr [0x7FFE0308], 1
75 03               jne short +3
0F 05               syscall
C3                  ret
CD 2E               int 2Eh
C3                  ret

Undokumentierte Hinweise

NtCreateJobObject allokiert eine `_EJOB`-Kernelstruktur und gibt ein Handle zurück. Für sich genommen tut sie nichts Beobachtbares: das Objekt wird sinnvoll, sobald Prozesse via NtAssignProcessToJobObject zugewiesen werden und Policy über NtSetInformationJobObject angewendet wird. Job Objects sind das Fundament des Windows-Sandboxings — Chromium-/Edge-Renderer, AppContainer / Windows Sandbox und das moderne Win32-Kindprozess-Management bauen alle auf Jobs auf. Verschachtelte Jobs (Win8+) erlauben es, Policies zu schichten, ohne frühere Zuweisungen zu brechen. Die SSN driftet alle paar Feature-Updates.

Häufige Malware-Nutzung

Fast vollständig harmlos. Das interessante Offensivmuster ist das Umgekehrte — aus einem Job *ausbrechen* via PROCESS_CREATE_FLAGS_BREAKAWAY_FROM_JOB beim Kindprozess-Spawn (sofern der Job es zulässt) oder den kontrollierenden Prozess beenden, damit die JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE-Policy zuschlägt und Spuren beseitigt. Wenige Red-Team-Tools erzeugen einen eigenen Job, um JobObjectExtendedLimitInformation mit JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE auf einen Stager anzuwenden, der sich selbst zerstört, sobald das Implant verschwindet. Schwaches Offensiv-Signal — auf einem gesunden System sind Jobs überall.

Erkennungs­möglichkeiten

Sysmon hat heute kein eigenes Event für Job Objects. Brauchbare Telemetrie kommt aus ETW Microsoft-Windows-Kernel-Process (Process-Start-Records geben die Job-ID über TokenInformation aus) und aus EDR-Hooks auf ntdll!NtCreateJobObject in Kombination mit ntdll!NtAssignProcessToJobObject. Der Blue-Team-Blickwinkel ist nicht „wer hat ein Job erzeugt" (das tun alle), sondern „wer hat ein Job erzeugt, das einen Prozess enthält, den er nicht selbst gestartet hat" — Hinweis auf versuchte Einschließung oder Beendigungskontrolle. In Kombination mit NtSetInformationJobObject(JobObjectExtendedLimitInformation) auf KILL_ON_JOB_CLOSE bei ungewöhnlichen Jobs flaggen.

Direkte Syscall-Beispiele

asmx64 direct stub (Win11 24H2 SSN)

; Direct syscall stub for NtCreateJobObject (SSN 0xB4 on Win11 24H2 / Server 2025)
NtCreateJobObject PROC
    mov  r10, rcx          ; syscall convention
    mov  eax, 0B4h         ; SSN for win11-24h2
    syscall
    ret
NtCreateJobObject ENDP

cSandbox-spawn skeleton (step 1 — create the job)

// First step of a sandboxed child-process pattern.
// Pair with NtAssignProcessToJobObject + NtSetInformationJobObject to fully wire it up.
HANDLE hJob = NULL;
NTSTATUS s = NtCreateJobObject(&hJob,
                               JOB_OBJECT_ALL_ACCESS,
                               NULL);   // anonymous, unnamed
if (!NT_SUCCESS(s)) return s;

// At this point hJob is empty; nothing happens to any process until
// NtAssignProcessToJobObject(hJob, hChild) is called.

rustwindows-sys + naked syscall stub

// Cargo: windows-sys = "0.59"  (Win32_System_JobObjects)
use std::arch::asm;

#[unsafe(naked)]
unsafe extern "system" fn nt_create_job_object_stub() {
    asm!(
        "mov r10, rcx",
        "mov eax, 0xB4",    // Win11 24H2; resolve dynamically for other builds
        "syscall",
        "ret",
        options(noreturn),
    );
}

MITRE ATT&CK-Mappings

Last verified: 2026-05-20