反虚拟机检测虚拟机CloakBox 的逆向安全审计

67次阅读
没有评论

写作背景:本文整理自 2026 年 4 月对一款名为 “CloakBox / ANTIDETECT 5 FREE Education Edition” 的公开软件做的纯静态反汇编 + 隔离虚拟机动态验证。前后两个阶段耗时数日,产出 19 份子报告、~200 KB 分析材料、12 个 Python 反汇编脚本。本文是想把过程本身讲明白,而不只是简单给出结论。

在绝大多数司法辖区,对合法获取的软件进行逆向工程,用于安全研究、漏洞分析、实现互操作或教学目的,属于版权法合理使用条款所保护的行为。本文讨论严格限于此范围,不提供 CloakBox 二进制文件,不讨论其具体使用场景,不涉及对产品用途的任何价值判断。所引用的公司名称、证书指纹、URL、UUID,均已存在于 CloakBox 公开发行的二进制字符串表中,并已被 VirusTotal、Vektor 官网、Patreon 页面、社区论坛等公开来源记录,不构成对任何隐私信息的披露。


第一部分:CloakBox 是什么

30 秒介绍

CloakBox 是一款专注于”反虚拟机识别”的 VirtualBox 衍生发行版

它的产品定位是:让虚拟机在面对那些会主动识别”自己是否跑在虚拟机里”的第三方软件时,技术上表现得与一台真实物理机更接近。

这是一个技术品类,叫做 “Anti-VM-Detection VM”“Anti-Detect Virtualization” 。近几年这个品类在国际市场上有多家商业化产品(如 ByteVM、Nstbrowser、各类广告联盟营销工作室用的专用 VM 等),CloakBox 是其中的一款。

技术三段论

非工程师也能读懂的方式拆解 CloakBox 做的三件事:

  1. 1. 虚拟化引擎:底层是 Oracle VirtualBox 7.2.4——这是一款全球几千万用户的开源虚拟机软件。CloakBox 基于它的源码(GPL v3 开源)在自己的代码分支上继续开发。
  2. 2. 反 VM 识别层:在虚拟机进入 Guest 操作系统之前,CloakBox 做了一系列字段替换——CPU 特征字符串、主板 BIOS 厂商、ACPI 表的 OEM ID、DMI 系统唯一 ID 等。这些字段如果保持 VirtualBox 默认值,很容易被识别为”虚拟机”;CloakBox 把它们替换成真实硬件厂商的值(比如 MSI 主板、Intel CPU、AMI BIOS)。
  3. 3. 授权与 UI:CloakBox 通过一家叫 keygen.sh 的商业授权 SaaS 做 license 验证;它的右键菜单(Qt 框架实现)提供了一组反检测功能的配置开关。

产品与归属

  • 开发方:Vektor T13 Technologies B.V.,一个荷兰鹿特丹注册的合法商业实体,另有关联的乌克兰 LLC 实体。
  • 商业模式:FREE 版免费、Premium 版通过 Patreon 订阅付费
  • 内部产品代号:Antidetect5(从 PDB 路径与 MSI 产品名里可见)
  • 产品形态:一个 65 MB 的 Windows 安装包(NSIS + 内嵌 MSI)
  • 依赖的第三方技术:Oracle VirtualBox(基础虚拟化)、Juice Labs Juicify(GPU 栈代理)、Qt 6(UI 框架)、libcurl + OpenSSL(TLS 栈)、keygen.sh(授权 SaaS)

这类技术的常见应用场景

“反虚拟机识别”不是 CloakBox 独有的概念。从业界视角看,这一技术品类在以下场景均有成熟商用产品:

场景 代表产品 / 用途
反机器人 / 反爬检测规避 广告联盟、电商爬虫、自动化营销工作室使用的反识别浏览器(Multilogin、AdsPower 等)
浏览器指纹隔离(多账号运营) 社媒矩阵管理、电商多店运营(Nstbrowser、ByteVM 等)
在线考试监考系统(proctoring)规避 这是反检测虚拟化行业里公开性最强、也最争议的一类应用——涉及 Pearson VUE OnVUE、ProctorU 等监考系统的绕过
恶意软件沙箱对抗(红队研究) 渗透测试、Red Team 技术测试,让 payload 在 VM 里能跑出真实物理机行为
隐私研究 / OSINT 作业隔离 研究员在隔离环境里接触可疑网页 / 样本,同时避免研究环境被目标识别

CloakBox 在这个品类里的具体位置:从它捆绑的工具集(OBS 虚拟摄像头、FakeGPS daemon、假 Realtek 声卡驱动、DoD STIG 组策略、Pearson-OnVUE 专用启动脚本)看,它的典型部署场景偏向在线监考系统规避。但同样这些技术组件(虚拟摄像头 / 假 GPS / 图形栈代理)在隐私研究和红队渗透测试领域也是常用的。

对使用者的安全考量

仅从软件本身对使用者计算机的技术影响角度评估:

1. CloakBox 不会做的事

基于完整的静态反汇编 + 动态 Frida 插桩验证:

  • 不读取浏览器密码、Cookie、自动填充字段(静态扫描无 LocalState / Cookies / Login Data 等 Chrome/Edge 敏感文件路径字符串,也无对应 API 导入)
  • 不截屏、不录键盘(无 GetKeyboardState / GetAsyncKeyState 长期钩子;无屏幕截取 API 的常驻使用)
  • 不访问加密货币钱包 / 文档(无 wallet.dat / .docx / .pdf 的文件扫描行为)
  • 不做 Process Injection 到其他进程(无 WriteProcessMemory / CreateRemoteThread 新增导入)
  • 不碰 SSDT / IDT / PatchGuard(内核层零新增钩子)
  • 不安装 rootkit 式持久化(无 MBR 改写、无 UEFI bootkit、无 WMI Event Subscription 持久化)

等价说法CloakBox 不是恶意软件(malware)、不是远控(RAT)、不是 infostealer、不是勒索软件。

2. CloakBox 做的事(使用者需要知情)

这些是使用者必须明确了解的技术行为:

1. 内核驱动开机自启

  • AtdtSup.sys 以 “System-start” 方式注册服务(Windows 引导阶段加载,早于用户登录)
  • • 驱动签名有效(Vektor EV + 已过期的 WHQL),但这意味着系统启动后就有一个 ring-0 组件
  • 卸载 CloakBox 后该驱动文件不会自动删除——要手动检查 C:\Windows\System32\drivers\AtdtSup.sys 是否被清理

2. 启动期”打卡”式授权心跳

  • • 每次启动 VirtualBox.exe无论用户是否激活了 license,都会向 api.keygen.sh 发一次 HTTPS POST(使用硬编码的 trial key)
  • • 这意味着 Vektor 后台能看到每一次启动的时间戳 + 源 IP
  • • 这是合法商业 DRM 机制(类似 Adobe、JetBrains),不是恶意 C2;但 EULA 没有显式告知用户这一行为
  • • 企业网络监控层面:公司 SOC 若部署 SSL 拦截代理也无法解密这段流量(CloakBox 用了内嵌 Mozilla CA bundle)

3. HWID 密钥写入用户 SSH 目录

  • • 调用 ssh-keygen.exe -m PEM -t rsa -b 4096 生成 4096-bit RSA 密钥对
  • • 路径:%USERPROFILE%\.ssh\id_rsa / .ssh\id_rsa.pub
  • • 这与用户自己用 Git/SSH 登录时使用的标准目录冲突——如果用户本身已有 SSH 工作密钥,可能被覆盖(目前未看到明确的覆盖保护逻辑)
  • • 从工程规范角度看,这不是好的做法(商业软件应该用自己独立的目录存 HWID 密钥)

4. UI 菜单触发的主机级修改

  • • CloakBox 的 “Fuck Menu” 里 22 个 action 一旦点击,会执行预编译在 VirtualBox.exe 里的 cmd 模板
  • • 这些模板会修改**主机(非虚拟机)**的:
    • • Windows Firewall 规则
    • • HOSTS 文件
    • • 浏览器快捷方式(Edge 加 --enable-unsafe-webgpu 等参数)
    • • 开机启动项(如安装 OpenVPN 后追加 Startup 快捷方式)
    • • Windows 组策略(应用 57 条 DoD STIG)
  • 这些修改没有自动 undo——需要用户手动回滚
  • • 只要不点这些菜单,CloakBox 本身不会触发这些修改

3. 需要注意的企业环境问题

如果你是在企业电脑上运行:

  • • 内嵌 Mozilla CA bundle 的单向 TLS 信任链意味着企业的 SSL 拦截代理无法解密这条 api.keygen.sh 流量——这在某些合规环境下可能违反企业”所有出站 HTTPS 必须可被 SOC 检查”的 policy
  • • 若用户点了 AntiOSBrowserHardened 等 action,宿主机的浏览器行为会被永久修改——企业的端点合规基线可能被破坏
  • • 即使未主动点 action,CloakBox 的存在本身(AtdtSup.sys + Vektor T13 EV 签名)会触发部分 EDR/Sysmon 规则告警

总结:给个人用户的技术判断

问题 答案
CloakBox 会偷我的数据吗? 不会(无 infostealer 组件)
CloakBox 会变成远控 / 挖矿 / 勒索吗? 不会(无相关能力)
CloakBox 会留持久化后门吗? 有受控的持久化(内核驱动 + 激活心跳),但技术上可识别、可清理
CloakBox 会影响我的日常网络 / 浏览器吗? 除非用户主动点 Fuck Menu 的 action,否则不影响;点了之后会有永久修改
装 CloakBox 等于装了病毒吗? 不等于——但它属于 “Anti-Detect 品类商业软件”,部分 EDR / Defender 会标为 PUA
卸载干净需要什么? 控制面板卸载 + 手动检查 AtdtSup.sys + 手动回滚任何点过的 Fuck Menu 修改

一句话判断对个人电脑低至中风险,可清理;对企业电脑不建议装,会破坏合规基线并触发安全告警。


第二部分:作者是如何一步步挖到真相的

接下来的内容逐步进入技术深水区。非工程师读者可以跳到第三部分”技术指纹总结”。

0. 序曲:一个看似平常的安装包

故事开始于一个普通的 .exe 文件:

文件名:CloakBox.exe
大小:65 MB
签名:Vektor T13 Technologies B.V., Rotterdam, Netherlands

Windows 资源管理器显示它是 "VirtualBox-7.2.4-r167084-Win"——一个看起来平平无奇的 Oracle VirtualBox 安装包。

但是 Oracle 公开发布的 VirtualBox 7.2.4 的内部 build 号是 r170995,不是 r167084。r167084 是一个从未出现在 Oracle 公开 CDN 上的内部 build。这意味着:

CloakBox 不是简单地把一个 Oracle 原版 VirtualBox 改个重新编译,它是基于 Oracle 的源码(Oracle VirtualBox 的核心是 GPL v3 开源的)在某个时间点 fork 出来的一个分支。它内部的构建树早已和 Oracle 主线分叉。

这个观察定下了整个分析的第一个基调:我们面对的不是一个”重打包”的二进制,而是一个源码级的 fork。这意味着 Vektor 的构建工具链需要维护自己的 Makefile.kmk、自己的签名工具链、自己的 GPL 合规分支。工程复杂度远超”重打包”级别。

1. 第一回合:签名链的五个身份

拆开安装包之后我们做了第一件事,对每一个可执行文件检查数字签名。这是审计外来软件的起手式,能在 5 分钟内告诉你”这东西的作者究竟是谁”。

结果发现 CloakBox 的文件集合里一共有 5 个不同的签名身份

签名身份 注册地 签哪些文件
Vektor T13 Technologies B.V. 荷兰鹿特丹(EV 证书) CloakBox.exe、VirtualBox.exe、UICommon.dll、AtdtSup.sys、VBoxCertUtil.exe、OBSDriver.dll、Realtek 驱动等(主体)
VEKTOR T13 TECHNOLOGIES LLC 乌克兰哈尔科夫(邮箱 vektort13@protonmail.ch FakeGPS/bcmgnssd.dll
Tyshchenko Volodymyr Volodymyrovych 乌克兰基辅(个人证书,邮箱 vovan44ik1@gmail.com 在 PDB 路径里出现
Ryan Smith 美国拉斯维加斯(个人证书) A5Toolkit-amd64.exe、WebRTCMonitor.msi
curl-for-win Code Signing Authority 开源项目(Daniel Stenberg) 附带的 curl.exe

这是五个独立的法律实体。它们之间的关系从证书签名块和 PDB 路径可以做合理推断:

  • • 两个 Vektor T13 实体(荷兰 BV + 乌克兰 LLC)几乎可以认定是同一组织的双法律主体架构。BV 负责欧盟市场合规,LLC 承担部分需要不同证书路径的代码(早期没有 BV 的 EV 证书时会用 LLC 证书签)
  • • Tyshchenko 的 PDB 路径 C:\Devel\Antidetect5\Personal\VirtualBox\... 暴露了他就是 Vektor 的核心开发者(昵称 “Vovan” 是俄语 “Владимир” 的通用爱称)
  • • Ryan Smith 是独立第三方,A5Toolkit 是Vektor 打包分发但非自研的第三方产品

技术启示:当一个”VirtualBox 改版”里出现跨国、跨个体、跨商业主体的签名组合时,它的供应链故事必然多层。后续 ISO 拆包(见第 6 节)印证了这一点——整张 406 MB 的”Guest Additions ISO”里至少有 6 家不同实体的二进制。

2. 第二回合:六个问题框架

第一阶段(表面审计)做到一半时,整个项目的分析方向被重新定义为 6 个逻辑递进的问题:

Q1 它是干什么的?(产品定位)
Q2 大概是怎么实现的?(架构)
Q3 具体是怎么实现的?(代码细节)
Q4 技术特征与行业分类是什么?
Q5 具体技术行为的清单
Q6 技术检测与卸载

这 6 个问题后来成了整个分析项目的骨架。每一步的深度都建立在前一步的基础上。

关键技术发现之一:新增 API 导入数为零

逐一对比 CloakBox 和 Oracle 原版 VirtualBox 7.2.4 的 PE 导入表,一个反直觉的结论浮现:

CloakBox 的内核驱动 AtdtSup.sys 相比 Oracle 的 VBoxSup.sys,导入 API 数量 = 112 vs 112,零新增

强烈暗示:Vektor 没有给内核驱动加任何新的 Windows API 依赖。换句话说,他们只是把 Oracle 的代码拿来改了文件名、改了设备名、改了 PDB 路径、加了些伪装字符串,而没有在内核层引入新的系统调用依赖。

这个观察对后续判断至关重要,也就可以推出 CloakBox 对于这部分并没有对原版 Virtualbox 进行更改。如果 Vektor 加了新的内核能力,他们必须引入新的 Windows API 导入,而这里没有。

Q1-Q6 的阶段性结论

Q1-Q3 阶段给出的初步技术分类:

D1 外部网络外联                 — 初版判定:无
D2 用户数据读取                 — 无
D3 持久化系统组件               — 部分(内核驱动 System-start 自启)
D4 核心系统组件修改             — 无
D5 反主机级监控能力             — 部分(TLS 走内嵌 CA、Sysmon overlay)

这是初版技术分类,后面它会被动态分析部分推翻。 这也是这个故事真正有意思的地方,阶段性结论和最终真相之间的差距。

Phase 2 六问的产出是 18 KB 的 Q1 报告 + 19 KB 的 Q2 架构报告 + 6 份 Q3 子报告(合计 80 KB)+ 两份 Q6 报告(防御 + 移除,合计 28 KB)+ 一个 600 行的 PowerShell 清理脚本(cleanup_verify.ps1,含 DryRun / Apply / VerifyOnly 三种模式)。

表面上项目到这里就结束了。

但有一个观察一直没被展开

CloakBox 的 VirtualBox.exe 和 VBoxHeadless.exe 的 .rsrc 段熵是 7.96。对比 Oracle 原版的 3.02,这段数据值得单独一章分析。

这个悬念打开了整个故事真正的核心章节。

3. 第三回合:消失的加密 blob

3.1 异常值不合理

Q3 阶段的观察:CloakBox 的 VirtualBox.exe 和 VBoxHeadless.exe 的 .rsrc 段信息熵 = 7.96

对于不做二进制分析的朋友:.rsrc 是 Windows PE 文件的”资源段”,通常装图标、对话框、字符串表、版本信息。这些应该是明文,信息熵通常在 2.0 – 4.0 之间。

熵 7.96 意味着”接近完全随机的字节流”,也就是说正常的数据结构不会这样。要么是加密后的数据,要么是压缩后的数据

Oracle 原版同名文件的 .rsrc 段熵只有 3.02(标准图标 + 字符串表)。

当时的假设很自然:

CloakBox 是否在 .rsrc 段里藏了什么加密数据?license key?硬编码的 URL?一段加密的二进制?

我们启动了一个 “Phase 2.1” 专项:

  1. 1. 提取出这段高熵 blob
  2. 2. 找出加密算法(XOR? RC4? AES? 自定义?)
  3. 3. 找出密钥在哪里
  4. 4. 解密,看看里面是什么

3.2 提取

.rsrc 段的资源树:

Type=ID_3  (RT_ICON)      ID=ID_1    Size = 140,104   ← 这个可疑
Type=ID_14 (RT_GROUP_ICON) ID=ID_1    Size = 20
Type=ID_16 (RT_VERSION)    ID=ID_1    Size = 856
Type=ID_24 (RT_MANIFEST)   ID=ID_1    Size = 465

140 KB 的 RT_ICON(图标资源)? 正常的 Windows 图标最多几十 KB。

Phase 2.1 的完整计划:8 步,预计 2-4 小时。

3.3 证伪:一个非常有价值的阴性结果

提取 blob → dump 成文件 → 一看前 8 个字节:

89 50 4E 47 0D 0A 1A 0A

这是 PNG 图像的 magic bytes

89   = 非 ASCII(避免误判为文本)
50 4E 47 = ASCII "PNG"
0D 0A 1A 0A = CRLF + Ctrl+Z + LF,跨平台换行一致性标记

就是一张 PNG 图片。

继续解析 PNG IHDR 头:

Width  = 256
Height = 256
Bit depth = 8
Color type = 6 (RGBA)

一张 256×256 RGBA 的 PNG 图像,Windows 10/11 高分辨率图标集的最大尺寸。

它之所以熵 7.96,是因为 PNG 的 IDAT chunk 本来就是用 zlib/DEFLATE 压缩过的。压缩数据接近随机是数学规律,不是加密。

假设完全错误。这个 blob 不是”伪装成图标的加密 payload”,它就是图标。

Oracle 用的是传统 ICO 多尺寸 BMP 集合(熵低),而 CloakBox 用了单张 256×256 PNG(熵高)。差别在于编码格式,不在于”是否加密”。

这是第一个”阴性结果”的价值,但它消除了一个本来会消耗大量后续资源的错误方向

但同样的 PE 里还有另一个异常值浮出水面:

CloakBox 的 VBoxRT.dll 比 Oracle 原版大 233 KB。多出来一个 RCDATA 资源(ID=111),它是什么?

4. 第四回合:CA bundle 的尾巴藏着更大的秘密

4.1 提取与识别

同样的流程:提取、看 magic bytes。结果是明文可读的:

## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Пн апр 21 20:46:07 2025 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
## file (certdata.txt).

是一份 Mozilla 的根证书 bundle,里面有 150 张证书的完整 PEM 格式,任何做 TLS 客户端的软件都需要这样一份东西。

但有个异常,这份 bundle 的日期字符串是俄语 locale

Пн  = Понедельник (俄语"星期一"缩写)
апр = апрель (俄语"四月"缩写)
所以 "Пн апр 21 20:46:07 2025 GMT" = "Mon Apr 21 20:46:07 2025 GMT"

curl 项目官方(curl.se)发布的 cacert.pem 日期字符串总是英文的。俄语 locale 只可能来自本地重新生成。也就是说,这份 bundle 不是从 curl.se 直接下载的,而是在一台 locale = ru_RU 的机器上用 mk-ca-bundle.pl 脚本重新生成的

这成为 Vektor 的第三条归因证据(前两条是 PDB 路径的 “Antidetect5” 和 Tyshchenko 的乌克兰签名)。

4.2 关键对比

我们把 CloakBox 的 VBoxRT.dll 和 Oracle 原版 VBoxRT.dll 做了完整资源对比:

资源 Oracle VBoxRT.dll CloakBox VBoxRT.dll
VERSION ✅ 有 ✅ 有
MANIFEST ✅ 有 ✅ 有
RCDATA/111 (CA bundle) 不存在 ✅ 233 KB,150 张证书

Oracle 根本没有这个资源,这是 CloakBox 新加的。

接着一个全二进制 grep:Oracle VBoxRT.dll 的整个 7.57 MB 里,-----BEGIN CERTIFICATE----- 出现次数 = 0;CloakBox 的对应文件里,出现 150 次,全部集中在这个新增资源里。

4.3 技术问题:为什么要内嵌 CA bundle?

Oracle 自己的 VBoxRT.dll 没有 CA bundle。Oracle 的 VBox 在需要 TLS 的时候(比如检查更新、下载 Guest Additions),默认使用 Windows 系统的证书库(通过 CertOpenSystemStoreW)。

那 CloakBox 为什么要在 DLL 里硬编码一份自己的 CA bundle?

从 TLS 工程角度看,内嵌 CA bundle 意味着客户端不信任本机的 Windows 系统证书库,只信任它自己打包的那一套。这是一种**”密钥锁定”式的 TLS 信任配置**(在商业软件里并不罕见,某些离线桌面应用、某些 IoT 设备都会用)。

具体到 CloakBox 的语境。这意味着任何在企业网络里部署了 SSL 拦截代理(BlueCoat、Zscaler 等,靠在 Windows 证书库里装企业根证书实现 MITM)的环境下,CloakBox 的这条 TLS 流量不会被代理的 MITM 解密,因为代理的企业根证书不在 Mozilla bundle 里。

4.4 能力 ≠ 行为

“CloakBox 内嵌了一份 CA bundle” 只是一种能力。要证明它是被实际使用的,而不是一段死代码残留,需要在反汇编层面找到对这个资源的引用。

目标:在 CloakBox 的 .text 段里找到 FindResourceA(hMod, MAKEINTRESOURCE(111), RT_RCDATA) 的调用点

4.5 静态 IAT 反扫描

pefile 解析导入表,找到 4 个 Windows 资源加载 API 的 IAT slot 地址:

FindResourceA:    VA = 0x18047c138
LoadResource:     VA = 0x18047c120
LockResource:     VA = 0x18047c128
SizeofResource:   VA = 0x18047c130

然后扫 .text 段里所有 call qword ptr [rip+disp] 指令(字节模式 FF 15 xx xx xx xx)——只要目标 VA 等于上面 4 个 IAT slot 之一,就是一个调用点。

结果:每个 API 在整个 DLL 里只被调用了 1 次。而且 4 个调用点聚集在 42 字节的窗口内:

0x1801c721c  call FindResourceA
0x1801c722b  call LoadResource
0x1801c723a  call SizeofResource
0x1801c7245  call LockResource

就在 FindResourceA 前 15 个字节:

0x1801c720d  mov edx, 0x6F        ; 0x6F = 111

111 被作为第二参数(lpName)传给 FindResourceA。那第三参数lpType,资源类型)呢?紧接着:

0x1801c7218  lea r8d, [rdx - 0x65]  ; 0x6F - 0x65 = 0x0A = 10 = RT_RCDATA

通过一个减法把 RT_RCDATA 常量算出来(可能是编译器优化,少写一条 mov)。

完整调用FindResourceA(hMod, MAKEINTRESOURCE(111), RT_RCDATA)

这就是加载 CA bundle 的位置。Oracle 原版的整个 VBoxRT.dll 根本没有 FindResourceA 这个导入——这是 CloakBox 新增的。

4.6 反汇编调用它的函数

反汇编 0x1801c7000 开始的函数FindResourceA 调用所在的函数。

前几十行在准备 HTTP 调用:

  • • 获取一个字符串指针 → 构造 UUID 格式化
  • • 设置 all_proxy 环境变量
  • • 设置 HTTP 头:Content-Type: application/vnd.api+jsonAccept: application/vnd.api+json

然后是一串 lea rdx/r8, [rip + disp],rip-相对的字符串引用。把每个 disp 计算出来,在 .rdata 段查对应的字符串:

0x1801c70c6  lea r8, "https://api.keygen.sh/v1/accounts/%s/licenses/actions/validate-key"
0x1801c70db  lea rax, "f564ba37-00df-4c0e-8528-82c7b5213abc"
0x1801c70e5  lea r8, "{ \"meta\": { \"key\": \"%s\", \"scope\": { \"policy\": \"%s\", \"product\": \"685d3797-7a93-47e0-8f6d-069014980a08\"} } }"
0x1801c713e  lea rdx, "all_proxy"
0x1801c71bb  lea r8, "application/vnd.api+json"
0x1801c71cd  lea rdx, "Content-Type"

这不是 TLS 验证函数,而是一个完整的 HTTP 客户端函数,它的目标是 api.keygen.sh

到这里我们意识到:CloakBox 有硬编码的 license 校验机制。这是 Phase 2 时 D1″零外部网络外联”的表述需要被修正的地方。它确实对外发 HTTPS 请求,目标是合法的商业软件授权验证。

4.7 完整还原这个函数的伪代码

把反汇编完整分析下来之后,函数的结构:

// VBoxRT.dll 0x1801c7000 — keygen_http_client
int keygen_http_client(license_key, *out_error, *out_name, *out_expiry)
{
    // 1. 初始化 HTTP 客户端(基于 libcurl)
    http = RTHttpCreate();

    // 2. 读 all_proxy 环境变量 → 设置 HTTP 代理
    const char *proxy = getenv("all_proxy");
    if (proxy) RTHttpSetProxyByUrl(http, proxy);

    // 3. 加载内嵌的 Mozilla CA bundle
    HRSRC  hResource = FindResourceA(GetModuleHandleA("VBoxRT.dll"),
                                      MAKEINTRESOURCE(111),
                                      RT_RCDATA);
    HGLOBAL hLoad    = LoadResource(hMod, hResource);
    DWORD   size     = SizeofResource(hMod, hResource);
    void    *bundle  = LockResource(hLoad);

    // 4. 把 bundle 设置为这个 HTTP 客户端的 CA 信任库
    //    关键:这是"替换"而非"追加",不用 Windows 系统证书库
    curl_easy_setopt(http, CURLOPT_CAINFO_BLOB, bundle);

    // 5. 设置 HTTP 头
    RTHttpSetHeaders(http, "Content-Type: application/vnd.api+json\r\n"
                           "Accept: application/vnd.api+json\r\n");

    // 6. 构造 URL 和 body(JSON:API 规范)
    // [静态分析时对 Account / Policy UUID 的具体归属做了推测,
    //  后续动态分析修正了这一映射——见下节]

    // 7. 发起 POST
    RTHttpPostBinary(http, url, body, strlen(body), &response);

    // 8. 解析 JSON 响应:meta.valid, meta.constant, data.attributes.name/expiry
    RTJsonParseFromString(response, &root);
    RTJsonValueQueryBooleanByName(root, "valid", &is_valid);
    RTJsonValueQueryStringByName (root, "constant", &error_str);

    return is_valid ? 0 : -9;
}

4.8 追溯调用者:CheckSerial

keygen_http_client 在整个 VBoxRT.dll 里只有一个调用者,位于地址 0x1801c7441,它所属的函数导出名是:

VBoxRT.dll 导出表:CheckSerial

就是它。Phase 2 Q3.5 报告里标记”值得关注但未深挖”的 CheckSerial 函数,其本质是 license 验证器。

CheckSerial 的代码结构:

  • • 从调用者传入的缓冲区读 license key
  • • 用 RTCString::strip() 去空白
  • • 调用 keygen_http_client 发请求
  • • 用 VBox 自家的 RTJson* 系列函数解析响应
  • • 提取 meta.validmeta.constant(如 "VALID" / "EXPIRED" / "NO_MACHINE")、data.attributes.namedata.attributes.expiry
  • • 返回给调用者

license 机制的代码底层至此完整浮现

5. 第五回合:UI 层:Qt 元对象里的 “Fuck Menu”

5.1 UICommon.dll 的导入表

UICommon.dll 是 VBox 的 Qt UI 核心模块(与 Oracle 原版同名)。它从 VBoxRT.dll 导入了 23 个函数。引人注目的一个:

UICommon.dll 从 VBoxRT.dll 导入:
  RTHttpCreate
  RTHttpAddHeader
  ...(21 个 HTTP / Crypto 相关)
  CheckSerial          ← Oracle 原版 VBoxRT.dll 不导出

UI 层直接调用 CheckSerial,这说明这是用户在 UI 里输入 license key 后触发的验证路径。

5.2 UI 层的 CheckSerial 调用者

IAT 反扫描定位到 UICommon.dll 的 0x1800ba1b0 内部函数(非导出)。它的行为:

int UICommon_validate_license(license_key_qstring,
                              *out_error, *out_name, *out_expiry)
{
    // 1. 从 Qt ExtraData 读一个配置 URL
    QUrl proxy_url = read_from_qt_extradata("ProxyConfigUrl");
    if (proxy_url.isValid()) {
        // 2. 把 URL 塞到 all_proxy 环境变量
        RTEnvSetEx("all_proxy", proxy_url.toUtf8().constData());
    }

    // 3. 读 Qt ExtraData 里的另一个 key:本地 license 缓存目录
    QDir cache_dir = QDir(read_from_qt_extradata("LicenseDir"));
    QString cache_file = cache_dir.absoluteFilePath("license.vbox-antidetect");
    //                    ↑ 本地 license 缓存文件名

    // 4. 转换 QString license_key → wchar_t*,调用 CheckSerial
    int rc = VBoxRT::CheckSerial(license_key.unicode(),
                                  &error, &name, &expiry);

    // 5. 返回结果给上层 UI slot
    if (rc < 0) {
        show_error("UNKNOWN (%1)" % error);
    }
    return rc;
}

本地 license 缓存的文件名是 license.vbox-antidetect,这个命名再次呼应 Vektor 的 “Antidetect5” 内部产品代号。

5.3 Qt moc 枚举里的菜单

UICommon_validate_license 的调用者时,遇到一个问题。它没有静态调用者,它通过 Qt 的 signal/slot 机制(运行时动态绑定)被调用。

换条路径:扫 UICommon.dll 的所有 Qt 元对象枚举符号。UICommon.dll 导出 6684 个符号(典型的 Qt C++ 模板爆炸)。相关的两个枚举:

enum RuntimeMenuDevicesActionType_*  // Oracle 标准设备菜单
enum RuntimeMenuFuckActionType_*     // ⭐ CloakBox 新增的菜单

技术注RuntimeMenuFuckActionType_* 是 Qt 元对象编译器(moc)生成的真实代码类名,由 Vektor 的源码在 .h 头文件中定义,不是我们的编辑用语。这是客观的代码事实。

22 个 action 枚举值:

_AntiOSActivateWindows         (Windows 激活模拟 — slmgr 系列命令)
_AntiOSBrowserHardened         (Edge / Chrome / Firefox 浏览器配置修改)
_GeolocationSettings           (打开独立 GeolocationSettingsWindow 窗口)
_AntiOSAkamaiPumper            (HOSTS 文件污染)
_AntiOSVPNHopTunerMinus1..10   (VPN TTL 调整)
_AntiOSVPNHopTunerMinusD       (动态 VPN hop 调整)
_AntiOSIPv6Allow
_AntiOSIPv6Block               (禁 IPv6 过渡协议 proto 41 / 43)
_AntiOSStrictFirewallOn
_AntiOSStrictFirewallOff       (~20 条 netsh 规则)
_AntiOSTCPFingerprint1         ("TCP M1D Fingerprint spoof v.2")
_AntiOSTCPFingerprint2         ("TCP M1D1 Fingerprint spoof v.2.1")
... 及几个 sentinel 值

这 22 个 action 是 Premium 版解锁后的主菜单,FREE 版下大部分是灰色 setEnabled(false) 状态。

5.4 配套发现:9 个归因 URL

扫 UICommon.dll 的字符串表时还发现一组硬编码的 URL:

https://antidetect.online        ← Vektor 主站
https://antidetect.wiki          ← 文档站
https://detect.expert            ← 姐妹站 + HWID 接收端点
https://t.me/antidetect          ← Telegram 频道
https://www.patreon.com/vektort13 ← Patreon 订阅付费页
https://www.youtube.com/vektort13 ← YouTube 频道
https://update.virtualbox.org/query.php  ← Oracle 继承(默认禁用)
https://download.virtualbox.org/virtualbox/  ← Oracle 继承

这些 URL 从归因角度补全了 Vektor T13 的商业运营拼图:Patreon 做订阅收费、YouTube + Telegram 做内容分发、antidetect.online/wiki/expert 是品牌矩阵、keygen.sh 做 DRM。这是一个完整商业化运营的产品供应商,不是地下工具或零星个人项目。

6. 第六回合:ISO 拆包:406 MB 的工具集

前面一直没深挖的是 CloakBox 内嵌的一张 “Guest Additions ISO”DriverUpdaterCD.iso406 MB,约是 Oracle 原版 Guest Additions ISO(~100 MB)的 4 倍

6.1 内容清单(按技术类别归类)

挂载后按作用类别分组:

A. 虚拟硬件驱动(给 Guest VM 安装的)

  • OBSDriver/OBSDriver.sys — 虚拟摄像头驱动(Vektor 签)。基于 OBS Virtual Camera 的二次封装,通过 DirectShow 接口注入任意视频流
  • FakeGPS/bcmgnssd.exe — 模拟 Broadcom GNSS 驱动(乌克兰 LLC 签)。实现 Windows Location Services 所期待的 GPS 数据接口
  • Realtek/realtek.sys + realtekp.exe — 模拟 Realtek 声卡驱动(Vektor 签)。让 Guest VM 的设备管理器里显示一个声卡条目

B. GPU 栈代理(第三方商业产品)

  • JuiceClient.zip (32 MB 压缩,160+ 文件) — Juice Labs Juicify,来自 juicelabs.co合法商业产品,原本用于云游戏 / 远程 GPU 渲染
    • • 5 个 shim DLL:Juiced3d11.dllJuiced3d12.dllJuicedxgi.dllJuiceopengl32.dllJuicevulkan-1.dll
    • juicenvml.dll — 实现 NVIDIA NVML API 的替换层,允许返回任意 GPU 型号 / 驱动版本
    • • 附带 PyTorch + YOLO/ResNet 模型文件(具体用途静态分析未完全确认)
  • A5Toolkit.exe + A5Toolkit-amd64.exe + A5Toolkit-x86.exe — 第三方工具套件(Ryan Smith 签)

C. 网络代理 / 隧道(双用途合法工具)

  • OpenVPN-2.5.6-I601-amd64.msi — 官方 OpenVPN
  • Proxifier/ProxifierSetup.exe — 商业 SOCKS 代理客户端(土耳其 İNİTEX Software 签)
  • tun2socks/* — 透明 TUN/TAP 流量路由(开源)
  • Throne/* (80 MB) — Matsuri / sing-box 的开源 GUI 代理客户端
  • Wub/Wub.exe — Sordum 的 Windows Update 阻断器
  • WebRTCMonitor.msi — WebRTC 泄漏阻断(Ryan Smith 签)
  • simplewall-3.8.2-setup.exe — 开源 WFP 前端防火墙
  • ip-auditor-installer-1.2.11.exe (80 MB) — 第三方 IP / browser fingerprint 自检工具

D. 系统配置基线

  • WinHard/Files/GPOs/DoD/57 条美国国防部 DoD STIG 组策略——Microsoft Office、IE、Edge、Chrome、Firefox、Adobe Acrobat 等的公开安全配置基线。这是美国 DISA 公开发布的政策模板
  • WinHard/Files/Sysmon/Sysmon.exe — Microsoft Sysinternals Sysmon
  • WinHard/Files/LGPO/LGPO.exe — Microsoft 官方组策略工具
  • akamai.txt — 715 行 0.0.0.0 <domain> 的 HOSTS 条目清单,覆盖 Akamai CDN 子域、广告服务器、多个”反欺诈检测 API”的域名

E. 字体库

  • Fonts/F1 .. F5 合计大约 30 个字体(Helvetica / Arial / SegoeUI / Tahoma / msjh / meiryo / SIMSUN / NotoSans / DejaVuSans …)。用于给 Guest VM 装”标准办公电脑字体集”,规避浏览器字体枚举指纹

F. 证书管理

  • cert/VBoxCertUtil.exe + 5 张 Vektor 自签根证书。实现可以把 Vektor 根证书装入 Guest VM 的信任库(让 Vektor 签名的 Guest 侧驱动可以加载)

G. Oracle 标准 Extension Pack

  • Installer/Oracle_VirtualBox_Extension_Pack-7.2.4.vbox-extpack — Oracle 官方扩展包(revision 170995,未修改,Oracle 签名完好)

6.2 技术观察

这张 ISO 不是标准意义上的 Guest Additions,它是一套主题为”反 VM 识别 + 硬件指纹重映射”的工具集成包:涵盖虚拟硬件驱动(FakeGPS / FakeRealtek / OBSDriver)、GPU 代理栈(Juice Labs)、企业合规基线(DoD STIG GPO + Sysmon)、网络出口控制(OpenVPN / Proxifier / tun2socks)、隐私保护(WebRTCMonitor)、字体库(反指纹)等。

从技术工程角度看,这是一个完整度较高的反检测工具链,多层覆盖(硬件层 / 内核层 / 用户态 / 浏览器层 / 网络层)。

7. 第七回合:动态验证登场

静态分析到这里其实已经够写一篇审计报告了。但我们还有未闭合的问题:

  1. 1. CloakBox 真的在启动时就发 keygen.sh 心跳吗?或者只在用户点”激活”时才发?
  2. 2. license.vbox-antidetect 这个缓存文件到底落在哪个目录?
  3. 3. all_proxy 环境变量默认是空的吗?
  4. 4. Oracle update.virtualbox.org 默认被禁用了吗?
  5. 5. 离线时 CloakBox 什么反应?
  6. 6. JuiceClient / Throne / A5Toolkit 运行时具体干啥?

这些需要动态行为观察,而静态分析的 host 不能跑 CloakBox(host-safe 原则)。

7.1 交接到另一个分析环境

静态分析完成后,整个项目被交接到另一个完全隔离的分析环境(独立的 Windows 11 VM,与静态分析机器之间 airgap)。移交材料包括:

  • • 一份详细的 SOP:6 个目标问题(Q-D1 ~ Q-D6)+ 6 个分析场景(Scene A-F)
  • • 一份 PowerShell 辅助脚本(一键采集 12 组数据:进程 / 注册表 / 防火墙规则 / 网络连接 / 文件系统 diff 等)
  • • 明确不装 Fiddler / mitmproxy,因为 CloakBox 用了内嵌 Mozilla CA bundle 任何 MITM 都会被拒绝。

动态分析环节的产出是一组证据文件:pktmon 抓包、Frida hook 日志、注册表差异 dump、文件系统快照前后对比。

7.2 pktmon + Frida 的双重证据

动态分析环境使用 Windows 自带的 pktmon 抓包(Wireshark 在隔离 VM 上没装),并使用 Frida 钩取 RTHttpPerform 函数。

pktmon 结果(大约 5 分钟窗口,58,288 个包):

  • 12 次 DNS A-query api.keygen.sh
  • • CNAME 链:api.keygen.shbehavioural-mandrill-rnma91gjivqr3isoab4hacmq.herokudns.com → AWS Global Accelerator 4 个 IP(35.71.131.46 / 13.248.241.119 / 13.248.144.105 / 3.33.148.61)
  • TCP 流到 35.71.131.46:443:6 次 SYN,完整 TLS 握手

Frida 钩到的完整 POST body

URL:    https://api.keygen.sh/v1/accounts/29755df0-2dab-4f4e-8ecb-6ff176fc1238/licenses/actions/validate-key
Method: POST (RTHTTPMETHOD_POST = 3)
Headers:
  Content-Type: application/vnd.api+json
  Accept:       application/vnd.api+json
Body (175 字节):
{
  "meta": {
    "key": "495F36-BEB779-2119F3-EA6C02-DC0260-V3",
    "scope": {
      "policy":  "f564ba37-00df-4c0e-8528-82c7b5213abc",
      "product": "685d3797-7a93-47e0-8f6d-069014980a08"
    }
  }
}

7.3 两个技术观察

① license 校验在启动时触发

CloakBox 在每次 VirtualBox.exe 启动时都会自动发一次 keygen.sh POST,即使用户从未输入过任何 license key。body 里的 "495F36-BEB779-2119F3-EA6C02-DC0260-V3" 是硬编码在 VBoxRT.dll 里的 trial/default key。

从技术实现角度看,这是一种 “启动期授权状态刷新” 模式,常见于需要”进入产品主界面前就确定 entitlement 状态”的软件(因为决定哪些 Premium UI 元素 setEnabled(true))。类似机制在 Adobe Creative Cloud、JetBrains IDE、许多商业软件都有。

② 静态推测的 UUID 归属需要修正

静态分析时,我们在反汇编里看到 lea rax, "f564ba37-..." 紧跟着 URL 模板里的 %s,推测 Account UUID = f564ba37-...,Policy UUID = 29755df0-...

Frida 实捕到的真实 POST 显示:

  • • URL 路径里的 %s(Account UUID)填的是 29755df0-...
  • • JSON body 的 scope.policy 填的才是 f564ba37-...

静态推测的顺序反了,原因是反汇编里那两个 UUID 字符串的 lea 指令出现顺序和它们在运行时请求里出现位置不对称。

这是静态分析的典型盲点之一。纯静态只能降低可能性空间,确切的运行时字段绑定需要动态验证

7.4 其他 Q-D 问题的答案

Q-D2 license.vbox-antidetect 文件位置在哪里?动态分析环境扫了所有候选路径(%APPDATA%%LOCALAPPDATA%%USERPROFILE%\.VirtualBox 等),在未激活的 VM 上它不存在。这个文件只在首次成功激活后才落盘。最可能的路径是 %USERPROFILE%\.VirtualBox\license.vbox-antidetect(和 VirtualBox.xml 同目录),需要一次成功激活才能确认。

Q-D3 all_proxy 默认值是什么? 确认为空,Windows 注册表的 HKCU\EnvironmentHKLM\...\Session Manager\Environment 都没有 all_proxy / ALL_PROXY / HTTP_PROXY / HTTPS_PROXY

Q-D4 update.virtualbox.org 是否被禁用? 确认禁用。首次启动写的 VirtualBox.xml 里有:

<Updates enabled="false">
  <Host enabled="false" channel="1" checkFreqSec="86400"
        repoUrl="https://update.virtualbox.org" checkCount="0"/>
</Updates>

双层禁用 + checkCount="0" 确认从未触发过 Oracle 版本查询。URL 字符串仍保留在 UICommon.dll(供用户手动触发),但不自动运行。

Q-D5 离线行为:从 UICommon.dll 的错误字符串看:

"Online license check failed, reason: %1.
 All Antidetect features will be unavailable."

离线时:Antidetect 功能(22 个 Fuck menu action)全部锁定,但基础 VirtualBox 功能仍可用(创建 VM、启动 VM、挂 ISO 全正常)。这是graceful degradation 模式(优雅降级),不是回退到默认 key。

Q-D6 Juice / Throne / A5 / ip-auditor 已在第 6 节分析。

7.5 第三个静态分析误差(AtdtSup.sys )的归因

静态分析初期,对 AtdtSup.sys 的某些保护逻辑(特别是 ObRegisterCallbacks “evil handle” filtering)表述得过于偏向”Vektor 加的 anti-EDR 能力”

深入对比 Oracle VirtualBox 的开源代码(src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp)后发现那段 handle 保护逻辑其实是 Oracle 原版 supdrvNtProtectVerifyProcess 其功能是给 Hyper-V 和 VMMR0 用的原生保护,不是 Vektor 加的

内核层面 Vektor 真正改的只有:

  • • 文件名(VBoxSup.sys → AtdtSup.sys)
  • • 服务名(VBoxDrv → AtdtSup)
  • • PDB 文件名(VBoxSup.pdb → AtdtSup.pdb,但 PDB 路径仍留 C:\Devel\Antidetect5\Personal\...
  • • 嵌入的伪 NVIDIA 字符串
  • • 签名(Vektor + WHQL 代替 Oracle)

导入 API 数量IOCTL 代码kernel hook 模式零变化。

从反编译的结果看来,这只是文件名改了而已,并没有改变内部逻辑。


第三部分:CloakBox 完整功能清单与技术实现详解

前面第二部分是叙事化的分析过程,这一部分是结构化的功能参考。如果你想快速查阅 “CloakBox 具体做了哪些事 / 每件事怎么实现”,可以直接从这里开始读。

本部分按 “4 层架构 × 全部功能模块” 组织,每个功能给出:它是什么(What)→ 它具体做什么(Do)→ 怎么实现的(How)。对于特定用途的功能(如摄像头 / GPS 伪造),只做技术实现描述,不讨论具体使用场景。

10. CloakBox 完整功能矩阵(鸟瞰)

执行阶段划分的 4 层架构:

┌─────────────────────────────────────────────────────────────────────┐
│ L1  Host-side VM 配置层(VM 创建前,在宿主机执行)                    │
│     由 Run-Outside-VM.ps1 + VBoxManage 命令实现                       │
│     作用对象:即将被启动的 .vbox 配置                                  │
├─────────────────────────────────────────────────────────────────────┤
│ L2  Hypervisor 层(VM 运行时,VMM 内部)                              │
│     100% 使用 Oracle 原生机制,Vektor 未加自定义逻辑                   │
├─────────────────────────────────────────────────────────────────────┤
│ L3  Guest OS 硬化层(VM 启动后,在 Guest 内执行)                     │
│     由 Run-Inside-VM.ps1 + DriverUpdaterCD.iso 里的驱动和工具实现     │
├─────────────────────────────────────────────────────────────────────┤
│ L4  Host-side 侵入性操作层(Qt UI "Fuck Menu" 触发)                  │
│     由嵌入 VirtualBox.exe .rdata 的 cmd/PowerShell 模板实现           │
└─────────────────────────────────────────────────────────────────────┘

具体功能分布:

功能模块 实现手段 作用目标
L1 CPU 仿冒 (6 profile) VBoxManage modifyvm --cpuid-set 虚拟机 guest CPUID 指令返回值
L1 SMBIOS / DMI 仿冒 (52 字段) VBoxManage setextradata VBoxInternal/Devices/pcbios/0/Config/Dmi* 虚拟 BIOS 向 guest 汇报的 DMI 表
L1 ACPI OEM ID 改写 setextradata .../acpi/0/Config/AcpiOemId guest 读 ACPI FADT 表
L1 MAC OUI 替换 UI 手动选 + VBoxManage modifyvm --macaddress 虚拟网卡 MAC 前 3 字节
L2 TSC 计数器 Oracle 原生 TSCTiedToExecution + RealTSCOffset RDTSC 指令返回值平滑
L2 CPUID 指令拦截 Oracle VMM 的 CPUID vmexit handler guest 的 CPUID 返回 L1 配置的值
L3 注册表 BIOS 字段刷新 Set-ItemPropertyHKLM\HARDWARE\DESCRIPTION\System\BIOS WMI Win32_BIOS / PowerShell Get-ComputerInfo 的返回
L3 假 GPU 描述注入 HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-...}\0000 设备管理器 / DXGI 的 adapter description
L3 PCI 设备 FriendlyName 清洗 HKLM\SYSTEM\CurrentControlSet\Enum\PCIVEN_80EE 改名 设备管理器显示(不改 Vendor ID 字节
L3 假声卡驱动注册 pnputil /add-driver realtek.inf /install Guest 设备管理器出现 “Realtek HD Audio”
L3 假 GPS 驱动注册 pnputil 注册 bcmgnssd.inf(签名:Vektor LLC) Windows Location Services 有数据可读
L3 虚拟摄像头驱动注册 pnputil 注册 OBSDriver.inf DirectShow 设备枚举出现 “OBS Virtual Camera”
L3 字体库批量安装 拷贝 F1-F5 字体到 C:\Windows\Fonts + 注册 EnumFontFamiliesEx 返回的字体集扩充
L3 DoD STIG GPO 导入 LGPO.exe /g <GPO_Backup> 组策略 tattoo 到注册表
L3 Sysmon 安装与配置 Sysmon64.exe -i <config.xml> 生成 “像企业托管终端”的事件日志
L3 Windows Update 阻断 Wub.exe 关闭 wuauserv 服务 + 改注册表 防止 Windows 更新覆盖反检测配置
L4 HOSTS 文件追加 type akamai.txt >> %windir%\system32\drivers\etc\hosts 715 行域名 null-routing
L4 Windows Firewall 规则 netsh advfirewall firewall add rule ... ~20 条 宿主机出站流量控制
L4 Windows 激活伪造 slmgr.vbs /ckms /ipk <key> /ato 系列 宿主机显示”已激活”
L4 浏览器配置修改 PS 脚本遍历 .lnk 快捷方式 + Firefox user.js + Chrome policies Edge/Chrome/Firefox 的启动参数和策略
L4 安装 OpenVPN 并开机自启 msiexec /i OpenVPN-*.msi /passive + 在 Startup 文件夹放 .lnk 宿主机每次登录自动连 VPN
L4 Chrome 扩展强装 reg add HKLM\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist 下次 Chrome 启动自动装指定扩展
L4 IPv6 过渡协议阻断 netsh advfirewall 封 proto 41/43/44 防止 IPv6 泄漏真实 IPv4
L4 DNS-QUIC 强制降级 netsh 封 UDP 80/443 HTTP/3 降级到 HTTP/2,TLS 流量可见
L4 TCP 指纹改写 netsh int tcp set global ... + 内核驱动辅助 宿主机所有出站 TCP 流量指纹
授权 keygen.sh license 校验 CheckSerial → libcurl + 内嵌 CA → api.keygen.sh Premium 功能 entitlement
授权 HWID 绑定 ssh-keygen -m PEM -t rsa -b 4096 → 公钥发 detect.expert 机器指纹持久化
授权 启动心跳 每次 VirtualBox.exe 启动触发一次 CheckSerial 即使用户未激活也”打卡”

一共 ~30 个独立的技术功能模块。下面逐层展开实现细节

11. L1 Host-side VM 配置层(反硬件指纹)

这一层的核心机制是 Oracle VirtualBox 自带的 VBoxManage modifyvmVBoxManage setextradata 命令。Vektor 没有扩展 VBox 的底层,他们只是把一套”真实硬件 profile 的数据”喂给 Oracle 的现成机制。

这是 CloakBox 在技术实现上最低技术含量也是最有效的部分。对于 90% 的非专业 VM 检测代码(靠读 SMBIOS / CPUID 的),这套机制已经足够。

11.1 CPU 仿冒(6 个 profile)

What:让 guest OS 在执行 cpuid 指令时,看到一个真实桌面 CPU 的返回值,而不是 VirtualBox 默认的半透明状态。

Do

  • • 替换 CPUID leaf 0 的 vendor string(”GenuineIntel” / “AuthenticAMD”)
  • • 替换 leaf 1 的 family/model/stepping + feature bits
  • • 替换 leaf 0x80000002-4 的 CPU brand string(”Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz” 这种)

How:从 Run-Outside-VM.ps1 里摘一段真实代码(这是 Vektor 公开发布的 PowerShell,不涉及反向工程):

# Intel Core i7-6700K profile
VBoxManage modifyvm <VM> --cpuid-set 00000000 00000016 756E6547 6C65746E 49656E69
#                                     Leaf 0     EAX(N)   EBX ("Genu") ECX("ineI")  EDX("ntel")

VBoxManage modifyvm <VM> --cpuid-set 00000001 000506E3 00100800 7FFAFBFF BFEBFBFF
#                                     Leaf 1     EAX(FMS)  EBX        ECX        EDX

VBoxManage modifyvm <VM> --cpuid-set 80000002 65746E49 2952286C 726F4320 4D542865
VBoxManage modifyvm <VM> --cpuid-set 80000003 37692029 3030372D 5043204B 40205055
VBoxManage modifyvm <VM> --cpuid-set 80000004 30302E34 007A4847 00000000 00000000
#    ↑ ASCII 编码的 "Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz"

Oracle VMM 内部把这些配置注入到 VMX/SVM 的 CPUID vmexit handler。每次 guest 执行 cpuid 指令时,hypervisor 拦截并返回配置的值。Vektor 没改 hypervisor 代码,只改了配置。

内置的 6 个 profile:

  • • i7-6700K(LGA1151, Skylake)
  • • i7-7700K(LGA1151, Kaby Lake)
  • • i7-9700K(LGA1151, Coffee Lake)
  • • i9-9900K(LGA1151)
  • • i7-3960X(LGA2011, Sandy Bridge-E)
  • • Ryzen 7 1800X(AM4, Zen 1)

缺陷

  • • 不处理 CPUID leaf 0x40000000(hypervisor vendor string,VirtualBox 默认返回 “VBoxVBoxVBox”),这让稍高级的 VM 检测代码能直接读到 Oracle 字样
  • • 不做 RDTSC 指令时间戳平滑,高灵敏度的时间窗检测仍可识别

11.2 SMBIOS / DMI 仿冒(52 字段)

What:让 guest OS 通过 WMI 或 DMI 查询时看到真实主板、BIOS、机箱、处理器的信息。

Do:覆盖 SMBIOS 的 6 大结构体(Type 0 BIOS / Type 1 System / Type 2 Baseboard / Type 3 Chassis / Type 4 Processor / Type 11 OEM Strings)的全部可查询字段。

How

# MSI PRO B650-P WIFI MS-7D78 profile(AM5 主板)
# BIOS 信息
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor       "American Megatrends Inc."
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVersion      "1.B0"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBIOSReleaseDate  "03/28/2024"

# 主板信息
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBoardVendor       "MSI"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBoardProduct      "PRO B650-P WIFI (MS-7D78)"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBoardVersion      "1.0"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiBoardSerial       "To be filled by O.E.M."

# 系统信息
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor      "Micro-Star International Co., Ltd."
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiSystemProduct     "MS-7D78"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiSystemUuid        "deadbeef-dead-beef-dead-beefdeadbeef"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiSystemSerial      "Default string"

# 机箱信息
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiChassisVendor     "Default string"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiChassisType       "3"  # Desktop

# 处理器信息(与 CPU profile 联动)
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiProcManufacturer  "Intel Corporation"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiProcVersion       "Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiProcSocket        "LGA1151"
VBoxManage setextradata <VM> VBoxInternal/Devices/pcbios/0/Config/DmiProcFamily        "0xCD"

# ACPI OEM 标识(这两个字段 PC OEM 厂商都用 ALASKA/AMI)
VBoxManage setextradata <VM> VBoxInternal/Devices/acpi/0/Config/AcpiOemId              "ALASKA"
VBoxManage setextradata <VM> VBoxInternal/Devices/acpi/0/Config/AcpiCreatorId          "AMI"

# ... 另 35 个字段

Oracle VMM 启动 guest 时,把这些值填进 SMBIOS 表的相应结构体里,guest 用标准 SMBIOS API(GetSystemFirmwareTable)查询时就看到真实硬件配置。

两个预置 profile

  • • MSI PRO B650-P WIFI MS-7D78(AM5 + 7950X3D 方向)
  • • ASUS ROG STRIX B650E-F GAMING WIFI(同 AM5 平台,Asus 口味)

最大技术缺陷DmiSystemUuid 被硬编码为 deadbeef-dead-beef-dead-beefdeadbeef。这意味着所有 CloakBox 用户的这个字段都相同。任何 VM 检测系统只要把这个 UUID 加到黑名单,可以做到一网打尽。

11.3 MAC OUI 替换

What:让 guest 的虚拟网卡 MAC 地址前 3 字节(OUI,Organizationally Unique Identifier)显示为真实网络设备厂商,而不是 VirtualBox 默认的 08:00:27

DoVBoxManage modifyvm <VM> --macaddress1 <随机 MAC>

How:Run-Outside-VM.ps1 的 UI 让用户从 5 个真实 OUI 里选一个,然后随机后 3 字节:

107B44 = ASUSTeK
A8A159 = ASRock
448500 = Intel
D46E0E = TP-LINK
841B5E = Netgear

Guest 侧还有兜底机制:Run-Inside-VM.ps1::Set-NetAdapter -MacAddress 在 Guest OS 内也能改(覆盖注册表 NetworkAddress 键),以防 L1 的 modifyvm 因为某种原因失败。

12. L2 — Hypervisor 层(零修改)

What:Vektor 的 hypervisor 层代码(VMMR0.r0、AtdtDDR0.r0)100% 使用 Oracle 原版源码,除了改名没有任何逻辑修改。

如何证明

  • • 逐一对比 CloakBox 和 Oracle 的内核驱动 IMPORT 表:112 vs 112 API,零新增
  • • 反汇编 supdrvNtProtectVerifyProcess(AtdtSup 里的一个 “evil handle filter” 函数) 对应 Oracle src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp,代码完全一致。
  • • PDB 路径泄露 C:\Devel\Antidetect5\Personal\VirtualBox\src\VBox\HostDrivers\Support\win\SUPDrv-win.cpp,Vektor 的源码目录结构和 Oracle 上游逐字符一致

这意味着 CloakBox 的 hypervisor 安全边界完全等同于 Oracle VirtualBox 7.2.4。没有新增攻击面,也没有新增防御能力。

13. L3 — Guest OS 硬化层(虚拟机内伪装)

当 VM 开机、Guest Windows 启动后,Run-Inside-VM.ps1 脚本(由用户在 VM 内手动运行)会执行一系列 Guest 侧的伪装。

13.1 注册表 BIOS 字段刷新

Why needed:即使 L1 的 SMBIOS 伪造做得完美,Guest Windows 在安装阶段会把 BIOS 字段缓存到注册表。如果用户是从一个”原本是 VirtualBox”的 Guest 改造过来的,这些缓存仍会暴露 VirtualBox 痕迹。

Do

# 改 BIOS 描述缓存
Set-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS" -Name "BIOSVendor"                 -Value "American Megatrends Inc."
Set-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS" -Name "BIOSVersion"                -Value "1.B0"
Set-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS" -Name "SystemManufacturer"         -Value "Micro-Star International Co., Ltd."
Set-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS" -Name "SystemProductName"          -Value "MS-7D78"
Set-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS" -Name "BaseBoardManufacturer"      -Value "MSI"
Set-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS" -Name "BaseBoardProduct"           -Value "PRO B650-P WIFI (MS-7D78)"

# 改系统信息
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SystemInformation" -Name "BIOSVendor"              -Value "AMI"
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SystemInformation" -Name "SystemManufacturer"      -Value "Micro-Star International Co., Ltd."
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SystemInformation" -Name "SystemProductName"       -Value "MS-7D78"

13.2 假 GPU 设备描述

What:让 Guest Windows 的设备管理器、DXGI 查询、WMI Win32_VideoController 显示一个真实 GPU(NVIDIA RTX 4090 / 3080 / GTX 1660 Super 三选一)。

Do:扫注册表里所有 display class 驱动,覆盖其描述字符串:

# 假装 RTX 4090
$gpuProfile = @{
    DriverDesc                          = "NVIDIA GeForce RTX 4090"
    ProviderName                        = "NVIDIA"
    "HardwareInformation.AdapterString" = "NVIDIA GeForce RTX 4090"
    "HardwareInformation.ChipType"      = "NVIDIA GeForce RTX 4090"
    Manufacturer                        = "NVIDIA"
}
$classKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000"
foreach ($k in $gpuProfile.Keys) { Set-ItemProperty -Path $classKey -Name $k -Value $gpuProfile[$k] }

# 扫所有 PCI 显卡子项把名字也改掉
Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Enum\PCI" -Recurse -ErrorAction SilentlyContinue | ForEach-Object {
    if ($_.PSChildName -match "VEN_80EE") {   # VirtualBox vendor ID
        Set-ItemProperty $_.PSPath -Name "DeviceDesc" -Value "NVIDIA GeForce RTX 4090" -ErrorAction SilentlyContinue
        Set-ItemProperty $_.PSPath -Name "FriendlyName" -Value "NVIDIA GeForce RTX 4090" -ErrorAction SilentlyContinue
    }
}

重要提示:这只改注册表里的显示字段。真正的 DXGI_ADAPTER_DESC 返回值要靠 L3.7 的 Juice Labs 图形 shim 才能完整伪造。

13.3 PCI 设备 FriendlyName 清洗

HKLM\SYSTEM\CurrentControlSet\Enum\PCI 下所有以已知 VM vendor 开头的子键(VEN_80EE = VBox, VEN_15AD = VMware, VEN_1234 = QEMU),把 FriendlyName 全部改成 “Standard PCI Device”。

技术缺陷:这只改 Windows 注册表层的显示名,检测工具只要直接读 PCI config space(通过 SetupAPI 或 DeviceIoControl 下发 IOCTL_BUS_QUERY_DEVICE_ID)就能读到真实的 VEN_80EE 字节,CloakBox 完全没覆盖这一层

13.4 外设驱动批量安装

通过 pnputil 把 DriverUpdaterCD.iso 里的几个驱动装进 Guest:

假 Realtek 声卡

pnputil /add-driver "V:\etc\Realtek\realtek.inf" /install
# 签名:Vektor T13 Technologies B.V.
# 作用:Guest 设备管理器出现 "Realtek High Definition Audio"
# 检测方意义:规避"VM 通常没有真实声卡"的启发式判断

假 GPS Broadcom GNSS

pnputil /add-driver "V:\etc\FakeGPS\bcmgnssd\bcmgnssd.inf" /install
# 签名:VEKTOR T13 TECHNOLOGIES LLC (Kharkiv, UA)
# 作用:注册一个 NDIS miniport 或 WDF driver,实现 Broadcom GNSS 芯片的接口
# 技术实现:Windows Location Services 通过标准 GPS 接口查询当前坐标,driver 返回可配置值
# 检测方意义:让任何使用 Windows Location API 的软件看到"有 GPS 硬件"

虚拟摄像头 OBSDriver

pnputil /add-driver "V:\etc\OBSDriver\OBSDriver.inf" /install
# 签名:Vektor T13 Technologies B.V.
# 内部实质:基于开源 OBS Virtual Camera 的二次封装
# 工作原理:
#   1. 注册 DirectShow filter
#   2. 实现 IPin / IMediaSource 接口
#   3. 从指定文件(AVI / MP4 / 图像序列)读取帧
#   4. 作为普通 webcam 暴露给 DirectShow 客户端
# 任何通过 DirectShow / Media Foundation 枚举摄像头的软件都会看到它
# 常见的用法场景:远程会议、视频录制软件、监控软件的视频输入替代

13.5 字体库扩充

What:给 Guest 装 30+ 真实办公环境常见字体(Helvetica / Arial / SegoeUI / Tahoma / msjh / meiryo / SIMSUN / NotoSans / DejaVuSans 等)。

Why:浏览器可以通过 CSS + JavaScript 枚举系统字体集(document.fonts.check() / CSS 盲测 + Canvas 测量宽度)。一个裸 VM 只有 Windows 默认字体,字体集指纹非常独特。装了标准办公字体集后,虚拟机检测软件看了字体指纹就会觉得是正常的 Windows 用户。

Do:拷贝 .ttf / .otf 文件到 C:\Windows\Fonts,然后注册:

Get-ChildItem "V:\etc\Fonts\F1\*.ttf" | ForEach-Object {
    Copy-Item $_.FullName "C:\Windows\Fonts\"
    $fontName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name)
    Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" `
                     -Name "$fontName (TrueType)" -Value $_.Name
}

13.6 DoD STIG 组策略应用

What:应用美国国防部 (DISA) 公开发布的 57 条安全配置基线 GPO,覆盖 Office 2013/2016/2019、Adobe Acrobat、IE11、Chromium Edge、Chrome、Firefox、OneDrive、Windows Defender、Windows Firewall 等。

Do:用 Microsoft 官方工具 LGPO.exe

& "V:\etc\WinHard\Files\LGPO\LGPO.exe" /g "V:\etc\WinHard\Files\GPOs\DoD\"

Why:让 Guest Windows 呈现出”企业托管终端”的技术特征。各种软件的配置被组策略锁定、Office 默认拒绝宏、IE 设为 11、Chrome 的 MachinePolicy 注册表里有大量键值,检测方的启发式判断”这台机器看起来像私人家用机”会被扰动。

注意:DoD STIG GPO 本身是微软和 DISA 合作公开发布的政策模板,任何企业都可以合法使用。这里涉及的不是非法 GPO,而是把企业合规模板用于”伪装企业环境”

13.7 GPU 图形栈全栈替换(Juice Labs Juicify)

What:拦截 Guest 内所有 D3D11/D3D12/DXGI/OpenGL/Vulkan 的图形 API 调用,返回可配置的 GPU 元数据。

实现:5 个 shim DLL,以 DLL hijacking / SetDllDirectory 方式加载到需要伪装的进程里:

Shim DLL 拦截的 API 表面
Juiced3d11.dll Direct3D 11: D3D11CreateDeviceIDXGIAdapter::GetDescIDXGIDevice::GetAdapter
Juiced3d12.dll Direct3D 12: D3D12CreateDeviceIDXGIFactory::EnumAdapters
Juicedxgi.dll DXGI: 设备枚举、显示输出枚举、GetDesc3GetLuid
Juiceopengl32.dll OpenGL: glGetString(GL_RENDERER/GL_VENDOR/GL_VERSION)
Juicevulkan-1.dll Vulkan: vkEnumeratePhysicalDevicesvkGetPhysicalDeviceProperties
juicenvml.dll NVIDIA NVML: nvmlDeviceGetNamenvmlDeviceGetDriverVersion(让看起来”装了 NVIDIA 驱动”)

How

  1. 1. 拦截方式:shim DLL 导出与原始 DLL 同名同签名的函数
  2. 2. 加载方式:通过 DLL 搜索顺序(把 shim 放在进程目录,优先于 %SystemRoot%)或通过 AppInit_DLLs 注册表值
  3. 3. 内部实现:多数函数透传到真实 DLL,但把 GPU 型号 / 驱动版本 / adapter description 字段替换成配置值

覆盖的检测路径

  • • WebGL navigator.gpu.renderer / WEBGL_debug_renderer_info
  • • Chrome/Edge 的 chrome://gpu 报告
  • • D3D11 应用的 adapter 查询
  • • NVIDIA GeForce Experience / 驱动控制面板的查询

这是 CloakBox 技术实现上最高阶的一环,靠商业第三方产品(Juice Labs 原本做云游戏 / 远程 GPU 的)提供的图形栈代理能力。

14. L4 — Host-side 侵入性操作层(Qt “Fuck Menu” 22 action 详解)

这一层是 CloakBox 用户主动点击菜单时才执行的宿主机修改。22 个 action 逐一展开:

14.1 _AntiOSAkamaiPumper — HOSTS 文件批量污染

Do:把 ISO 里的 akamai.txt(715 行)追加到 Windows HOSTS。

How

type %MY_VBOX_ADDITIONS%\etc\akamai.txt >> %windir%\system32\drivers\etc\hosts

akamai.txt 的内容是 0.0.0.0 <domain> 格式,覆盖:

  • • Akamai CDN 多个子域(*.akamaized.net*.akamai.net
  • • 广告/分析服务器(smartadserver.comdoubleclick.netappsflyer.comtiktokv.com
  • • 多个”反欺诈检测 API”(fingerprint.compixelscan.netprivacy.netbrowserscan.netseon.iosift.com
  • • 部分社交媒体域名(facebook.comtwitter.comspotify.com

作用机制:把这些域名解析到 0.0.0.0(或 127.0.0.1)→ 浏览器请求失败 → 网页里的 bot detection / fingerprinting 脚本加载失败 → 检测逻辑超时或走白名单路径。

副作用:这是宿主机全局的改动——影响所有浏览器、所有应用。

14.2 _AntiOSActivateWindows — Windows 激活状态操纵

Do:运行一系列 slmgr 命令,把宿主 Windows 的许可状态改成”已激活”。

How

slmgr /ckms              :: 清除 KMS 服务器信息
slmgr /upk               :: 卸载当前 product key
slmgr /ipk <VLK>         :: 装入一个 Volume License Key
slmgr /ato               :: 触发激活

作用:让 winver / systeminfo / WMI 查询 Win32_ComputerSystem.OEMStringArray 返回”已激活”状态——规避”未激活 Windows 可能是 VM”的启发式。

14.3 _AntiOSBrowserHardened 浏览器配置修改

Do:多个子动作

  1. 1. 遍历所有可能路径的 Microsoft Edge .lnk 快捷方式,在 Target 的 Arguments 里追加: --test-type --enable-unsafe-webgpu --use-webgpu-adapter=d3d11作用:让 Edge 启动时进入”开发者测试模式”,绕过部分安全检查,允许 WebGPU 使用 D3D11 后端。
  2. 2. 从 https://dl.google.com/chrome/install/latest/chrome_installer.exe 下载 Chrome 安装器到 %TEMP%,静默安装。
  3. 3. 把 ISO 里的 Firefox user.js 覆盖到所有 Firefox profile: V:\etc\WinHard\Files\FireFox Configuration Files\defaults\pref\*.jsuser.js 里配置禁用 WebRTC、禁用 WebGL 指纹采样、禁用多种隐私泄漏点。
  4. 4. 通过 reg add HKLM\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist 强制安装指定 Chrome 扩展。

14.4 _AntiOSStrictFirewallOn / Off 约 20 条防火墙规则

On 操作

:: 阻止特定 VBox 进程发 UDP / ICMP
netsh advfirewall firewall add rule name="Antidetect_BlockUDP_VirtualBoxVM" ^
    program="C:\Program Files\Vektor T13\VirtualBox\VirtualBoxVM.exe" ^
    protocol=udp dir=out action=block
netsh advfirewall firewall add rule name="Antidetect_BlockUDP_VBoxSVC" ... (同上模式)
netsh advfirewall firewall add rule name="Antidetect_BlockUDP_VBoxNetNAT" ... (同上模式)

:: 封 IPv6 过渡协议(6to4 / Teredo / ISATAP)—— 防止 IPv6 隧道泄漏真实 IPv4
netsh advfirewall firewall add rule name="IPv6_proto_41_out" protocol=41 dir=out action=block
netsh advfirewall firewall add rule name="IPv6_proto_43_out" protocol=43 dir=out action=block
netsh advfirewall firewall add rule name="IPv6_proto_44_out" protocol=44 dir=out action=block
netsh advfirewall firewall add rule name="IPv6_proto_58_out" protocol=58 dir=out action=block

:: 封 DNS-over-QUIC(强制 HTTP/3 降级为 HTTP/2 走 TCP)
netsh advfirewall firewall add rule name="DNS_QUIC_UDP_80"  protocol=udp remoteport=80  dir=out action=block
netsh advfirewall firewall add rule name="DNS_QUIC_UDP_443" protocol=udp remoteport=443 dir=out action=block

Off 操作:逆向移除上面所有规则。

作用机制

  • • VBox 进程禁 UDP + ICMP:防止 VirtualBox 的内部 NAT 堆栈因 ICMP 时间戳差异被识别
  • • 封 IPv6 proto:防止 Teredo / 6to4 这些 IPv6-over-IPv4 隧道暴露真实公网 IPv4
  • • 封 QUIC:强制 HTTP/3 降级到 TCP TLS,让 VPN / 代理 / SSL 拦截代理能看到 TLS 流量(HTTP/3 用 UDP,很多代理不支持)

14.5 _AntiOSTCPFingerprint1 / 2 TCP 协议栈指纹改写

Do:修改宿主机 TCP/IP 协议栈的出站 SYN 包参数——MSS(Maximum Segment Size)、Window Scale factor、SACK 选项顺序、Timestamp 选项等。

How:主要通过 netsh int tcp set global + 注册表配置:

netsh int tcp set global rss=disabled
netsh int tcp set global autotuninglevel=normal
netsh int tcp set global ecncapability=disabled
netsh int tcp set global timestamps=disabled
netsh int tcp set supplemental template=Internet congestionprovider=cubic
:: ... 以及一组注册表配置改 TCP 选项顺序

作用机制:p0f / JA3 / JA4 这些被动 TCP 指纹工具依赖 SYN 包里的参数组合判断 OS 类型。TCP M1D profile 和 M1D1 profile 是两套预置的参数组合。让 VM 对外的 TCP 指纹看起来像特定的 Windows 10/11 桌面机,而不是 VBox 默认的 VirtualBox NAT 栈。

重要副作用:这是宿主机全局的改动,会影响所有出站 TCP 流量,而不只是 VM 流量。

14.6 _AntiOSVPNHopTunerMinus1 ~ Minus10 / MinusD

Do:修改出站 IP 包的 TTL(Time To Live)字段减 1 到减 10,或动态模式。

How:通过 netsh int ipv4 set global defaultcurhoplimit=<N> 或通过 WFP 驱动动态调整。

作用机制:通过 VPN 的流量 TTL 经过的”跳数”比物理机直连少,如果用户的 VPN 加 CloakBox 组合的 TTL 呈现”绕了一大圈”的特征就会被识别。调整 TTL 让流量看起来像直连(减少跳数数字)。

14.7 _GeolocationSettings 独立的地理位置设置窗口

这是一个独立的 Qt QDialogGeolocationSettingsWindow 类),不是一个 cmd 模板。用户在这里配置:

  • • 假 GPS 坐标(联动 FakeGPS daemon)
  • • 浏览器 navigator.geolocation 的返回值
  • • Windows Location Services 返回的纬度 / 经度

14.8 _AntiOSIPv6Allow / Block

只做 IPv6 协议启用 / 禁用的开关——修改 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\DisabledComponents

14.9 其他若干 action

其余几个 action(Change Windows install date / Install Realtek driver spoof / Block NetBIOS / Disable System Restore / Tweak DNS UDP size / OpenVPN 持久化 / Random Chrome Extension install / Toast notification / Initial WinHard bootstrap / Deny Device install 等)在 ISO 的 action_cmd_templates 里。每一条都是一段注册表写入或 cmd 调用,逻辑清晰、实现简单。

其中一个值得单独说明的:

OpenVPN 启动项持久化(FREE 版也可用):

start /wait msiexec.exe /i "%MY_VBOX_ADDITIONS%\Tools\OpenVPN-*-amd64.msi" /passive
mkdir "%userprofile%\OpenVPN\config"
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut(
   '%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\openvpn.lnk');
   $s.TargetPath='%1\openvpn-gui.exe';
   $s.Arguments='--connect 0001.ovpn';
   $s.WorkingDirectory='%1';
   $s.Save()"

作用:装完 OpenVPN 后,在 Startup 文件夹创建快捷方式——每次 Windows 登录都自动连 0001.ovpn 配置的 VPN,即使用户没开 CloakBox。这个快捷方式需要用户手动删除才会取消。

15. 授权与激活机制(完整协议详解)

15.1 keygen.sh JSON:API 协议

What:CloakBox 用 JSON:API 规范(application/vnd.api+json Content-Type 的公开规范,类似 REST 但结构化程度更高)与 keygen.sh 交互。

请求

POST /v1/accounts/29755df0-2dab-4f4e-8ecb-6ff176fc1238/licenses/actions/validate-key HTTP/1.1
Host: api.keygen.sh
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
  "meta": {
    "key": "<用户的 license key 或硬编码 trial key>",
    "scope": {
      "policy":  "f564ba37-00df-4c0e-8528-82c7b5213abc",   ← FREE Education Policy
      "product": "685d3797-7a93-47e0-8f6d-069014980a08"    ← CloakBox Product
    }
  }
}

响应(来自 keygen.sh 官方文档的标准结构):

{
  "meta": {
    "valid":    true,
    "constant": "VALID",         // or NOT_FOUND / EXPIRED / SUSPENDED / NO_MACHINE / ...
    "detail":   "is valid"
  },
  "data": {
    "id":   "<license UUID>",
    "type": "licenses",
    "attributes": {
      "name":    "<license holder name>",
      "expiry":  "2026-12-31T23:59:59.999Z",
      "status":  "ACTIVE",
      "uses":    42,
      "maxUses": 100,
      "entitlements": ["BASIC", "PREMIUM_ANTIOS", ...]
    }
  }
}

15.2 HWID 生成(机器指纹)

首次启动时:

ssh-keygen.exe -m PEM -t rsa -b 4096 -N "" -f %USERPROFILE%\.ssh\id_rsa

生成 RSA-4096 密钥对:

  • • 私钥:%USERPROFILE%\.ssh\id_rsa(PEM 格式)
  • • 公钥:%USERPROFILE%\.ssh\id_rsa.pub

公钥随后上传到 detect.expert(Vektor 的 HWID 服务器),在 keygen.sh 后台绑定到 license。

工程规范性问题

  • %USERPROFILE%\.ssh\ 是**用户标准 SSH 目录**。如果用户已有 Git SSH 登录配置或者保存了 SSH Key,CloakBox 可能**覆盖**用户原有的 id_rsa
  • • 商业软件的 HWID 密钥应该存储在应用自己的目录(如 %LOCALAPPDATA%\CloakBox\

15.3 启动心跳机制

每次 VirtualBox.exe 启动:

  1. 1. 主窗口构造前调用 UICommon::VBoxLicenseViewer::check()
  2. 2. 触发 VBoxRT.dll!CheckSerial
  3. 3. 发 POST 请求到 keygen.sh
  4. 4. 解析响应里的 meta.validdata.attributes.entitlements
  5. 5. 根据 entitlements,调 Qt 的 setEnabled(true/false) 决定哪些 Fuck Menu action 可点

关键行为:即使用户未输入 license key,CloakBox 也会用硬编码的 trial key 495F36-BEB779-2119F3-EA6C02-DC0260-V3 发请求,保证 keygen.sh 后台能看到这次启动。

这当于 Adobe Creative Cloud 的未登录打开、JetBrains IDE 的 evaluation 模式,这些软件也有类似的”匿名启动状态刷新”机制。这是 DRM 的标准做法,不是恶意行为,但是 EULA 可能没显式披露。

15.4 离线行为

keygen.sh 无法连接时:

UICommon.dll 错误字符串:
"Online license check failed, reason: %1.
 All Antidetect features will be unavailable."

行为:

  • • 红字错误对话框
  • • 22 个 Fuck Menu action 全部 setEnabled(false)
  • • 基础 VirtualBox 功能(创建 / 启动 / 管理 VM)仍然可用

这是 graceful degradation 模式,不回退到默认 key、不试图激活、不阻止启动。

16. 内核驱动(AtdtSup.sys)详解

16.1 驱动本身

  • 文件名AtdtSup.sys(原名 VBoxSup.sys,来自 Oracle)
  • 签名:Vektor T13 Technologies B.V.(EV 代码签名)+ 曾经有效的 Microsoft WHQL 签名(2024-10-10 → 2025-10-08,已过期
  • 服务名AtdtSup,显示名 “ATDT Core Service”
  • 启动类型Service_Start = SERVICE_SYSTEM_START(Windows 引导阶段加载,早于用户登录)
  • 设备对象\Device\VBoxDrvVektor 没改这个。Oracle 源码硬编码,换名代价过高

16.2 WHQL 签名路径

WHQL(Windows Hardware Quality Labs)是 Microsoft 的硬件兼容性认证项目。一个驱动要获得 WHQL 签名需要满足下面的条件。

  1. 1. 开发方申请 Microsoft Hardware Developer 账号(需公司注册、需身份验证)
  2. 2. 用自己的 EV 代码签名证书给驱动签名
  3. 3. 提交到 Microsoft Partner Center 的 HLK(Hardware Lab Kit)测试流程
  4. 4. 通过测试后,Microsoft 用自己的 CA(Microsoft Windows Hardware Compatibility Publisher)追加一个签名

对 CloakBox 的意义:WHQL 签名让 AtdtSup.sys 能在开启 Secure Boot 的 Windows 11 上加载。普通 EV 代码签名在严格的 Secure Boot 策略下不够,WHQL 是另一道保障。

当前状态:WHQL 证书已于 2025-10-08 过期。CloakBox 在新装的 Windows 11 Secure Boot 严格模式下可能无法加载内核驱动,除非 Vektor 提交新一轮 WHQL。

16.3 驱动行为(等同 Oracle SUPDrv)

由于驱动代码逐字节等同 Oracle 的 SUPDrv,它的行为就是 Oracle VirtualBox 内核支持层的全部功能:

  • • 管理 VM 实例(创建 / 销毁 hypervisor context)
  • • 提供 ring-0 / ring-3 的 IPC
  • • 处理 VMX / SVM 的开关
  • ObRegisterCallbacks 保护进程 handle(防止恶意软件干扰 VBoxVMM 进程——这是防御功能
  • • 内存页管理(给 guest 分配物理页)

没有加的:键盘记录、屏幕截取、网络 sniff、文件扫描、注册表持久化(除了标准服务注册)、rootkit 行为。

17. 完整的安装后系统改动清单

装完 CloakBox 之后,宿主机的持久化改动:

新增文件

  • C:\Program Files\Vektor T13\VirtualBox\ 全套(大约 50 个 PE 文件)
  • C:\Windows\System32\drivers\AtdtSup.sys
  • %USERPROFILE%\.VirtualBox\VirtualBox.xml(VBox 全局配置)
  • • (激活后)%USERPROFILE%\.VirtualBox\license.vbox-antidetect
  • %USERPROFILE%\.ssh\id_rsa + id_rsa.pub(如果 .ssh 目录原本不存在,会创建)

新增服务

  • AtdtSup(内核驱动,System-start)
  • VBoxSDS(COM 服务,Oracle 原版继承)

新增注册表

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{562E2E1E-5C55-4502-B230-738EE218D753}(MSI 卸载条目)
  • HKLM\SYSTEM\CurrentControlSet\Services\AtdtSup
  • HKLM\SYSTEM\CurrentControlSet\Services\VBoxSDS

未做的持久化(明确排除):

  • • 没有 Startup 文件夹或 Run 键的开机自启(CloakBox 本身不自启——除非用户点了某些 Fuck Menu action 装了 OpenVPN)
  • • 没有 WMI 事件订阅
  • • 没有计划任务
  • • 没有 BHO / Windows Shell 扩展
  • • 没有 DLL hijacking AppInit_DLLs

18. 对于使用者而言安装了会怎么样?

以上技术细节可以归纳为一个更直观的 “用户视角清单”

装 CloakBox 之后,默认只做这些事(不点任何 Fuck Menu):

  • • 每次启动 VirtualBox.exe → 向 api.keygen.sh 发一次 HTTPS POST(~200 ms)
  • • 生成一个 RSA-4096 HWID 密钥放 ~/.ssh/id_rsa(可能覆盖你的 Git SSH 密钥)
  • • 装一个 System-start 内核驱动(持续在内存里)

如果你点了 Fuck Menu 里的 action后,每一个 action 都是永久的宿主机改动。没有自动撤销,典型后果是:

  • • 点 Akamai Pumper → Windows HOSTS 永久追加 715 行,所有浏览器的网页加载会受影响,不限于 VM
  • • 点 Strict Firewall On → Windows Firewall 永久加 ~20 条规则,宿主机所有出站 UDP 被限制
  • • 点 Activate Windows → 宿主机的 Windows product key 被换,可能触发微软的 license compliance 检查
  • • 点 Browser Hardened → Edge 桌面快捷方式的启动参数被永久改 + Firefox prefs 被覆盖 + 可能下载并安装 Chrome
  • • 点 OpenVPN 持久化 → 以后每次 Windows 登录都自动连 VPN,在你发现之前可能持续几周
  • • 点 TCP Fingerprint → 宿主机所有出站 TCP 连接的指纹被改,包括你的日常浏览、视频会议、游戏

第四部分:技术指纹总结与行业分类

五维技术评估矩阵

业界对这类软件的技术分类通常采用 5 个维度:

维度 评估 严重度 证据
D1 外部网络外联 存在(商业 DRM 心跳) api.keygen.sh 每次启动发 POST;detect.expert 辅助端点;Oracle update.virtualbox.org 默认禁用
D2 用户数据采集 无键盘 / 屏幕截取;无浏览器 / 钱包扫描;ssh-keygen 生成的 HWID RSA-4096 密钥存在 %USERPROFILE%\.ssh\(属工程规范性问题)
D3 持久化系统组件 部分 AtdtSup.sys 内核驱动 System-start 启动;Vektor 自签根证书可选注入 Guest 信任库
D4 核心系统组件修改 无 SSDT / IDT / PatchGuard 触摸;内核驱动内部逻辑 = Oracle SUPDrv 未改
D5 反主机级监控能力 部分 内嵌 Mozilla CA bundle 走自己的 TLS 信任链;集成 Sysmon overlay;集成 Wub Windows Update 阻断器

技术分类(行业标准术语)

CloakBox 的技术组合匹配以下行业分类

  • Anti-Detection Virtualization(反识别虚拟化)— 产品品类定位
  • Commercial DRM-enabled software(带商业授权 DRM 的软件)— 授权模式
  • Virtualization stack fork(虚拟化栈分叉)— 源码工程类型
  • Bundled toolkit distribution(捆绑工具集分发)— 发行形态

CloakBox 的反检测覆盖度自评

基于 “理想 anti-detect 产品” 为 100% 的量表:

反检测层级 覆盖度 技术实现质量
CPU / 硬件指令层 ⬛⬛⬜⬜⬜ 用 Oracle 原生 --cpuid-set 做 6 个 profile,无 hypervisor leaf、无 TSC 平滑
SMBIOS / DMI ⬛⬛⬛⬛⬜ 52 字段覆盖,2 个主板 profile;缺陷:所有用户共享同一个 DmiSystemUuid
ACPI ⬛⬛⬜⬜⬜ 只改 AcpiOemId + AcpiCreatorId 两字段
PCI Vendor/Device ID ⬜⬜⬜⬜⬜ 完全未改,VBox 虚拟设备的 0x80EE Vendor ID 仍暴露
内核驱动 / 设备对象 ⬛⬛⬜⬜⬜ 文件名改了,但 \Device\VBoxDrv 硬编码未改
进程 / 文件 ⬛⬛⬛⬜⬜ VBoxNetLwf.sys / VBoxNetAdp6.sys 未改名
注册表 ⬛⬛⬛⬜⬜ Guest 侧刷设备描述字段;不删服务键
MAC / 网络 ⬛⬛⬛⬛⬜ 5 个真实厂商 OUI 人工选
TCP 指纹 ⬛⬛⬛⬜⬜ 2 个 profile
GPU / WebGL / Canvas ⬛⬛⬛⬛⬛ — Juice Labs 商业产品,5 个 shim DLL 覆盖 D3D11/12/DXGI/OpenGL/Vulkan/NVML
摄像头 ⬛⬛⬛⬛⬜ OBS 虚拟摄像头驱动持久化
GPS ⬛⬛⬛⬛⬜ FakeGPS 伪装 Broadcom GNSS daemon
字体指纹 ⬛⬛⬛⬜⬜ 静态 F1-F5 字体集
企业终端合规姿态 ⬛⬛⬛⬛⬛ — 57 条 DoD STIG GPO

总体覆盖度:⬛⬛⬛⬜⬜ — 中上。实现层总体偏 low-tech(大量依赖 Oracle 原生机制 + setextradata),但覆盖面较完整。

技术层面的识别特征(留给同行参考)

对一款 Windows 终端,以下技术指纹组合可用于识别 CloakBox 存在:

文件系统层

  • C:\Program Files\Vektor T13\VirtualBox\ 目录存在
  • C:\Windows\System32\drivers\AtdtSup.sys 存在
  • %USERPROFILE%\.VirtualBox\license.vbox-antidetect 存在(激活后)
  • DriverUpdaterCD.iso 文件存在于安装目录
  • • MSI Product Code {562E2E1E-5C55-4502-B230-738EE218D753} 已注册

签名特征

  • • Thumbprint 6FE993BC8729F84CF60684BB1D8BD1CC3CB2D004(Vektor BV)
  • • 签发 CA:GoGetSSL G4 CS RSA4096 SHA256 2022 CA-1
  • • AtdtSup.sys 的 WHQL 签名(Microsoft Windows Hardware Compatibility Publisher,2024-10-10 → 2025-10-08,已过期)

进程 / 服务

  • • 服务 AtdtSup(DisplayName “ATDT Core Service”)
  • • 进程 VirtualBoxVM.exe 加载了来自 C:\Program Files\Vektor T13\VBoxRT.dll

网络行为

  • • TLS SNI = api.keygen.sh + 源进程 VirtualBox.exe / VirtualBoxVM.exe / VBoxHeadless.exe 组合
  • • DNS 查询 detect.expert(HWID 辅助端点)
  • • 注意:单独的 api.keygen.sh 是合法 SaaS,不构成识别信号——必须结合源进程才有辨识度

Guest VM 层(如果 Guest 已装了 CloakBox 的 DriverUpdaterCD.iso)

  • • 注册表 HKLM\SYSTEM\CurrentControlSet\Services\OBSDriver
  • • 注册表 HKLM\SYSTEM\CurrentControlSet\Services\bcmgnssd
  • • 进程 bcmgnssd.exe
  • • 虚拟摄像头设备 “OBS Virtual Camera” 与真实摄像头硬件并存

VM 本身被识别为 CloakBox 的技术特征

  • • CPU vendor / brand string 与 motherboard profile 不一致(比如 Intel CPU brand 但 AMD 相关 CPUID feature bits 异常)
  • DmiSystemUuid = deadbeef-dead-beef-dead-beefdeadbeef(CloakBox 硬编码默认值,用户间共享)
  • • Guest 看不到 “VBoxGuestAdditions” 但能看到 CloakBox 捆绑的非标组件(OBSDriver / FakeGPS 等)
  • • CPUID leaf 0x40000000 可能返回 Oracle 的 hypervisor 字符串(CloakBox 未处理此 leaf)

YARA 规则示例

rule CloakBox_ANTIDETECT5_Installation {
    meta:
        description = "Detection for CloakBox ANTIDETECT 5 FREE Education - public binary fingerprints"
        author      = "public technical analysis"
        reference   = "https://example.com/cloakbox-analysis"
        severity    = "informational"
    strings:
        $ss1 = "api.keygen.sh" ascii
        $ss2 = "685d3797-7a93-47e0-8f6d-069014980a08" ascii
        $ss3 = "29755df0-2dab-4f4e-8ecb-6ff176fc1238" ascii
        $ss4 = "f564ba37-00df-4c0e-8528-82c7b5213abc" ascii
        $ss5 = "license.vbox-antidetect" ascii
        $ss6 = "Vektor T13" ascii
        $ss7 = "Antidetect5" ascii
        $ss8 = "AtdtSup" ascii
        $ss9 = "application/vnd.api+json" ascii
    condition:
        3 of them
}

关键声明:此 YARA 规则基于公开二进制的字符串特征,用于识别 CloakBox 存在,不用于任何其他目的。


第五部分:研究方法论

工具链

全部使用合法、开源的分析工具:

  • pefile (Python) — PE 结构解析
  • capstone (Python) — x86_64 反汇编
  • rizin — 二进制分析框架
  • • 自写的 Python 脚本(IAT caller scan 等) — 利用 pefile + struct.unpack 做反向 IAT 扫描
  • • Sysinternals Autoruns / Sysmon / Procmon — 系统行为监控
  • Wireshark / Windows 原生 pktmon — 网络抓包
  • Frida — 动态二进制插桩
  • 7-Zip / lessmsi — 压缩包与 MSI 提取

分析时间线

  1. 1. Phase 1 表面审计:签名验证、字符串提取、初步技术分类(~4 小时)
  2. 2. Phase 2 六问深度:Q1-Q6 + 完整子报告集(~12 小时)
  3. 3. Phase 2.1 .rsrc 深挖:假设证伪(PNG + CA bundle)(~1.5 小时)
  4. 4. Phase 2.2 CA bundle 使用路径:发现 keygen.sh 调用链(~2 小时)
  5. 5. Phase 2.3 UICommon + ISO 目录 + 技术识别规则 + 交接 SOP(~2 小时)
  6. 6. Phase 3 动态验证(隔离 VM 内执行)+ 整合勘误(~6 小时)

第六部分:法律与研究声明

关于本文

  • • 本文基于合法获取的 CloakBox 公开发行版所做的静态逆向工程 + 隔离虚拟机动态验证分析
  • • 目的是安全研究、技术文档化、行业知识分享
  • • 所引用的 UUID、域名、证书指纹全部来源于公开二进制的字符串表,且已被 VirusTotal、社区论坛、Vektor 自家网站等公开来源记录

关于 CloakBox

  • • Vektor T13 Technologies B.V. 是荷兰商会真实注册的合法商业实体
  • • 其代码签名证书是商业 CA(GoGetSSL)合法签发的 EV 证书
  • • 其授权服务器(keygen.sh)是美国合法 SaaS(被 Cursor、Figma、BoltAI 等大量正规软件使用)
  • • 其 Patreon 页面、YouTube 频道、Telegram 群是公开运营

CloakBox 是一款技术实现扎实的商业反检测虚拟化产品。本文对它的描述严格限于二进制可观察的事实,不涉及对产品用途、市场定位、商业模式的价值判断。读者对产品的使用决策由读者根据自身法律环境自行做出,与本文作者无关。

利益声明

本文作者与 Vektor T13、Juice Labs、Keygen.sh、任何虚拟化产品厂商、任何竞品均无任何商业、雇佣、或顾问关系。本文不接受任何形式的赞助。


尾声

CloakBox 在技术层面是一份完整度较高的工程产物

  • • 源码级 fork Oracle VirtualBox,维护独立分支
  • • 6 个 CPU profile 覆盖主流桌面 CPU
  • • 52 个 SMBIOS 字段 + 2 个主板 profile 的字段集
  • • 22 个 UI action 对应 22 种反检测配置预设
  • • 57 条 DoD STIG 组策略 + Juice Labs 图形 shim + OBS 虚拟摄像头 + FakeGPS 的多层整合
  • • 完整的商业 DRM 集成(keygen.sh JSON:API)
  • • WHQL 签发的内核驱动路径

纯技术工程视角看,它展示了商业反检测虚拟化产品的工程化程度可以达到的水平。对于做 virtualization introspection、anti-sandbox research、enterprise EDR 识别方法研究的同行,它是一份具有参考价值的样本。

至于具体的使用场景判断,那不是本文讨论的范围。


本文写作日期:2026 年 4 月
CloakBox 分析版本:ANTIDETECT 5 FREE Education Edition r.2.2.0 7.2.4
若你看到的版本号不同,部分技术细节可能已变化

欢迎在评论区里讨论技术问题

反虚拟机检测虚拟机CloakBox 的逆向安全审计
正文完
 0
评论(没有评论)
验证码