memory-forensics
npx skills add https://github.com/sherifeldeeb/agentskills --skill memory-forensics
Agent 安装分布
Skill 文档
Memory Forensics
Comprehensive memory forensics skill for analyzing RAM dumps and volatile memory artifacts. Enables detection of malware, rootkits, process injection, credential harvesting, and other memory-resident threats that leave no disk footprint.
Capabilities
- Memory Image Acquisition: Guide acquisition of memory dumps using various tools (WinPMEM, LIME, DumpIt, FTK Imager)
- Process Analysis: Enumerate running processes, detect hidden/injected processes, analyze process trees
- DLL/Module Analysis: Identify loaded modules, detect DLL injection, find hollowed processes
- Network Connection Analysis: Extract active network connections, listening ports, socket information
- Registry Hive Extraction: Extract registry hives from memory for offline analysis
- Credential Extraction: Locate and extract credentials, password hashes, Kerberos tickets
- Malware Detection: Detect code injection, API hooks, SSDT hooks, IDT modifications
- String Extraction: Extract strings, URLs, IPs, and other IOCs from memory regions
- Timeline Generation: Create memory-based timelines of process execution and system events
- Rootkit Detection: Identify kernel-level rootkits, hidden drivers, DKOM techniques
Quick Start
from memory_forensics import MemoryAnalyzer, ProcessScanner, MalwareDetector
# Initialize analyzer with memory image
analyzer = MemoryAnalyzer("/path/to/memory.raw")
# Get system profile
profile = analyzer.identify_profile()
print(f"Detected OS: {profile.os_name} {profile.version}")
# Scan for processes
scanner = ProcessScanner(analyzer)
processes = scanner.list_processes(include_hidden=True)
# Detect malware indicators
detector = MalwareDetector(analyzer)
findings = detector.scan_all()
Usage
Task 1: Memory Image Acquisition
Input: Target system requiring memory acquisition
Process:
- Select appropriate acquisition tool based on OS
- Verify tool integrity (hash validation)
- Execute acquisition with minimal system impact
- Calculate and record hash of acquired image
- Document acquisition metadata
Output: Raw memory dump with integrity verification
Example:
from memory_forensics import MemoryAcquisition
# Windows acquisition guidance
acquisition = MemoryAcquisition()
# Get tool recommendations
tools = acquisition.recommend_tools(
os_type="windows",
os_version="10",
acquisition_type="live"
)
# Generate acquisition command
cmd = acquisition.generate_command(
tool="winpmem",
output_path="E:\\evidence\\memory.raw",
format="raw"
)
print(f"Execute: {cmd}")
# Create acquisition documentation
doc = acquisition.create_documentation(
case_id="INC-2024-001",
examiner="John Doe",
target_hostname="WORKSTATION01",
acquisition_tool="WinPMEM 4.0",
hash_algorithm="SHA256"
)
Task 2: Process Analysis
Input: Memory image file path
Process:
- Load memory image and identify OS profile
- Enumerate all processes (visible and hidden)
- Analyze process tree relationships
- Detect anomalous processes
- Identify process injection indicators
Output: Comprehensive process listing with anomaly flags
Example:
from memory_forensics import MemoryAnalyzer, ProcessScanner
analyzer = MemoryAnalyzer("/evidence/memory.raw")
scanner = ProcessScanner(analyzer)
# List all processes with details
processes = scanner.list_processes(
include_hidden=True,
include_terminated=False
)
for proc in processes:
print(f"PID: {proc.pid}, Name: {proc.name}, PPID: {proc.ppid}")
print(f" Created: {proc.create_time}")
print(f" Command Line: {proc.cmdline}")
print(f" Suspicious: {proc.is_suspicious}")
# Detect hidden processes
hidden = scanner.find_hidden_processes()
for proc in hidden:
print(f"HIDDEN: PID {proc.pid} - {proc.name}")
# Analyze process tree
tree = scanner.build_process_tree()
tree.print_tree()
# Find orphan processes
orphans = scanner.find_orphan_processes()
# Detect process hollowing
hollowed = scanner.detect_hollowing()
for proc in hollowed:
print(f"HOLLOWED: {proc.pid} - {proc.name}")
print(f" Image path mismatch: {proc.image_mismatch}")
Task 3: DLL and Module Analysis
Input: Memory image and target process(es)
Process:
- Enumerate loaded DLLs for target processes
- Identify unsigned or suspicious modules
- Detect DLL injection techniques
- Compare loaded modules to expected baseline
- Extract suspicious modules for analysis
Output: Module analysis report with injection indicators
Example:
from memory_forensics import MemoryAnalyzer, ModuleScanner
analyzer = MemoryAnalyzer("/evidence/memory.raw")
module_scanner = ModuleScanner(analyzer)
# Analyze all loaded modules
modules = module_scanner.enumerate_modules(pid=4892)
for mod in modules:
print(f"Module: {mod.name}")
print(f" Base: 0x{mod.base_address:x}")
print(f" Size: {mod.size}")
print(f" Path: {mod.path}")
# Detect DLL injection
injections = module_scanner.detect_dll_injection()
for inj in injections:
print(f"INJECTION in PID {inj.target_pid}:")
print(f" Technique: {inj.technique}")
print(f" Injected DLL: {inj.dll_name}")
print(f" Source PID: {inj.source_pid}")
# Find unlinked modules
unlinked = module_scanner.find_unlinked_modules()
# Detect reflective DLL loading
reflective = module_scanner.detect_reflective_loading()
# Extract suspicious module
module_scanner.extract_module(
pid=4892,
module_name="suspicious.dll",
output_path="/evidence/extracted/"
)
Task 4: Network Connection Analysis
Input: Memory image file
Process:
- Extract active TCP/UDP connections
- Identify listening ports and services
- Map connections to processes
- Detect suspicious external connections
- Extract connection artifacts
Output: Network connection inventory with process mapping
Example:
from memory_forensics import MemoryAnalyzer, NetworkScanner
analyzer = MemoryAnalyzer("/evidence/memory.raw")
net_scanner = NetworkScanner(analyzer)
# Get all network connections
connections = net_scanner.get_connections()
for conn in connections:
print(f"PID {conn.pid} ({conn.process_name}):")
print(f" Protocol: {conn.protocol}")
print(f" Local: {conn.local_addr}:{conn.local_port}")
print(f" Remote: {conn.remote_addr}:{conn.remote_port}")
print(f" State: {conn.state}")
# Find connections to suspicious IPs
suspicious = net_scanner.find_suspicious_connections(
threat_intel_feed="/feeds/malicious_ips.txt"
)
# Get listening ports
listening = net_scanner.get_listening_ports()
for port in listening:
print(f"Port {port.port}/{port.protocol} - PID {port.pid}")
# Detect covert channels
covert = net_scanner.detect_covert_channels()
# Export to CSV
net_scanner.export_connections("/evidence/network_connections.csv")
Task 5: Credential Extraction
Input: Memory image file
Process:
- Locate credential storage structures
- Extract password hashes (NTLM, LM)
- Find Kerberos tickets
- Identify cached credentials
- Extract plaintext passwords (if available)
Output: Extracted credentials for further analysis
Example:
from memory_forensics import MemoryAnalyzer, CredentialExtractor
analyzer = MemoryAnalyzer("/evidence/memory.raw")
cred_extractor = CredentialExtractor(analyzer)
# Extract all credentials
credentials = cred_extractor.extract_all()
# Get NTLM hashes
ntlm_hashes = cred_extractor.get_ntlm_hashes()
for cred in ntlm_hashes:
print(f"User: {cred.username}")
print(f"Domain: {cred.domain}")
print(f"NTLM Hash: {cred.ntlm_hash}")
# Extract Kerberos tickets
tickets = cred_extractor.get_kerberos_tickets()
for ticket in tickets:
print(f"Service: {ticket.service_name}")
print(f"Client: {ticket.client_name}")
print(f"Expiry: {ticket.expiry_time}")
# Find LSA secrets
lsa_secrets = cred_extractor.get_lsa_secrets()
# Extract cached domain credentials
cached = cred_extractor.get_cached_credentials()
# Export credentials report
cred_extractor.export_report("/evidence/credentials_report.json")
Task 6: Malware Detection
Input: Memory image file
Process:
- Scan for known malware signatures
- Detect code injection techniques
- Identify API hooks and SSDT modifications
- Find hidden/rootkit artifacts
- Analyze suspicious memory regions
Output: Malware detection findings with IOCs
Example:
from memory_forensics import MemoryAnalyzer, MalwareDetector
analyzer = MemoryAnalyzer("/evidence/memory.raw")
detector = MalwareDetector(analyzer)
# Run comprehensive malware scan
findings = detector.scan_all()
# Detect code injection
injections = detector.detect_code_injection()
for inj in injections:
print(f"Injection found in PID {inj.pid}:")
print(f" Type: {inj.injection_type}")
print(f" Address: 0x{inj.address:x}")
print(f" Size: {inj.size}")
# Scan with YARA rules
yara_matches = detector.scan_yara(
rules_path="/rules/malware_rules.yar"
)
for match in yara_matches:
print(f"YARA Match: {match.rule_name}")
print(f" PID: {match.pid}")
print(f" Offset: 0x{match.offset:x}")
# Detect API hooks
hooks = detector.detect_api_hooks()
for hook in hooks:
print(f"Hook: {hook.function_name}")
print(f" Original: 0x{hook.original_address:x}")
print(f" Hooked: 0x{hook.hook_address:x}")
# Check SSDT integrity
ssdt_mods = detector.check_ssdt()
# Detect DKOM (Direct Kernel Object Manipulation)
dkom = detector.detect_dkom()
# Export IOCs
detector.export_iocs("/evidence/memory_iocs.json")
Task 7: Registry Analysis from Memory
Input: Memory image file
Process:
- Locate registry hives in memory
- Extract hives to disk
- Parse registry keys and values
- Identify suspicious registry entries
- Extract persistence mechanisms
Output: Registry analysis with persistence indicators
Example:
from memory_forensics import MemoryAnalyzer, RegistryAnalyzer
analyzer = MemoryAnalyzer("/evidence/memory.raw")
reg_analyzer = RegistryAnalyzer(analyzer)
# List available registry hives
hives = reg_analyzer.list_hives()
for hive in hives:
print(f"Hive: {hive.name} at 0x{hive.virtual_address:x}")
# Extract hive to file
reg_analyzer.extract_hive(
hive_name="SYSTEM",
output_path="/evidence/SYSTEM_hive"
)
# Query specific key
value = reg_analyzer.query_key(
hive="SOFTWARE",
key_path="Microsoft\\Windows\\CurrentVersion\\Run"
)
# Find persistence mechanisms
persistence = reg_analyzer.find_persistence()
for entry in persistence:
print(f"Persistence: {entry.location}")
print(f" Value: {entry.value}")
print(f" Type: {entry.persistence_type}")
# Get recently modified keys
recent = reg_analyzer.get_recent_modifications(hours=24)
# Search registry for pattern
matches = reg_analyzer.search(pattern="*.exe", include_values=True)
Task 8: String and IOC Extraction
Input: Memory image or specific memory regions
Process:
- Extract ASCII and Unicode strings
- Identify URLs, IPs, domains
- Find email addresses and file paths
- Extract potential C2 indicators
- Correlate IOCs with threat intelligence
Output: Extracted IOCs categorized by type
Example:
from memory_forensics import MemoryAnalyzer, IOCExtractor
analyzer = MemoryAnalyzer("/evidence/memory.raw")
ioc_extractor = IOCExtractor(analyzer)
# Extract all IOCs
iocs = ioc_extractor.extract_all()
# Get URLs
urls = ioc_extractor.extract_urls()
for url in urls:
print(f"URL: {url.value}")
print(f" Found at: 0x{url.offset:x}")
print(f" Process: {url.process_name}")
# Get IP addresses
ips = ioc_extractor.extract_ips()
for ip in ips:
print(f"IP: {ip.value} ({ip.geo_location})")
# Get domains
domains = ioc_extractor.extract_domains()
# Get file paths
paths = ioc_extractor.extract_file_paths()
# Extract strings from specific process
proc_strings = ioc_extractor.extract_strings(
pid=4892,
min_length=4,
encoding="both" # ascii and unicode
)
# Correlate with threat intel
enriched = ioc_extractor.enrich_iocs(
threat_feed="/feeds/threat_intel.json"
)
# Export IOCs in STIX format
ioc_extractor.export_stix("/evidence/memory_iocs.stix")
Task 9: Rootkit Detection
Input: Memory image file
Process:
- Check kernel integrity
- Detect hidden drivers
- Analyze SSDT/IDT modifications
- Find DKOM artifacts
- Identify inline kernel hooks
Output: Rootkit detection results with remediation guidance
Example:
from memory_forensics import MemoryAnalyzer, RootkitDetector
analyzer = MemoryAnalyzer("/evidence/memory.raw")
rootkit_detector = RootkitDetector(analyzer)
# Run comprehensive rootkit scan
results = rootkit_detector.scan_all()
# Check for hidden drivers
hidden_drivers = rootkit_detector.find_hidden_drivers()
for driver in hidden_drivers:
print(f"Hidden Driver: {driver.name}")
print(f" Base: 0x{driver.base:x}")
print(f" Size: {driver.size}")
# Analyze SSDT
ssdt_hooks = rootkit_detector.analyze_ssdt()
for hook in ssdt_hooks:
print(f"SSDT Hook: {hook.function}")
print(f" Expected: 0x{hook.expected:x}")
print(f" Actual: 0x{hook.actual:x}")
# Check IDT (Interrupt Descriptor Table)
idt_mods = rootkit_detector.analyze_idt()
# Detect inline hooks in kernel
inline_hooks = rootkit_detector.detect_inline_hooks()
# Check kernel callbacks
callbacks = rootkit_detector.analyze_callbacks()
for cb in callbacks:
print(f"Callback: {cb.type}")
print(f" Address: 0x{cb.address:x}")
print(f" Module: {cb.module}")
# Generate rootkit report
rootkit_detector.generate_report("/evidence/rootkit_analysis.html")
Task 10: Memory Timeline Analysis
Input: Memory image file
Process:
- Extract timestamps from memory structures
- Correlate process creation times
- Analyze recent file handles
- Build execution timeline
- Identify temporal anomalies
Output: Memory-based timeline of system activity
Example:
from memory_forensics import MemoryAnalyzer, MemoryTimeline
analyzer = MemoryAnalyzer("/evidence/memory.raw")
timeline = MemoryTimeline(analyzer)
# Generate comprehensive timeline
events = timeline.generate()
for event in events:
print(f"{event.timestamp}: {event.event_type}")
print(f" Source: {event.source}")
print(f" Details: {event.details}")
# Get process timeline
proc_timeline = timeline.get_process_timeline()
# Get network timeline
net_timeline = timeline.get_network_timeline()
# Find events around specific time
window = timeline.get_events_around(
timestamp="2024-01-15T10:30:00",
window_minutes=30
)
# Export to timeline format
timeline.export_csv("/evidence/memory_timeline.csv")
timeline.export_json("/evidence/memory_timeline.json")
# Generate visual timeline
timeline.generate_html_report("/evidence/timeline_report.html")
Configuration
Environment Variables
| Variable | Description | Required | Default |
|---|---|---|---|
VOLATILITY_PATH |
Path to Volatility installation | No | System PATH |
YARA_RULES_PATH |
Default YARA rules directory | No | ./rules |
SYMBOL_PATH |
Path to debug symbols | No | None |
THREAT_INTEL_FEED |
Threat intelligence feed URL | No | None |
Options
| Option | Type | Description |
|---|---|---|
profile |
string | Force specific OS profile |
output_format |
string | Output format (json, csv, html) |
verbose |
boolean | Enable verbose output |
use_yara |
boolean | Enable YARA scanning |
parallel |
boolean | Enable parallel processing |
Examples
Example 1: Incident Response Memory Analysis
Scenario: Investigating a potential ransomware infection
from memory_forensics import MemoryAnalyzer, ProcessScanner, MalwareDetector, NetworkScanner
# Load memory dump from infected system
analyzer = MemoryAnalyzer("/evidence/infected_host.raw")
# Step 1: Identify suspicious processes
scanner = ProcessScanner(analyzer)
suspicious = scanner.find_suspicious_processes()
print(f"Found {len(suspicious)} suspicious processes")
# Step 2: Check for known ransomware indicators
detector = MalwareDetector(analyzer)
ransomware_iocs = detector.scan_yara("/rules/ransomware.yar")
# Step 3: Identify C2 connections
net_scanner = NetworkScanner(analyzer)
external_conns = net_scanner.find_external_connections()
suspicious_c2 = net_scanner.check_against_threat_intel("/feeds/c2_ips.txt")
# Step 4: Extract encryption keys (if in memory)
keys = detector.find_crypto_keys()
# Step 5: Generate comprehensive report
analyzer.generate_report(
output_path="/evidence/ransomware_analysis.html",
include_timeline=True,
include_iocs=True
)
Example 2: Credential Theft Investigation
Scenario: Investigating Mimikatz or similar credential harvesting
from memory_forensics import MemoryAnalyzer, CredentialExtractor, ProcessScanner
analyzer = MemoryAnalyzer("/evidence/dc_memory.raw")
# Look for Mimikatz artifacts
scanner = ProcessScanner(analyzer)
mimikatz_indicators = scanner.search_command_lines(
patterns=["sekurlsa", "logonpasswords", "lsadump"]
)
# Extract compromised credentials
extractor = CredentialExtractor(analyzer)
credentials = extractor.extract_all()
# Check for Kerberos ticket theft (Golden/Silver ticket)
tickets = extractor.get_kerberos_tickets()
for ticket in tickets:
if ticket.is_suspicious():
print(f"ALERT: Suspicious ticket for {ticket.service_name}")
# Document affected accounts
extractor.generate_affected_accounts_report("/evidence/compromised_accounts.csv")
Example 3: Rootkit Investigation
Scenario: Investigating suspected kernel-level compromise
from memory_forensics import MemoryAnalyzer, RootkitDetector, ModuleScanner
analyzer = MemoryAnalyzer("/evidence/server_memory.raw")
# Comprehensive rootkit analysis
rootkit_detector = RootkitDetector(analyzer)
# Check kernel integrity
integrity = rootkit_detector.verify_kernel_integrity()
if not integrity.is_clean:
print("ALERT: Kernel modifications detected!")
for mod in integrity.modifications:
print(f" - {mod.description}")
# Find hidden components
hidden_drivers = rootkit_detector.find_hidden_drivers()
hidden_processes = rootkit_detector.find_hidden_processes()
# Analyze all hooks
all_hooks = rootkit_detector.find_all_hooks()
# Generate remediation guidance
rootkit_detector.generate_remediation_guide("/evidence/rootkit_remediation.md")
Limitations
- Memory analysis accuracy depends on image acquisition quality
- Encrypted memory regions may not be analyzable
- Some anti-forensics techniques may evade detection
- Profile identification may fail for custom or rare OS versions
- Large memory dumps (>32GB) may require significant processing time
- Credential extraction requires appropriate access permissions
- YARA scanning effectiveness depends on rule quality
Troubleshooting
Common Issue 1: Profile Detection Failure
Problem: Unable to automatically detect OS profile Solution:
- Manually specify profile using
--profileoption - Ensure memory image is not corrupted
- Check if OS version is supported
Common Issue 2: Incomplete Process Listing
Problem: Known processes not appearing in output Solution:
- Enable hidden process detection
- Check for memory corruption
- Verify image acquisition was complete
Common Issue 3: Slow Analysis Performance
Problem: Analysis taking too long Solution:
- Enable parallel processing
- Use targeted scans instead of full analysis
- Ensure adequate system resources
Common Issue 4: YARA Scan Errors
Problem: YARA rules failing to load Solution:
- Validate YARA rule syntax
- Check rule file encoding (UTF-8)
- Update YARA to latest version
Related Skills
- disk-forensics: Complements memory analysis with persistent storage investigation
- malware-forensics: Detailed malware analysis of extracted samples
- timeline-forensics: Integrate memory timeline with other data sources
- artifact-collection: Evidence collection and preservation procedures
- incident-response: Overall IR workflow integration