一个单文件原生 Windows 托盘应用程序(C、Win32、无运行时依赖),可精确显示哪个程序在发送和接收字节以及发往哪个主机,保持 Windows 连接审计开启,让你或 AI 代理能够当场终止进程或阻止程序,并通过 localhost 套接字流式传输所有内容,只有你明确允许的程序才能使用该套接字。
1.2 版本新增了 Inspector:放大查看单个进程并查看其连接(状态、RTT、重传、连接时间)、其在网络上解码的数据包(TLS SNI/ALPN、QUIC、DNS、HTTP)、进程概况(CPU、内存、磁盘、GPU、用户、命令行、签名者)以及时间线(连接、失败、子进程、DLL 加载),并支持 pcapng 导出。所有这些都来自 Windows 自带的内核提供程序和 ndiscap.sys;无需安装驱动程序。
1.3 版本使该套接字能够同时服务多个代理(SENTINEL.md 中的 Sentinel 设计):命令在工作线程上运行,因此来自一个客户端的缓慢 inspect 不再阻塞其他客户端;最多可同时运行四个 pcapng 捕获,每个进程一个;conns 可分页浏览每个流,并可筛选活动流或自某个时间戳以来被触及的流;监视器可以只请求解码的握手信息而非每一帧;flowinfo 事件在解码的瞬间宣告每个流的 SNI、ALPN、HTTP 请求或 TLS 版本;每个连接可监视 64 个进程;inspect 报告文件的 SHA-256 并缓存签名检查结果。
真实的 Hodometer 录像通过进程检查、数据包捕获和经过验证的防火墙阻止来跟踪一次受控上传。Sentinel 片段是明确标注的模拟 AI 调查,其评分和试运行行为由仓库代码计算得出。已发布的视频中移除了个人详细信息和不相关的进程。
address:port。本地和局域网流量默认隐藏(切换按钮,或 local on)。host)。history),并追加到 history.jsonl。auditpol /set /subcategory:"Filtering Platform Connection" /success:enable /failure:enable 所开启的内容)。如果关闭,它会重新开启、记录日志并通知已连接的代理。按钮可立即执行此操作。conn 事件转发,包含程序路径、目标、主机名和端口。spike 事件、在 hodometer.log 中写入一行,并发送托盘通知(每 5 分钟最多一次)。双击一行,按 检查所选进程,使用右键菜单,或通过套接字发送 inspect <pid> show。最多可打开八个检查器窗口;每个窗口跟随一个 pid。
capture_<name>_<pid>_<time>.pcapng;可在 Wireshark 中打开。最多可同时运行四个捕获(每个进程一个,或每个进程各一个);标头显示此进程的捕获,并在其他捕获正在运行时注明。复制 JSON 将整个 Inspector 状态放入剪贴板(即 inspect 回复)。终止 和 阻止 作用于此进程。工作原理:帧来自 Windows 自带的 ndiscap.sys(netsh trace 背后的 Microsoft-Windows-NDIS-PacketCapture 提供程序),通过第二个 ETW 会话 HodometerZoom 获取,该会话仅在 Inspector 打开、有套接字客户端在监视或捕获正在运行时运行(外加 30 秒宽限期)。帧不携带进程 ID;Hodometer 通过将本地和远程地址及端口与其从内核网络事件构建的连接表进行匹配来归属它们。这就是它实现 pktmon 和 Wireshark 无法做到的按进程数据包的方式。从 SNI 学到的名称也会在 DNS 未揭示任何信息时填充主表的主机列(例如使用 DNS over HTTPS 的浏览器)。
每个新的套接字客户端通过其所属进程(经由 TCP 表)、其可执行文件路径和文件的 SHA-256 来识别。除非该程序已被信任,否则会出现一个标准 Windows 任务对话框(盾牌图标,三个命令链接按钮):
trusted.jsonl 中;文件更改后会再次询问。intruder 事件和托盘警报。对话框在 60 秒后自动拒绝(--auth-timeout N 可更改),如果客户端放弃则自行关闭。
一分钟内超过十次连接尝试会暂停提示五分钟(所有未知项均被拒绝)。
Hodometer 以提升权限运行,因此 Windows 的完整性隔离(UIPI)阻止非提升权限的程序自行点击对话框。
在客户端被允许之前,它只会收到 {"ev":"auth","status":"pending"},其命令会被拒绝。pardon <substring> 会清除程序的拒绝记录及其获得的任何防火墙阻止。
build.ps1 使用 MinGW-w64(WinLibs gcc + windres)构建 Hodometer.exe;静态链接 ws2_32、iphlpapi、dnsapi、advapi32、
shell32、user32、gdi32、comctl32、ole32、psapi、pdh、wintrust、crypt32 和 bcrypt。build.ps1 -Out Hodometer-new.exe 在 Hodometer.exe 运行时以另一个名称构建(正在运行的 exe 被锁定)。install.ps1(以管理员身份运行一次)注册登录任务 Hodometer(提升权限,无 UAC 提示),在桌面放置一个
启动该任务的快捷方式,停用旧的脚本监视器并启动应用。--port N(默认 48201)、--tx MBPS、--rx MBPS、--auth-timeout SECONDS、--show、--local、
--no-audit-auto。Unregister-ScheduledTask -TaskName Hodometer -Confirm:$false,删除文件夹和快捷方式;它创建的防火墙
规则命名为 Hodometer block: ...,可在 Windows 防火墙中移除,或使用 unblock 移除。TCP 127.0.0.1:48201,换行分隔的 JSON。连接后,等待 auth 显示 allowed(用户点击提示),
然后以纯单词或 JSON 形式读取事件并写入命令({"cmd":"kill","pid":123}、{"cmd":"block","path":"..."})。
命令在四个工作线程上运行:不同客户端并行处理,每个客户端自己的命令按发送顺序一次执行一个,
因此回复按命令顺序返回(事件交错;通过 reply 字段匹配回复)。在所有客户端中排队命令超过 128 条的客户端会收到
{"reply":"error","error":"command queue full, try again"}。最多支持 32 个客户端。
事件:
| ev | when | fields |
|---|---|---|
auth | 连接时以及做出决策时 | status:pending、allowed(+remembered)、denied、asking、abandoned、suspended |
hello | 一旦被允许 | version、port |
tick | 每秒 | t、tx_mbps、rx_mbps、tx_total、rx_total、audit、etw、procs[](前 25 个活跃进程:pid、name、tx_bps、rx_bps、tx_total、rx_total、remote、host、blocked、vm、conns、retx、fails、path) |
spike | 突发超过阈值(保持 10 秒) | kind、tx_mbps、rx_mbps、top[] |
conn | 每个出站连接(Security 5156) | pid、app、path(NT 设备路径)、dst、host、port、proto |
flow | 被监视的 pid:连接生命周期 | pid、kind(connect、established +connect_ms、closed +tx/rx、failed +error、retransmit +bytes、reconnect)、proto、lport、remote、port、host |
flowinfo | 被监视的 pid:某个流的身份刚刚被解码(每个流一次;最多两次) | 与 conns 条目相同的字段:pid、proto、lport、remote、port、host、state、sni、alpn、tls、quic、http、字节数、RTT……在带有 SNI 或 ALPN 的 TLS 或 QUIC ClientHello 上发送,在第一个明文 HTTP 请求上发送,以及在未看到 ClientHello 时的 TLS ServerHello 上发送(没有 SNI 的 TLS 流)。不需要 packets,也不计入数据包预算 |
pkt | 被监视的 pid 配合 packets(每一帧)或 handshakes(仅解码为 TLS ClientHello/ServerHello、DNS 查询/应答、HTTP 请求/响应或已解码 QUIC hello 的帧):每个客户端最多 200 次/秒 | pid、t、dir、proto、lport、remote、port、host、len、flags、info(解码结果) |
trace | 被监视的 pid:进程事件 | kind(start 带 ppid/image、stop 带 exit_code、image = DLL 加载) |
capture | 一个 pcapng 已关闭 | path、pid、packets、bytes、active(仍在运行的捕获) |
killed、blocked、unblocked | 已执行的操作 | pid / path、by |
intruder | 某个程序被拒绝三次 | path、denials、firewall_blocked |
audit | 策略被更改或修复 | enabled、action |
client | 某个客户端被断开 | status、why |
snap | 窗口捕获完成 | path、ok、window(main 或 inspector) |
命令: