# Flyshot 跨平台混淆发布设计 ## 目标 为全部 `Flyshot.*` 自研程序集增加统一的 Obfuscar 混淆发布流程,生成一份 Windows 与 Linux 共用的 .NET 8 框架依赖部署包。混淆流程必须显式失败,不能在工具缺失或混淆失败时留下看似成功的未保护发布包。 ## 工具与环境边界 - 使用环境中安装的 Obfuscar 全局工具,命令名为 `obfuscar.console`。 - 仓库不增加 Obfuscar NuGet `PackageReference`,也不增加 `.config/dotnet-tools.json`。 - 构建环境需预先执行 `dotnet tool install --global Obfuscar.GlobalTool --version 2.2.50`。 - 发布脚本只依赖 PowerShell 7、.NET 8 SDK 和环境中的 Obfuscar。 ## 发布结构 发布脚本不接受运行平台或 RID,固定执行一次框架依赖发布: 1. 使用 `dotnet publish` 生成自包含、多文件的原始发布目录。 2. 动态生成包含绝对路径的 Obfuscar XML 配置。 3. 校验当前八个核心程序集不可缺失,并将发布目录中的全部 `Flyshot.*.dll` 加入混淆模块列表。 4. Obfuscar 输出到独立临时目录。 5. 仅在混淆成功且输出程序集完整时,用混淆程序集替换原始发布目录中的对应文件。 6. 将映射文件移入不随部署包交付的 `outputs/obfuscation-maps//`。 7. 最终部署包输出到 `outputs/obfuscated/framework-dependent/`。 ## 混淆边界 - `KeepPublicApi=true`:保留公共 API 名称,保护 ASP.NET Core 控制器发现、配置绑定、DI、JSON DTO、Swagger 和程序集间调用。 - `HidePrivateApi=true`:重命名内部类型、私有方法和字段。 - `RenameProperties=false`、`RenameEvents=false`:避免配置绑定、JSON 序列化和框架约定受属性或事件重命名影响。 - 不处理 `Microsoft.*`、`System.*`、NLog、Swashbuckle 等第三方程序集。 - 所有 `Flyshot.*.dll` 必须被发现并加入配置;缺少任何当前核心程序集都视为发布失败,未来新增模块会自动纳入。 ## 验证 - 脚本契约测试验证:RID 列表、环境工具缺失失败、全部自研程序集进入配置、第三方程序集不进入配置、映射文件不进入部署目录。 - 执行现有解决方案测试与 Release 构建。 - 真实执行框架依赖发布及混淆,并分别在 Windows 与 Linux 的 .NET 8 运行时上启动。 - Windows 包实际启动并请求 `/healthz`。 - Linux 包至少验证 ELF 启动文件、依赖文件和全部混淆程序集完整;环境存在 WSL 时再实际启动并请求 `/healthz`。 ## 风险与限制 Obfuscar 能显著提高普通反编译的阅读成本,但不能绝对阻止有经验的逆向分析。保留公共 API 是当前 ASP.NET Core 稳定运行所需的安全边界;若未来需要更强的控制流混淆、字符串加密或防篡改,应评估商业混淆器。