ItsZardos/clipwarden
GitHub: ItsZardos/clipwarden
一款 Windows 后台工具,通过监控剪贴板中加密货币地址在复制与粘贴之间是否被恶意替换来检测剪贴板劫持恶意软件。
Stars: 0 | Forks: 0
一个小巧的 Windows 后台工具,它会监视剪贴板中的加密货币地址,并在复制和粘贴之间有东西篡改(替换)地址时发出警报。它的目标是“剪贴板劫持”恶意软件:这类软件会在受害者粘贴之前,悄悄地将复制的加密货币地址替换为攻击者的地址。
支持的链:**Bitcoin、Ethereum**(以及任何共享 ETH 地址格式的 EVM 链)、**Solana、Monero**。
## 为什么我要开发这个工具
剪贴板劫持恶意软件是一种缓慢而耐心的窃取加密货币的方式。一个后台进程读取你的剪贴板,发现一个有效的钱包地址,然后在你粘贴之前将其替换为攻击者的地址。大多数杀毒软件无法捕获剪贴板劫持者,因为这种行为看起来很平常:读写剪贴板本身并不具有恶意。
防御方面的手段似乎还不够充分。如果攻击者的手段是在复制和粘贴的瞬间替换剪贴板内容,那么防御者的手段就是察觉到这种替换发生的时候。这就是 ClipWarden 的全部初衷。
更详细的说明记录在 [`docs/threat-model.md`](docs/threat-model.md) 中。
## 它能做什么,不能做什么
它能做到:
- 作为一个小型常驻进程在系统托盘中运行。
- 挂钩 Windows 剪贴板更改事件(`AddClipboardFormatListener`)并检查每一个新的剪贴板值。
- 使用**真正的校验和验证**(Base58Check、Bech32/Bech32m、EIP-55、Solana 的 Ed25519 曲线验证),而不仅仅是正则表达式,对看起来像受支持的加密地址的剪贴板文本进行分类。
- 当剪贴板在短时间内从一个有效地址更改为同类型的另一个不同有效地址,且期间没有用户的键盘敲击或鼠标点击时,进行标记并发出警报。
- 通过**四个独立的通道**发出警报,这样一个“请勿打扰”设置或一个损坏的子系统就无法让检测静默:置顶弹出窗口、系统声音、托盘图标闪烁、Windows toast 通知。每个通道都是可配置的;每次检测总是会写入到只追加的审计日志中。
- 将所有内容本地存储在 `%APPDATA%\ClipWarden\` 下。绝不联网。
它不能做到:
- 清除恶意软件。ClipWarden 是一个检测器,而不是修复工具。
- 识别是哪个进程编辑了剪贴板。这已列入 v2 的规划路线图。
- 抵御内核模式的剪贴板劫持者、窃取你的助记词或预复制地址的 infostealer,或者攻击者说服你手动输入他们地址的社会工程学。完整的超出范围列表请参见 [`docs/threat-model.md`](docs/threat-model.md)。
- 在 macOS 或 Linux 上运行。目前仅限 Windows。
- 回传数据。没有遥测,没有自动更新检查。你可以通过抓包来验证这一点。
## 安装
提供两种安装选项。任选其一。
1. **安装程序**(推荐)。从 GitHub Releases 页面下载 `ClipWarden-1.0.0.exe` 并运行。按用户安装,无需管理员权限。它会将二进制文件作为 `ClipWarden.exe` 安装在 `%LOCALAPPDATA%\Programs\ClipWarden\` 下,创建一个“开始”菜单快捷方式,并提供一个可选的“开机自启”复选框(默认不勾选)。
2. **便携版**。从同一个 Releases 页面下载 `ClipWarden-Portable.exe`。无需安装 - 双击即可启动。
这两个构建产物都在发布版本旁边发布了 SHA-256 校验和。请验证它们:
```
Get-FileHash .\ClipWarden-1.0.0.exe -Algorithm SHA256
Get-FileHash .\ClipWarden-Portable.exe -Algorithm SHA256
```
二进制文件在 v1.0.0 版本中未进行代码签名,因此 Windows SmartScreen 可能会在首次启动时警告你。**只有在哈希值与**发布值匹配时,才点击“更多信息” → “仍要运行”。
## 使用托盘
右键单击托盘图标可显示完整菜单:
- **启用** - 切换监控状态而无需退出。
- **暂停** - 一次性暂停:15 分钟、1 小时或“直到我手动恢复”。定时选项会自动恢复;**立即恢复**可提前结束暂停。
- **打开配置** / **打开日志文件夹** / **打开历史文件夹** - 直接跳转到 `%APPDATA%\ClipWarden\` 进行配置调整或日志审查。
- **关于 ClipWarden** - 版本信息。
- **退出 ClipWarden** - 干净地关闭程序。
当检测到替换时:
1. **置顶弹出窗口** 会悬浮在你当前正在执行的任何操作之上,显示链类型、脱敏处理前后的地址对,以及一个 **知道了** 按钮。这是一个 Tk 窗口,而不是 shell toast,因此焦点助手 / 免打扰模式不会抑制它。
2. 播放**系统声音**(可选)。
3. **托盘图标** 闪烁红光约 5 秒钟。
4. 还会触发一条 **Windows toast 通知**(可选,受焦点助手设置影响)。
5. 无论启用了哪些通知通道,都会向 `log.jsonl` 中追加一条记录。该日志是持久的审计追踪。
## 配置
所有用户可写的文件都位于 `%APPDATA%\ClipWarden\` 下:
- `config.json` - 运行时设置(见下文)。
- `whitelist.json` - 你标记为安全的地址。精确匹配;ETH 和 BTC bech32 地址在比较时会转为小写,BTC base58、SOL 和 XMR 地址区分大小写。
- `log.jsonl` - 只追加的检测审计追踪,每行一个 JSON 对象。在 10 MB 时轮转,并保留 3 个备份。
- `crash.log` - 未处理的异常堆栈跟踪(如果有的话)。
`config.json` 的默认结构:
```
{
"enabled_chains": ["BTC", "ETH", "XMR", "SOL"],
"substitution_window_ms": 1000,
"user_input_grace_ms": 750,
"notifications_enabled": true,
"alert": {
"popup": true,
"toast": true,
"sound": true,
"tray_flash": true
}
}
```
- `substitution_window_ms`:BEFORE 和 AFTER 之间仍被视为替换的最大间隔(100–10000 毫秒)。
- `user_input_grace_ms`:保留字段;检测器目前直接使用 `GetLastInputInfo` 作为两次复制之间的输入判断门槛。
- `notifications_enabled`:旧版总开关。当为 `false` 时,所有警报通道均被抑制;`log.jsonl` 仍会记录该条目。
- `alert.popup` / `alert.toast` / `alert.sound` / `alert.tray_flash`:每个通道的开关。日志始终会触发。
未知键将在加载时被拒绝。如果 `config.json` 格式错误,它将被重命名为 `config.json.bak-
`,并立即恢复默认设置 - 监视器被静默禁用比设置被还原是更糟的故障模式。删除上述任何文件,ClipWarden 都会在下次启动时使用默认值重新创建它们。
自启动不是一个配置键。它是由安装程序任务以及 `ClipWarden.exe` 上的 `--install-autostart` / `--uninstall-autostart` 标志所拥有的按用户设置的 Windows 运行项。在旧的 `config.json` 中遗留的任何旧版 `"autostart"` 字段都会在加载时被剥离,并且文件会被重写而不包含该字段,因此从早期版本升级不会产生验证错误。
## 从源代码运行
```
git clone https://github.com/ItsZardos/clipwarden.git
cd clipwarden
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install --require-hashes -r requirements.txt
pip install --require-hashes -r requirements-dev.txt
pip install -e . --no-deps
python -m clipwarden # tray
python -m clipwarden --headless # no tray; blocks on Ctrl-C
```
构建一个便携版 exe 和安装程序:
```
pyinstaller build\ClipWarden.spec --clean
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" build\installer.iss
python tools\gen_checksums.py
```
有关完整的打包工作流,请参见 [`build/README.md`](build/README.md)。
测试、lint 检查、格式化:
```
pytest
ruff check .
ruff format --check .
```
## 自我测试
`tools\attacker_sim.py` 提供了一个剪贴板劫持模拟器,如果不加 `--i-know-this-is-adversarial` 参数它将拒绝运行:
```
.\.venv\Scripts\python tools\attacker_sim.py --i-know-this-is-adversarial
```
在 ClipWarden 运行的情况下,你应该能看到弹出窗口 + 声音 + 托盘闪烁 + toast 通知,并且 `log.jsonl` 中会新增一条记录。任何审计此项目的人都可以使用相同的脚本来验证该工具是否能在他们的机器上正常工作。
## 故障排除
**“当我几秒钟后再次运行 `attacker_sim` 时,没有触发弹出窗口。”** 两个常见原因:
- 你忘记了加 `--i-know-this-is-adversarial`;模拟器打印出警告并退出,没有触碰剪贴板。
- 你在两次复制之间的按键触发了用户输入门槛。当 BEFORE 和 AFTER 之间发生了键盘或鼠标活动时,检测器会抑制警报,因为这种行为看起来像是故意重新复制。运行模拟器,然后不要碰键盘和鼠标,直到弹出窗口出现。
**“我想在静默失败时准确地捕捉到发生了什么。”** 在启动 ClipWarden 之前,将 `CLIPWARDEN_DIAGNOSTIC` 环境变量设置为 `1`(也可接受 `true` / `yes` / `on`,不区分大小写):
```
$env:CLIPWARDEN_DIAGNOSTIC = "1"
Start-Process "$env:LOCALAPPDATA\Programs\ClipWarden\ClipWarden.exe"
```
一个轮转的 INFO+ 级别跟踪日志将出现在 `%APPDATA%\ClipWarden\diagnostic.log`(256 KiB × 3 个备份)。在提交 Bug 报告时请附带该文件。
**“任务管理器中为一次启动显示了两个 `ClipWarden.exe` 进程。”** 那是 PyInstaller 的单文件 bootloader 及其派生的 Python 子进程。这是正常现象,不是单实例错误。从托盘退出会同时结束这两个进程。
## 许可证
MIT。见 [`LICENSE`](LICENSE)。版权所有 (c) 2026 Ethan Tharp。
## 作者
Ethan Tharp。[ethantharp.dev](https://ethantharp.dev)。标签:clipboard分析, Clipper恶意软件, MIT开源协议, Python, Solana, TLS, 个人防护, 以太坊, 剪贴板监控, 加密货币剪贴板劫持, 地址替换检测, 子域名枚举, 无后门, 比特币, 漏洞挖掘, 端点可见性, 系统安全, 系统托盘程序, 网络安全, 虚拟货币安全, 门罗币, 防御工具, 隐私保护