
Open-source Windows forensics engine that acquires, parses, and correlates artifacts (MFT, USN, Registry, etc.) to reconstruct timelines with AI-assisted analysis and court-grade evidence sealing.
A forensic time machine for Windows.
Crow-Eye doesn't just detect — it reconstructs what actually happened on the timeline, from acquisition all the way to a verdict traceable to its source records.
Crow-Eye is an open-source (GPL-3.0) Windows forensics engine that unifies acquisition, analysis, verification, intelligence, and AI. Most security tools ask "is this bad?" and clear whatever looks legitimate. Crow-Eye asks a different question: "what happened?" It correlates all activity — suspicious or not — and reconstructs the actual sequence of events on a system, so the truth of an investigation is rebuilt from evidence rather than guessed from alerts.
That reconstruction-first design is exactly what it takes to hunt APT and nation-state threats: sophisticated adversaries live inside legitimate tools (powershell.exe, PsExec, certutil) and in the sequence of actions — invisible to tools that clear anything that looks normal. Because Crow-Eye never clears anything and reasons over execution artifacts (which survive log tampering and anti-forensics), the attack can't hide. The same engine stays approachable for everyday DFIR work and for non-experts who simply want to know what happened on a computer.
Crow-Eye is used across very different workflows. Each one enters the engine through a different door:
Any collector works. Crow-Eye does not require its own acquisition tool. Point the Offline Importer at a folder of raw artifacts produced by Velociraptor, KAPE, an EDR collection package, or any other collector — it indexes the supported artifacts and runs the offline parsers over them. Separately, output from Plaso, Autopsy, Volatility or any other tool can be brought in as CSV, JSON, or SQLite via Import Evidence and correlated alongside native artifacts.
Crow-Eye is built as an integrated loop — each stage feeds the next, from raw disk to a defensible verdict.
Crow-Eye is an integrated pipeline, not a bag of parsers. Evidence flows one way, and every stage keeps its link back to the source record.
%%{init: {"flowchart": {"nodeSpacing": 60, "rankSpacing": 70, "curve": "basis"}, "themeVariables": {"fontSize": "17px", "fontFamily": "system-ui, sans-serif"}} }%%
flowchart TB
%% ═══════════ 1. EVIDENCE SOURCE ═══════════
S1["Live Windows system"]
S2["Forensic image<br/>E01 · VHDX · VMDK · Raw"]
S3["Collected artifacts<br/>Velociraptor · KAPE · EDR"]
S4["Third-party output<br/>Plaso · Autopsy · Volatility"]
%% ═══════════ 2. INGEST ═══════════
I1["CROW-CLAW<br/>live acquisition"]
I2["IMAGE PARSING<br/>direct, no mounting"]
I3["OFFLINE IMPORTER<br/>SCAN → COLLECT → PARSE"]
I4["IMPORT EVIDENCE<br/>CSV · JSON · SQLite"]
PARSERS["ARTIFACT PARSERS<br/>18 artifact types · live and offline"]
%% ═══════════ 3. CASE ═══════════
CASE[("CASE DATABASES<br/>Target_Artifacts/<br/>Imported_Evidence/")]
%% ═══════════ 4. ANALYSIS ═══════════
TL["INTERACTIVE TIMELINE<br/>heat map · week · day"]
UB["USER BEHAVIOR ANALYTICS<br/>40 detections · plain-English story"]
CE["CORRELATION ENGINE<br/>Feathers → Wings → Engines → Pipelines"]
RES[("Correlation results")]
DL["DYNAMIC LINKING<br/>non-destructive enrichment overlay"]
INTEL[("Crow_Intelligence.db<br/>SID · MAC · hash · GUID → name")]
%% ═══════════ 5. AI LAYER ═══════════
EYE["EYE<br/>GEP-governed AI assistant"]
NM["NARRATIVE MAP<br/>hash-chained case memory"]
COMP["COMPLIANCE<br/>live GEP status · EvidenceSeal audit"]
OUT["LIVING REPORT<br/>CSV · JSON · HTML"]
%% ═══════════ FLOW ═══════════
S1 --> I1
S2 --> I2
S3 --> I3
S4 --> I4
I1 --> PARSERS
I2 --> PARSERS
I3 --> PARSERS
PARSERS -- "parsed artifacts" --> CASE
I4 -- "verbatim copy or<br/>converted to feather" --> CASE
CASE -- "read-only" --> TL
CASE -- "read-only" --> UB
CASE -- "read-only" --> CE
CASE -- "read-only" --> DL
CE --> RES
DL --> INTEL
CASE -- "read-only queries" --> EYE
RES -. "queried on demand" .-> EYE
EYE <== "verdict · narrative · evidence" ==> NM
EYE -- "audited by" --> COMP
EYE -- "report_* tools" --> OUT
%% ═══════════ STYLE ═══════════
classDef src fill:#334155,stroke:#94a3b8,stroke-width:2px,color:#f1f5f9
classDef ing fill:#0f766e,stroke:#2dd4bf,stroke-width:2px,color:#f0fdfa
classDef store fill:#92400e,stroke:#fbbf24,stroke-width:3px,color:#fffbeb
classDef ana fill:#1e40af,stroke:#60a5fa,stroke-width:2px,color:#eff6ff
classDef ai fill:#6b21a8,stroke:#c084fc,stroke-width:2px,color:#faf5ff
classDef out fill:#166534,stroke:#4ade80,stroke-width:2px,color:#f0fdf4
class S1,S2,S3,S4 src
class I1,I2,I3,I4,PARSERS ing
class CASE,RES,INTEL store
class TL,UB,CE,DL ana
class EYE,NM,COMP ai
class OUT out
linkStyle default stroke-width:2px
Evidence source → Ingest → Case databases → Analysis → AI layer → Report
How to read it:
Independent stages. The Timeline and UBA read the case artifact databases directly — neither requires a correlation run, and the Timeline does not depend on the Correlation Engine (it applies its own lightweight temporal grouping). Correlation is an additional analysis layer whose results the Eye can query.
Read-only by design. Parsing writes to the case database; every downstream stage (UBA, the Timeline, correlation viewers, the Eye) opens those databases read-only. The original evidence is never modified — Dynamic Linking reads the case databases to build a per-case Crow_Intelligence.db of identity mappings and enriches the artifact data tables inline via non-destructive ATTACH + LEFT JOIN queries rather than rewriting rows.
Governed by design. Every action the Eye takes is anchored to the tamper-evident EvidenceSeal hash chain, and the Compliance page continuously verifies the Eye against the Ghassan Elsman Protocol (GEP) — live per-rule status, exportable to EYE_Logs/audit_trail.json.
Recommended: get the packaged Windows build (MSI installer / EXE) from the official website — no Python setup, runs out of the box.
The installed MSI/EXE build is the recommended way to run Crow-Eye, and it is our top priority for updates:
Prefer to run from source? See Quick Start below. The from-source build is intended for contributors and does not include the auto-updater — use the MSI/EXE for automatic updates.
Download the MSI/EXE from crow-eye.com/download, install, and launch Crow-Eye as Administrator. Create a case and start analyzing.
For contributors and advanced users. This path does not include the auto-updater — use the MSI/EXE for automatic updates.
Requirements (installed automatically on first run):
Recommended hardware
Correlation streams in constant memory for very large datasets, so RAM is rarely the hard limit — disk throughput and free space usually are.
Launch (run as Administrator so Crow-Eye can access system artifacts):
python "Crow Eye.py"
The main interface opens, you create a case, and all analysis output is organized under that case directory for later review and reporting.
🖥️ Cross-platform note: on Linux, live parsers are disabled automatically and Crow-Eye runs in offline / forensic-image mode. Full live acquisition is Windows-only.
Crow-Eye parses a broad set of Windows execution, file-system, and user-activity artifacts, both from a live system and from offline sources (collected folders or forensic images).
Jump Lists & LNK are parsed by Crow-Eye's own purpose-built LNK / Jump List parser — not a third-party module.
Custom registry / locked files: Windows locks live registry hives (
NTUSER.DAT,SOFTWARE,SYSTEM) during operation. For custom analysis of a live system, boot from external media (WinPE/Live CD), use forensic acquisition tools, or analyze a disk image.
CrowEye/Artifacts Collectors/Target Artifacts (or your case's registry/ folder):
NTUSER.DAT from C:\Users\<Username>\NTUSER.DATSOFTWARE from C:\Windows\System32\config\SOFTWARESYSTEM from C:\Windows\System32\config\SYSTEMC:\Windows\Prefetch, extracting execution history and forensic metadata (including per-run timestamps).Crow-Claw is Crow-Eye's specialized acquisition engine for collecting and preserving artifacts from live systems or mounted images.
Analyze artifacts collected from any source without a live connection to the target — three clear operations:
live_acquisition folder, organized by type.Parsing is handled by Crow-Eye's dedicated offline parsers — the same artifact logic as live mode, operating on collected files: Prefetch, Registry, MFT, USN (plus the MFT/USN correlator), AmCache, ShimCache, SRUM, Event Logs, LNK/JumpLists, and Recycle Bin.
Beyond raw artifacts, Crow-Eye can take third-party forensic output straight into a case — Plaso, Autopsy, Volatility, or any custom export — and make it usable by the Eye and the Timeline without requiring a correlation run first.
Because the case database manager auto-discovers any .db under the case tree, imported evidence immediately becomes available to:
imported artifact type, with working time-window filtering and time bounds.The importer is stdlib-only (sqlite3 / csv / json) and runs on a background worker, so large imports do not block the UI.
Analyzes artifacts directly from the running Windows system, auto-extracting from their standard locations for real-time forensic analysis.
Every investigation is a case: a self-contained directory that organizes artifact databases and analysis output. Crow-Eye tracks recent cases (with favorites, tags, and status), validates a case on open, writes config atomically (crash-safe), and supports case config import/export and templates with ready-made semantic mappings.
Correlate events across artifacts on a unified temporal grid, with Heat Map, Week, and Day views — an identity-threaded, court-traceable story rather than a flat super-timeline.
The Timeline reads the case's parsed artifact databases directly and is independent of the Correlation Engine — you do not need to build feathers, author wings, or run a pipeline to use it. It applies its own lightweight temporal grouping (exact-timestamp and time-window correlation, grouping by application, path, or user) to relate events on the grid. Evidence brought in through Import Evidence also appears on the timeline as the imported artifact type, with working time-window filtering and time bounds.
Full-text search across the case database, plus export to CSV (spreadsheets), JSON (integration with other tools), and Detailed HTML reports (full dossiers consolidating every artifact tied to a search term).
Translate raw technical identifiers — SIDs, MAC addresses, hashes — into human-readable context on the fly. Dynamic Linking enriches the view using non-destructive SQL ATTACH queries, so the original evidence is never modified, and it can ingest bulk IOC threat feeds to flag known-bad indicators inline.
Turn raw artifacts into a plain-English activity story — a manager/HR-readable account of what a user and their applications actually did, with every statement traceable to the exact source evidence.
User Behavior Analytics (UBA) reads the parsed artifact databases in your case's Target_Artifacts/ folder (strictly read-only) and replays them through a declarative rule set to produce a clear, chronological Activity Story. Open it from the "User Behavior" toolbar button or with Ctrl+Shift+B (a case must be loaded).
uba/config/behavior_rules.json) — tunable without code — each classified by severity: routine · notable · suspicious · critical.runas), account & group changes, service changes, system-clock tampering (suspicious), and event-log clearing (critical).database : table : rowid) — nothing is asserted without a source.The 40 detections span four severity classes and the full breadth of the parsed artifact set:
Filters: free-text search · user/actor (including "Unattributed" and a signed-in-session toggle) · behavior class (user / application / system) · severity · application (searchable multi-select across 200+ programs) · datetime range with quick presets (all time / first day / last day / last hour of activity).
Data sources: Security, System and Application Event Logs · USN Journal · MFT · UserAssist · BAM · Prefetch · ShimCache · AmCache · MUICache · ShellBags · LNK / JumpLists · Recycle Bin · SRUM (application, network, connectivity) · registry hives.
database → table → rowid and opens the real source rows on demand.<user>'s session"), never to attribute an action.UBA is rule-driven behavioral correlation and classification, not statistical/ML anomaly scoring — every finding maps to an explicit, auditable rule. See
RELEASE_NOTES.mdfor the full detection catalogue.
Correlation Engine v1.7.0 — the reconstruction core. See RELEASE_NOTES.md for release history.
The Crow-Eye Correlation Engine is a production-grade forensic correlation system. It ingests Windows artifacts from any source, normalizes them, and surfaces the temporal and identity relationships that turn isolated records into a coherent narrative of what happened on a system, when, and who was involved. It works out of the box with built-in correlation rules (Wings) for the most common investigation questions, lets analysts author custom rules without touching code, and defers meaning to authorable rules and the investigator — never to a black-box score.
Universal Data Import: The Correlation Engine can take output from any forensic tool in CSV, JSON, or SQLite format and convert it into a Feather database. This means you can correlate data from third-party tools (Plaso, Autopsy, Volatility, etc.) with Crow-Eye's native artifacts, creating a unified correlation analysis across all your forensic data sources.
A focused accuracy pass, validated end-to-end against a real ~700K-record Windows case, layered on top of earlier reliability work. Every fix below is locked by the pytest regression suite and verified by a holistic validation harness that exercises all 7 default wings against both engines.
The identity engine captures all the evidence
TypeError and aborted the per-row loop). Records-seen jumped from 3,558 → 745,615 on the validation case.User, ComputerName, NewProcessName, TargetUserName) before channel/provider metadata.artifact column on each row. The engine now falls back to feather_metadata.artifact_type, so SecurityLogs / SystemLogs / ApplicationLogs use their artifact-specific identity priority.'N/A', 'Unknown', '-', nil-GUIDs bundled unrelated records together). The validator now rejects 30+ placeholder variants.No more "everything is Low — something is wrong"
High. Matches with feather_count == 1 now get confidence_category="Low - single feather", so the High view focuses on real cross-feather correlation.chrome had 10+ keys and never correlated). The key is now name-only — cross-feather correlation works again.Impersonation detection via path classification — after a match is formed, the engine classifies every record's path as TRUSTED (Program Files, System32, WinSxS, the BAM/SRUM /device/harddiskvolumeN/... forms, …) or SUSPICIOUS (Temp, Downloads, Public, AppData\Local\Temp, Recycle Bin, removable roots, network shares). A match spanning both classifications raises impersonation_alert (≈0.05% rate, each a real candidate).
Honest evidence accounting — a per-window drop ledger with named buckets (no_identity_field, normalize_failure, below_threshold_skipped, …) plus a per-pipeline summary (records seen, high/low emitted, no-identity, drop buckets, timeless-feather joins). Every record either lands in a match or in a named drop bucket — "no evidence left over" is verifiable from the log. low_confidence_review_mode is ON by default, so below-threshold groups become Low-confidence matches instead of silently vanishing.
Timeless-feather identity enrichment — feathers without per-row timestamps (AutoStartPrograms, MUICache, SystemServices, TypedPaths) no longer get a fake generation-time stamped on every row; instead, after timed matches form, the engine joins matching records from every timeless feather by identity as supplementary evidence.
Consolidated identity registry — config/standard_fields/identities.json is the single source of truth for every column the engines + Eye should consult: 98 categories, 1,146 column synonyms (app/process, file, hash, user, host/device, network, registry, service/task, event, email, browser, cloud, Windows internals, certificate, container, OS objects). Adding a new column synonym is a JSON edit, not a code change.
Semantic-mapping false-positive fixes — multi-indicator gating now actually enforced (data-exfiltration-pattern requires ≥2 indicators); impossible AND rules (4625 AND 4624) rewritten as OR; wiper/remote-tool rules use real regex instead of firing on every Prefetch entry; baseline-activity rules demoted from high/critical to info/low (the wing's weighted scoring escalates real threats).
The Correlation Engine is production-ready and actively used in investigations (Correlation Engine v1.7.0):
Chrome.exe/chrome.dll/Chrome.EXE collapse to one bucket; versions and architectural qualifiers stay distinct.YYYYMMDD, US slash, and annotated strings all parsed correctly on the first try.run_times) expanded so every execution gets its own correlation event.config/standard_fields/*.json; per-table metadata in correlation_engine/config/feather_schemas.json — extend by editing JSON, not code.query_time_range_iter; lock-protected feather caches; ready for parallel correlation.The Correlation Engine consists of four main components:
Purpose: Transform raw forensic artifacts into a standardized, queryable format.
Any Tool Output → Feather Builder → Normalized Feather Database
(CSV/JSON/SQLite) (SQLite with standard schema)
Examples:
- Plaso CSV → Feather Builder → timeline.db
- Autopsy JSON → Feather Builder → autopsy_artifacts.db
- Volatility CSV → Feather Builder → memory_artifacts.db
- Custom Output → Feather Builder → custom.db
Supported import formats: CSV (any headered file), JSON (flat or nested), and SQLite (direct import). Automatic column mapping, data-type detection, timestamp normalization to ISO, validation, and optimized indexes.
prefetch.db (Feather)
├── feather_metadata (artifact type, source, record count)
├── prefetch_data (executable_name, path, last_executed, hash)
└── Indexes (timestamp, name, path)
Purpose: Define which artifacts to correlate and how.
{
"wing_id": "execution-proof",
"wing_name": "Execution Proof",
"correlation_rules": {
"time_window_minutes": 5,
"minimum_matches": 2,
"anchor_priority": ["Prefetch", "SRUM", "AmCache"]
},
"feathers": [
{"feather_id": "prefetch", "weight": 0.4},
{"feather_id": "shimcache", "weight": 0.3},
{"feather_id": "amcache", "weight": 0.3}
]
}
Purpose: Execute correlation logic to find relationships between artifacts. Structural links come first; a tier-weighted score is layered on top as interpretation/ranking, not as the basis for a match.
Time-Window Scanning Engine — best for time-based analysis and systematic temporal correlation. Scans through time in fixed intervals, collects records from all feathers per window, applies semantic field matching + weighted scoring, and prevents duplicates via MatchSet tracking. O(N log N) (indexed timestamp queries); batch processing (~2,567 windows/second).
Identity-Based Correlation Engine — best for large datasets (>1,000 records) and identity tracking. Extracts and normalizes identities, groups records by identity, builds temporal anchors within each cluster, classifies evidence as primary/secondary/supporting, and streams for very large sets (>5,000 anchors) at constant memory. O(N log N); 40+ identity field patterns per type.
Engine selection: use the Time-Window engine for time-based analysis and the Identity-Based engine for identity tracking — both are production-ready and optimized for large datasets with indexed queries.
Purpose: Automate complete analysis workflows from feather creation to result generation. A pipeline reads its config (engine type, wings, feathers), instantiates the right engine via the EngineSelector, executes each wing, aggregates matches, saves results (DB + JSON), and displays them in the GUI with filtering and visualization.
{
"pipeline_name": "Investigation Pipeline",
"engine_type": "identity_based",
"wings": [{"wing_id": "execution-proof"}, {"wing_id": "file-access"}],
"feathers": [
{"feather_id": "prefetch", "database_path": "data/prefetch.db"},
{"feather_id": "srum", "database_path": "data/srum.db"},
{"feather_id": "eventlogs", "database_path": "data/eventlogs.db"}
],
"filters": {
"time_period_start": "2024-01-01T00:00:00",
"time_period_end": "2024-12-31T23:59:59"
}
}
1. Data Preparation Raw Forensic Data → Feather Builder → Feather Databases
2. Configuration Wing Configs + Feather References → Pipeline Config
3. Execution Pipeline Executor → Engine Selector → Correlation Engine
4. Correlation Engine loads Feathers + applies Wing rules → Correlation Results
5. Visualization Results Database → Results Viewer GUI
Scenario: prove that malware.exe was executed on a system.
{
"wing_id": "malware-execution",
"correlation_rules": { "time_window_minutes": 5, "minimum_matches": 2 },
"feathers": ["prefetch", "shimcache", "amcache"]
}
from correlation_engine.pipeline import PipelineExecutor
executor = PipelineExecutor(pipeline_config)
results = executor.execute()
Identity: malware.exe
Anchor 1 (2024-01-15 10:30:00):
✓ Prefetch: malware.exe executed at 10:30:00
✓ ShimCache: malware.exe modified at 10:30:15
✓ AmCache: malware.exe installed at 10:29:45
Conclusion: Execution proven with 3 corroborating artifacts
| Records |
|---|
python -m correlation_engine.mainA powerful assistant, not a replacement. Eye automates and verifies an investigator's hypotheses — it never makes the call for you.
Eye is Crow-Eye's built-in forensics AI assistant: a skilled forensic investigator backed by a real knowledge base of Windows artifacts. It gives you a natural-language interface to query, correlate, and document everything in a case — Prefetch, MFT, Registry, Event Logs, AmCache, ShimCache, SRUM, and more — while keeping an auditable, tamper-evident record of exactly what it did. Eye can run entirely on your own hardware (including fully air-gapped), in keeping with Crow-Eye's "0 ms data sent off-device" privacy stance. Full architecture: eye/README.md.
Eye turns conversational questions ("show me what executed from C:\Temp after 22:00") into real forensic work: it plans an approach, retrieves relevant artifact knowledge, runs SQL and cross-artifact searches against your case databases, and synthesizes a validated answer. Every answer is produced in two places at once — a chat reply for you, and a structured block written into a Living Report Workspace so the dossier builds itself as the investigation proceeds.
Everything Eye does is anchored to the Ghassan Elsman Protocol (GEP) — a vendor-neutral, tool-agnostic standard for how any AI should be used in digital forensics. It is 10 principles a conforming system must uphold so AI-assisted findings stay truthful, traceable to source records, and backed by an auditable, tamper-evident chain, with the human investigator in control:
Crow-Eye's Eye is the reference implementation of the GEP; the in-product behaviors that uphold it are Operating Rules. 📜 Read the standard: eye/docs/GEP_standard.md.
Eye adapts to your threat model through three deployment modes:
In CLI-agent mode, Crow-Eye drives an existing AI terminal/command-line agent as the model — instead of a cloud API or a local offline server — so you can investigate with the agent you already use.
The investigation loop:
You can change models at runtime with the switch_model tool. Switching is restricted to the same backend, so evidence is never silently sent to a different provider than the one you chose.
Eye is built so you can see — and later prove — how it reached a conclusion. As Eye works, it streams structured ThinkingStep updates to the UI in real time; each carries a step_id, type, human-readable label, status (active → done, or error), and optional tool/params/detail.
| Step type | What you're seeing |
|---|---|
thinking |
A typical query unfolds as thinking → rag → thinking → tool_call → synthesis, and every case keeps on-disk trace artifacts you can inspect afterward:
| File | What it records |
|---|---|
<case>/EYE_Logs/eye_payload_seal.jsonl | The exact payloads sent to the model, hash-chained. |
<case>/EYE_Logs/truncation_audit.log | What context was kept, summarized, dropped, or pinned — and why. |
<case>/case_history.json | The full conversation history, with per-message token counts. |
Eye is tool-driven: the model never touches evidence directly. It emits tool calls, and Eye executes them against the case's databases and returns the results — so every action is explicit, logged, and reproducible. Tools are defined in configs/llm_config.json and dispatched through eye/services/context_manager.py.
Investigative tools — read and analyze evidence:
Reporting tools build the Living Report Workspace: report_append_section, report_add_data_table, report_add_chart, report_add_timeline, report_add_heatmap, report_add_chain_of_custody, report_add_chat_transcript, report_add_image, report_edit_section, report_delete_section, chat_add_table, and export_report (export requires human approval).
Authoring tools (governed — see Building Correlation Wings & Semantic Mappings): correlation_create_wing, correlation_edit_wing, correlation_create_semantic_mapping, correlation_edit_semantic_mapping. Tool calls are translated to whatever the active backend expects — native function-calling for cloud APIs and local servers, or an XML <tool_call> wrapper for CLI agents.
Eye doesn't just query the Correlation Engine — it can help extend it. When Eye spots a recurring cross-artifact pattern, it can propose new Wings (correlation rules) and Semantic Mappings (technical-to-human translations). This is governed authorship: Eye proposes, the analyst reviews the saved artifact, and every change is justified and evidence-backed.
A Wing ties feathers together within a time window and a minimum-match threshold to prove a claim:
A Semantic Mapping translates a raw technical value into human-readable meaning (e.g. EventID 4624 → "Successful Logon"). It comes in two flavors: a simple mapping (single value/regex → semantic value) or a multi-condition rule (conditions joined by AND/OR). Both support category, severity, confidence, and scope, and both require reason + related_evidence.
Governance — write-side rules that uphold the GEP:
reason.database:table:rowid reference.Long investigations can outgrow a model's context window — especially smaller offline models. Instead of crashing or silently dropping evidence, Eye auto-compacts its own context before every model call (inside its guarded generation path, fully audited).
Before each call, Eye measures the full payload and reserves room for the reply (10% of the window, min 512 tokens, never more than half). If it still doesn't fit, it heals in two ordered passes, never touching protected messages (pinned, auto-detected evidence, or a tool result):
SUMMARIZED.TRUNCATED.If the irreducible evidence core (pinned + tool results + the current question) still overflows, Eye refuses to proceed rather than truncate evidence (REFUSED_OVERFLOW) and asks you to narrow the query or use analyze_large_dataset. Whatever finally goes to the model is the exact payload that gets sealed for chain of custody.
The Eye is stateless between turns — so the Narrative Map is where "what we know and what we've concluded" lives for a case. It is the Eye's persistent, auditable, tamper-evident working memory, and its contents are injected into the Eye's prompt on every turn (the map literally is the memory).
proven · open · negative · needs · absolute), and the artifact-backed Evidence beneath those.narrative_map_audit.jsonl). You can add, edit, and remove its claims and evidence, directly shaping how the Eye understands and interprets the case.open with no evidence while it investigates, but it can never be proven without evidence; a theme the Eye checked but found empty auto-converts to negative — because a documented absence is itself a finding.Compliance isn't a feature bolted on top — it's enforced in the pipeline.
database:table:rowid, plus computed offsets for MFT records). Seals are append-only and hash-chained to <case>/EYE_Logs/eye_payload_seal.jsonl — a single altered or removed record breaks the chain, so the log proves mathematically which bytes the model analyzed.<case>/EYE_Logs/truncation_audit.log (SUMMARIZED, TRUNCATED, PRESERVED, PINNED, UNPINNED, BUDGET_REDUCED), each with a hash. Detected evidence is auto-pinned above a confidence threshold; you can also pin messages manually.📖 Full Eye architecture: eye/README.md.
Historically, investigators fell into the trap of trusting their forensic tools without understanding how the underlying artifacts behave or how the tool parsed them. The risk today is simply replacing "the tool" with "the AI". An AI can parse a record with perfect technical accuracy and still place it in the wrong context — changing the entire meaning of the evidence.
Eye-Describe exists so that neither the human nor the model has to guess. It is an interactive, byte-level reference for the raw binary structures of Windows artifacts, and it serves two roles at once:
| Role | What it does |
|---|---|
| 🧑🏫 The blueprint for the human | An interactive educational reference to the deep byte-level anatomy of Windows artifacts — what each structure is, how it behaves, what it can and cannot prove. Free to use, aimed at students, educators, and practitioners who want to understand the evidence rather than the output column. |
| ⚖️ The compliance anchor for the AI |
By anchoring the AI layer to documented artifact behavior, Crow-Eye is not asking you to trust a model — it is constraining the model to respect the raw forensics.
Don't replace tool trust with AI trust. Understand the data.
Forensic tooling is only useful if its output can be defended. Crow-Eye's correctness work is deliberately visible:
RELEASE_NOTES.md — including cases where a fix changed records-seen by orders of magnitude. Knowing what was wrong, and when, is part of what makes a result defensible.verify_chain() re-walks the Narrative Map audit log and the Evidence Seal chain to detect modification — including of human-readable fields.Crow-Eye is more than software — it's an open research platform accelerating the entire field of Windows forensics. The project focuses on:
A selection of Crow-Eye's interface and analysis views.






Planned and in-progress work (see RELEASE_NOTES.md for shipped changes):
Have an idea or want to add an artifact? Open an issue or see Contributing.
Crow-Eye is built as an open research platform, and contributions are welcome — new parsers, correlation rules, documentation, and artifact research.
Crow-Eye is released under the GNU General Public License v3.0 (GPL-3.0). It is free to use, study, share, and modify under the terms of that license.
If you use Crow-Eye in academic work, published research, or a case report, please cite it:
@software{elsman_crow_eye,
author = {Elsman, Ghassan},
title = {Crow-Eye: A Windows Forensics Engine},
url = {https://github.com/Ghassan-elsman/Crow-Eye},
license = {GPL-3.0},
year = {2026}
}
Plain text: Elsman, G. Crow-Eye: A Windows Forensics Engine (GPL-3.0). https://github.com/Ghassan-elsman/Crow-Eye
For methodology citations, the Ghassan Elsman Protocol is documented separately in eye/docs/GEP_standard.md.
Crow-Eye is free and open-source, built and maintained by one person. If it helps your work, please consider sponsoring — it directly funds new parsers and research: SPONSORS.md · GitHub Sponsors.
Created and maintained by Ghassan Elsman.
| You are | Your typical input | Where to start |
|---|
| Corporate IR / MSSP / MDR | Targeted collections from Velociraptor, KAPE, or EDR-native collection | Offline Importer → Correlation Engine → UBA |
| Law enforcement / forensic labs | Full forensic images (E01, VHDX, VMDK, Raw) with chain-of-custody requirements | Image analysis → Correlation Engine → Narrative Map |
| Internal security / insider-threat & HR investigations | Live systems or collected artifacts | Live analysis → UBA activity story |
| Students, educators & researchers | Sample images and lab data | Eye-Describe → Quick Start |
| Subsystem | What it does | Stage |
|---|
| Crow-Claw | High-speed acquisition of live systems and dead-box images. | Acquisition |
| Offline Importer | SCAN → COLLECT → PARSE artifacts from any source into the case database. | Acquisition |
| Correlation Engine | Dual-engine (Identity + Time-Window) reconstruction via Feathers · Wings · Engines · Pipelines. | Analysis |
| Interactive Timeline | Identity-threaded, court-traceable timeline (Heat Map / Week / Day views), read straight from the case databases. | Verification |
| User Behavior Analytics (UBA) | Rule-driven, plain-English "what did this user do" activity story. | Intelligence |
| Eye — AI Assistant | Natural-language investigation + the sealed Narrative Map case memory. | AI |
| Storage Forensics | Physical disk & partition analysis (hidden/unmounted detection, boot warnings). | Analysis |
| Stage | What matters |
|---|
| ① → ② | Four independent doors into a case. You never need Crow-Eye's own collector — a folder from Velociraptor, KAPE, or an EDR package goes through the Offline Importer, and third-party CSV/JSON/SQLite goes through Import Evidence. |
| ② → ③ | Everything converges on one place: the case databases. Parsed artifacts land in Target_Artifacts/; imported third-party evidence lands in Imported_Evidence/ and is auto-discovered. |
| ③ → ④ | The three analysis paths are independent of each other. The Timeline and UBA read the case databases directly — neither requires a correlation run. The Correlation Engine is an additional layer, not a prerequisite. |
| ③ → ④ | Dynamic Linking sits alongside the Timeline and UBA — a fourth, independent reader of the case databases (it has nothing to do with the Timeline visualization). It gathers identity mappings (SID → username, MAC → network, hash/GUID → app) into a per-case Crow_Intelligence.db, then overlays that context inline in the artifact data tables via non-destructive ATTACH + LEFT JOIN. It changes how records read, never the evidence. |
| ④ → ⑤ | The Eye queries the case databases directly and can pull correlation results on demand. It never touches evidence itself — it emits tool calls that Crow-Eye executes and logs. |
| ⑤ → Report | The Living Report is built by the Eye alone, through its report_* tools. The Timeline and UBA are analysis surfaces — they do not write to the report. Case-level findings can still be exported separately via Search & Export. |
| ⑤ ↔ | The Narrative Map is bidirectional: the Eye writes to it, you write to it, and its contents are injected into the Eye's prompt every turn. It is the memory, and you can command it. |
| ⑤ ⟳ | The Compliance page audits the Eye. Every tool call the Eye makes is anchored to the EvidenceSeal hash chain; the page renders live per-rule GEP status (10 principles) verified from that chain and EYE_Logs/, exportable as audit_trail.json. |
| Minimum | Recommended for large cases |
|---|
| RAM | 8 GB | 16 GB+ (MFT/USN sets of millions of records) |
| Disk | 5 GB free | Free space ≥ 2× the size of the evidence being parsed |
| CPU | 4 cores | 8+ cores |
| OS | Windows 10/11 (full) · Linux (offline & image analysis) | — |
| Artifact | Live | Offline | Data Extracted |
|---|
| Prefetch | ✅ | ✅ | Execution history, run count, per-run timestamps |
| Registry (AutoRun, UserAssist, BAM, ShimCache, networks, time zone) | ✅ | ✅ | Persistence, program usage, background activity, network config |
| Amcache | ✅ | ✅ | App execution, install time, SHA-1, file paths |
| ShimCache | ✅ | ✅ | Executed apps, last modified, size |
| MUICache | ✅ | ✅ | Program presence and display names |
| Jump Lists & LNK | ✅ | ✅ | File access, paths, timestamps, metadata |
| ShellBags | ✅ | ✅ | Folder access history and navigation |
| MRU & RecentDocs / Typed Paths | ✅ | ✅ | Open/Save history, recent files, typed locations |
| Browser / Website history | ✅ | ✅ | Visited sites and access times |
| Event Logs (System / Security / Application) | ✅ | ✅ | Logons, process creation (4688), account & service changes, log clearing |
| MFT | ✅ | ✅ | File metadata, deleted files, timestamps (NTFS, Win 7/10/11) |
| USN Journal | ✅ | ✅ | File create/modify/delete/rename with full name history |
| Recycle Bin | ✅ | ✅ | Deleted file names, paths, deletion time, size |
| SRUM | ✅ | ✅ | App resource/network/energy usage, per-app data transferred |
| USB & connected devices | ✅ | ✅ | Device connection and presence |
| Network list & connections | ✅ | ✅ | Known networks and connection activity |
| AutoStart / Services & Drivers | ✅ | ✅ | Persistence, service installs and state changes |
| Disks & Partitions (Storage Forensics) | ✅ | ✅ | Physical disk tree, partition layout, hidden/unmounted detection |
$RECYCLE.BIN to recover deleted file names, original paths, deletion times, and sizes (live systems and disk images).| 🔍 SCAN | 📦 COLLECT |
|---|
| Action | Discovery — identifies artifacts at their original location | Acquisition — copies & preserves artifacts in the case folder |
| I/O impact | Read-only; no files moved | Read + write; physically duplicates artifacts |
| Organization | Updates .artifact_scan_index.json metadata | Organizes files into type-specific folders |
| Use case | Fast triage to see if the source has relevant data | Full forensic preservation for long-term analysis |
| Input | What happens |
|---|
.db / .sqlite | Validated and copied verbatim into the case's Imported_Evidence/ folder. The schema is left untouched. |
.csv / .json | Auto-converted into a feather-shaped SQLite database via the canonical FeatherWriter, carrying feather_metadata that declares the table's primary timestamp — auto-detected from the column names — exactly like a natively collected feather. |
| Category | Detections include |
|---|
| Identity & access | Sign-in / sign-out, workstation unlock, remote-desktop logons, admin logons, explicit-credential use (runas), account creation and changes, admin-group additions |
| Execution | Programs opened (UserAssist), programs run (Prefetch, expanded to per-run events), process creation (4688), program presence (ShimCache / AmCache / MUICache), application installs, application crashes (from Application Event Log 1001 records) |
| File activity | File open / create / delete / copy / rename — renames show the full name history (old → … → current) reconstructed from the USN Journal, with soft-delete ($R/$I) resolution |
| Navigation | Folder browsing (ShellBags), recent documents, typed locations, website visits |
| Devices & network | USB device connect, device presence, network shares, network connections, per-application data transferred (SRUM) |
| Persistence & system | Autostart persistence (Run keys + services, escalated when the target runs from a user-writable path), service and driver installs, service state changes, system start/shutdown, clock changes, event-log clearing |
| Time-Window Engine |
|---|
| Identity-Based Engine |
|---|
| 1,000 | 0.5s | 2s |
| 10,000 | 5s | 15s |
| 100,000 | 50s | 2.5 min (streaming) |
| 1,000,000 | — | 25 min (streaming) |
| Capability | What it means for you |
|---|
| Natural-language investigation | Ask in plain English; Eye writes the SQL and searches for you. |
| Multi-source integration | Unified access across all parsed artifacts in the case. |
| RAG-enhanced analysis | Eye pulls artifact-specific forensic knowledge before answering. |
| Living Report Workspace | Findings, tables, charts, and timelines are documented in real time. |
| Human-in-the-loop | Critical actions (e.g. report export) require your explicit approval. |
| Chain of custody | Cryptographic proof of exactly what the model analyzed. |
| # | Principle | In one line |
|---|
| GEP-1 | Evidence Primacy | Conclusions come only from artifacts actually examined. |
| GEP-2 | Traceability | Every fact links to a specific source record. |
| GEP-3 | Specificity & Chronology | Exact UTC timestamps, identifiers, and paths, ordered in time. |
| GEP-4 | Cross-Corroboration | Rest on multiple sources; report agreement, silence, and conflict. |
| GEP-5 | Premise Verification | Treat human claims as hypotheses to prove or refute. |
| GEP-6 | Completeness | Never silently drop or truncate evidence. |
| GEP-7 | Integrity & Non-Repudiation | Never modify evidence; record what was seen and done, tamper-evidently. |
| GEP-8 | Transparency & Explainability | Reasoning, tools used, and data seen are visible and auditable. |
| GEP-9 | Human Authority | The investigator decides; durable actions are attributable. |
| GEP-10 | Defensibility | Output is objective, precise, and structured for independent review. |
| Mode | Best for | Backends |
|---|
| ☁️ Cloud AI Models | Deep, complex analysis with maximum compute | OpenAI, Anthropic (Claude), Google Gemini |
| 🔒 Offline AI Server (air-gapped) | Zero-exposure, on-premise investigations | Ollama, LM Studio |
| ⚡ CLI Terminal Agents | Reuse an AI terminal agent you already have as the model | Claude Code, Gemini CLI, ChatGPT CLI, llama.cpp, … |
| Eye planning — detecting forensic intent, building the system prompt, deciding next moves. |
rag | Eye retrieving artifact knowledge from its knowledge base to ground the answer. |
tool_call | Eye executing a forensic tool (a SQL query, a search, a correlation lookup). |
synthesis | Eye validating and assembling the final, evidence-backed answer. |
| Tool | Purpose |
|---|
query_database | Run a SELECT against a forensic database. |
search_artifacts | Cross-database text / regex search. |
semantic_search_artifacts | Semantic search across parsed artifacts. |
get_schema | Inspect table schemas. |
query_correlation_results | Query the Correlation Engine's output by time / identity. |
correlate_imported_evidence | Correlate third-party evidence imported into the case against native artifacts. |
analyze_large_dataset | Map-reduce analysis of big result sets — no silent truncation. |
list_case_files | List files in the case directory. |
internet_search / fetch_web_content | Look up and fetch external threat / technical context. |
query_living_off_the_land_intel | LOLBAS / LOLDrivers lookups. |
query_threat_intel | VirusTotal / threat-intel lookups. |
switch_model | Change model at runtime (same backend only). |
| Field | Meaning |
|---|
wing_name | Human-readable name for the rule. |
proves | The forensic claim it supports (e.g. program execution). |
feathers[] | Artifacts to correlate — each with artifact_type, optional weight (0–1) and tier (1–4). |
time_window_minutes | Correlation window (default 180 = 3 hours). |
minimum_matches | How many feathers must match within the window (default 1). |
reason (required) | Forensic justification for the rule. |
related_evidence (required) | One or more database:table:rowid refs that motivated it. |
reason and related_evidence; rules authored outside Eye are read-only and cannot be silently rewritten.| Eye's visibility is bound to the documented artifact behaviors in Eye-Describe. The model reasons against a hardcoded reference for what an artifact actually means, rather than inferring semantics on its own. |