Lesson 2 of 5 · 25 min read

Memory Acquisition — Tools, Techniques, and Triage Artifacts

Memory acquisition is the single highest-value action in the first 30 minutes of a Windows IR. Everything that happens after the system reboots — the disk imaging, the log analysis, the timeline reconstruction — is working with incomplete information without the memory image.


Memory Acquisition Tools Comparison

ToolMethodFleet SupportOutput FormatBest For
WinPmemKernel driverManualRaw .rawSingle system, open source
Magnet RAM CaptureKernel driverManualRaw .memSingle system, GUI
VelociraptorVQL artifactYes (fleet)Raw or compressedEnterprise IR
DumpItKernel driverManualRaw .dmpQuick single-host
FTK ImagerKernel driverManual.mem / .ad1When already using FTK

Fleet acquisition via Velociraptor:

# Velociraptor artifact for fleet memory acquisition
name: Windows.Memory.Acquisition
sources:
  - query: |
      SELECT upload(
        file=pathspec(
          DelegatePath=winpmem(),
          Path="/"),
        name=format(format="memory_%s.raw", 
                   args=[hostname()])
      ) AS Upload
      FROM scope()

Step-by-Step Memory Acquisition

Option A: WinPmem (CLI)

# Run from USB/network share, output to network share
# Requires admin privileges

# Acquire to network share
.\winpmem_mini_x64_rc2.exe \\forensic-server\case\$(hostname)_memory.raw

# Verify hash immediately after acquisition
Get-FileHash \\forensic-server\case\$(hostname)_memory.raw -Algorithm SHA256
Get-FileHash \\forensic-server\case\$(hostname)_memory.raw -Algorithm MD5

# Document:
# - Acquisition start time
# - Acquisition end time
# - System uptime at acquisition (systeminfo | findstr "System Boot")
# - Tool version
# - Both hash values

Option B: Magnet RAM Capture (GUI)

1. Run as Administrator from USB media
2. Set destination to \\forensic-server\case\ (network share)
3. Click "Capture Memory"
4. After completion: SHA256 and MD5 hashes displayed in output log
5. Copy hash values to chain of custody form

Option C: Velociraptor Live Response (Remote)

# From Velociraptor server — collect memory from suspect host without
# physically touching the system

velociraptor query \
  'SELECT * FROM Artifact.Windows.Memory.Acquisition()' \
  --org default \
  --client [CLIENT_ID]

# Memory image collected and stored in Velociraptor server's file store
# Accessible via web interface for download and analysis

Documenting the Acquisition

Chain of custody starts at acquisition. Every acquisition must be documented:

FORENSIC ACQUISITION RECORD

Case number:        IR-2024-089
Date/time (UTC):    2024-09-02T18:30:00Z
Analyst:            M. Torres
System hostname:    WS-JSMITH-01
System IP:          10.1.2.33
System uptime:      4 days 7 hours (system boot: 2024-08-29T11:15:00Z)
Acquisition tool:   WinPmem v4.0.rc1
Tool hash (SHA256): [tool binary hash — proves tool integrity]
Tool run from:      USB media (E:\)
Output location:    \\forensic-server\case\IR-2024-089\

Artifacts collected:
  1. Physical memory image
     File: WS-JSMITH-01_memory_20240902T1830.raw
     Size: 16,384 MB (16 GB RAM)
     Acquisition duration: 00:18:42
     MD5:    9b4c2f1d3e8a7b6c5d4e3f2a1b0c9d8e
     SHA256: 4a3f7e2c8b1d5e9f3c7a2e6b4d8f1a5c...

  2. Network state (netstat)
     File: WS-JSMITH-01_netstat_20240902T1825.txt
     Captured before memory acquisition
     MD5:    2d7f3a1c...

  3. Process list
     File: WS-JSMITH-01_processes_20240902T1826.csv
     MD5:    5e9c4b2a...

Analyst signature: [digital or physical signature]
Witness (if applicable): [name]

Key Memory Artifacts for IR

After acquisition, initial triage with Volatility or MemProcFS targets:

# 1. Process list comparison (detect DKOM rootkits)
vol.py -f memory.raw windows.pslist
vol.py -f memory.raw windows.psscan
# Compare: processes in psscan not in pslist = DKOM-hidden

# 2. Active network connections
vol.py -f memory.raw windows.netscan
# Look for: ESTABLISHED connections to external IPs from unusual processes

# 3. Injection detection
vol.py -f memory.raw windows.malfind
# Look for: MZ header in private executable memory regions

# 4. Command line history
vol.py -f memory.raw windows.cmdline
# Look for: encoded PowerShell, LOLBin arguments, lateral movement commands

# 5. Credential extraction (high sensitivity)
vol.py -f memory.raw windows.hashdump
# Output: NTLM hashes — treat as live credentials