Unified Memory Forensics MCP Server - Multi-tier engine (Rust + Python + Vol3)
Project description
mem-forensics-mcp
Unified Memory Forensics MCP Server - Multi-tier engine combining Rust speed with Vol3 coverage.
Architecture
Three-tier engine automatically routes each tool to the fastest backend:
LLM <-> [mem-forensics-mcp (Python)] <-> memoxide (Rust child, stdio MCP)
<-> Volatility3 (Python library)
| Tier | Engine | Speed | Coverage |
|---|---|---|---|
| Tier 1 | Rust (memoxide) | Fast | pslist, psscan, cmdline, dlllist, malfind, netscan, cmdscan, search, readraw, rsds |
| Tier 2 | Python analyzers | Medium | Process anomalies, C2 detection, credentials, YARA, VT integration |
| Tier 3 | Volatility3 | Slower | Any vol3 plugin (filescan, handles, svcscan, driverscan, ...) |
Installation
Prerequisites
# Install uv (fast Python package manager)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Ensure Python 3.10+
python3 --version
Install
git clone https://github.com/x746b/mem_forensics-mcp.git
cd mem_forensics-mcp
# Full install (recommended)
uv sync --extra full
# Minimal (Vol3 only, no YARA/VT)
uv sync --extra volatility3
Build Rust Engine (optional)
Prebuilt binaries ship for aarch64-linux and x86_64-linux in engines/memoxide/. The server auto-detects the host architecture. To build from source:
# Requires Rust toolchain (https://rustup.rs)
cd engines/memoxide-src
cargo build --release
# Binary lands at engines/memoxide-src/target/release/memoxide
# The server auto-detects it (prefers local build over prebuilt)
Configure Volatility3 (optional)
If Vol3 is installed at /opt/volatility3 it's auto-detected. Otherwise set the env var:
# Point to repo root or site-packages directory
export VOLATILITY3_PATH="/path/to/volatility3"
Verify
uv run python -m mem_forensics_mcp.server
# Should show: Rust engine: available, Volatility3: available
Adding to Claude CLI
claude mcp add mem-forensics-mcp \
--scope user \
-- uv run --directory /opt/mem_forensics-mcp python -m mem_forensics_mcp.server
With custom Volatility3 path:
claude mcp add mem-forensics-mcp \
--scope user \
-e VOLATILITY3_PATH=/opt/volatility3 \
-- uv run --directory /opt/mem_forensics-mcp python -m mem_forensics_mcp.server
Quick Start
1. Initialize Memory Image
memory_analyze_image(image_path="/evidence/memory.raw")
2. Run Full Triage
memory_full_triage(image_path="/evidence/memory.raw")
3. Drill Down
memory_run_plugin(image_path="/evidence/memory.raw", plugin="malfind", pid=1234)
Tool Reference
Core
| Tool | Tier | Description |
|---|---|---|
memory_analyze_image |
1->2 | Initialize image, auto-detect profile |
memory_run_plugin |
1->3 | Run any plugin (Rust or Vol3) |
memory_list_plugins |
- | List available plugins |
memory_list_sessions |
- | List active sessions |
memory_get_status |
- | Show engine status |
Analysis
| Tool | Tier | Description |
|---|---|---|
memory_full_triage |
1+2 | Complete automated investigation |
memory_hunt_process_anomalies |
2 | DKOM detection, parent-child validation |
memory_get_process_tree |
2 | Process tree with suspicious highlighting |
memory_find_injected_code |
1->2 | Code injection + YARA scanning |
memory_find_c2_connections |
1+2 | Network C2 detection |
memory_get_command_history |
1+2 | Command recovery + classification |
memory_extract_credentials |
2 | Hash/secret extraction via Vol3 |
Extraction
| Tool | Tier | Description |
|---|---|---|
memory_dump_process |
2 | Process info and loaded DLLs |
memory_dump_vad |
2 | Examine memory region details |
memory_list_dumpable_files |
3 | List cached files |
Threat Intelligence
| Tool | Description |
|---|---|
vt_lookup_hash |
VirusTotal hash lookup |
vt_lookup_ip |
VirusTotal IP reputation |
vt_lookup_domain |
VirusTotal domain reputation |
vt_lookup_file |
Hash file + VT lookup |
Example: Full Triage Output
Running memory_full_triage on a Windows 10 memory dump (Win10 19041, x64, VMware):
{
"threat_level": "critical",
"risk_score": 100,
"summary": "Processes: 115 found. Process Anomalies: 4 info-level. Network: 4 flagged of 79 connections. Commands: 52 suspicious fragments. Injected Code: 12 RWX regions. Correlations: 2 critical.",
"engine": "rust+python"
}
Tier routing in action:
- Rust (Tier 1) collected process list, psscan, cmdlines, netscan, malfind, cmdscan in ~2s
- Python (Tier 2) correlated findings: parent-child validation, C2 detection, injection analysis, risk scoring
Key findings from the triage:
| Category | Detail |
|---|---|
| Suspicious process | mmc.exe launched from explorer.exe, loading a .msc file from browser downloads |
| Injected code | 4 RWX private memory regions in mmc.exe, 2 in EXCEL.EXE |
| Child process | dllhost.exe spawned by mmc.exe with executable RWX region |
| Network | svchost.exe connections to external IPs on ports 443/80 |
| Correlations | active_implant + active_c2_session flagged as critical |
| IOCs | Suspicious external IPs extracted automatically |
Drill-down with filtered filescan:
memory_run_plugin(image_path="memory.raw", plugin="filescan", filter="notepad")
# Returns: 2 of 7612 results matched (server-side grep before truncation)
Targeted file extraction with CLI fallback:
memory_run_plugin(image_path="memory.raw", plugin="dumpfiles",
params={"virtaddr": [0xa7850eb98de0], "dump_dir": "/tmp/out"})
# Returns: 1 result — Notepad.lnk extracted to /tmp/out/
# (auto-routes to vol3 CLI for ListRequirement params)
Why Multi-Tier? Real-World Testing Observations
Tested on several different memory dumps (Win7 SP1 through Win11, x64, both VirtualBox and VMware images).
Tier 1 (Rust) — Speed Where It Matters
The Rust engine handles the plugins that get called most frequently during investigation. The search plugin is the standout:
- Full-dump byte search scans 500MB-1GB dumps in seconds, finding ASCII and UTF-16LE strings anywhere in physical memory
- A single
searchcall can locate email content, browser JSON blobs, embedded URLs, and credential fragments buried deep in physical memory — data that would otherwise require chaining multiple Vol3 plugins (pslist, memdump, strings) to extract - Process listing (
pslist), command lines (cmdline), and network connections (netscan) return instantly, enabling rapid triage of 50-100+ process dumps
The speed advantage compounds during full_triage, where Tier 1 collects pslist + psscan + cmdline + netscan + malfind + cmdscan data in ~2s, compared to ~30s+ for Vol3 equivalents.
Tier 2 (Python Analyzers) — Intelligence Layer
Raw plugin output is data. Tier 2 turns it into findings:
- Process anomaly detection cross-references pslist vs psscan (DKOM detection) and validates parent-child relationships against Windows rules — reduces 50+ processes to a handful of actionable anomalies
- PID reuse handling distinguishes terminated parent processes from truly suspicious orphans, eliminating false positives that plague naive parent-child checks
- Full triage orchestrator correlates across all data sources: processes with RWX regions + external network connections = "active implant" correlation. This multi-source correlation elevates raw data into risk scores and IOC lists
- C2 detection enriches netscan results with process context — svchost connecting to external IPs on unusual ports gets flagged, while the same connection from a browser does not
Tier 3 (Vol3) — Coverage for Everything Else
Vol3 handles the long tail of forensic needs:
filescan+dumpfilesfor file extraction from memory cache (documents, archives, browser databases)handles,svcscan,driverscanfor deep-dive investigation- Server-side
filterparameter greps results before returning — e.g.filescanwithfilter="keyword"returns matching entries from thousands of cached files - CLI fallback for
ListRequirementparams (e.g.,dumpfileswithphysaddrlists) that Vol3's Python API mishandles
Tier Routing Is Invisible
The key design principle: the LLM (or analyst) never needs to know which tier handles a request. memory_run_plugin(plugin="pslist") routes to Rust; memory_run_plugin(plugin="filescan") routes to Vol3. If Rust fails, Vol3 takes over. The routing is an implementation detail, not a user concern.
Related Projects
| Project | Focus |
|---|---|
| winforensics-mcp | Windows disk forensics - EVTX, Registry, MFT, Prefetch, YARA, PCAP |
| mac_forensics-mcp | macOS DFIR - Unified Logs, FSEvents, Spotlight, Plists |
License
MIT License
Author
xtk
Built for the DFIR community. No Windows required >)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mem_forensics_mcp-0.1.0.tar.gz.
File metadata
- Download URL: mem_forensics_mcp-0.1.0.tar.gz
- Upload date:
- Size: 2.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Kali GNU/Linux","version":"2025.4","id":"kali-rolling","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db5110143a9efb54c4aa1974564d1ac1a4338cfb30ab4644188ab2fd0679fd10
|
|
| MD5 |
7837e591c1d72e11de3d7894c8fd0159
|
|
| BLAKE2b-256 |
6ac9972e976324c77f0fac6efeba4613c4ce326130731f910699c142fe132e53
|
File details
Details for the file mem_forensics_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mem_forensics_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 67.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Kali GNU/Linux","version":"2025.4","id":"kali-rolling","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f35cb089895830ae85d7b608ff50ead1c32c040ed79f6529cd5b8839ad58f202
|
|
| MD5 |
c32a788cf865b84d29c844274cd92c68
|
|
| BLAKE2b-256 |
9313449a2fd16122df3d30ecdeb50edebf629411027906b6f6bdfdc0a490020b
|