Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

VVON-Model

Live2D 模型的离线加密分发方案

画师把模型打成加密包,只有指定的那一个 Windows 账户能解开并挂载给 VTube Studio 使用。

模型明文全程不落地。

Windows x64 · 客户端 C++20 / Win32 / Dokany · 打包工具 Python 3.14


两个软件,各干什么

软件 角色 谁用
VVON-Model Delivery Tool(打包工具,27 MB 绿色版) 读买家的请求文件 → 把模型目录加密成 .vkit 画师
VVON-Model Client(买家客户端,安装包) 生成本机钥匙 → 挂载 .vkit 给 VTS 买家

测试时你一个人扮演两个角色,可以完整跑通闭环,不需要等我。


核心机制:包绑定一个 Windows 账户(先理解这个)

每个 .vkit 包在打包时,用目标账户的公钥封装了内容密钥(RSA-2048-OAEP)。客户端打开包时比对包头的接收方钥匙 ID 与本机钥匙,不一致直接拒绝。

注意是账户不是机器:同一台电脑上的两个 Windows 账户 = 两把不同钥匙,A 账户的包在 B 账户下也打不开。

私钥存在 Windows 软件密钥存储(KSP)里,不可导出,且绑定当前 Windows 用户账户(不是机器)。

这意味着:

  • ✅ 你自己打的包,你自己能开 —— 完整测试没问题
  • ❌ 把包发给另一个人 → 他必然打不开,会看到「包的接收密钥与本机不匹配」
  • 上面那条"打不开"本身就是一条重要测试 —— 两个人互相发包,验证确实拒绝
  • ⚠️ 换 Windows 用户账户、重装系统、换电脑 → 之前的包全部失效,私钥不可导出所以没法备份迁移,只能重新走一遍「导出请求 → 打包」

所以:别在打算重装系统之前攒一堆测试包。


完整测试流程(一个人跑完)

①  装客户端 → 启动 → 自动生成本机钥匙
②  客户端点「导出请求」→ 存出 VVON-授权请求.vreq
③  解压打包工具 → 运行 → 选那个 .vreq + 选一个 Live2D 模型目录 → 打包
④  回客户端 → 选刚打好的 .vkit → 点「加载并挂载模型」
⑤  VTS 自动启动 → 模型列表里应出现该模型 → 加载它

你需要准备

  • Windows 10 1809+ / Windows 11,x64

    安装包只拦到 Win7 SP1(那是 Dokan 的下限),更旧才会明确报错。但主程序实际需要 Win10 1703 以上的 API,Win7/8 上装得进去却起不来。请自己确认版本。

  • 管理员权限 —— 安装时会弹 UAC 提权(装内核驱动 + 装到 Program Files)。装完后运行主程序不需要管理员
  • 机器上没有其它版本的 Dokan —— 已装 Dokan 2.x 的其它版本时,安装会整体失败并回滚,不是跳过也不是升级
  • VTube Studio(Steam 版或独立版,客户端自动探测)
  • 一个 Live2D 模型目录.model3.json + 贴图 + .moc3 那一套)

没有现成模型可以用 Live2D 官方示例模型(Hiyori / Haru 等),或 VTS 自带的示例。


第一步:安装客户端

  1. 下载 VVON-ModelSetup.exe,双击
  2. 会弹 SmartScreen 警告 → 点「更多信息」→「仍要运行」(见下)
  3. 一路下一步。安装程序会串装 Dokan 2.3.1 内核驱动(已内嵌,不联网下载)
  4. 安装界面是单页一个按钮,没有向导多页、没有许可页、没有安装位置选择(固定装到 C:\Program Files\VModelClient\
  5. 全新安装通常不需要重启。若启动时报「Dokan 驱动未就绪」再重启

装完只有桌面快捷方式(名字是 VModelClient),没有开始菜单项。

SmartScreen 警告是预期的

安装包用自签名证书签名,Windows 不信任自签根,所以提示"未知发布者"。

想自己核对签名者身份:

$s = Get-AuthenticodeSignature ".\VVON-ModelSetup.exe"
$h = [System.Security.Cryptography.SHA256]::Create().ComputeHash($s.SignerCertificate.RawData)
($h | ForEach-Object { $_.ToString("x2") }) -join ''

应得到:

33a633b8b31111ffdba1ef2303019b69b5886e1384409258d565b0d79e6a4d0b

签名者 CN=VVON Model Client,带 DigiCert RFC 3161 时间戳。

Get-AuthenticodeSignature 会报 UnknownError +「根证书不受信任」——自签证书的预期结果,不代表签名无效。程序自校验验的是 digest + 上面这个固定指纹,不依赖系统信任链。


第二步:导出请求文件

启动客户端,主界面从上到下:

区域 内容
🔑 本机公钥指纹 一串十六进制 = 你这个 Windows 账户的身份。下方提示「* 画师据此指纹加密模型」
导出请求 按钮 弹保存对话框,默认文件名 VVON-授权请求.vreq。里面只有公钥,没有私钥
模型文件 选择框 .vkit 包。未选时提示「* 请选择要挂载的 .vkit 模型」
加载并挂载模型 主按钮 解析包 → 挂载虚拟盘 → 自动启动 VTS。挂载后变成 ⛔ 停止并卸载
底部版权行 点它弹「关于」框(列出第三方组件与许可)。框里再点「查看完整许可」才打开许可全文

点「导出请求」存出 .vreq

首次启动可能遇到的提示

启动时有几道闸按顺序过,任一不过就弹一个框然后退出(看不到主界面,不是闪退):

顺序 提示 原因
1 程序完整性校验失败,请重新安装。 最可能撞到的一条。exe 被任何改动都会命中:杀软改写、下载损坏、被重打包/加壳/改图标
2 启动初始化失败,请重新安装客户端。 无法定位程序自身目录
3 Dokan 运行时组件验证失败,请重新安装客户端。 dokan2.dll 不存在、被替换、签名不符等六种情况共用这一句。最常见的是"只拷了 exe,dll 根本不在"
4 Dokan 运行时组件加载失败,请重新安装客户端。 dll 校验过了但加载失败
5 Dokan 驱动未就绪。请运行正式安装程序;若刚完成安装,请重启 Windows。 驱动没装
6 Dokan 组件版本不一致,请使用正式安装程序重新安装。 混用了不同版本的 Dokan

不要只拷 VModelClient.exe 出来跑。 会卡在第 3 条。必须走安装包。

这一条不弹框、不退出

提示 说明
✗ 密钥创建失败,请查看日志或联系支持 显示在指纹框下方(琥珀色),程序照常进主界面,只是指纹框为空、无法导出请求。这种情况没有界面上的恢复入口,请把日志发我

界面上的几个已知不便

  • 指纹没法复制,也没法从日志里找:那个只读框是自绘控件,不能选中、不能 Ctrl+C,也没有复制按钮;64 个字符在框里会被省略号截断(实际只显示约 38 个)。日志里也不记指纹。要核对的话只能导出 .vreq 后用十六进制工具看(key ID 在第 28 字节起的 32 字节)。这点确实不方便,你们要是觉得该加个复制按钮就说。
  • 没有"打开日志"按钮:界面多处说"请查看日志",但要自己去 %LOCALAPPDATA%\VVON\ModelClient\Logs\vmodel_debug.log
  • 刚启动按 Enter 没反应:焦点初始在窗口本身,要先按一次 Tab。

第三步:用打包工具打包

解压 VVON-Model_v2.8.zip(27 MB,绿色免安装,内嵌 Python 运行时,无需装 Python),运行 VVON-Model.exe

工具有两个页面:加密打包授权历史

在打包页:

  1. 选刚才导出的 .vreq(工具会严格校验:canonical SPKI、RSA-2048、指数 65537、key ID)
  2. 选模型目录(支持拖拽)
  3. 选输出位置
  4. 开始打包

工具会随机生成内容密钥(CEK),用 .vreq 里的公钥封装,写出 .vkit

打包工具首次运行会在自己目录建 license_records.db(SQLite,记录打包历史)。发出去的压缩包里没有这个文件,你的数据库是你自己的。

路径规则会拦住一些模型

打包时路径必须满足协议的允许字符表、深度和长度上限。非法路径、身份冲突(比如两个只有大小写不同的文件名)、文件/目录前缀冲突都会让整包失败,不会静默改名或丢文件。

如果你的模型目录打包失败,请把工具报的错发我 —— 这类反馈很有价值,说明真实素材里有我没考虑到的命名。


第四步:挂载

回客户端,选刚打好的 .vkit,点「加载并挂载模型」。

进度条会一直停在 0%、文字停在「⏳ 正在处理...」 —— 进度只有 0 和 100 两档,没有中间值。大包解密可能要数秒到十几秒,此时所有按钮禁用。这不是卡死,别强杀进程。

成功后主按钮变为卸载,「导出请求」在挂载期间禁用。

挂载失败的几种情况

提示 原因
❌ 未检测到 VTube Studio,请先安装或启动一次 VTS 再挂载 探测不到 VTS。界面没有手动指定路径的入口 —— 探测走「运行中进程 / Steam 库 / 卸载注册表」三条路,都不中就无解。可先手动启动一次 VTS 再挂载
❌ 挂载失败:无法挂载到 VTS 模型目录 对 VTS 安装目录没写权限。VTS 装在 Program Files 下、或开了"受控文件夹访问"时常见
❌ 挂载失败:同名模型目录已存在,请先移除后重试 模型目录下已有同名非空文件夹
❌ 挂载失败:包的接收密钥与本机不匹配,或文件损坏 用了别人的包,或换过 Windows 账户
⚠️ 检测到逆向分析工具(RenderDoc / Cheat Engine 等),请关闭后重试 见下方「逆向工具预检」

注意:如果挂载点是同名空目录或联结,程序会直接删掉它再挂载。别把重要空目录放在那个位置。

卸载 = 强杀 VTS

点「停止并卸载」或直接关闭客户端,会通过 Job 对象内核级终止 VTube Studio,不给它保存的机会。VTS 里未保存的设置会丢。 客户端崩溃或被任务管理器结束时同样会连带杀掉 VTS。

请在卸载前先在 VTS 里保存好你要保留的配置。

模型被挂载到 VTS 自己的模型目录下(VTube Studio_Data\StreamingAssets\Live2DModels\<包名>),所以 VTS 能像本地模型一样直接列出来。

挂载后:只有 VTS 能读

用资源管理器点进那个目录,会被拒绝访问 —— 连目录句柄都拿不到,所以看不到任何文件名、大小或目录结构。日志里会留下:

ZwCreateFile(open): 非授权进程(PID=15784, type=1) 被拒
调用者 打开文件/目录 读内容
已授权的 VTS 成功 解密后明文
其他任何进程 拒绝(ACCESS_DENIED 拒绝

身份闸在打开阶段就拦下,早于任何目录或文件的分支判断 —— 刻意不走"能列出文件名但读不了内容"那条路,因为文件名本身也是信息。

所以「资源管理器进不去 / 报拒绝访问」= 功能正常

「已授权的 VTS」指的是本程序亲手启动的那一个 VTS 实例(带 -nosteam 参数),不是"任何 VTS"。挂载时总会自己再启动一个,即使你机器上已经有 VTS 在跑。身份判据是进程 ID + 持有进程句柄(防 PID 被回收复用后冒充),不校验 VTS 自身的哈希或签名(VTS 主程序本身没有签名,没法校验)。


隐私与安全

两端都完全不联网

客户端产品代码全量扫描:

检查项 结果
网络 API(WinHTTP / WinINet / socket / curl…) 0 处
链接的网络库(ws2_32 / winhttp / wininet…) 0 个
源码中的 URL / 域名字面量 0 个

打包工具同样零联网(唯一的 urllib 引用是本地路径转义,不发请求)。

没有遥测、没有许可服务器、没有联网校验。 两端断网可完整使用。

一个你们会想到的追问:签名校验会不会偷偷联网?

WinVerifyTrust 默认可能去查证书吊销列表(CRL/OCSP),那是真的网络请求。

代码里明确关掉了:

data.fdwRevocationChecks = WTD_REVOKE_NONE;              // 不查吊销
data.dwProvFlags         = WTD_CACHE_ONLY_URL_RETRIEVAL; // 只用本地缓存,不出网

所以自校验也不联网。你可以用 Process Monitor 或防火墙验证。

(唯一联网环节是我构建签名时取 RFC 3161 时间戳,与你运行无关。)

落盘写了什么

位置 内容
%LOCALAPPDATA%\VVON\ModelClient\Logs\vmodel_debug.log 客户端日志,5 MB 自动轮转
<包路径>.cfgs\ VTS 写回的配置(影子目录,与包同目录)
打包工具目录下 license_records.db 打包历史(你自己的,不外传)

客户端日志不记录私钥、内容密钥、派生密钥、完整模型路径、模型内容。打包工具的持久日志只记固定事件、异常类型、数量、耗时,不记买家信息、源/输出路径、异常消息和堆栈。

可以直接打开看,也欢迎你检查后告诉我有没有该脱敏的漏了。

客户端运行期间日志可以正常打开阅读(上一版是独占打开,读不了,已修)。

客户端进程加固(日志可查)

我这台机器上六项全部启用:

ApplyProcessMitigations: [DllSearch=System32] 已启用
ApplyProcessMitigations: [ASLR] 已启用
ApplyProcessMitigations: [ImageLoad] 已启用
ApplyProcessMitigations: [DynamicCode] 已启用
ApplyProcessMitigations: [StrictHandle] 已启用
ApplyProcessMitigations: [ExtensionPoint] 已启用

DynamicCode 禁止运行时生成/改写可执行代码,ExtensionPoint 封住全局挂钩注入。

这六项是尽力启用:单项失败只记一条 WARN 然后继续启动。所以你日志里看到某项 失败, err=N 而程序照常运行是正常的(旧系统或 EDR 干扰时可能出现),不是程序坏了。

逆向工具预检

挂载前扫一遍进程,命中以下工具则拒绝挂载:

renderdoc.exe / qrenderdoc.exe / ninjaripper.exe
cheatengine-x86_64.exe / cheatengine-i386.exe

刻意不含 x64dbg、WinDbg、OBS、Discord —— 避免误伤开发者和直播环境。快照失败时 fail-open(宁可放行也不误伤)。

⚠️ 挂载后再开这些工具,会被自动卸载

不只是挂载前检查 —— 挂载期间还有个监视器在轮询:挂载后 3 秒首次检查,之后每 12 秒一次。中途开起 RenderDoc 或 Cheat Engine,会在 12 秒内自动整卷卸载,进度条显示:

🛑 检测到冲突工具,已停止并卸载,请关闭后重试

做抓帧对比、性能分析、或想研究保护机制的人一定会踩这个 —— 模型会在你毫无预期时消失。这是刻意设计,不是崩溃。要做这类测试请先关掉工具再挂载,或者直接告诉我你想测什么。

反作弊(ACE 等)兼容性 —— 诚实说明

dokan2.sysWHQL 签名的(CN=Microsoft Windows Hardware Compatibility Publisher),在我机器上开着 HVCI 也能正常加载,说明它不在微软的易受攻击驱动黑名单上。反作弊的驱动黑名单针对的是可被利用的内核原语(任意内存读写、任意进程终止),不是"文件系统驱动"这个类别。

但这是资质分析,不是实测。 反作弊厂商策略不公开,个别厂商可能对任何非白名单的文件系统过滤驱动采取保守态度。

这是我特别希望你们帮测的一项。 如果你常玩带 ACE / EAC / BattlEye 的游戏,请分两步:

  1. 只装客户端(驱动已加载,不挂载模型)→ 启动游戏,看是否正常
  2. 挂载一个模型 → 再启动游戏,看是否正常

无论结果如何都请告诉我,尤其是失败的情况

两级读取限流闸(可能让你莫名读不了文件)

为了挡"反复扫整个包把内容榨出来",有两道会话级预算闸。正常使用碰不到,但如果你在做压力测试或反复加载同一模型,可能触发:

预算 触发后
单文件重读抑制 每个文件:块数 × 8(块 = 2 MiB) 该文件本次会话内永久读不了(返回 STATUS_DATA_ERROR
整卷输出熔断 整包受保护内容总量 × 3 所有受保护文件一律拒读(ACCESS_DENIED),sticky 锁死

唯一解除办法是卸载再重新挂载(而卸载会强杀 VTS)。反复挂载/卸载不会累积 —— 每次挂载都是全新预算。

我实测一次正常会话(90 MB 包、253 分钟、含切表情)只用掉整卷预算的 26.6%,还有 3.8 倍余量。但大模型 + 长时间直播 + 频繁换装是我没测过的组合,如果你遇到模型突然加载不出来,这可能就是原因 —— 请务必告诉我,这是我最想拿到的一类数据。

明说的能力边界

这是本地 DRM,不是万能的:

  • 不能对抗完全控制本机的攻击者。模型要显示就必须解密进内存,机主有充分权限时理论上可以提取。
  • 目标是抬高门槛(挡随手拷走、挡扒贴图工具、挡转发给第三方),不是数学上的不可能。
  • 自签名证书不消除 SmartScreen 警告。
  • 协议仍是 DRAFT 状态,包格式可能变动 —— 旧包在新版本可能失效

欢迎你尝试绕过。 你们比我更懂怎么攻,能找到实际可行的提取路径对我价值极大,请直接告诉我。


实测性能数据(我的机器,i7-8750H / 40 GB)

一次 253 分 38 秒的真实挂载会话,90.87 MB 包 / 24 个文件:

指标 数值
空闲内存 18.2 MB
挂载稳定态 105.5 MB 工作集 / 48.5 MB 私有
挂载稳定态 CPU 0.130% 单核(= 12 核总量的 0.011%)
VTS 载入模型峰值 108.3 MB,约 61% 单核,持续 5-10 秒
切表情 16-47 ms 尖峰,内存零变化
120 秒连续采样 内存、句柄零漂移
卸载后 回落至 17.0 MB
解密缓存命中率 97.5%(hit 2261 / miss 58)

48.5 MB 里 32 MB 是明文块缓存(有硬上限)。包不做整包映射,只按 VTS 实际读取按需解密 —— 所以 90 MB 的包常驻内存不到 50 MB。

对直播的意义:40 GB 内存里占 0.26%,CPU 占单核千分之一点三。同时开 FPS 游戏 + OBS + 礼物特效插件不构成资源竞争。

这些数字只来自我一台机器。 你的实测数据(尤其是不一致的)对我很有价值。


已知不是 bug 的情况

现象 说明
别人的包打不开 设计如此,包绑定单个 Windows 账户
资源管理器里挂载目录进不去 DRM 生效,只有 VTS 能读
SmartScreen 警告"未知发布者" 自签名证书,预期
Get-AuthenticodeSignature 报"根证书不受信任" 自签名,预期。核对指纹即可
❌ 挂载失败:同名模型目录已存在,请先移除后重试 VTS 模型目录下已有同名非空文件夹。程序会先试着删同名目录(空目录/联结能删掉),删不动才报这个错
卸载客户端后 Dokan 驱动还在 刻意保留,避免弄坏共用它的其他软件(已知有同款 2.3.1 的其他用户)
日志里 SelfIntegrity: 本程序无 Authenticode 签名 仅开发构建会有;正式安装包不会
开着 RenderDoc / Cheat Engine 时挂载失败 逆向工具预检,预期
打包工具报路径非法 协议路径策略,请把错误发我

反馈怎么提

请附上:

  1. 系统:Windows 版本、CPU、内存
  2. 客户端日志%LOCALAPPDATA%\VVON\ModelClient\Logs\vmodel_debug.log
  3. VTS 版本(如果测到挂载)
  4. 模型来源(官方示例?自制?大概多少文件多大)
  5. 复现步骤和你预期看到什么

我最想知道的

  1. 反作弊兼容性(上面那两步)
  2. 换装 / 配置写回 —— 在 VTS 里改配置,卸载再挂载,配置是否还在
  3. 打包工具在真实模型上的路径兼容性 —— 各种命名的素材
  4. 大模型 + 长时间挂载 —— 我只测过 90 MB / 253 分钟,更大更久的没测过
  5. 任何挂载失败崩溃VTS 加载不出模型
  6. 你能不能绕过 DRM —— 认真的,找到了请告诉我

关于源码

本仓库只发布二进制成品,不公开源码。 授权条款见 LICENSE

简单说:欢迎你装来测、欢迎为找漏洞而逆向,但不要再分发或商用。

有想法、发现或批评都欢迎,走 Issues 或 Discussions。


第三方组件

组件 许可
Dokany MIT
BoringSSL Apache 2.0
xorstr Apache 2.0

完整许可全文在安装后的程序目录里(THIRD-PARTY-NOTICES.txt),也可以点主界面左下角版权行 → 「关于」框 → 「查看完整许可」打开。仓库里不放这个文件。


联系

一般问题、bug、测试报告 → 在本仓库开 Issue

安全漏洞请走私密渠道

如果你找到了绕过 DRM 保护的方法(提取出模型明文、伪造授权、让非授权进程读到内容等),请不要发在公开 Issue 里 —— 那等于把方法公布给所有想白拿模型的人。

请走 GitHub 的私密上报:

仓库页 → Security 标签 → Report a vulnerability

只有我能看到,修复后你可以决定要不要公开。

这条渠道是明确欢迎的,LICENSE 第三条写了安全研究例外 —— 为找漏洞而逆向本软件不违反授权。你们比我更懂怎么攻,找到可行的提取路径对我价值极大。

About

Live2D 模型离线加密分发方案 · 测试版

Topics

Resources

Security policy

Stars

Watchers

Forks

Releases

Contributors