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
| Name | Type | Dir | Description |
|---|---|---|---|
| JobHandle | PHANDLE | out | Erhält das Handle des neu erzeugten Job Objects bei Erfolg. |
| DesiredAccess | ACCESS_MASK | in | Zugriffsrechte für das zurückgegebene Handle, typischerweise JOB_OBJECT_ALL_ACCESS für Eigentümer. |
| ObjectAttributes | POBJECT_ATTRIBUTES | in | Optionaler Name und Attribute; NULL erzeugt ein anonymes Job (am häufigsten beim Sandboxing). |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0xA1 | win10-1507 |
| Win10 1607 | 0xA3 | win10-1607 |
| Win10 1703 | 0xA6 | win10-1703 |
| Win10 1709 | 0xA7 | win10-1709 |
| Win10 1803 | 0xA8 | win10-1803 |
| Win10 1809 | 0xA8 | win10-1809 |
| Win10 1903 | 0xA9 | win10-1903 |
| Win10 1909 | 0xA9 | win10-1909 |
| Win10 2004 | 0xAD | win10-2004 |
| Win10 20H2 | 0xAD | win10-20h2 |
| Win10 21H1 | 0xAD | win10-21h1 |
| Win10 21H2 | 0xAE | win10-21h2 |
| Win10 22H2 | 0xAE | win10-22h2 |
| Win11 21H2 | 0xB1 | win11-21h2 |
| Win11 22H2 | 0xB2 | win11-22h2 |
| Win11 23H2 | 0xB2 | win11-23h2 |
| Win11 24H2 | 0xB4 | win11-24h2 |
| Server 2016 | 0xA3 | winserver-2016 |
| Server 2019 | 0xA8 | winserver-2019 |
| Server 2022 | 0xB0 | winserver-2022 |
| Server 2025 | 0xB4 | winserver-2025 |
Kernel-Modul
Verwandte APIs
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.
Erkennungsmö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 ENDPcSandbox-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