All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
- PowerShell profile injection detection -- scans all four
$PROFILEpaths for suspicious patterns (IEX, encoded commands, download cradles, etc.) and emits WARNING + T1546.013 - Root certificate store anomaly detection -- compares
Cert:\LocalMachine\Rootagainst 46 well-known CA name fragments; flags unknown root CAs as WARNING + T1553.004 (catches rogue MITM certs) - Category breakdown chart in HTML report -- stacked horizontal bar chart showing finding counts per module/category, placed between the stats grid and system info
- Improved remediation click-to-copy -- regex now also matches system commands (
sfc,netsh,reg,certutil,dism, etc.) and theImport-verb prefix
- Version bumped to 0.5.0
- SECURITY.md updated to mark 0.5.x as supported, 0.3.x as unsupported
- WinRM listener detection -- flags ports 5985/5986 if not in TrustedPorts (WARNING, T1021.006)
- SSH listener detection -- flags port 22 if not in TrustedPorts (INFO, T1021.004)
- Test assertions --
Assert-FindingCountfor Network and DefenseEvasion modules
- TrustedCompanies config drift --
Get-DefaultConfigexpanded from 9 to 38 entries, synced withconfig.example.json - Report HTML injection hardening -- finding details now use
[System.Net.WebUtility]::HtmlEncode()instead of manual</>replacement - Score formula documented -- added comment explaining penalty weights and cap behavior
- Configurable network/API limits --
BackdoorPorts,KnownDNSServers,AbuseIPDBMaxChecks,MaxVTLookupsconfig fields with sensible defaults;commonPortsin Check-Network.ps1 now usesTrustedPortsfrom config - Module Logging detection -- Check-DefenseEvasion.ps1 flags when PowerShell Module Logging is not enabled (INFO, T1562.002)
- Transcription detection -- Check-DefenseEvasion.ps1 flags when PowerShell Transcription is not enabled (INFO, T1562.002)
- Report suppressed count -- HTML report stats grid shows a "Suppressed" card when findings have been suppressed via config
- Startup folder persistence check -- scans per-user and all-user startup folders for executables, scripts, and shortcuts (WARNING, T1547.001)
- 22 empty catch blocks replaced with
Write-Verboseacross Check-Accounts.ps1, Check-DefenseEvasion.ps1, Check-FileSystem.ps1, and lib/Helpers.ps1 so failures are traceable with-Verbose - Report filterFindings JS bug -- implicit
event.targetreplaced with explicit button element parameter, fixing potential strict-mode errors - Redundant if/else in Check-FileSystem.ps1 -- collapsed identical branches for trusted-company severity assignment
- ServiceWhitelist implementation --
ServiceWhitelistconfig field is now applied in Check-Processes.ps1 service analysis, skipping whitelisted services from unquoted-path, user-directory, and SYSTEM-outside-standard-dirs checks - Test assertions --
Assert-FindingCounthelper, double-extension detection assertion, category coverage checks, severity/remediation/MITRE field validation, CIMode JSONsuppressedkey check
- Error handling -- replaced empty
catch {}blocks withWrite-Verbose/Write-Status/Write-Warningin Check-Network.ps1 (DNS reverse-lookup, AbuseIPDB), lib/Helpers.ps1 (Run key enumeration), and AmIHacked.ps1 (config parse fallback) New-DefaultConfig$PSScriptRootfix -- default path now resolves viaSplit-Path $PSScriptRoot -Parentat call-time instead of duringparam()evaluation (which pointed tolib/instead of project root)
- README CI JSON example -- updated to include
suppressedkey and correct version - SECURITY.md -- added 0.4.x to supported versions table
- Dead code cleanup -- removed unused
Get-ProcessParentId,Get-ProcessCommandLinefrom Helpers.ps1, unused$maxPenaltyfrom ReportGenerator.ps1, unused$Colorparameter from CI summary writer - Redundant guard in Check-Processes.ps1 -- removed unreachable
System32 + whitelistcheck (already handled by earlier whitelist guard) Get-DefaultConfigmissing fields -- addedTrustedAppDirsandSuppressionsdefaults so configless runs don't silently skip filtering
fix-bom.ps1now tracked -- removed from.gitignoreand updated to use$PSScriptRootinstead of hardcoded path; new clones now include the BOM-fix utility referenced by the pre-commit hook and CONTRIBUTING.md
- Finding suppression system --
Suppressionsarray in config lets users acknowledge known-benign findings by title pattern (wildcard-likematching). Suppressed count appears in summary box and CI JSON output.
- AMSI registry checks -- detects
AmsiEnable=0(CRITICAL, T1562.001) and missing PowerShell Script Block Logging (INFO, T1562.002) - PS.Security preflight -- detects when
Get-AuthenticodeSignatureis unavailable and emits a WARNING at scan startup listing affected checks -SkipModules Baseline-- baseline comparison is now skippable, enabling faster targeted scans without baseline drift noise- ASCII verdict box in CI mode -- non-interactive output uses
+==+|instead of Unicode box-drawing, preventing encoding issues in piped/agent output - Pre-commit hook --
.githooks/pre-commitrejects commits with.ps1files missing UTF-8 BOM
- Unsigned process false positives --
Check-Processes.ps1now usesTrustedAppDirsfrom config to skip processes in trusted directories (e.g. Git for Windows) - Ephemeral port baseline noise -- ports in the Windows dynamic range (49152-65535) are excluded from baseline diffs
- Added
Git\usr\bintoTrustedAppDirsinconfig.example.json
- AMSI false CRITICAL --
Get-AuthenticodeSignaturefails silently in some PS 5.1-Filesessions;Get-FileSignaturenow returns aCheckFailedsentinel so callers distinguish module failures from unsigned files - Scanner self-contamination --
remoteIpMoProxy_*temp files created by the scanner's own CIM/WMI calls are no longer flagged as suspicious - Stale COM registrations -- HKCU COM overrides where the DLL no longer exists on disk are now skipped (inert registrations can't be exploited)
- Known-legitimate scheduled tasks -- OneDrive, Opera, Zoom, Discord, and Teams updater tasks are no longer flagged as persistence
- Per-user session services -- baseline diffs now skip Windows per-user service instances (e.g.
AarSvc_ddff8) that change every login session $argsshadowing -- renamed to$taskArgsin scheduled task checks to avoid shadowing PowerShell's automatic variable- Restored Unicode box-drawing on verdict summary top border
- UTF-8 BOM -- all
.ps1files now use UTF-8 BOM encoding, fixing parse errors on PowerShell 5.1 where non-ASCII characters (checkmarks, box-drawing) were misinterpreted as string delimiters $PSScriptRootinparam()-- path parameter defaults no longer reference$PSScriptRoot(unavailable duringparam()evaluation withpowershell.exe -File); resolved in the script body instead
-CIModeswitch -- agent/CI-friendly output: suppresses ASCII banner and browser auto-open, auto-enables-Redact, prints a JSON summary to stdout (delimited by---AMIHACKED-SUMMARY-JSON---), and exits with structured code (0=clean, 1=warnings, 2=critical)$PSScriptRootfallback -- fixes "Cannot bind argument" error when invoked viapowershell.exe -File- Non-interactive auto-detection --
[Environment]::UserInteractivecheck auto-enables CI behaviors in piped/headless environments - CIMode test block in
tests/Invoke-MockScan.ps1validating JSON summary and exit codes - "CI / AI Agent Usage" section in README and "Using with AI Agents" section in CLAUDE.md
- Console verdict label
THREATS DETECTEDnow readsCOMPROMISEDto match the HTML report
-Redactswitch -- masks operator identity (computer name, username, domain, profile paths) in console output, HTML reports, and JSON exports; useful for screenshots and sharing reports publiclyInvoke-RedactandInvoke-RedactObjecthelper functions inlib/Helpers.ps1
- Documentation overhaul -- fixed incorrect API key names in CLAUDE.md (
vtApiKey->VirusTotalAPIKey,abuseIpDbApiKey->AbuseIPDBKey), fixedMitreAttack->MITREfield name, added missing config keys (TrustedAppDirs,SuspiciousTempExtensions) to README, fixed verdict label (THREATS DETECTED->COMPROMISED), added-MITREto CONTRIBUTING.md example - Removed emoji from README heading
- Version bumped to 0.3.4
SECURITY.mdwith vulnerability disclosure policy and scopeCLAUDE.mdfor project documentation and AI-assisted development context
- Open-source release -- fresh public repository with clean commit history and noreply author email
- Config safety -- renamed
config/config.jsontoconfig/config.example.json; user config is now gitignored to prevent accidental API key commits - Console banner -- replaced Unicode block-character ASCII art with standard-character ASCII banner for reliable terminal rendering
- HTML report polish -- removed all emoji, refined typography (Inter + JetBrains Mono), improved verdict banner with CSS-only icons, tightened spacing, more professional default appearance
- README overhaul -- reorganized sections, collapsed verbose blocks (Console Output, Project Structure) into details elements, replaced broken SVG banner with clean heading
- Removed personal utility scripts (
_run_scan.ps1,_fix_bom.ps1) - Added 10 GitHub repository topics for discoverability
- MITRE ATT&CK tagging on all findings — technique IDs render as clickable badges linked to attack.mitre.org
- Ghost scheduled tasks detection — enumerates TaskCache registry for tasks with missing SD values or not visible to
Get-ScheduledTask - BITS job abuse detection — flags non-Microsoft URLs, raw IP targets, and suspended/error-state BITS jobs
- Expanded WMI persistence check — now also queries
root\defaultnamespace and enumerates all non-standard namespaces underroot\ -CreateBaselineswitch — explicit opt-in for baseline export; baselines are no longer auto-saved on every runTest-IsTrustedSignerhelper — validates a file has a valid digital signature from a trusted company before downgrading severity- Dual-theme report — clean professional default, with a toggleable "Terminal Mode" for CRT scanlines, glitch title, and neon glow effects
- No Baseline Found info — emits an INFO finding when no baseline exists and
-CreateBaselineis not used - GitHub issue templates: bug report, false positive, detection request
- This CHANGELOG
- Baseline workflow — removed unconditional
Export-Baselinecall from orchestrator; baseline export is now explicit via-CreateBaseline - Version info trust logic inverted — unsigned binaries claiming a trusted company name are now WARNING/CRITICAL (possible impersonation), not INFO. Only files with valid signatures from trusted signers are downgraded.
- Report CRT toggle renamed from "CRT Mode" to "Terminal Mode"; effects are off by default (professional theme)
- Version bumped to 0.3.0
- Baseline auto-save footgun — previously every scan overwrote the baseline, potentially poisoning it with compromised-state data
- False negative on spoofed version info — unsigned executables with a trusted company in their version info were incorrectly downgraded to INFO
-Offlineflag to disable all API calls (VirusTotal, AbuseIPDB)-BaselinePathfor diff comparison against a previous system snapshot-ExportJsonfor machine-readable findings output- Dynamic module discovery from
modules/directory with metadata parsing - Baseline export/import with diff for ports, services, accounts, Run keys, scheduled tasks, and Defender exclusions
Check-DefenseEvasionmodule: event log clearing, AMSI integrity, Defender real-time protection, ETW tampering, tamper protection- Advanced persistence checks: IFEO debugger injection, AppInit_DLLs, Winlogon Shell/Userinit hijacking, COM hijacking, WMI persistence
- Info-stealer artifact scan: browser profile archives, stealer output filenames, crypto wallet access patterns
- Reverse DNS for high-connection-count IPs with trusted domain downgrade
- Copy-to-clipboard for PowerShell remediation commands in the HTML report
- Retro-terminal/cyberpunk HTML report aesthetic
TrustedCompaniesandTrustedDomainSuffixesconfig optionstests/Invoke-MockScan.ps1test harnessCONTRIBUTING.md
- Module loading switched from hardcoded to dynamic discovery
- False positive reduction for temp directory files using version info enrichment
- Report includes Expand All, Print Report, and CRT Mode buttons
- Initial release
- Process & Service Analysis: unsigned process detection, suspicious parent-child relationships, temp directory processes, service path analysis, known attack tool detection
- Network Indicators: active connection analysis, AbuseIPDB integration, listening port audit, DNS configuration, hosts file check, proxy detection, firewall status
- Account & Authentication: local account enumeration, admin group audit, failed login analysis, RDP session history, credential dumping artifact detection, LSA protection check
- File System Red Flags: recently modified system binaries, suspicious files in temp/AppData, VirusTotal hash lookups, alternate data streams, autorun persistence, Defender exclusion audit
- Self-contained HTML report with severity filtering, collapsible categories, and technical detail expansion
- Configurable whitelists, thresholds, and API keys via
config.json