- Add validated mitre_attack frontmatter to all 754 skills (286 distinct
techniques), verified against MITRE ATT&CK v19.1 via the official
mitreattack-python library: 0 revoked, deprecated, or invalid IDs
- Curate precise per-skill technique IDs for forensics, malware-analysis,
threat-intel, and red-team skills (e.g. DCSync -> T1003.006,
Kerberoasting -> T1558.003, Pass-the-Ticket -> T1550.003)
- Reconcile v19.1 tactic restructuring: Defense Evasion split into
Stealth (TA0005) and Defense Impairment (TA0112); revoked T1562.*
family and T1070.001/.002 remapped to active equivalents (T1685.*)
- Normalize word-split tags across 35 skills (remove filename-derived
stopword tags, add semantic cybersecurity tags)
- Add api-reference.md for 3 skills that were missing it
- Update README ATT&CK section with accurate v19.1 tactic distribution
Analyze memory dumps using Volatility3 plugins to detect injected code, rootkits, credential theft, and malware artifacts in Windows, Linux, and macOS memory images.
cybersecurity
malware-analysis
memory-forensics
volatility3
malware-analysis
incident-response
process-injection
rootkit-detection
dfir
1.0
mahipal
Apache-2.0
Executable Denylisting
Execution Isolation
File Metadata Consistency Validation
Content Format Conversion
File Content Analysis
DE.AE-02
RS.AN-03
ID.RA-01
DE.CM-01
T1027
T1055
T1140
T1497
T1003
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
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
Step 1: Process Analysis for Malware Detection
#!/usr/bin/env python3"""Volatility3-based memory forensics automation for malware analysis."""importsubprocessimportjsonimportsysimportosclassVol3Analyzer:"""Automate Volatility3 plugin execution for malware analysis."""def__init__(self,dump_path,vol3_path="vol"):self.dump_path=dump_pathself.vol3=vol3_pathself.results={}defrun_plugin(self,plugin,extra_args=None):"""Execute a Volatility3 plugin and capture output."""cmd=[self.vol3,"-f",self.dump_path,"-r","json",plugin,]ifextra_args:cmd.extend(extra_args)try:result=subprocess.run(cmd,capture_output=True,text=True,timeout=300)ifresult.returncode==0:returnjson.loads(result.stdout)except(subprocess.TimeoutExpired,json.JSONDecodeError)ase:print(f" [!] {plugin} failed: {e}")returnNonedefdetect_process_injection(self):"""Use malfind to detect injected code regions."""print("[+] Running windows.malfind (code injection detection)")results=self.run_plugin("windows.malfind")injected=[]ifresults:forentryinresults:injected.append({"pid":entry.get("PID"),"process":entry.get("Process"),"address":entry.get("Start VPN"),"protection":entry.get("Protection"),"hexdump":entry.get("Hexdump","")[:200],})print(f" [!] Injection in PID {entry.get('PID')} "f"({entry.get('Process')}) at {entry.get('Start VPN')}")self.results["injected_processes"]=injectedreturninjecteddeffind_hidden_processes(self):"""Compare pslist vs psscan to find hidden processes."""print("[+] Running process comparison (pslist vs psscan)")pslist=self.run_plugin("windows.pslist")psscan=self.run_plugin("windows.psscan")ifnotpslistornotpsscan:return[]list_pids={e.get("PID")foreinpslist}scan_pids={e.get("PID")foreinpsscan}hidden=scan_pids-list_pidsifhidden:print(f" [!] {len(hidden)} hidden processes found!")forentryinpsscan:ifentry.get("PID")inhidden:print(f" PID {entry['PID']}: {entry.get('ImageFileName')}")self.results["hidden_processes"]=list(hidden)returnlist(hidden)defanalyze_network(self):"""Extract active network connections."""print("[+] Running windows.netscan")results=self.run_plugin("windows.netscan")connections=[]ifresults:forentryinresults:conn={"pid":entry.get("PID"),"process":entry.get("Owner"),"local":f"{entry.get('LocalAddr')}:{entry.get('LocalPort')}","remote":f"{entry.get('ForeignAddr')}:{entry.get('ForeignPort')}","state":entry.get("State"),"protocol":entry.get("Proto"),}connections.append(conn)self.results["network_connections"]=connectionsreturnconnectionsdefextract_dlls(self,pid=None):"""List loaded DLLs per process."""print(f"[+] Running windows.dlllist{f' (PID {pid})'ifpidelse''}")args=["--pid",str(pid)]ifpidelseNoneresults=self.run_plugin("windows.dlllist",args)dlls=[]ifresults:forentryinresults:dlls.append({"pid":entry.get("PID"),"process":entry.get("Process"),"base":entry.get("Base"),"name":entry.get("Name"),"path":entry.get("Path"),"size":entry.get("Size"),})self.results["loaded_dlls"]=dllsreturndllsdefscan_with_yara(self,rules_path):"""Scan memory with YARA rules."""print(f"[+] Running windows.yarascan with {rules_path}")results=self.run_plugin("windows.yarascan",["--yara-file",rules_path])matches=[]ifresults:forentryinresults:matches.append({"rule":entry.get("Rule"),"pid":entry.get("PID"),"process":entry.get("Process"),"offset":entry.get("Offset"),})self.results["yara_matches"]=matchesreturnmatchesdeffull_triage(self):"""Run full malware-focused memory triage."""print(f"[*] Full memory triage: {self.dump_path}")print("="*60)self.detect_process_injection()self.find_hidden_processes()self.analyze_network()returnself.resultsif__name__=="__main__":iflen(sys.argv)<2:print(f"Usage: {sys.argv[0]} <memory_dump>")sys.exit(1)analyzer=Vol3Analyzer(sys.argv[1])results=analyzer.full_triage()print(json.dumps(results,indent=2,default=str))
Validation Criteria
Memory dump successfully parsed with correct OS profile
Injected processes detected via malfind with RWX regions
Hidden processes identified through pslist/psscan comparison
Network connections reveal C2 communication endpoints
YARA rules match known malware signatures in memory
Credential artifacts extracted from lsass process memory