| name | performing-memory-forensics-with-volatility3-plugins |
| description | Analyze memory dumps using Volatility3 plugins to detect injected code, rootkits, credential theft, and malware artifacts in Windows, Linux, and macOS memory images. Use when analyzeing memory dumps using volatility3 plugins to detect injected code,. |
| domain | cybersecurity |
| subdomain | malware-analysis |
| tags | ["memory-forensics","volatility3","malware-analysis","incident-response","process-injection","rootkit-detection","dfir"] |
| version | 1.0 |
| author | oyi77 |
| license | Apache-2.0 |
| d3fend_techniques | ["Executable Denylisting","Execution Isolation","File Metadata Consistency Validation","Content Format Conversion","File Content Analysis"] |
| nist_csf | ["DE.AE-02","RS.AN-03","ID.RA-01","DE.CM-01"] |
Performing Memory Forensics with Volatility3 Plugins
Overview
Volatility3 (v2.26.0+, feature parity release May 2025) is the standard framework for memory forensics, replacing the deprecated Volatility2. It analyzes RAM dumps from Windows, Linux, and macOS to detect malicious processes, code injection, rootkits, credential harvesting, and network connections that disk-based forensics cannot reveal. Key plugins include windows.malfind (detecting RWX memory regions indicating injection), windows.psscan (finding hidden processes), windows.dlllist (enumerating loaded modules), windows.netscan (active network connections), and windows.handles (open file/registry handles). The 2024 Plugin Contest introduced ETW Scan for extracting Event Tracing for Windows data from memory.
When to Use
Trigger phrases:
-
"performing memory forensics with volatility3 plugins"
-
"Analyze memory dumps using Volatility3 plugins to detect injected code, rootkits"
-
When conducting security assessments that involve performing memory forensics with volatility3 plugins
-
When following incident response procedures for related security events
-
When performing scheduled security testing or auditing activities
-
When validating security controls through hands-on testing
Prerequisites
- Python 3.9+ with
volatility3 framework installed
- Memory dump files (
.raw, .dmp, .vmem, .lime)
- Windows symbol tables (ISF files, auto-downloaded)
- Understanding of Windows process memory architecture
- YARA integration for in-memory pattern scanning
Workflow
- Prepare the environment — ensure write-blocker is connected and test workstation is ready
- Document the source — record device serial, model, and pre-acquisition hash
- Acquire the image — use the appropriate tool with hash verification enabled
- Verify integrity — compare source and image hashes; document any discrepancies
- Analyze and report — perform the analysis and document findings with chain of custody
Step 1: Process Analysis for Malware Detection
subprocess
json
sys
os
:
():
.dump_path = dump_path
.vol3 = vol3_path
.results = {}
():
cmd = [
.vol3, , .dump_path,
, , plugin,
]
extra_args:
cmd.extend(extra_args)
:
result = subprocess.run(
cmd, capture_output=, text=, timeout=
)
result.returncode == :
json.loads(result.stdout)
(subprocess.TimeoutExpired, json.JSONDecodeError) e:
()
():
()
results = .run_plugin()
injected = []
results:
entry results:
injected.append({
: entry.get(),
: entry.get(),
: entry.get(),
: entry.get(),
: entry.get(, )[:],
})
(
)
.results[] = injected
injected
():
()
pslist = .run_plugin()
psscan = .run_plugin()
pslist psscan:
[]
list_pids = {e.get() e pslist}
scan_pids = {e.get() e psscan}
hidden = scan_pids - list_pids
hidden:
()
entry psscan:
entry.get() hidden:
()
.results[] = (hidden)
(hidden)
():
()
results = .run_plugin()
connections = []
results:
entry results:
conn = {
: entry.get(),
: entry.get(),
: ,
: ,
: entry.get(),
: entry.get(),
}
connections.append(conn)
.results[] = connections
connections
():
()
args = [, (pid)] pid
results = .run_plugin(, args)
dlls = []
results:
entry results:
dlls.append({
: entry.get(),
: entry.get(),
: entry.get(),
: entry.get(),
: entry.get(),
: entry.get(),
})
.results[] = dlls
dlls
():
()
results = .run_plugin(
,
[, rules_path]
)
matches = []
results:
entry results:
matches.append({
: entry.get(),
: entry.get(),
: entry.get(),
: entry.get(),
})
.results[] = matches
matches
():
()
( * )
.detect_process_injection()
.find_hidden_processes()
.analyze_network()
.results
__name__ == :
(sys.argv) < :
()
sys.exit()
analyzer = Vol3Analyzer(sys.argv[])
results = analyzer.full_triage()
(json.dumps(results, indent=, default=))