本帖最后由 yonfei 于 2026-10-11 09:46 编辑
RaiDrive_2023.9.256_x64是最后一个免登录的版本,发布已三年有余,国庆假期拿它练了练手。
https://wwarc.lanzouv.com/irt9N4bjftdc[/color]
密码:7gur
RaiDrive 授权机制逆向 —— 学习归档
归档日期:2026-10-07
对象:RaiDrive 2023.9.256.0(客户端 RaiDrive.dll / 服务 RaiDrive.Service.x64.dll,均 .NET 6.0.24)
性质:自用研究归档。授权文件已脱敏。
一、一句话结论
挂载成"本地磁盘"还是"网络盘",由 RaiDrive.Service 进程内的那份授权决定;
而那份授权的内容,可以完全由安装目录里的三个 JSON 文件说了算
—— 与客户端怎么启动、是否登录都无关。
最终方案只做服务端一层:安装器给 RaiDrive 服务注册一个启动钩子(SvcLicenseHook),
钩子在服务取授权时用槽位文件替换服务器返回的内容。授权再由服务通过
LoginResponse / LicenseState 下发给任何连上来的客户端。
RaiDrive.Service 启动
└─ DOTNET_STARTUP_HOOKS=SvcLicenseHook(写在服务的环境变量里,机器级)
├─ 挂钩 LicenseAPI.DecryptSubscription(where, licensedata)
│ 槽位文件存在 → 返回文件内容(服务器返回的被丢弃)
│ 槽位文件缺失 → 解密服务器内容并写入该槽位
└─ guest-path seeder:把槽位 01 镜像进 LicenseAPI.StandardLicense 静态字段
→ 未登录时(ClearLicense→GetStandardLicense 命中静态缓存)也吃文件
↓ 生效授权(plan / physical / ad …)
客户端(原版 RaiDrive.exe 即可)连上来 → 服务下发 → 本地磁盘 / 无广告
二、核心结论速查
| 结论 |
证据在哪 |
决定"本地磁盘"的是授权里的 physical(LicenseInfo.CheckStorageLicense → MountType.Contains("physical")) |
03_分析与证据/授权文件机制_说明与实测.md |
同一份服务器响应,只换槽位文件就能让 MOUNT STATE IsNetwork 在 True/False 之间翻转 |
同上(服务端 A/B) |
| 未登录时走的是静态缓存,改文件默认不生效 → guest-path seeder 解决 |
同上("不登录也能吃文件"一节) |
| 客户端"登录当下"的订阅显示来自服务端下发,所以原版 exe 也显示付费档 |
同上("为什么原版也自动有授权"一节) |
判定是否成功:Win32_LogicalDisk.DriveType = 3 本地 / 4 网络 |
同上(客观判据一节) |
| 让服务端重新取授权的办法:登录一次(登录事件)> 重启服务(必然生效);客户端重启在未登录时无效 |
同上(触发条件一节,含 UserInfo.Login 三条分支) |
三、最终交付物
| 文件 |
说明 |
01_最终产物/RaiDrive服务端授权包/ |
最终交付:RaiDrive授权安装器.exe(65.9 MB 单文件、内嵌钩子与三个槽位、自带运行时、自动提权)+ 授权文件\(三份脱敏 JSON)+ 使用说明.md |
01_最终产物/SvcLicenseHook.dll |
服务端钩子成品(17,920 B;hook.log 已按要求关闭) |
01_最终产物/客户端方案(已退役)/ |
历史产物:启动无广告RaiDrive.exe、AdJsonHook.dll(客户端钩子)、one.json.样例 |
用法:把 RaiDrive授权安装器.exe 复制进 RaiDrive 安装目录并就地双击 → 点「安装」。
之后照常双击你的 RaiDrive 图标即可(不需要专用启动器)。
改授权:替换 RaiDrive 目录里的三个槽位文件 →
- 已登录:在客户端重新登录一次即可生效;
- 未登录:断开/重连驱动器(或重启客户端);
- 不确定时:重启
RaiDrive.Service(一定生效)。
四、目录导航
| 目录 |
内容 |
00_总览/ |
本 README、关键发现与结论.md、时间线.md、术语与符号速查.md、工作区清单.txt(含未打包内容说明) |
01_最终产物/ |
最终交付包 + 钩子成品 + 已退役的客户端方案 |
02_源码/ |
全部源码:svchook/(服务端钩子)、ad-hook/(客户端钩子 + 启动器)、authsetup/(安装器工程 + 内嵌载荷) |
03_分析与证据/ |
主分析文档 + 原始(未脱敏)授权文件 + 服务器下发的加密原文 + 实际生效内容 + 钩子审计日志 + 全部部署/测试报告 + 早期阶段证据截图 |
04_反编译与解包/ |
客户端原始 DLL、服务 DLL 的 4 个内嵌资源(含被保护的 10.17 MB 载荷)、从内存雕出的 PE 映像、解包方法 |
05_工具脚本/ |
内存转储/PE 雕刻脚本、钩子部署脚本、各类 A/B 验证脚本、DSH MCP 客户端说明 |
06_历史阶段文档/ |
早期阶段的交接文档(NEXT_SESSION.md 等)+ 上一轮存档 StarDrive-存档-20261006/(含源码/构建步骤/截图) |
07_重建步骤/ |
从源码重建钩子、启动器、安装器的完整命令与部署验证方法 |
五、最短复现路径
# 1) 直接用成品(推荐)
copy "01_最终产物\RaiDrive服务端授权包\RaiDrive授权安装器.exe" "C:\Program Files\OpenBoxLab\RaiDrive\"
# 然后在该目录双击它 → 点「安装」(需要管理员)
# 2) 从源码重建(详见 07_重建步骤/构建步骤.md)
cd 02_源码\svchook ; dotnet build -c Release # → SvcLicenseHook.dll
cd 02_源码\authsetup ; dotnet publish -c Release -r win-x64 -o out # → 安装器 exe
验证是否成功(权威判据):
Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='Z:'" | Select-Object DriveType, FileSystem, VolumeName
# DriveType = 3 → 本地磁盘(成功);4 → 网络驱动器
六、这份归档没收录什么
工作区里另有约 4 GB 早期阶段中间产物(ILSpy 反编译输出、上百个 dnlib 试验目录、
服务进程内存转储 152 MB、编译中间目录等)—— 都可以用 05_工具脚本/ 里的脚本或
07_重建步骤/ 的命令重新生成,因此没有打包。逐项说明见 00_总览/工作区清单.txt。
七、阅读顺序建议
00_总览/关键发现与结论.md —— 先看结论与代码位置
03_分析与证据/授权文件机制_说明与实测.md —— 完整分析过程与全部实测(最有信息量的一份)
03_分析与证据/原始授权文件/ 与 加密原文与生效内容/ —— 数据长什么样
02_源码/svchook/SvcLicenseHook.cs —— 最终方案的全部实现(约 500 行,含详细注释)
07_重建步骤/构建步骤.md —— 想自己重建时看
|