Natively如何做到"不可检测"?Stealth模式、进程伪装与屏幕共享保护的完整揭秘
【免费下载链接】natively-cluely-ai-assistantNatively — Free open-source AI meeting assistant, interview copilot, and note taker. The best alternative to Cluely, Otter, Granola, Final Round AI, Fireflies, and Interview Coder. Real-time transcription, AI meeting notes, lecture recording, local RAG, BYOK, and stealth mode. Runs locally. No subscriptions. No data breaches.项目地址: https://gitcode.com/gh_mirrors/na/natively-cluely-ai-assistant
Natively 是一款免费开源的AI 会议助手、面试副驾与会议记录工具(Cluely、Otter、Final Round AI 的替代方案),支持实时转录、本地 RAG 与自带密钥(BYOK),全部数据本地运行。而它最硬核的卖点,是这套经过五个大版本打磨的Stealth 隐身模式(Undetectable):隐藏 Dock 图标、伪装进程名、屏幕共享中"消失",让 AI 面试助手在标准在线笔试中不可被察觉。本文将带你完整拆解它的实现原理。🔍
一、为什么"不可检测"是面试 AI 的核心难题?
面试助手要在 Zoom、浏览器笔试平台上工作,同时不能:
- ❌ 出现在对方的屏幕共享 / 屏幕录制里
- ❌ 在 Dock、任务栏、活动监视器里留下可疑图标或进程名
- ❌ 抢走前台应用的焦点,导致 Zoom 窗口被压暗(面试官一眼看穿)
Natively 的解法是一套"JS 主进程策略 + Rust 原生模块"的组合拳,核心代码都在仓库里,任何人都可以逐行审计。
二、进程伪装:把自己变成"系统工具"
2.1 静态伪装:换一个"合法"的名字
disguiseAppName.ts 定义了伪装表,进程名会按平台呈现为无害的系统工具:
| 伪装模式 | macOS | Windows |
|---|---|---|
| terminal | Terminal | Command Prompt |
| settings | System Settings | Settings |
| activity | Activity Monitor | Task Manager |
| none | Natively | Natively |
也就是说,在任务管理器里,它可能只是一个"Command Prompt ",毫不起眼。
2.2 动态伪装:实时改写活动监视器显示名
静态重命名只影响ps层面的名字。更深层的实现在 process_name.rs:macOS 活动监视器的"进程名称"列来自 LaunchServices 的运行时可变记录(LSDisplayName),而非二进制文件名。Natively 通过私有 SPI_LSSetApplicationInformationItem在运行中改写自己的显示名——不修改任何磁盘文件、不重新签名,代码签名保持完整,伪装可以热切换。若某个 macOS 版本移除了该 API,会自动降级为静态伪装,优雅降级(graceful degradation)。
三、消失的 Dock 与任务栏
开启 Undetectable 后,macOS Dock 里一个 Natively 图标都不该留下。macDockPolicy.ts 记录了一段"血泪史":早期版本启动时 Dock 会闪现 2~4 个重复图标,根因是 Electron 的setVisibleOnAllWorkspaces会反复切换激活策略、process.title写入会重新注册前台应用。
最终方案:
- ✅ 所有窗口族改用
skipTransformProcessType,杜绝激活策略抖动 - ✅ 主进程内建自验证强制循环(每 130ms 检查一次、最多 10 轮),对抗 Electron Dock 隐藏有 1 秒静默失效的怪癖
- ✅ Windows 侧由 windowsFocusPolicy.ts 与任务栏策略同步隐藏任务栏按钮
四、屏幕共享保护:让对方录不到你
这是整个 Stealth 体系中工程含量最高的部分。
4.1 给窗口打上"私密"标记
capture_exclusion.rs 负责给窗口打上"请勿截屏"标记:
- macOS:
NSWindowSharingNone(setSharingType:),系统级截屏与共享都会跳过它 - Windows:
SetWindowDisplayAffinity的WDA_EXCLUDEFROMCAPTURE,Win10 2004+ 原生支持
Google Meet、Teams、QuickTime 会自动尊重这个标记,无需任何配置。
4.2 漏网之鱼:对话框、提示框、下拉菜单
原生弹窗(文件选择器、确认框、<select>弹出层)是独立的 OS 窗口,Electron 的内容保护管不到它们——实测中简历选择器曾直接出现在共享画面里。foreignWindowCaptureGuard.ts 的对策是高频"清扫"(sweep):
- 打开对话框后每 16ms重扫一次,直到窗口消失
- Undetectable 开启期间每 50ms全量巡检(覆盖 tooltip 等主进程不可见的窗口)
- 应用激活瞬间立即重扫(macOS 会在激活变化时重置窗口共享状态)
4.3 源头封堵:隐身模式下直接拒绝弹出系统对话框
stealthPromptGate.ts 更直接:Undetectable 开启时,插件安装确认、局域网访问确认等系统级对话框干脆不弹,改为文字提示"请先关闭 Undetectable"。安全相关操作"宁缺毋漏"(fail closed),连检查本身抛异常都会按"开启"处理。
4.4 Zoom 的特殊设置
Zoom 是唯一例外——它是否尊重"私密窗口"标记取决于一个设置:进入Zoom → 设置 → 共享屏幕 → 高级 → 屏幕捕获模式,选择**"带窗口过滤的捕获"**(Advanced capture with window filtering)。若选了"不带窗口过滤",Zoom 会直接抓原始屏幕画面,Natively 就会暴露。⚠️
五、隐身键盘:不抢焦点也能打字
AI 面板悬浮在会议窗口上方时,最大的破绽是点击或打字会抢走 Zoom 的焦点。Natively 用双平台原生钩子解决:
- macOS:stealth_window.rs 给面板设置
becomesKeyOnlyIfNeeded,并用私有 API_setPreventsActivation:直接写 WindowServer 标记——点击面板按钮不会让 Zoom 失去键焦点,效果对标 Spotlight 级别的隐身 - Windows:无面板概念,用
WS_EX_NOACTIVATE扩展样式让窗口"永不激活";输入则靠 keyboard_hook_windows.rs 的WH_KEYBOARD_LL低级钩子截获按键,经 Rust 工作线程 → N-API → 覆盖层渲染进程注入字符,面板全程无需获得焦点
StealthKeyboardManager.ts 是这套机制的 JS 状态机,细节值得称道:
- 快捷键(默认 Cmd/Ctrl+Shift+Space)在钩子之前被全局快捷键消费,天然互不干扰
- Esc / 点击窗口外 / 切走应用都会毫秒级自动退出钩子,防止按键"消失"
- macOS 10 秒、Windows 5 分钟空闲自动断开,是防止钩子卡死的最后防线
- CJK 输入法(IME)激活时自动让位——钩子在输入法组词前截获按键会吞掉候选窗口,ImeDetector.ts 负责探测并回退到普通焦点输入
六、诚实的边界:它不是"绝对隐身"
README 的官方 FAQ 给出了清醒的定位(见 README.md):
- 这是best-effort(尽力而为),不保证绝对不可检测——macOS 15.4+ 上 Apple 可能让新的捕获工具看到被标记的窗口,手机摄像头也永远拍得到
- 它不设计用于绕过 Pearson VUE、ProctorU、Respondus 这类 OS 级专用监考软件
- 适用于 LeetCode、HackerRank、CoderPad 等无专用监考的标准在线笔试
七、本地运行 = 没有服务器可泄露
Stealth 解决的是"在场隐身",而 Natively 的另一重安全是"数据不出本机":转录、会议纪要、RAG 向量库全部存在本地 SQLite,LLM 可走任意 BYOK 端点或本地 Ollama。对比 Cluely 曾曝出 8.3 万用户数据泄露事故,本地化架构意味着没有服务器可被攻破。
八、延伸阅读:源码导航清单
| 模块 | 路径 | 职责 |
|---|---|---|
| 进程名伪装表 | disguiseAppName.ts | 平台化伪装名定义 |
| 活动监视器实时改名 | process_name.rs | LaunchServices SPI 改写 |
| Dock 隐藏策略 | macDockPolicy.ts | 防重复图标 + 自验证循环 |
| 截屏排除 | capture_exclusion.rs | 原生窗口共享标记 |
| 外部窗口巡检 | foreignWindowCaptureGuard.ts | 16ms/50ms 清扫 |
| 系统弹窗封堵 | stealthPromptGate.ts | Undetectable 下拒绝弹窗 |
| macOS 窗口隐身 | stealth_window.rs | 不抢焦点的 NSPanel 属性 |
| 键盘钩子状态机 | StealthKeyboardManager.ts | 钩子生命周期与安全退出 |
结语
Natively 的"不可检测"不是一句口号,而是一套可审计的工程体系:进程伪装解决"你是谁",Dock 策略解决"你在不在",截屏排除解决"别人看不看得到",键盘钩子解决"你怎么输入"。四个维度全部开源可查——这本身就是它对"隐私优先"最有说服力的证明。🛡️ 如果你想深入了解各模式配置,可继续阅读 README.md 的 Stealth 章节与 CLAUDE.md 的架构说明。
【免费下载链接】natively-cluely-ai-assistantNatively — Free open-source AI meeting assistant, interview copilot, and note taker. The best alternative to Cluely, Otter, Granola, Final Round AI, Fireflies, and Interview Coder. Real-time transcription, AI meeting notes, lecture recording, local RAG, BYOK, and stealth mode. Runs locally. No subscriptions. No data breaches.项目地址: https://gitcode.com/gh_mirrors/na/natively-cluely-ai-assistant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考