Five object types explain nearly all endpoint telemetry: processes, threads, tokens, handles and registry keys.
A process is a container: private virtual memory, loaded modules (DLLs), handles, and a security token. Threads execute inside it. Every process except the first has a parent, and that lineage is what EDR records.
Office spawning a shell is the canonical "impossible parent". So is w3wp.exe (IIS) spawning cmd.exe — that is a web shell. Learning ten of these pairs gets you further than any signature list.
| Process | Legit parent | Normal count | Abuse |
|---|---|---|---|
| System / smss.exe | — | 1 | Name-spoofing imposters elsewhere on disk |
| csrss.exe | smss (gone) | 2+ | Fake copies in user paths |
| wininit / winlogon | smss (gone) | 1 each | Session hijack, sticky-keys backdoor |
| services.exe | wininit | 1 | Parent of malicious services |
| svchost.exe | services.exe | many | Wrong parent = injection; always check -k group |
| lsass.exe | wininit | 1 | Credential dumping target |
| explorer.exe | userinit (gone) | 1 per session | Parent of user-launched anything |
S-1-5-21-…-1103. Names are cosmetic; SIDs are what ACLs store. Well-known ones worth recognising: S-1-5-18 SYSTEM, S-1-5-32-544 Administrators, RID 500 the built-in Administrator, 512 Domain Admins.SeDebugPrivilege (read any process memory) or SeImpersonatePrivilege (the basis of the "potato" escalations).# hives HKLM machine-wide config HKCU current user HKLM\SYSTEM\CurrentControlSet\Services services + drivers HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run classic autorun HKCU\...\Windows\CurrentVersion\Explorer\Shell Folders\Startup HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options debugger hijack (sticky keys)
# paths that matter C:\Windows\System32 signed OS binaries — the LOLBin pantry C:\Users\<u>\AppData\Local\Temp payload staging C:\Users\<u>\AppData\Roaming persistence, browser profiles C:\ProgramData world-writable-ish, malware favourite \\?\C:\$Recycle.Bin hiding in plain sight
Execution from Temp, ProgramData or a user's Downloads, by an unsigned binary, is a three-signal stack that should always be worth a look.
Attackers prefer built-in, signed tools because allow-listing and reputation checks pass them. Know these on sight:
| Binary | Legit job | Abuse |
|---|---|---|
| powershell.exe | Automation | -enc base64, download cradles, in-memory execution |
| rundll32.exe | Run a DLL export | Execute payload DLLs, proxy execution |
| regsvr32.exe | Register COM | Scriptlet execution from a URL (Squiblydoo) |
| mshta.exe | Run HTA files | Remote script execution |
| certutil.exe | Certificates | -urlcache -f = file downloader; base64 decode |
| bitsadmin / curl.exe | Transfers | Stealthy download of stage 2 |
| wmic.exe | Management | Remote process creation, lateral movement |
| msbuild.exe | Build | Compile and run inline C# payloads |
| rundll32 comsvcs.dll MiniDump | — | Dump LSASS without external tools |
Detection approach: do not block the binaries — most break the OS. Detect anomalous invocation: certutil with a URL, regsvr32 with scrobj.dll, PowerShell with encoded commands from an Office parent, rundll32 with no arguments.
schtasks /create; check C:\Windows\System32\Tasks for XML with odd actions.schtasks/sc/reg and registry-write events under the autorun keys.LSASS holds authentication material for logged-on users so they are not re-prompted: NTLM hashes, Kerberos tickets, sometimes plaintext with legacy providers. Dumping its memory is therefore the single highest-value action on a Windows host, and any process opening a handle to lsass.exe with read-memory rights deserves an alert.
Defensive levers worth naming in a design review: Credential Guard (isolates LSASS secrets in VBS), Protected Process Light on LSASS, tiered administration (admins never log into workstations), LAPS for unique local admin passwords, and disabling NTLM where possible.
| Technique | Port | Artefact on target |
|---|---|---|
| PsExec-style service | 445 | New service, ADMIN$ write, 7045 event |
| WMI (wmiexec) | 135 + dynamic | WmiPrvSE.exe spawning cmd.exe |
| WinRM / PowerShell Remoting | 5985/5986 | wsmprovhost.exe as parent |
| RDP | 3389 | Type 10 logon, rdpclip.exe |
| Scheduled task remote | 445 | Task XML created remotely |
Logon types in event 4624 are the fastest triage field: 2 interactive, 3 network (SMB/share), 10 RemoteInteractive (RDP), 5 service, 9 new-credentials (runas /netonly — often tooling). A wave of type 3 logons from one workstation to many servers is lateral movement in one line.
svchost.exe appears with parent explorer.exe, running from C:\Users\jsmith\AppData\Local\Temp\. Verdict?
svchost.exe is spawned by services.exe from C:\Windows\System32, always with a -k group argument. A copy in a user Temp directory launched from Explorer is name-spoofing — a technique that works precisely because analysts recognise the name and relax. Hash lookup is useful later; the structural facts already decide it.| ID | Channel | Meaning |
|---|---|---|
| 4624 / 4625 | Security | Successful / failed logon (check Logon Type) |
| 4648 | Security | Explicit credentials used — runas, lateral movement |
| 4672 | Security | Special privileges assigned — admin logon |
| 4688 | Security | Process creation (enable command-line auditing!) |
| 4720 / 4732 | Security | User created / added to privileged group |
| 4768 / 4769 | DC Security | Kerberos TGT / service ticket — Kerberoasting shows here |
| 7045 | System | New service installed — PsExec-style movement |
| Sysmon 1 / 3 / 7 / 8 / 11 / 22 | Sysmon | Process, network, image load, remote thread, file create, DNS |
| 4104 | PowerShell | Script block logging — the deobfuscated script text |
# who and what whoami /all SID, groups, privileges tasklist /svc wmic process get Name,ProcessId,ParentProcessId,CommandLine Get-CimInstance Win32_Process | Select Name,ProcessId,ParentProcessId,CommandLine # network → process pivot netstat -ano | findstr ESTABLISHED Get-NetTCPConnection -State Established | Select LocalPort,RemoteAddress,RemotePort,OwningProcess # persistence sweep Get-ScheduledTask | Where State -ne "Disabled" | Select TaskName,TaskPath Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" Get-CimInstance -Namespace root\subscription -Class __EventFilter Get-Service | Where {$_.Status -eq "Running"} | Select Name,DisplayName # signing and hashes Get-AuthenticodeSignature C:\path\to.exe Get-FileHash -Algorithm SHA256 C:\path\to.exe
In practice you will run most of this through SentinelOne's remote shell or its Deep Visibility queries rather than by hand — but knowing the native equivalents means you can validate what the tool tells you.
Rank your detection ideas by how expensive they are for an attacker to evade — the classic pyramid: hashes are free to change, IPs and domains cheap, tools moderate, behaviours (TTPs) expensive.
# pseudo-logic that generalises well
parent IN (winword,excel,outlook,powerpnt) AND child IN (cmd,powershell,wscript,mshta)
process=powershell AND cmdline CONTAINS ANY (-enc, -w hidden, downloadstring, frombase64)
process opens HANDLE to lsass.exe WITH access 0x1010 AND process NOT IN (known_edr, taskmgr)
new_service WITH image_path NOT UNDER (C:\Windows, C:\Program Files)
schtasks CREATE WHERE task_action CONTAINS (powershell, rundll32, %temp%)
Every rule needs three things before it ships: an ATT&CK technique ID, a known false-positive list from your own estate (backup agents, RMM tools and installers cause most of them), and a documented response action. A rule with no response instruction is a rule the on-call will close as "informational".