Lesson 33 — The Process Tree Didn't Match Normal User Activity
Every process in the alert had a familiar name.
The problem was the order in which they appeared.
A browser launched PowerShell. PowerShell launched another Windows utility.
That utility then started a process the user had never knowingly opened.
Agent Foskett stopped looking at the filenames individually.
The process tree was the evidence.
The names looked normal
The ancestry did not. Process relationships can expose suspicious execution even when every individual binary is legitimate.
Case briefing
Investigation objective
Reconstruct the process ancestry, determine whether the parent-child relationships are expected, identify the initiating user context and follow suspicious descendants through the endpoint timeline.
Investigator's rule
A legitimate binary does not make a legitimate process tree. Attackers frequently use trusted operating-system tools inside abnormal execution chains.
Stage 1 — stop reading processes as isolated events
| Isolated observation | Process-tree observation |
|---|---|
| msedge.exe ran | msedge.exe initiated PowerShell. |
| powershell.exe ran | PowerShell was a child of the browser. |
| rundll32.exe ran | rundll32.exe was launched by the suspicious PowerShell process. |
| regsvr32.exe ran | regsvr32.exe appeared deeper in the same execution chain. |
Process ancestry provides causality clues
Parent-child relationships help explain how one execution led to another. They do not prove intent, but they give the analyst a defensible sequence to investigate.
Expected relationships matter too
Normal user activity creates repeatable patterns. Comparing a suspicious chain with known-good behaviour can reveal where the execution path diverged.
Stage 2 — retrieve the device process timeline
let TargetDevice = "WS-FIN-044";
let StartTime = datetime(2026-08-24 10:10:00);
let EndTime = datetime(2026-08-24 10:25:00);
DeviceProcessEvents
| where DeviceName =~ TargetDevice
| where Timestamp between (StartTime .. EndTime)
| project Timestamp,
AccountName,
InitiatingProcessFileName,
InitiatingProcessCommandLine,
InitiatingProcessId,
FileName,
ProcessCommandLine,
ProcessId,
SHA1
| order by Timestamp asc
Why keep process IDs?
ProcessId and InitiatingProcessId help the analyst distinguish multiple instances of the same executable and understand which process launched which child.
Time ordering is essential
Sort the activity chronologically. A process tree becomes much easier to reason about when you can see the execution sequence unfold.
Stage 3 — map the suspicious chain
Do not infer missing relationships
If telemetry does not establish a parent-child relationship, record that uncertainty. A defensible process tree contains observed relationships, not convenient assumptions.
Preserve command lines
The command line may explain why a legitimate utility was invoked. Arguments, paths, URLs and script content can turn a vague process relationship into a useful investigative lead.
Stage 4 — focus on suspicious descendants
DeviceProcessEvents
| where Timestamp > ago(24h)
| where DeviceName =~ "WS-FIN-044"
| where InitiatingProcessFileName in~ (
"powershell.exe",
"rundll32.exe",
"regsvr32.exe"
)
| project Timestamp,
AccountName,
InitiatingProcessFileName,
FileName,
ProcessCommandLine,
SHA1
| order by Timestamp asc
Follow justified pivots
Each suspicious descendant can expose the next stage of execution. Follow the process when its relationship, command line or timing gives you a reason to do so.
Avoid process-name tunnel vision
Do not create a fixed list of “bad” Windows binaries and assume everything else is safe. The same executable can be benign in one process tree and highly suspicious in another.
Stage 5 — compare with normal user activity
DeviceProcessEvents
| where Timestamp > ago(14d)
| where AccountName =~ "alex.wilson"
| summarize Executions=count()
by InitiatingProcessFileName,
FileName
| order by Executions desc
Baseline the relationship
The useful question is not merely whether a process is common. Ask whether this parent-child combination is normal for this user, device or peer group.
Rare does not equal malicious
A relationship that has never appeared before deserves attention, but rarity is still only context. Continue validating the command and subsequent behaviour.
Stage 6 — correlate the tree with file activity
DeviceFileEvents
| where Timestamp > ago(24h)
| where DeviceName =~ "WS-FIN-044"
| where InitiatingProcessFileName in~ (
"powershell.exe",
"rundll32.exe",
"regsvr32.exe"
)
| project Timestamp,
ActionType,
FileName,
FolderPath,
SHA1,
InitiatingProcessFileName
| order by Timestamp asc
The tree may explain a new file
If one of the suspicious processes creates or modifies a file, that event can connect execution ancestry to the next stage of the incident.
Record exact timestamps
Seconds matter during endpoint reconstruction. A file created immediately before execution can be much more meaningful than the same file appearing hours earlier.
Stage 7 — test the story
Ask what would disprove your theory
If you believe the tree represents malicious execution, actively look for evidence of legitimate software, automation or user activity that could explain it.
Keep facts separate from interpretation
“PowerShell launched rundll32.exe” is an observation. “The attacker used rundll32.exe” is an interpretation that requires supporting evidence.
Stage 8 — write the process-tree finding
Lesson 33 key takeaways
- Legitimate process names can appear inside suspicious execution chains.
- Parent-child relationships are often more informative than filenames alone.
- Use process IDs and timestamps to help reconstruct execution accurately.
- Preserve command lines for both parent and child processes.
- Follow suspicious descendants when the evidence justifies the pivot.
- Compare parent-child combinations with normal user and device activity.
- Rarity is investigative context, not proof of maliciousness.
- Correlate process ancestry with file and network telemetry.
- Do not invent relationships that the available evidence does not establish.
- Separate observed facts from conclusions in the investigation record.
Module 4 — Endpoint Incidents: Following the Attack Chain
Lesson 33 extends the attack chain from suspicious PowerShell execution into process ancestry. The next lesson follows a file that appears only seconds before it executes.
Continue your SOC Analyst training
🔎 SOC Analyst Academy — Module 4: Endpoint Incidents: Following the Attack Chain
How to investigate suspicious process trees in Microsoft Defender XDR
Lesson 33 of the Agent Foskett SOC Analyst Academy teaches analysts how to use DeviceProcessEvents, process IDs, parent-child relationships and command-line evidence to reconstruct abnormal endpoint execution.
KQL process ancestry investigation for SOC analysts
Learn how to compare process relationships with normal user activity, follow suspicious descendants and correlate process ancestry with file activity during Microsoft Defender XDR investigations.
