← Back to parser

How to parse SRUDB.dat without installing anything

There is no shortage of SRUM parsers. The choice is about your workflow, not about capability — every tool below reads the same ESE structures and resolves the same SruDbIdMapTable joins.

ApproachInstall requiredBest for
Browser parserNoneOne-off analysis, sensitive files (no upload), demos
SrumECmd.NET 6+ runtimeWindows DFIR workstation, batch processing
srum-dumpPython 3.9+Linux/macOS analysts, custom pipelines

SrumECmd — what most DFIR shops actually run

Eric Zimmerman's SrumECmd is the standard on Windows analysis workstations. It writes one CSV per table, ready for Timeline Explorer:

SrumECmd.exe -f C:\evidence\SRUDB.dat -r C:\evidence\SOFTWARE --csv C:\output

-r points at the SOFTWARE registry hive so that network profile GUIDs resolve to friendly SSIDs. Without it, you get raw GUIDs and have to pivot through the registry manually.

Output:

  • Application Resource Use (current + LT)
  • Network Data Usage
  • Network Connectivity
  • Energy Usage (+ LT)
  • Push Notifications
  • The resolved IdMap

Process a whole evidence drive in a single batch script and pull the CSVs into Timeline Explorer or your SIEM.

srum-dump — the cross-platform option

Mark Baggett's Python tool. Writes an XLSX with one sheet per table.

pip install -r requirements.txt
python srum_dump.py --SRUM_INFILE SRUDB.dat --REG_HIVE SOFTWARE --OUT_DIR ./out

Willi Ballenthin's JSON fork is a better fit for scripted pipelines (pandas, jq). Both are slower than SrumECmd on multi-gigabyte files, faster than waiting for a Windows VM if you live in Linux/macOS.

In-browser parser

Drop SRUDB.dat onto the page. Parsing happens entirely client-side via WebAssembly; nothing is uploaded. For a typical 5 MB database the results render in about a second.

What you get:

  • All ESE tables enumerated with column types.
  • Tabs for the well-known SRUM tables (Application Resource Use, Network Data Usage, Network Connectivity, Energy Usage, Push Notifications).
  • AppId and UserId automatically resolved against SruDbIdMapTable.
  • FILETIME columns rendered as ISO-8601; OLE dates rendered correctly.

Useful when the source database came from a regulated environment and uploading it to a third-party SaaS is not an option.

Picking between them

  • One file, quick triage → browser parser.
  • Many files, repeatable in a script → SrumECmd.
  • Custom analysis in pandas / jq → srum-dump JSON fork.
  • Sensitive evidence that cannot cross a vendor boundary → browser parser.

Common pitfalls before you trust any tool's output

  1. Copying a locked file. SRUDB.dat is locked on a live system. See where is SRUDB.dat located for acquisition options.
  2. Dirty database. A copy from a live host is almost always dirty. The most recent rows live in the SRU*.log files. See how to fix a dirty SRUDB.dat.
  3. Forgetting the SOFTWARE hive. Without it, network profile names are raw GUIDs. SrumECmd's -r flag and srum-dump's --REG_HIVE accept the hive path.
  4. Reading only the short-term table. Application Resource Use captures ~30 days. The LT sibling holds weekly aggregates for up to a year. Always check both, especially for incidents older than a month.
  5. Assuming every timestamp is FILETIME. Application Resource Use TimeStamp is an OLE variant date. Energy and Network Connectivity event timestamps are FILETIMEs. Mixing them slips dates by 400 years.

Further reading

Frequently asked questions

Do I need Python to parse SRUDB.dat?

No. You can use a browser-based parser (no install), a .NET command-line tool (SrumECmd), or Python (srum-dump). Pick whichever fits your environment.

Is the browser-based parser slower than CLI tools?

For files under 100 MB the difference is imperceptible — parsing happens in WebAssembly at near-native speed. CLI tools win for batch processing dozens of files.

Can I export results to CSV?

SrumECmd and srum-dump both produce CSV/XLSX out of the box. The browser parser currently shows results in an interactive table; CSV export is on the roadmap.

Will any parser show me data older than 30 days?

Only if the long-term (LT) tables exist and have rows. Short-term tables are pruned after about 30 days by the SRUM service itself.

Can I parse just the SRUDB.dat file or do I need the logs?

SRUDB.dat alone is usually enough. The SRU*.log transaction logs only matter when the database was copied while the service was mid-flush — in that case, replaying the logs gives you the missing recent rows.