Most SOC analysts I have interviewed or worked with stop after a few very well known event IDs or sources of execution evidence. Judging by the speed of the answer you can usually tell which ones come from personal experience and which come from a distant memory of a SANS poster or something similar.
The list is nearly always the same: Sysmon event ID 1, Security 4688, Prefetch, maybe Amcache. None of it is wrong.
It is also five artifacts, and the tables below list 157 event IDs, counted per channel, and 14 on-disk artifacts that bear on whether code ran. The gap is not trivia. On a real host, with no agent and no tuned audit policy, several of the sources nobody queries are the only ones still present.
This is the full enumeration, grouped the way I use it in an investigation. It is a reference rather than an argument, so it is long. If you want the short version, the last two sections are the ones to read.
How the classes are grouped
Not by which log a source lives in. By the question the source answers about execution. That is why Security 4688 and Sysmon 1 sit in the same class despite living in different logs and needing entirely different setup: they answer the same question, which is whether a process was created.
A source earns a place only if it anchors to a process, a path, or a command. Anything vaguer than that is context, not evidence of execution.
Attestation strength and availability are tags on each source, not groupings. Keeping them as tags is what lets the classes stay clean.
The two rules that sit over all of it
Grade the channel and the provider, never the bare event ID. Application event 1000 is a crash under the Application Error provider and an attacker-controlled free-text string under the .NET Runtime provider. The number on its own tells you nothing. The unit of meaning is channel plus provider plus ID.
An absent source is a collection gap, not a clean result. If the channel was off, rolled, or never collected, the honest phrasing is low-confidence-clean with the gap named. Silence is a statement about your telemetry.
Availability: know what you have before you claim scope
Every source below carries one of four tags. This is the difference between a source you can count on and one you are hoping for.
| Tag | Meaning | Available | What it contains | What it proves |
|---|---|---|---|---|
| Default | on by default | DEFAULT | Present on a host nobody prepared | The backbone of a real investigation. Pull these first. |
| Config | audit or logging on | CONFIG | Requires an audit policy or a logging setting | High value where enabled, absent where nobody thought about it. |
| Deploy | agent or policy | DEPLOY | Requires Sysmon, EDR, AppLocker or WDAC | The best field fidelity available, and the least likely to be there. |
| Live | real-time only | LIVE | ETW trace sessions and vendor consoles | Nothing after the fact unless a session was already running. |
Class 1: direct process creation
The most direct evidence there is. Something recorded that a process came into existence. Read every create together with its command line and its parent, because a create with no ancestry is half a finding.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Sysmon/Operational | 1, 5 | DEPLOY | Image, CommandLine, hashes, parent image and parent command line, user, integrity level, ProcessGuid | A process started and what launched it. Pair 1 with 5 for the lifetime. |
| Security | 4688, 4689, 4696 | CONFIG | NewProcessName, PID, creator PID, token elevation, SID. Command line only with command-line auditing on | The same event with less in it. 4689 pairs by PID for runtime; 4696 records a primary token being assigned to a process. |
| Kernel-Process (ETW) | 1, 2 | LIVE | Native ProcessStart and ProcessStop | Real time only. Nothing to install, and almost never there after the fact. |
| Shell-Core | 9707, 9708, 62408, 62409 | DEFAULT | Run, RunOnce and autostart command started then finished, with exe and PID | A default-on process-creation record most people never query. |
| AppModel-Runtime | 201 | DEFAULT | Created process N for a packaged app: PID, app, package | Execution of packaged and UWP applications. |
| EDR telemetry | vendor | DEPLOY | Process, command line, hashes, parent chain, signer, user | Sysmon-grade detail with retention off the host, which on a long dwell case is often all that survives. |
Shell-Core is the one I would point at. It is on by default, it names the executable and the PID, and it is absent from almost every answer I hear.
Class 2: what the live process did
Creation proves a launch. Sysmon is a strong source for what came after: most of its events carry the ProcessGuid of the process that caused them, so modules, files, registry changes and connections tie back to that launch. Sysmon is far more than event 1, and a poor configuration either drowns these in noise or omits them entirely.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Sysmon | 7, 8, 10, 25 | DEPLOY | Modules loaded with signature status, remote threads, handles into other processes with the GrantedAccess mask, and process tampering | What the process did to other processes and which code it loaded. The leads for sideloading, injection, LSASS access and hollowing, each read with the source process before it becomes a finding. |
| Sysmon | 2, 9, 11, 15, 23, 26 | DEPLOY | File creates and stream hashes, creation-time changes, raw disk reads and file deletions | What the process did on disk: drops and staging, Mark of the Web, reads past file locks, timestamp changes and cleanup. Installers and sync clients produce most of these too, so the process decides it. |
GrantedAccess on event 10 is the single field I would keep if I could keep only one. Read with the source image, it separates a process opening a handle to LSASS for a legitimate reason from one reading credentials out of it.
The persistence and command-and-control side
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Sysmon | 12, 13, 14, 17, 18, 19, 20, 21 | DEPLOY | Registry keys and values, named pipes created and connected, WMI event filter, consumer and binding | What the process set up to run again or to talk to others. Run keys, IFEO and COM hijacks land in 13, WMI subscriptions in 19 to 21, and pipe names are hunting clues for command-and-control frameworks. |
| Program-Telemetry | 500, 505 | DEFAULT | Compatibility fix applied to an executable, naming the fix | The application-side record of a compatibility fix being applied. Kernel-ShimEngine 3 and 4 record shims on drivers and devices, not applications. |
Class 3: process to network and DNS
Two ways to attribute a connection to a process. Sysmon by deployment, the Windows Filtering Platform by audit policy. On a host without Sysmon, WFP is the only native process-to-network map you have.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Sysmon | 3, 22 | DEPLOY | Process, destination IP and port, resolved hostname, DNS query and results | The cleanest process-to-network attribution available. |
| Security (WFP) | 5156, 5157 | CONFIG | Connection permitted or blocked, with Process ID and application path | Joins to 4688 by Process ID, after converting: 4688 writes the PID in hex and 5156 in decimal. PIDs are reused, so join on host, PID and a bounded time window. |
| Security (WFP) | 5154, 5155 | CONFIG | An application permitted or blocked from listening on a port | The backdoor and C2-listener tell, and low volume. |
| Security (WFP) | 5158, 5159 | CONFIG | Bind to a local port, naming process and port | Precedes a listen. |
| Windows Firewall | 2004, 2005, 2006 | CONFIG | Rule added, changed or deleted, including the modifying application | Attacker firewall changes surface here by name. |
WFP is a firehose, thousands of events a minute on a domain controller. Collect it selectively. 5154 for listens and 5157 for blocks are the high-value, low-volume picks.
Class 4: script and command
PowerShell lives in two logs and you need both. The classic log tells you how PowerShell was launched and whether it arrived over WinRM. The operational log tells you what the script did. Query one and you get a quiet answer that is wrong.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Windows PowerShell (classic) | 400, 403 | DEFAULT | Engine start and stop. HostApplication carries the invocation line | The launch line, including cmd.exe, %COMSPEC% and -enc. HostName of ServerRemoteHost means it arrived remotely. |
| Windows PowerShell (classic) | 600 | DEFAULT | Provider lifecycle | Provider WSMan Is Started is the remoting and lateral-movement tell. |
| Windows PowerShell (classic) | 800 | CONFIG | Pipeline execution details, HostApplication, user | Invocation detail, only with module logging on. A default session writes 400, 403 and 600, and no 800. |
| PowerShell/Operational | 4104 | CONFIG | Script block logging: the decoded block | The deobfuscated command transcript, which is the one people know. |
| PowerShell/Operational | 4103, 4105, 4106 | CONFIG | Module logging, script block start and stop | Command invocation with parameters, and execution timing. |
| PowerShellCore/Operational | 4103, 4104 | DEPLOY | The same IDs in a separate log for PowerShell 7 | pwsh does not write to the 5.1 logs. Query both or miss it entirely. |
| VBScript (Application) | 4096 | DEFAULT | VBScript engine invoked | A .vbs ran. Deprecated, so worth a look when it appears. |
WMI
WMI is a favorite for remote execution and for fileless persistence, and both land in one operational log that is on by default.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| WMI-Activity/Operational | 5857 | DEFAULT | Provider loaded, with its on-disk path | Provider hijacking. |
| WMI-Activity/Operational | 5858 | DEFAULT | Operation failure with ClientMachine, user, ClientProcessId and the query text | The query text of wmiexec-style reconnaissance. |
| WMI-Activity/Operational | 5859, 5860 | DEFAULT | 5859: a provider registered a notification query. 5860: a temporary event consumer registered, with the query, user, client process and client machine | 5860 is a subscription held in memory by a running client, including a remote one. The permanent kind is 5861. |
| WMI-Activity/Operational | 5861 | DEFAULT | Permanent event consumer created, often with the command it will run | The only native record of WMI subscription persistence. |
Class 5: persistence-linked launch, services
A service install is execution and persistence in the same record, and it is the classic remote-execution tell. 7045 is on by default, so pull it first.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| System | 7045 | DEFAULT | Service installed: name, ImagePath, type, start type, account | The loudest PsExec and remote-service signal. PSEXESVC, or a cmd /c or encoded ImagePath. |
| Security | 4697 | CONFIG | Service installed, with the full image path | The audited twin of 7045. |
| System | 7034, 7031 | DEFAULT | Service crashed or terminated unexpectedly, with recovery action | A service ran and failed. |
| System | 7000, 7009 | DEFAULT | Service failed to start or timed out | An attempted launch of the named image. |
| System | 7040 | DEFAULT | Service start type changed | Tampering with defenses, for example a security service moved to disabled. |
Class 6: persistence-linked launch, tasks and DCOM
Scheduled tasks write to both a Security log and an operational log, and the operational one is on by default. DCOM is the awkward case: lateral movement over DCOM has no single event.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Security | 4698, 4699 | CONFIG | Task created or deleted, with the Actions XML in cleartext | The executable and arguments the task will run. |
| Security | 4700, 4701, 4702 | CONFIG | Task enabled, disabled or updated | Changes to existing persistence. |
| TaskScheduler/Operational | 106, 140, 141 | DEFAULT | Task registered, updated, deleted | The default-on twin of 4698. |
| TaskScheduler/Operational | 129 | DEFAULT | Created Task Process, naming the instance and PID | Maps directly onto a 4688 or Sysmon 1. |
| TaskScheduler/Operational | 200, 201 | DEFAULT | Action started and completed | The difference between persistence that is armed and persistence that actually ran. |
| System (DCOM) | 10000, 10001 | DEFAULT | A DCOM server failed to start, with the command it tried, which carries -Embedding | An activation was attempted on this host and failed. |
| System (DCOM) | 10010, 10028 | DEFAULT | 10010: a server did not register with DCOM in time. 10028: this host could not reach a remote computer while activating a CLSID, with the requesting PID and process | Failed attempts. 10028 is written on the machine the attempt came from, and names the target and the process that tried. |
Reconstruct DCOM movement from a process create, the -Embedding tell on the command line, and a Type 3 logon. All four events above record failures, so a DCOM move that worked leaves none of them. Treat 10016 as by-design noise; it is almost never what you are looking for.
Class 7: control adjudication
The highest field fidelity in the log, because a security control inspected the image before deciding. Path, hash and publisher in one record. Audit mode counts, which is the point most people miss.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| AppLocker EXE and DLL | 8002, 8003, 8004 | DEPLOY | Allowed, audited or blocked, with path, hash, publisher, rule and SID | In audit mode, 8002 and 8003 together log every file the policy evaluated: 8002 for files the rules allow, 8003 for files they would have blocked. |
| AppLocker MSI and Script | 8005, 8006, 8007 | DEPLOY | The same for .msi and for .ps1, .vbs, .js, .cmd and .bat | Script execution with the same fidelity. |
| AppLocker Packaged app | 8020, 8021, 8022 | DEPLOY | Packaged app allowed, audited or blocked | UWP execution adjudication. |
| CodeIntegrity (WDAC) | 3076, 3077 | DEPLOY | Audit-mode or enforced block against App Control policy | The file failed policy, and the record names it. |
| CodeIntegrity (WDAC) | 3033, 3089 | DEPLOY | Image failed the signing level, with signature information | Signing detail for the blocked file. |
| Defender ASR | 1121, 1122 | DEPLOY | Block or audit with rule GUID, path, process, target and parent command line | Behavioral and narrow. A 1121 means the blocked operation did not happen; the process that attempted it did run. |
| Defender AV | 1116, 1117 | DEFAULT | Malware detected and action taken, with file path and process | On by default, and frequently the only control record present. |
| SRP (Application) | 865, 866, 867, 868 | DEPLOY | Software Restriction Policy enforcement | Older estates only. |
The standing recommendation I give is to run AppLocker or WDAC in audit mode. Most of the forensic value, none of the operational risk of blocking something the business needs.
Class 8: install, deploy and servicing
Installer and transfer subsystems place software and run it, and they name products, packages, URLs and paths while doing so.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| MsiInstaller | 1033, 1035 | DEFAULT | Product installed or reconfigured: name, version, manufacturer | What was installed through Windows Installer. |
| MsiInstaller | 11707, 11708 | DEFAULT | Install completed, or failed and rolled back | The outcome of the install. |
| BITS-Client/Operational | 3 | DEFAULT | Job created: JobId, JobTitle, RemoteName URL, LocalName | A background transfer, with the source URL. |
| BITS-Client/Operational | 59, 60, 16403 | DEFAULT | Job started, stopped, notify | SetNotifyCmdLine runs a command from svchost, which is the abuse case. |
| AppXDeploymentServer | 400, 401, 404 | DEFAULT | Packaged app deployment, naming package and volume | 404 records a failed install attempt, which is still evidence. |
| AppXDeployment | 332, 603, 607 | DEFAULT | Package deployment operation, start and result | Packaged app servicing. |
| Store (Install-Agent) | 2000 | DEFAULT | Store install activity naming process and module | Store-sourced installs. |
| RestartManager | 10010 | DEFAULT | Application holding files during install or update, with full path | Names running executables incidentally. |
MSI events fire for Windows Installer packages. A plain .exe installer often logs nothing at all, so absence here is not evidence that nothing was installed.
Class 9: crash and fault derived
It ran because it broke. Weak attestation, on by default, and frequently the only surviving trace. Every one of these names a path.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Application Error | 1000 | DEFAULT | Faulting application path, version, faulting module, exception code, PID, start time | A process existed and crashed, with its full path. |
| Application Hang | 1002 | DEFAULT | Hanging application path, version, PID | A process existed and hung. |
| Windows Error Reporting | 1001 | DEFAULT | Fault bucket and application path | Points at the .wer files under ReportArchive and ReportQueue. |
| .NET Runtime | 1026, 1023 | DEFAULT | Unhandled managed exception with stack trace and assembly paths | A managed application ran and failed. |
| ESENT | 216, 325, 326, 327 | DEFAULT | Database attach, create and detach, with calling process, PID and database path | A 325 creating a new database at a non-standard path is the ntdsutil credential-theft signal. |
| Diagnostics-Performance | 101, 103, 203 | DEFAULT | Application or service slow at boot or shutdown, with timing | Names something that ran. |
These are self-reported by the faulting subsystem, so corroborate them against Sysmon, Prefetch or Amcache before leaning on one.
Classes 10 and 11: compatibility, telemetry and self-reported
Execution inferred from a shim or inventory subsystem, plus the weakest tier of all: records an application wrote about itself. This is where the provider rule earns its keep.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Program-Telemetry | 500, 505 | DEFAULT | Compatibility fix applied to an executable, with path and fix | Telemetry-setting dependent, so absence proves nothing. |
| Program-Compatibility-Assistant | 17 | DEFAULT | Shim engine names an executable that ran | A default-on execution hint most estates never read. |
| Program-Inventory | 903, 904, 905 to 908 | DEFAULT | New application installed, updated or removed | Inventory-level install record. |
| OAlerts | 300 | DEFAULT | Office application prompt with file name and which Office app | An Office application ran and opened something. |
| .NET Runtime | 1000 | DEFAULT | Arbitrary free text written by any application | The weakest record on this page. Any process can write any string here. |
| VSS (Application) | 8231 | DEFAULT | Volume Shadow Copy activity | Ransomware and anti-forensic context. |
| Vendor sources | various | DEFAULT | Backup, RMM, AV and database engines writing path-bearing entries | Self-reported, rarely parsed, and often the only record of a niche application. |
This is the concrete case for grading the provider. Application event 1000 is a crash under Application Error and an attacker-controlled string under .NET Runtime. And the provider name itself can be borrowed: on a Windows 11 test host, Windows PowerShell’s Write-EventLog, run elevated, wrote a .NET Runtime 1000 carrying arbitrary text. eventcreate.exe refuses the name of any installed provider, so it is the wrong tool to worry about. Corroborate before you cite.
Class 12: remote and lateral execution context
This class turns a process ran into a process ran because somebody moved to this box. RDP alone spans four logs across three machines.
| Log or provider | Event IDs | Available | What it contains | What it proves |
|---|---|---|---|---|
| Security | 4624 Type 3, 4648 | CONFIG | Inbound network logon; explicit credential use | SMB, WMI, WinRM and service arrival. 4648 covers runas and PsExec -u. |
| Security | 5140, 5145 | CONFIG | Share access, with the relative target on 5145 | ADMIN$, IPC$ and C$ access, including the PSEXESVC pipe. |
| WinRM/Operational | 6, 91, 168, 169 | DEFAULT | WSMan shell created, with authentication and user | The WinRM and PowerShell remoting footprint, on by default. |
| TS-RemoteConnectionMgr | 1149 | DEFAULT | RDP connection with source IP and user | A connection that passed NLA. Not yet a full logon. |
| Security | 4624 Type 10, 4778, 4779 | CONFIG | RDP interactive logon, session reconnect and disconnect | Under NLA a Type 3 is recorded first. |
| TS-LocalSessionManager | 21, 22, 24, 25 | DEFAULT | RDP session logon, shell start, disconnect, reconnect, with source address | A source address of LOCAL is not RDP. |
| TS-RDPClient | 1024, 1102 | DEFAULT | On the machine somebody connected FROM, naming the destination | The pivot origin, which is the half people forget to collect. |
Process ancestry is what ties arrival to execution: wsmprovhost.exe, PSEXESVC or w3wp.exe spawning cmd.exe.
Class 13: the on-disk cousins
Not event logs. Filesystem and registry artifacts that independently prove a run and, critically, survive a cleared event log. In a compromise assessment I collect these first.
| Artifact | Where it lives | Available | What it contains | What it proves |
|---|---|---|---|---|
| Prefetch | C:\Windows\Prefetch | DEFAULT | Execution, run count, last eight run times, referenced files | Strong execution evidence, with no user attribution. |
| Amcache | Amcache.hve | DEFAULT | Presence, key timestamps, SHA-1 of the first 31MB, PE metadata | Presence and identity of the binary, including after deletion. An entry alone is not execution: inventory scans add files that never ran. |
| ShimCache | SYSTEM AppCompatCache | DEFAULT | Path, size, last-modified | Recorded on enumeration. Presence is not execution. Pair it with Amcache or Prefetch. |
| SRUM | System32\SRU | DEFAULT | Per-application runtime and bytes sent and received | Bytes per application per interval: where an exfiltration volume estimate starts, though it does not record where the bytes went, and badly underused. |
| BAM and DAM | SYSTEM bam | DEFAULT | Execution keyed to the user SID | The attribution Prefetch does not give you. |
| PCA | AppCompat\PCA | DEFAULT | PcaAppLaunchDic path and the UTC time of its last GUI launch, PcaGeneralDb exit code | Windows 11 22H2 and Server 2025 onward. Records executables launched through the GUI, including from shares and USB. A launch by a Run key, a service, a task or a command line is not recorded, so the time is the last GUI launch, not the last execution, and a binary never opened from the GUI has no entry. Compared against Sysmon event 1 on the same Windows 11 host, the times matched for binaries opened from the GUI and were older for binaries that also start on their own. |
Per-user launch and deleted binaries
| Artifact | Where it lives | Available | What it contains | What it proves |
|---|---|---|---|---|
| UserAssist | NTUSER.DAT | DEFAULT | GUI-launched programs per user: run count, focus time, last run | Per-SID attribution for interactive launches. |
| RecentApps and RunMRU | NTUSER.DAT | DEFAULT | Recently run applications and Run-dialog history | What the user typed and launched. |
| Jump Lists | Recent Destinations | DEFAULT | Application execution and file interaction, with AppID mapping | Ties an application to the documents it touched. |
| MUICache | USRCLASS.DAT | DEFAULT | Executed application names and descriptions per user | A per-user execution name list. |
| WER report files | ReportArchive and ReportQueue | DEFAULT | AppCrash and AppHang folders | Confirms a path executed before the crash time. |
| MPLog | Defender Support | DEFAULT | Scanned file paths | Often the deepest surviving record of a binary that has been deleted. |
| USN journal and $MFT | NTFS metadata | DEFAULT | Drop, rename, timestomp and deletion timing | Independent of the event log entirely. |
| ActivitiesCache | ConnectedDevicesPlatform | DEFAULT | Windows Timeline application and document usage, with start and end times | Execution with a duration attached. |
Traps and blind angles
Each of these has ended a finding on cross-examination. Name the applicable gap before writing the words no evidence.
- The bare event ID lies. Application 1000 is a crash or an implant string depending on the provider.
- Most Security detail needs audit policy. 4688 command lines, 4697, 4698, WFP and 4104 are all off until somebody turns them on.
- PowerShell splits across two logs, and PowerShell 7 splits into a third.
- ShimCache is not execution. It records a path on enumeration.
- Self-reported events are forgeable. Write-EventLog writes a classic Application event under an installed provider’s name, with any text.
- Deliberate evasion exists. Security 1102 and System 104 wipe the trail, DCOM has no single event, and golden or silver tickets bypass the domain controller entirely.
The order I actually collect in
Ordered for a long-dwell compromise assessment. Default-on and durable first, because those sources survive clearing, give the longest lookback, and need nobody to have prepared anything.
- Prefetch, Amcache, SRUM, BAM, PCA, ShimCache
- Windows PowerShell classic 400, 600 and 800, plus Operational 4104
- System 7045, 7034 and 7040
- Shell-Core 9707, 9708, 62408 and 62409
- TaskScheduler 106, 129, 200 and 201, and DCOM 10000, 10001, 10010 and 10028
- WMI-Activity 5857 to 5861
- Application channel: 1000, WER, ESENT, MSI and Program-Telemetry
- Sysmon 1, 3, 5, 7, 8, 10, 11, 13, 22 and 25, and EDR
- AppLocker, WDAC and Defender ASR
- Security 4688, 4689, 4697, 4698 to 4702, 4648, 5140 and WFP
Kernel-Process ETW and EDR are live or console sources, not a retrospective evtx pull. Any channel that is absent is an unanswered question, and it belongs in the report as one.
Six lines that hold it together
- Group by what a source tells you, not by which log it lives in.
- Grade the provider, not the ID. Channel plus provider plus ID is the unit.
- Tag every source by availability. Know what you have before claiming scope.
- Sysmon is a class, not an event. Event 1 is the start; 3, 7, 8, 10, 13, 22 and 25 carry the rest.
- Query both PowerShell logs, and the PowerShell 7 log as well.
- Absence is a finding. Say low-confidence-clean and name the gap.
The DFIR take-aways
Without Class 1 covering your investigation window, everything else is a partial view. You will be missing at least one of: the parent process, the command line, a complete timeline, or a clear answer to who executed it. You can still work, but say what is missing.
Knowing these sources lets you inventory the case on day one. Walk the list, see which sources exist and how far back each one reaches, and you can set expectations with the client immediately. It is also the moment to ask for additional logging to be switched on and retained, so the rest of the investigation has more to work with than the start did.
Not every investigation needs the full execution chain reconstructed. Sometimes a handful of events is enough to prove or dismiss the question you were actually asked. Scope the collection to the question.
This article deliberately leaves things out. Execution of libraries, webshells and injection techniques are their own subject and deserve their own post.
It also does not cover recovering deleted records or files. In a high-profile investigation no stone should be left unturned, and carving deleted evidence is a separate discipline from knowing which sources exist.
References
Grouped by class. Vendor research appears only where the link points at an original discovery.
Method and audit policy
Classes 1 and 2, process creation and behavior
Class 3, network and DNS
Class 4, script and command
Classes 5 and 6, services, tasks and DCOM
- MITRE ATT&CK T1543.003, Windows service
- MITRE ATT&CK T1053.005, scheduled task
- MITRE ATT&CK T1021.003, distributed component object model