NAJEMWEHBE/spyscan
GitHub: NAJEMWEHBE/spyscan
一款纯本地运行的 Windows 间谍软件与监控感知扫描器,通过基线快照、IOC 匹配和行为分析检测设备上潜在的监控活动。
Stars: 0 | Forks: 0
# spyscan — 个人间谍软件/监控感知扫描器
**防御性工具。只回答一个问题:_是否有东西在监控这台设备?_** 仅限本地,无遥测,不会有任何数据离开你的机器。这是一个扫描/分诊工具 —— **不能**替代内核 EDR 或杀毒软件。
优先支持 PC (Windows);跨设备(网络设备 + 移动取证)已在规划路线中。
## 功能简介
对已知状态良好的机器建立快照,然后在随后的扫描中标记出跨八个信号源的**新增/可疑**项目,对每项发现进行评分,并输出裁决报告。
| 采集器 | 捕获内容 | ATT&CK |
|---|---|---|
| `autostart_native` | 持久化,**默认内置**:Run/RunOnce 键、Startup 文件夹、Winlogon Shell/Userinit、WMI event consumers | T1547.001 / T1547.004 / T1546.003 |
| `autoruns` (Sysinternals) | 更全面的 ASEP 扫描(测试机上有 63 个已填充位置,而默认构建只有 6 个)—— **前提是你自行安装 autorunsc**(参见 [Autostart 覆盖范围](#autostart-coverage-what-it-checks-and-what-it-does-not)) | T1547.001 |
| `processes` | 来自 `%TEMP%`/AppData 的二进制文件,无可信父进程,隐藏文件 | — |
| `netconns` | 远程端点 + 所属进程,监听端口 | T1071 |
| `consentstore` | **当前正在使用的摄像头/麦克风**(注册表 `LastUsedTimeStop=0`) | T1125 / T1123 |
| `services_tasks` | 新服务 + 计划任务(路径、运行身份) | T1543.003 / T1053.005 |
| `drivers` | 已加载的内核驱动 | T1014 |
| `canary` | 触发的蜜罐诱饵文件(+8 → ALERT,永不被静默) | T1530 |
三个检测引擎为每个实体提供**统一的 0–100 分评分**:
1. **baseline-diff** — 自你的干净快照以来的变化,
2. **signature/IOC** — 已知的商业间谍软件域名 + 植入 daemon 名称(Pegasus/Predator/Candiru,引用自 Amnesty/Citizen Lab),Authenticode 签名,Windows Defender 复核,
3. **behavioral** — 临时路径 / 未签名 / 无父进程 / 信标回连 / 摄像头-麦克风实时活动。
评级区间:**ALERT ≥8 · REVIEW 4–7 · INFO <4.** Microsoft 签名会被加入白名单归为 INFO — **除非**存在已知的恶意信号(Defender 命中 / IOC 名称),这将始终覆盖白名单(不存在签名恶意软件豁免)。Loopback/临时连接会被归为底层的良性级别,以免报告淹没在频繁变更的数据中。
## 快速开始
### 选项 A — 打包应用程序(无需 Python)
1. 从 [Releases](https://github.com/NAJEMWEHBE/spyscan/releases) 下载 `SpyScan-v0.1.0-win64.zip`。
2. 使用同一版本中的 `SHA256SUMS.txt` 进行校验:
Get-FileHash .\SpyScan-v0.1.0-win64.zip -Algorithm SHA256
3. 解压并运行 `SpyScan.exe`。该可执行文件目前**未签名**,因此 SmartScreen 会发出警告
(“更多信息 → 无论如何运行”)— 这正是发布哈希值的原因,如果你更愿意
从源代码构建,可以选择选项 B。你也可以在
[VirusTotal](https://www.virustotal.com/gui/file/a10f63d94348c61c1739e7c34db66319887e497a5071477d91e733dad06841f9) 上交叉验证该 exe;
少数启发式引擎可能会标记任何未签名的 PyInstaller 单文件 exe
(这种自解压打包行为类似于某些恶意软件捆绑自身的方式 — 这是已知
的误报来源)。
4. 在应用程序中:在你信任的干净机器上**设置基线 (Set baseline)**;之后选择**立即扫描 (Scan now)**。
### 选项 B — 从源代码构建 (CLI)
```
git clone https://github.com/NAJEMWEHBE/spyscan.git
cd spyscan
python -m venv .venv # Python 3.13+
.\.venv\Scripts\pip install -e .
# 1. 建立基线 — 在你信任是干净的机器上执行此操作
.\.venv\Scripts\spyscan baseline
# 2. 之后,扫描哪些发生了变化 / 看起来像间谍活动
.\.venv\Scripts\spyscan scan
# 3. 打开报告
start runs\last_scan.html
```
- `runs\last_scan.html` — 人类可读报告:裁决横幅、包含每项发现*证据*及 ATT&CK 标签的 ALERT/REVIEW 表格、诚实的局限性页脚。(INFO 项仅计数,不列出。)
- `runs\last_scan.json` — 完整的机器可读结果(所有分类)— 供独立应用程序 UI 使用。
### 独立应用程序
相同的引擎,在一个原生窗口中运行 — 无需终端。
**开发中**(从仓库运行):
```
.\.venv\Scripts\python -m spyscan.cli app # or: spyscan app (installed)
```
**作为打包可执行文件**(独立运行:内置 UI、IOC 列表和白名单 — **但不包含** autorunsc,见下文):
```
# 构建它(单文件夹,推荐)
.\.venv\Scripts\pyinstaller spyscan.spec --noconfirm
# 然后双击 dist\SpyScan\SpyScan.exe(或运行它)
```
也支持单文件构建(`$env:SPYSCAN_ONEFILE=1; .\.venv\Scripts\pyinstaller spyscan.spec --noconfirm` → `dist\SpyScan.exe`);单文件夹构建启动更快,是推荐的发布方式。
窗口通过原生的 [pywebview](https://pywebview.flowrt.dev/) WebView2 框架打开(如果缺少该 runtime,它会回退到你的默认浏览器)。它显示:
- **立即扫描 (Scan now)** 按钮和**设置基线(受信任机器)**按钮,
- ALERT + REVIEW 项目的**发现 (FINDINGS)** 表格(风险 / 实体 / 来源 / 原因 / ATT&CK),并提供完整 HTML 报告的链接,
- **基线 (BASELINE)** 面板(存在状态 / 事实计数)和**白名单 (ALLOWLIST)** 面板(活跃规则计数 + 文件路径)。
打包的应用程序将其可写状态(`baseline.db`、`runs\`)保持在**可执行文件旁边**,而内置的只读资源则从构建内部提供。本地服务器仅绑定 `127.0.0.1`;设置 `SPYSCAN_PORT` 可固定端口(否则将自动选择可用端口并写入 exe 旁边的 `spyscan_url.txt`)。
**解读结果:** ALERT = 立即检查。REVIEW = 值得看一眼。每项发现都会显示其评分*原因*(例如 `+3 自基线起新增,+2 未签名,+3 从临时路径运行`)。由你决定 — 该工具只负责呈现问题,而不进行定罪。为你的已知良好软件建立白名单,以减少反复出现的良性提醒(例如你自己的开发解释器)。
### 将你的软件加入白名单
已知良好的软件(来自 venv 的你自己的开发 `python.exe`/`bun.exe`,或已签名的供应商工具)可能会触发临时路径/未签名/新增启发式规则。白名单会将匹配到的发现归为底层的 **INFO/0**,使其不再报警 — **但已知的恶意信号(Defender 命中 / IOC 进程名)始终会覆盖它**,因此你绝不会意外隐藏真正的恶意软件。
该文件位于 **`config/allowlist.json`**(随程序发布,可直接在原地编辑)。运行 `spyscan allowlist` 可打印其路径 + 当前规则计数。四种规则类型:
| 规则 | 匹配方式 |
|---|---|
| `path_globs` | 对发现的 exe / 镜像路径进行 `fnmatch`,不区分大小写(在 JSON 中使用 `\\`,例如 `"*\\.venv\\scripts\\*"`) |
| `signers` | Authenticode 签名者主题的不区分大小写**子字符串**匹配(例如你的代码签名组织) |
| `sha256` | 精确的文件哈希(也会测试事实的 `md5`) |
| `entity_keys` | 精确的命名空间发现键(例如 `processes::name::exe`) |
随附的默认配置包含**一**条规则:`*\.venv\scripts\*`,因此从源码运行 spyscan 时不会标记其自身的 venv 解释器。其他一切 — 你的 Python 安装、开发工具、供应商软件 — 都需要由你自行添加;spyscan 不会预先静默那些它无法得知是否属于你的路径。请保持**严格** — 永远不要将 `AppData` 或 `Temp` 等宽泛目录整体加入白名单,否则会使检测器致盲。`scan` 会打印 `allowlisted: N`,让你随时查看有多少发现被静默。
## Autostart 覆盖范围:检查什么,不检查什么
**默认构建不包含 Sysinternals `autorunsc`。** 其许可证禁止
重新分发(“你不得发布该软件供他人复制” / “不得
将该软件……转让给任何第三方”),且没有免费/非商业用途的豁免,因此任何 spyscan
下载包在法律上都不能携带它。私人使用没问题 — 这正是*你*可以自行安装的原因。
因此,Autostart 覆盖范围以 `autostart_native` 这一纯 Python 采集器的形式发布。它是
autorunsc 扫描范围的**刻意精简子集**,且差距确实存在:在测试用的 Windows 11
机器上,`autorunsc -a *` 报告了 **63 个 autostart 位置**,而默认构建仅读取
其中的 **6** 个。这是你在相信干净结果之前应该了解的覆盖范围差异。
**默认构建读取的内容**
| 位置 | 详情 |
|---|---|
| Run / RunOnce / RunServices / RunServicesOnce | HKLM(原生**和** WOW64 32位视图)+ HKCU(仅原生 — `HKCU\SOFTWARE` 是[共享的,不重定向](https://learn.microsoft.com/en-us/windows/win32/winprog64/shared-registry-keys)) |
| Startup 文件夹 | 每用户 `%APPDATA%` + 公共 `%ProgramData%` |
| Winlogon | 仅 `Shell` 和 `Userinit` 值 |
| WMI event consumers | `root/subscription` `CommandLineEventConsumer` + `ActiveScriptEventConsumer` |
| 服务 / 计划任务 / 驱动程序 | 通过 `services_tasks` 和 `drivers`,它们在**所有**配置下都会运行,并包含*已禁用*的条目(autorunsc 也会报告这些,标记为 `Enabled=disabled`) |
**它不读取的内容 — 以下每一项都是植入程序可能在默认构建中隐藏的位置**
| 未检查 | 为什么重要 |
|---|---|
| `BootExecute` | 在启动时由 `smss.exe` 运行的原生二进制文件,早于 Win32 子系统或任何安全服务启动 |
| `AppInit_DLLs` | 如果关闭了 Secure Boot,会被 `user32.dll` 加载到几乎每一个交互式进程中 |
| Image File Execution Options `Debugger` | 在 SYSTEM 级别静默重定向任何服务镜像 exe 的启动 |
| 凭证提供程序, `Winlogon\GpExtensions` | 恶意的凭证提供程序会在每次登录时参与收集你的密码 |
| 打印监视器 / 提供程序 DLL | 每次启动时以 SYSTEM 权限加载到 `spoolsv.exe` 中 (T1547.010) |
| 浏览器辅助对象、Shell 扩展、编解码器、Winsock LSP | 加载到 Explorer、浏览器或任何网络进程中的 DLL |
| LSA 身份验证 / 通知包 | 加载到 `lsass.exe` 中;通知包是一个密码过滤器,能看到每一次明文密码更改 |
| `Active Setup`, `SafeBoot\AlternateShell`, `IconServiceLib`, `KnownDLLs` | 测试机器上已填充的更多登录/启动 ASEP |
| 网络 / RDP / Office / IE 提供程序和 Shell 服务对象 | `SecurityProviders`, `NetworkProvider\Order`, `rdpwd\StartupPrograms`, `Protocols\Filter`+`Handler`, Outlook `Addins`, `ShellServiceObjects`, `ShellIconOverlayIdentifiers`, `UrlSearchHooks` — 在测试机器上均已填充 |
由于同样的原因,autostart 列表之外还存在两个相关的盲点(spyscan 仅记录
OS API 返回的内容,不再做进一步解析):
- **svchost 托管的服务**仅记录 `svchost.exe -k -p` — 位于 `HKLM\SYSTEM\CurrentControlSet\Services` 下针对每个服务的 `Parameters\ServiceDll` 从未被读取,因此
替换该 DLL 不会引发 spyscan 的差异比对。
- **计划任务**被完整枚举,但 `schtasks` 将许多操作报告为
`"COM handler"` 而不是路径,且任务事实未经过签名/哈希丰富 — 因此对于
这些任务,执行的代码永远不会被解析,临时路径信号也无法触发。
**想要全面扫描?** 自行安装 Sysinternals Autoruns,并将 `autorunsc64.exe` 放在
你的 `PATH`、`C:\Program Files\Sysinternals` 中,或者放在 `SpyScan.exe` 旁边的 `tools\` 文件夹中。
spyscan 会在**下一次扫描**时自动识别它 — 无需重启,这三个的效果
完全相同 — 随后运行完整的 `-a *` 扫描,并且 `autostart_native` 会自动让位,因此注册表 /
Startup / Winlogon / WMI 条目不会被重复报告。服务、驱动程序和计划任务
仍然会*同时*被 autorunsc 和 `services_tasks` / `drivers` 采集器报告,因此
这些项目会显示为来自两个不同的来源。
## 诚实的局限性
- **用户态扫描器,非内核 EDR。** 高级/零点击植入程序可以避开用户态枚举。干净的结果**并不能**证明设备是干净的。
- **Autostart 覆盖范围是子集**,而非完整的 ASEP 表面 — 参见 [Autostart 覆盖范围](#autostart-coverage-what-it-checks-and-what-it-does-not) 了解具体未检查哪些位置以及如何弥补这一差距。
- IOC 情报源很快就会过期(攻击者会轮换基础设施)— 这就是为什么 baseline-diff + 行为分析占据主要权重,而不仅仅是依赖签名。
- 仅在你**拥有/控制**的设备上进行检测;这是防御性工具,不可用于监控他人。
## 测试
```
.\.venv\Scripts\python -m pytest -q # 263 passing
```
纯逻辑(schema、diff、score、parsers)已通过 fixture 进行单元测试;涉及 OS 的采集器被标记为集成测试。
## 路线图(已完成 = 阶段 0+1)
- **阶段 2** — 网络端设备(TinyCheck/PiRogue:在受监控的热点运行 Zeek+Suricata)→ 无需安装即可捕获**任何设备**(手机/IoT)。
- **阶段 3** — 通过 Amnesty **MVT** 进行移动取证(iOS/Android 植入程序 IOC 匹配),作为子进程调用。
- **阶段 4** — 实时 ETW/WMI 监视器 + 事件关联;应用内实时仪表板。
- **阶段 5** — ~~canary-token 触发器~~ **已构建**:canary-token 触发器通过行为捕获未知植入程序(触发的诱饵得 +8 分 → ALERT,且永不被白名单/MS 级别静默;参见 `canary_audit.py`)。受保护的响应仍在路线图中。
- **近期调整** — ~~用户白名单~~ **已构建**(参见[将你自己的软件加入白名单](#allowlisting-your-own-software));仍待完成:全新基线辅助工具、填充进程事实的 `verified` 字段、对标记的二进制文件运行 YARA、实时 abuse.ch IOC 情报源。
请参阅 `docs/` 获取完整的基础简报、高级威胁简报、设计决策和构建计划(均附有引用)。
## 许可证
[MIT](LICENSE)。
_防御性安全工具。旨在让你保持**警觉**,而非用于监视。_
标签:IOC检测, IP 地址批量处理, 恶意软件扫描, 漏洞挖掘, 系统基线监控, 逆向工具, 防御性安全, 防间谍软件