| name | analyzing-memory-images |
| description | Analyze volatile memory images (RAM dumps) using Volatility 3 — process enumeration, injected code detection, credential extraction, network artifacts, rootkit analysis, and timeline construction from memory-resident data. Use when examining a memory capture from a compromised host, hunting for injected code or hollowed processes, extracting credentials or network state from RAM, or detecting kernel-level rootkits. |
| verified | 2026-07-27T00:00:00.000Z |
Analyzing Memory Images
Memory is the only place certain artifacts exist — injected code, decrypted
payloads, credential material, and network connections from processes that have
already exited. Disk forensics misses all of these. The work is getting the
image before it is lost, then asking the right questions in the right order.
When to Use
- You have a memory dump (raw, LiME, EWF, crash dump, or VM snapshot) to analyze
- Investigating a compromised host and need artifacts that exist only in RAM
- Looking for injected code, process hollowing, or reflective DLL loading
- Extracting credential material — hashes, Kerberos tickets, cached credentials
- Identifying network connections and listening ports from a point-in-time capture
- Detecting kernel-level rootkits — SSDT hooks, DKOM, hidden drivers
When NOT to Use
- Broader incident response methodology — use
responding-to-incidents
- You have an acquired disk image, not a RAM capture — use
responding-to-incidents
- On-disk artifacts of a live/triage Windows host — use
investigating-windows-endpoints
- Analyzing a known malware sample on disk — use
analyzing-malware
- Writing detection rules from your memory findings — use
engineering-detections
Acquisition
Acquire memory before doing anything else on a live system. Every command you
run on the box changes what is in memory. Image first, triage second.
sudo insmod lime-$(uname -r).ko "path=/evidence/mem.lime format=lime"
sudo ./avml /evidence/mem.lime
winpmem_mini_x64.exe mem.raw
DumpIt.exe /OUTPUT mem.raw /QUIET
Hash immediately after acquisition. Record SHA-256, source host, timestamp
(UTC), collection tool and version, and analyst name. If the image will be used
in legal or regulatory proceedings, maintain chain of custody from this point.
Volatility 3 Workflow
Start with orientation, then follow the evidence. Do not run every plugin
blindly — each question has a plugin that answers it.
Orientation
vol -f mem.raw windows.info
vol -f mem.lime linux.bash
vol -f mem.raw banners.Banners
windows.info gives you the OS version, build number, and kernel base address.
If this fails, the image may be corrupt, the wrong format, or require a custom
symbol table. For Linux, you need the matching ISF (Intermediate Symbol Format)
file — generate it from the kernel debug symbols of the exact kernel version.
Process Analysis
vol -f mem.raw windows.pslist
vol -f mem.raw windows.psscan
vol -f mem.raw windows.pstree
What to look for in the process list:
- Processes with unusual parents (
svchost.exe not under services.exe)
- Multiple instances of singleton processes (
lsass.exe, csrss.exe)
- Processes with misspelled names (
scvhost.exe, lssas.exe)
- Unexpected processes running as SYSTEM
- Processes with creation times that cluster around the suspected compromise
vol -f mem.raw windows.dlllist --pid <PID>
vol -f mem.raw windows.handles --pid <PID>
Injected Code Detection
This is where memory analysis earns its keep. Disk-based forensics cannot see
code that was never written to a file.
vol -f mem.raw windows.malfind
vol -f mem.raw windows.malfind --dump --pid <PID>
Interpreting malfind results:
- Not every RWX region is malicious — JIT compilers (.NET CLR, Java, Chrome V8)
legitimately allocate executable memory. Filter these out by process name.
- A PE header (MZ + "This program") in an unbacked region is high confidence.
- Shellcode without a PE header is common in staged payloads — look for
0xFC
(cld instruction), 0x60 (pushad), or call + pop sequences at the
start of the region.
Hollow process detection:
vol -f mem.raw windows.pslist --dump
Credential Extraction
Memory contains credentials in forms that disk forensics cannot recover —
plaintext passwords (pre-Windows 10 1607 with WDigest), NTLM hashes,
Kerberos tickets, and cached domain credentials.
vol -f mem.raw windows.hashdump
vol -f mem.raw windows.lsadump
vol -f mem.raw windows.cachedump
vol -f mem.raw windows.memmap --pid <lsass_pid> --dump
pypykatz lsa minidump <dumped_lsass_file>
Every credential found expands the blast radius. Each hash or ticket
represents a lateral movement path the attacker had available. Feed these
into scoping during responding-to-incidents.
Network Artifacts
vol -f mem.raw windows.netscan
vol -f mem.raw windows.memmap --pid <PID> --dump && strings -a pid.*.dmp | grep -iE '\.(com|net|org|ru|cn)\b'
vol -f mem.lime linux.sockstat
What to look for:
- Connections to external IPs from unexpected processes (especially
svchost.exe, rundll32.exe, regsvr32.exe)
- Listening ports on unusual numbers — backdoors often bind to high ports
- Connections from processes that no longer appear in pslist (terminated
C2 channels visible only in memory)
- Correlate remote IPs against threat intel feeds immediately
Command History and Console Output
vol -f mem.raw windows.cmdline
vol -f mem.raw windows.consoles
vol -f mem.lime linux.bash
Encoded PowerShell is common. Decode -EncodedCommand arguments:
echo "<base64_string>" | base64 -d | iconv -f UTF-16LE -t UTF-8
Timeline Construction from Memory
Combine process creation times, network connections, and handle timestamps
to build a memory-only timeline. This timeline captures events that never
touched disk.
UTC Timestamp | Artifact | Detail | PID
2026-07-10 02:14:02 | Process create | cmd.exe via explorer.exe | 4812
2026-07-10 02:14:08 | Process create | powershell.exe via cmd.exe | 5104
2026-07-10 02:14:09 | Network conn | 5104 -> 203.0.113.50:443 EST | 5104
2026-07-10 02:14:15 | Process create | rundll32.exe (no DLL in cmdline)| 6220
2026-07-10 02:14:15 | malfind hit | RWX region with PE header | 6220
2026-07-10 02:14:22 | Network conn | 6220 -> 198.51.100.10:8443 EST | 6220
Merge this with disk and log timelines from responding-to-incidents to fill
gaps. Memory gives you what ran; disk gives you what persisted; logs give you
what was recorded. None of the three is complete alone.
Rootkit Detection
Kernel-mode rootkits modify OS structures to hide processes, files, registry
keys, and network connections. Memory analysis is the primary detection method
because the rootkit cannot hide from a raw memory image.
vol -f mem.raw windows.ssdt
vol -f mem.raw windows.driverscan
vol -f mem.raw windows.modules
vol -f mem.raw windows.modscan
vol -f mem.raw windows.callbacks
vol -f mem.lime linux.check_idt
DKOM (Direct Kernel Object Manipulation):
- Process unlinking: removes EPROCESS from ActiveProcessLinks
- Detected by comparing pslist (walks the list) vs psscan (carves memory)
- The same principle applies to threads, drivers, and other kernel objects
Linux-Specific Analysis
vol -f mem.lime linux.pslist
vol -f mem.lime linux.pstree
vol -f mem.lime linux.psaux
vol -f mem.lime linux.bash
vol -f mem.lime linux.elfs
vol -f mem.lime linux.check_syscall
vol -f mem.lime linux.lsmod
vol -f mem.lime linux.hidden_modules
vol -f mem.lime linux.lsof
vol -f mem.lime linux.sockstat
vol -f mem.lime linux.mountinfo
Symbol tables for Linux: Unlike Windows, Linux has no fixed kernel
structures. You must provide an ISF file matching the exact kernel version.
Generate it with dwarf2json from the kernel's debug symbols
(vmlinux with DWARF info). Without the correct symbols, Volatility will
either fail or produce garbage output.
Strings and YARA Scanning
When you do not know what you are looking for, or need to validate a
hypothesis across the entire image.
vol -f mem.raw yarascan.YaraScan --yara-file rules.yar
vol -f mem.raw yarascan.YaraScan --yara-file rules.yar --pid <PID>
strings -a -t d mem.raw > strings_ascii.txt
strings -a -t d -e l mem.raw > strings_unicode.txt
bulk_extractor -o be_output mem.raw
YARA rules for memory analysis should differ from file-based rules.
Packed or encrypted payloads on disk are decrypted in memory, so write rules
for the unpacked form. Also target strings that only appear at runtime:
mutex names, C2 URLs, API resolution strings, and decrypted configuration
blocks.
Rationalizations to Reject
- "The disk image is enough." Disk forensics cannot see injected code,
in-memory-only payloads, decrypted configurations, or credentials that were
never written to disk. Memory is a different evidence source, not a redundant
one.
- "The memory dump is too large to analyze efficiently." Start with targeted
plugins — pslist, malfind, netscan, cmdline — not a full strings dump. Five
plugins will answer more than a grep through 64 GB of raw data.
- "We can just re-image and move on." Re-imaging destroys the only copy of
volatile evidence. If you need to know what the attacker did, you need the
memory.
- "Malfind flagged it, so it is malicious." Malfind reports suspicious memory
protections, not confirmed malware. JIT engines, .NET assemblies, and some
security tools produce legitimate RWX regions. Validate every hit.
- "We don't have the right Volatility profile." For Linux, build the ISF from
the target kernel's debug symbols. For Windows, Volatility 3 auto-detects
most versions. An unsupported profile is a solvable problem, not a reason to
skip memory analysis.
- "The system was rebooted, so memory evidence is gone." Check for crash
dumps, hibernation files (
hiberfil.sys), page files (pagefile.sys), and
VM snapshots. These contain partial memory contents and are often overlooked.
- "Strings output is too noisy to be useful." Use bulk_extractor histograms,
YARA rules, or grep for specific indicators. Raw strings is a last resort,
not a first step.
References
responding-to-incidents — broader IR methodology and evidence handling
analyzing-malware — deep analysis of samples extracted from memory
engineering-detections — writing rules from TTPs discovered in memory
hunting-threats — proactive search using indicators found in memory analysis