Repository navigation
Evidence and Reporting
How WinSecHunter preserves what it found, how you prove it was not altered, and how the bundle differs from the narrative reports.
β Home Β· Reporting and Abuse
| Output | Written by | Goes where | Purpose |
|---|---|---|---|
| Evidence bundle | Export-WinSecInvestigation |
<OutputDirectory>/<CaseId>/ |
immutable facts + hashes |
| Reports |
New-WinSecIncidentReport, New-WinSecAbuseReport, Export-WinSecIocList
|
<OutputDirectory>/<CaseId>-reports/ |
documents for humans and third parties |
Reports are deliberately outside the bundle. Adding a file after export would make the
manifest report an Extra file, and a verifier would be right to flag it.
WSC-20261021-AB12CD34/
βββ events.csv flattened events (spreadsheet / SIEM)
βββ events.json flattened events (API / jq)
βββ events.clixml typed WinSecEvent objects for Import-Clixml
βββ findings.json brute-force / spraying / stuffing findings
βββ sessions.csv reconstructed logon sessions
βββ coverage.csv log completeness snapshot
βββ attribution.json PTR / geo / ASN / provider verdicts
βββ timeline.csv activity buckets
βββ iocs.csv indicators with count and first/last sighting
βββ iocs.json same, structured
βββ report.html self-contained event-centric report
βββ report.md Markdown summary
βββ case.json case metadata and notes
βββ manifest.json SHA-256 + bytes + UTC write time for every artifact above
Artifacts are written only when the corresponding input exists (for example, no
findings.json when no findings were supplied).
{
"caseId": "WSC-20261021-AB12CD34",
"generatedUtc": "2026-10-21T12:34:56.0000000Z",
"collector": {
"host": "IR-WS01",
"user": "analyst",
"tool": "WinSecHunter",
"toolVersion": "2.1.0",
"catalogVersion": "2.1.0",
"psVersion": "7.6.6",
"os": "Microsoft Windows 11 ..."
},
"hashAlgorithm": "SHA256",
"artifacts": {
"WSC-20261021-AB12CD34/events.csv": {
"Sha256": "β¦",
"Bytes": 123456,
"WrittenUtc": "2026-10-21T12:34:55.0000000Z",
"Source": "Get-WinSecEventByIp events (flattened)"
}
}
}The manifest is written last and does not hash itself. Every other file is listed.
$s = Test-WinSecEvidenceIntegrity -Path D:\IR\WSC-20261021-AB12CD34 -Summary
$s | Format-List BundlePath, CaseId, Artifacts, Verified, Modified, Missing, Extra, Unreadable, IsIntact| Status | Meaning | Action |
|---|---|---|
OK |
hash and size match | none |
Modified |
file exists, content or size changed | treat evidence as unreliable; re-export from source |
Missing |
listed in the manifest, not present | restore from a copy; do not "fix" the manifest |
Extra |
present in the folder, not in the manifest | added after export β remove or document it |
Unreadable |
exists but cannot be hashed | permissions or a lock; resolve and re-run |
Extra is the check a hash list alone cannot perform: an added file breaks no recorded hash.
# machine-readable for a pipeline
Test-WinSecEvidenceIntegrity .\bundle -Json | Set-Content .\integrity.json -Encoding utf8NoBOM
# only problems
Test-WinSecEvidenceIntegrity .\bundle -ProblemsOnly | Format-Table RelativePath, Status$b = Import-WinSecCase -Path D:\IR\WSC-20261021-AB12CD34
$b.Case.CaseId
$b.Events.Count
$b.Events[0].GetType().Name # WinSecEvent β typed, not a flat row
$b.Events | Get-WinSecIpTimeline -AsciiChartevents.json is preferred; if it is absent, events.clixml is used. -SkipEvents loads the
case and the other artifacts without rehydrating events β useful for very large bundles.
The restored case keeps its evidence table, so a follow-up report references the same chain of custody.
| Recipient | Hand over | Do not hand over |
|---|---|---|
| Internal case file | whole bundle + <CaseId>-reports
|
raw credentials |
| Management | executive incident report (.html or .md) |
raw event dump |
| Auditor / court | bundle + verification output + custody notes | modified copies |
| ISP abuse desk |
.eml (attachments included) |
unrelated internal data |
| TIP / SIEM |
iocs.stix.json or iocs.csv
|
account names, unless policy allows |
- Export once; keep the bundle read-only afterwards.
- Record
Test-WinSecEvidenceIntegrity -Summaryoutput and store it with the bundle. - Keep the original EVTX or disk image alongside the bundle when available.
- Share copies, never the only copy.
- If a file must be added, create a new bundle version instead of editing the old one.
- Include the case id and UTC timestamps in every hand-off message.
The bundle contains report.html β an event-centric document generated during export
(summary cards, histogram, tables). New-WinSecIncidentReport produces a narrative
report with verdict, confidence, recommendations and custody statement. They complement each
other: the bundle report is raw evidence, the incident report is the story told about it.
WinSecHunter v2.1.0 Β· PolyForm Noncommercial 1.0.0 Β· derivative of Get-SecurityEventsByIP.ps1 by Mikhail Deynekin
Repository Β· Changelog Β· Security policy Β· Contributing
π Home
π― Problem Domain π Getting Started π§ Architecture
π Cmdlet Reference π Detection and Analysis π Remote Collection π°οΈ Threat Intel and Attribution π‘οΈ Audit Policy Guide
π Reporting and Abuse π§Ύ Evidence and Reporting π Reference Tables
π§ Configuration π©Ί Troubleshooting and FAQ π§βπ» Development πΊοΈ Roadmap