[ user-mode · windows-only · no kernel driver ]

See what your machine is
actually doing

Watchdog is a single-binary behavioural security monitor for Windows. It subscribes to the kernel's own event streams, enriches every event with live process context, and scores them through thirteen heuristic detectors against a baseline it learns at runtime — no signature lists, no threat feeds, no cloud.

~10 MB single binary · <1% CPU steady · 30–80 MB RAM · 13 detectors · written in Rust
Administrator: Windows PowerShell — watchdog.exe
WATCHDOG LIVE CALM no suspicious activity recorded up 00:14:22
DEFENSES
Windows Defenderrunning (MsMpEng) Firewall · Domainenabled Firewall · Privateenabled Firewall · Publicenabled UACenabled VPNinstalled · ProtonVPN
NETWORK FOOTPRINT
Outbound connects142 Unique remote IPs37 Unique domains21 DNS queries88 Public / private61% public · 39% LAN Processes with net12
TODAY
218 processes started · 63 distinct images
9 INFO · 3 WARN · 1 CRIT
WATCHDOG HEALTH
Events ingested38 204 Drop rate0 (0.00%) Baseline maturity100/138 (72%) Active detectors13 ModeLIVE
[ 01 · how it observes ]

Six sensors, straight from the kernel.

Watchdog subscribes to five Event Tracing for Windows providers in a single real-time session — the same plumbing Defender, EDR products and Process Monitor use. A sixth synthetic sensor polls for new drive letters. Everything it reports comes from the local system, observed through Windows' own instrumentation.

01 Kernel-Process Every process start, stop, and image (DLL) load on the system.
02 Kernel-File File create and write operations, filtered at the callback to skip high-volume system paths like \Windows\ and \Program Files\. Writes feed the ransomware detectors; reads don't.
03 Kernel-Registry SetValueKey operations — writes to registry values.
04 Kernel-Network Outbound TCP connect operations, both IPv4 and IPv6.
05 DNS-Client DNS queries via the Windows resolver. (Browsers using DNS-over-HTTPS bypass this — and stay invisible.)
+1 Drive sensor Polls QueryDosDevice every 2s. A new drive letter (USB, SD, mapped share) emits a RemovableDriveMounted event into the same pipeline.
ENRICHED IN FLIGHT

Each event is resolved on the way through: process lookup from a live CreateToolhelp32Snapshot table, NT device paths canonicalised to C:\…, command lines fished out via NtQueryInformationProcess, Authenticode checked with WinVerifyTrust, and System-attributed connects re-mapped to their real owning process.

[ 02 · what it detects ]

Thirteen behavioural heuristics — no signature lists.

Each detector emits a sub-score in [0.0, 1.0]. The scorer combines them via 1 − Π(1 − sᵢ) so independent signals reinforce without saturating. Severity buckets: Info ≥ 0.30 · Warn ≥ 0.40 · Crit ≥ 0.70.

LolbinSpawn [ lolbin ]

A signed-but-abusable Windows binary (mshta, rundll32, certutil, powershell…) running with malware-pattern command lines: -EncodedCommand, iex(, DownloadString, base64 blobs.

peaks at CRIT

UnusualParentChild [ chain ]

Rarely-benign process chains: word/excel → cmd/powershell, chrome → shell, lsass → anything. Useful even without baseline — these chains are almost never legitimate.

peaks at WARN

RegistryPersistence [ persist ]

Writes to 14 well-known autostart locations: Run, RunOnce, Image File Execution Options, Winlogon\Shell, AppInit_DLLs, service ImagePath, Active Setup…

peaks at WARN

RapidFileTraversal [ ransomware ]

A process touching ≥25 distinct directories in 10s — the canonical ransomware / bulk-exfil fingerprint. Baseline-aware: legitimate I/O-heavy processes get suppressed after familiarisation.

peaks at CRIT

EntropyBurst [ ransomware ]

A process writing a burst of high-entropy files (Shannon ≥ 7.8 bits/byte, sampled from the first 4 KiB) — encryption caught in the act. Already-compressed formats (zip, jpg, office, pdf…) are denylisted to avoid false hits.

peaks at CRIT

UnsignedFromUserPath [ authenticode ]

A binary running from a user-writable path (%TEMP%, %APPDATA%, Downloads, Desktop, ADS) with no valid Authenticode signature, verified through WinVerifyTrust. Highest-yield for downloaded malware.

peaks at WARN

NewNetworkEgress [ phone-home ]

A program seen running many times before — but never connecting out — just made its first outbound TCP connection. Suggests a previously-silent process is now phoning home.

peaks at WARN

RareDestination [ c2-callback ]

A mature, focused program connecting to an external /24 (v4) or /48 (v6) prefix it has never used. Complements NewNetworkEgress; chatty clients (>32 prefixes) and LAN/loopback are auto-excluded.

peaks at WARN

DnsAnomaly [ dga ]

Multi-evidence: ≥2 of {label entropy > 3.5 bits/char, abused TLD (.tk .xyz .top .icu…), label ≥ 40 chars}. Single hits alone are too noisy — CDNs use random-looking subdomains too.

peaks at CRIT

UsbExfilHint [ exfil ]

Temporal correlation: a removable drive letter just appeared, and within 5 minutes a process writes ≥10 distinct files to that drive. Two domains, one inference.

peaks at CRIT

ProcessImpersonation [ masquerade ]

A critical system image (svchost, lsass, services, csrss…) launched from outside its expected directory, or an svchost not parented by services.exe. Classic process-masquerading move.

peaks at CRIT

ImageLoadFromUnusualPath [ dll-sideload ]

An unsigned or untrusted module (DLL) loaded from a user-writable path — DLL sideloading / search-order hijacking. Verified with the same WinVerifyTrust cache; the process's own primary image is skipped.

peaks at WARN

OffHoursActivity [ off-hours ]

An interactive process launched during an hour this host is normally idle, judged from a learned hour-of-day profile (≥5 days observed). On its own it's just an amplifier — it nudges other signals up.

peaks at INFO
RUNTIME BASELINE ·adaptive

Watchdog keeps a per-image profile that accumulates as it runs — observed parents, children, peak file-traversal counts, network destinations, whether the image ever connected out. After five samples an image is mature, and baseline-aware detectors trust the learned ceiling.

Persists to %ProgramData%\Watchdog\baseline.bin every 5 minutes, so the learning ramp happens once per machine. LOLBins are excluded by design — an attacker can't train the system to ignore powershell by repeating the same malicious act.

[ 03 · four views ]

One key away from any altitude.

The TUI defaults to a consumer-facing summary. Three deeper pages are one keystroke away from anywhere — raw, network, offensive.

VIEW 01 — default

Summary default

Six panels in two columns, built so a non-analyst can answer "is something bad happening?" in five seconds.

  • Verdict bar — CALM / REVIEW / THREAT with time-since-last-alert.
  • Defenses — Defender, firewall per-profile, UAC, VPN status.
  • Incidents queue — events coalesced into plain-language cards.
  • Network footprint + health — counters, drop rate, baseline maturity.
INCIDENTS ·summary
Inventor.exe made first outbound connection
→ 104.83.79.25:80 · NewNetworkEgress · score 0.55
setup_x64.exe unsigned, from Downloads
→ %USERPROFILE%\Downloads · score 0.65
svchost.exe registry autostart write
→ Run\OneDriveSetup · score 0.33
VIEW 02 — analyst feed

Raw r

Time-ordered stream of every scored event. The 50,000-event buffer evicts by score-biased rule — a Defender scan can't wipe a WARN powershell from twenty minutes ago.

  • Details pane — full process info, parent, payload, and a "Why" block.
  • Filters — text/regex, source (PROC/FILE/REG/NET/DNS/USB), min-score.
  • Pause freezes the view without dropping events; export to JSONL.
FEED ·raw
22:25:04 INFO 0.35 clinfo.exe CompileSource.bc
22:25:05 WARN 0.55 radeonsoftware 104.83.79.25:80
22:25:06 CRIT 0.71 radeonsoftware msys.bat
22:25:08 CRIT 0.85 radeonsoftware Fallout76.exe
22:25:08 CRIT 0.85 radeonsoftware Revit.exe
VIEW 03 — network inventory

Network n

Read-only inventory of everything on the wire: interfaces, neighbors, live TCP table, and a per-host inspector.

  • Interfaces — adapters, MACs, IPv4/IPv6, gateways, DNS, link speed.
  • Neighbors — live ARP/NDP cache with reverse-DNS + OUI vendor names.
  • TCP connections — full table with state, endpoints, owning process.
  • d sweeps the subnet via ICMP from 32 threads · per-host port probe.
NEIGHBORS ·arp/ndp
192.168.1.1 30:b1:b5:07 liveboxplus
192.168.1.19 e4:5f:01:1e Raspberry Pi
192.168.1.98 d0:c5:d3:05 Roomba-3168
192.168.1.109 00:f9:66:78 IPCAM.home
192.168.1.255 ff:ff:ff:ff (broadcast)
VIEW 04 — lab use

Offensive o

Currently one read-only tool: a WiFi scan from the WLAN API's cached results. No active attack code — strictly educational.

  • SSID list — signal %, dBm, bars, encryption (OPEN/WEP/WPA2/WPA3).
  • OPEN and WEP highlighted red; connected + saved profiles flagged.
  • Detail pane — what the encryption means, and which pentest techniques target it.
WIFI ·scan
▮▮▮▮ MOVISTAR_A4F2 WPA2 -48 dBm
▮▮▮▯ vodafone5G WPA3 -61 dBm
▮▮▯▯ Orange-Home WPA2 -67 dBm
▮▯▯▯ FreeWiFi_Cafe OPEN -78 dBm
▮▯▯▯ linksys WEP -81 dBm
[ 04 · known limitations ]

What it can't see — stated plainly.

A monitor that overstates its coverage is worse than useless. Here is exactly where Watchdog is blind.

Windows-only
ETW is the entire foundation. There is no Linux or macOS build.
Requires Administrator
Real-time ETW sessions, reading other processes' command lines, and several API calls all fail with ACCESS_DENIED otherwise.
Browser DNS-over-HTTPS is invisible
Chrome / Edge / Brave bypass the Windows resolver, so DnsAnomaly only sees lookups through the system DNS client.
No driver-level visibility
Well-hidden process / thread injection needs a Protected Process Light — out of scope for an unsigned user-mode binary.
Signatures are file-only, no catalog
WinVerifyTrust checks embedded signatures, not the system catalog — a catalog-signed binary copied out of \Windows\ reads as unsigned.
Defender real-time state isn't directly readable
Tamper protection blocks it — we use MsMpEng.exe presence as a proxy.
[ 05 · install & run ]

One binary. Run it elevated.

No installer, no driver, no kernel component. Download the single watchdog.exe, open an elevated terminal, and run it — or install it via Scoop. An optional background service mode is built in for always-on, headless use.

Windows 10 / 11 · x64
ETW manifested providers are required; older builds untested.
Administrator privileges
The binary ships a requireAdministrator manifest, so Windows raises the UAC prompt on launch automatically.
~10 MB free disk · ~80 MB RAM
No runtime, no .NET, no third-party native dependencies.
Unsigned — SmartScreen will warn
No code-signing budget yet, so the first run shows "unknown publisher". Verify the source on GitHub, then "Run anyway".
Optional install-service
Registers a headless LocalSystem service that sinks incidents to rotating JSONL + the Event Log. The default launch is still the interactive TUI.
watchdog.exe · win-x64 Build from source
 Administrator: Windows PowerShell
PS C:\Tools> scoop bucket add watchdog https://github.com/yagoid/watchdog
PS C:\Tools> scoop install watchdog
Installing 'watchdog' (0.1.0) …
✓ 'watchdog' was installed successfully!
PS C:\Tools> Start-Process watchdog -Verb RunAs
Watchdog v0.1.0 · win-x64 · elevated ✓
Opening ETW session Watchdog-RT
5 providers subscribed · drive sensor armed
✓ live. ingesting events.
baseline: %ProgramData%\Watchdog\baseline.bin
maturity 0/138 — learning what's normal…
PS C:\Tools>