HOLLOWING
NTUNMAPVIEWOFSECTION
SUSPENDED
SETTHREADCONTEXT
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting Process Hollowing: Suspended Starts and Remote Memory Writes

Hollowing wears a trusted process like a costume. The costume is convincing, but the way it was put on leaves a distinctive API sequence.

Scroll

Process hollowing starts a legitimate executable suspended, removes or overwrites its image in memory, writes the attacker’s payload, redirects the main thread and resumes. On disk the process looks genuine; in memory it is not. Detection works best where you can see the sequence of calls, and falls back on structural anomalies when you cannot.

Signals at a Glance

SignalWhereATT&CK
Process created suspended, then remote allocate/write/SetThreadContext from the parentEDR API telemetry, MDE ApiCall eventsT1055.012
NtUnmapViewOfSection against a freshly created childEDR, ETW Threat-IntelligenceT1055.012
Sysmon Event 25 ProcessTampering on a new processSysmon 25T1055.012
svchost.exe, RuntimeBroker or similar with the wrong parent or no argumentsSysmon 1, 4688T1036.005
Image-backed region with modified content or a private RWX region at the image baseMemory scanner, EDRT1055

The API Sequence

The giveaway is the order of operations performed on a process the actor has only just created. Endpoint products that expose cross-process API calls let you join them. In Defender XDR:

// Microsoft Defender XDR (KQL) - hollowing sequence by one initiator against one victim
let window = 2m;
DeviceEvents
| where ActionType in ("NtAllocateVirtualMemoryRemoteApiCall",
                       "NtMapViewOfSectionRemoteApiCall",
                       "SetThreadContextRemoteApiCall",
                       "QueueUserApcRemoteApiCall")
| summarize actions = make_set(ActionType), n = dcount(ActionType),
            first = min(Timestamp)
          by DeviceId, DeviceName, InitiatingProcessId, InitiatingProcessFileName,
             FileName, ProcessId
| where n >= 2 and actions has "SetThreadContextRemoteApiCall"
| project first, DeviceName, InitiatingProcessFileName, FileName, actions
// tune/validate: debuggers, some installers and AV self-tests behave the same way.

Without API telemetry, rely on what a hollowed process looks like from the outside. Windows services run svchost.exe with -k and are started by services.exe; a hollowed copy often lacks both.

title: Suspicious svchost Parent or Missing -k
logsource:
  product: windows
  category: process_creation
detection:
  selection:
    Image|endswith: '\svchost.exe'
  filter_parent:
    ParentImage|endswith:
      - '\services.exe'
      - '\MsMpEng.exe'
      - '\svchost.exe'
  filter_args:
    CommandLine|contains: ' -k '
  condition: selection and not (filter_parent or filter_args)
level: high
# tune/validate: confirm on your build which system binaries start svchost directly.

Memory and Structure

Vetted sources

Use SigmaHQ process-creation and process-tampering rules, Elastic’s process injection and hollowing detections, Splunk ESCU content for suspicious svchost, MITRE CAR analytics for process injection, and Atomic Red Team T1055.012 tests. Baseline your own environment — protective software and debuggers also write into child processes.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026