CLI 使用文档
sgprotect_con 的命令语法、授权管理、输出路径规则、返回码与流水线集成示例。
概述
sgprotect_con 是 Sugo Protector 的命令行版本,适合以下场景:
- CI/CD 流水线中自动保护构建产物
- 批处理多个文件或目录
- 服务器或无人值守环境
- 把 GUI 中调试好的
.sugo配置复用到自动化流程
命令行版本与 GUI 共用账号、授权和保护引擎。函数级配置不通过命令行参数传递,而是读取输入文件旁的 .sugo 文件,因此推荐先在 GUI 中配置函数保护并保存,再交给 CLI 执行。
快速开始
chcp 65001
sgprotect_con --version
sgprotect_con --phone=13800000000 --password=你的密码 --license-list --license-refresh
sgprotect_con --phone=13800000000 --password=你的密码 --license-bind=XXXX-XXXX-XXXX
sgprotect_con D:\work\app.exe -o D:\work\app.protected.exe
基本语法
sgprotect_con <input_path> [options] [-o <output_path>]
sgprotect_con --help
sgprotect_con --help=native
sgprotect_con --help=dotnet
sgprotect_con --help=apk
sgprotect_con --help=aab
input_path:待保护文件路径,支持绝对路径和相对路径。-o <output_path>:输出文件路径,可相对或绝对。- 参数顺序不敏感,但建议把输入文件放在最前面。
Windows 控制台编码
中文路径和输出建议先把控制台切换到 UTF-8:
chcp 65001
PowerShell 中可设置:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
参数参考
输入与输出
| 参数 | 说明 |
|---|---|
<input_path> | 待保护文件 |
-o <output_path> | 指定输出路径 |
-h / --help | 显示总帮助 |
--help=native | Native(PE/ELF)参数帮助 |
--help=dotnet | .NET 参数帮助 |
--help=apk / --help=aab | Android 参数帮助 |
-v / --version | 显示版本号 |
账号与授权
| 参数 | 说明 |
|---|---|
--phone=<phone> | 登录手机号 |
--password=<password> | 登录密码 |
--logout | 注销并清理本机凭据,不要求先通过授权校验 |
--license-list | 列出授权缓存 |
--license-refresh | 刷新授权,需与 --license-list 同时使用 |
--license-bind=<num> | 把授权绑定到本机 |
--license-unbind=<num> | 解绑本机授权 |
--license-refresh只在--license-list流程内生效。单独传入不会刷新授权。
命令组合示例
:: 首次登录并刷新授权列表
sgprotect_con --phone=13800000000 --password=****** --license-list --license-refresh
:: 绑定授权
sgprotect_con --phone=13800000000 --password=****** --license-bind=XXXX-XXXX-XXXX
:: 解绑授权
sgprotect_con --phone=13800000000 --password=****** --license-unbind=XXXX-XXXX-XXXX
:: 注销
sgprotect_con --logout
文件类型识别
程序会根据文件内容自动识别类型:
| 类型 | 说明 |
|---|---|
| Native PE | Windows x86 / x64 / ARM / ARM64 可执行文件或 DLL |
| Native ELF | Linux x86 / x64 / ARM / ARM64 可执行文件或共享库 |
| .NET | .NET Framework / .NET 程序集(x86 / x64 / AnyCPU) |
| Android APK | APK 包 |
| Android AAB | App Bundle |
识别失败时输出:
Unsupported file type
如果文件已经被保护过,输出:
File is already protected
此时应使用原始未保护产物重新执行,不要重复保护。
输出路径规则
输出路径按以下优先级解析:
| 优先级 | 来源 |
|---|---|
| 1 | 命令行 -o <output_path> |
| 2 | <input_path>.sugo 配置文件中的输出路径 |
| 3 | 默认命名 <basename>.protected<ext> |
补充规则:
- 相对路径以输入文件所在目录为基准转换为绝对路径。
- 建议提前创建输出目录,避免因目录不存在或权限不足导致失败。
- 建议输出到新文件,不要覆盖原始未保护产物。
示例:
| 输入 | 指定输出 | 实际结果 |
|---|---|---|
D:\work\a.exe | out\a.protected.exe | D:\work\out\a.protected.exe |
D:\work\a.exe | D:\release\a.exe | D:\release\a.exe |
D:\work\a.exe | 未指定 | D:\work\a.protected.exe |
配置文件(.sugo)
程序会自动尝试加载:
<输入文件完整路径>.sugo
例如输入 D:\work\app.exe,则读取 D:\work\app.exe.sugo。
加载成功时会打印:
Config file: D:\work\app.exe.sugo
配置文件保存以下内容:
- 输出路径
- 压缩、导入表保护、反调试、虚拟机检测、内存校验等开关
- 函数保护规则(混淆 / 虚拟化 / 加密)
推荐流程:
- 在 GUI 中加载同一份输入文件。
- 配置保护选项和函数保护。
- 点击“开始保护”前,GUI 会自动保存
.sugo。 - 在流水线中用 CLI 指向同一输入文件,CLI 会自动读取该配置。
.sugo是明文 JSON 配置,可以纳入版本管理;但不要提交包含账号密码的文件。
授权校验
真正开始保护前,程序会获取本机“已绑定”的授权列表:
- 没有任何可用授权时:
No valid license bound. Please bind a license first. - 授权类型不覆盖当前文件类型时:
Current file type license is not available. Please bind a valid license first.
授权与账号绑定在本机凭据中。已经登录过的机器通常可以自动登录;在 CI 环境中建议:
- 在构建机上手动执行一次带
--phone/--password的命令完成登录。 - 后续命令不再传明文密码,直接执行保护。
- 定期检查凭据是否失效。
在命令行中传
--password会让密码出现在进程列表和 shell 历史中。生产流水线应使用受控的构建机,并通过密钥管理工具注入,不要写进公开仓库。
执行保护
Native(PE / ELF)
sgprotect_con D:\work\app.exe -o D:\release\app.exe
执行流程:
- 分析文件结构。
- PE 文件会尝试加载同目录同名的
.pdb,用于函数级保护。 - 按
.sugo中的选项执行压缩、导入表保护、反调试、函数混淆/虚拟化等策略。 - 输出保护后的文件。
需要函数级保护时,务必保留与二进制匹配的
.pdb,否则只能按地址或导出符号选择函数。
.NET
sgprotect_con D:\work\Client.dll -o D:\release\Client.dll
执行流程:
- 解析程序集元数据。
- 按配置执行压缩、JIT 加密、反调试、内存校验和函数加密/混淆。
- 输出保护后的程序集。
Android APK / AAB
sgprotect_con D:\work\app-release.apk -o D:\release\app-release-protected.apk
sgprotect_con D:\work\app-release.aab -o D:\release\app-release-protected.aab
执行流程:
- 识别 APK / AAB 结构。
- 按配置执行 Dex 加密、反调试、反注入、Root/模拟器检测等策略。
- 输出保护后的包。
如果加固过程改变了包内容,发布前需要使用原签名证书重新签名。AAB 不能直接安装,测试时请用
bundletool生成 APK。
返回码与输出
成功:
Protection completed!
Output file: D:\release\app.protected.exe
返回码 0。
失败:
Error (0xXXXXXXXX): <status message>
返回码非 0。常见错误:
| 输出 | 含义 | 处理 |
|---|---|---|
Unsupported file type | 文件类型不支持 | 确认是 PE/ELF/.NET/APK/AAB |
File is already protected | 文件已保护过 | 使用原始产物 |
No valid license bound... | 没有绑定授权 | 先绑定授权 |
Current file type license is not available... | 授权类型不匹配 | 购买或绑定对应类型授权 |
| 输出路径相关错误 | 目录不存在或无权限 | 检查路径与权限 |
| 保护引擎错误 | 文件损坏、加壳冲突、符号缺失 | 用原始文件重试并查看日志 |
流水线集成
Windows 批处理
@echo off
chcp 65001 >nul
setlocal
set INPUT=%1
set OUTPUT=%2
sgprotect_con "%INPUT%" -o "%OUTPUT%"
if errorlevel 1 (
echo Protection failed for %INPUT%
exit /b 1
)
echo Protected: %OUTPUT%
PowerShell
param(
[Parameter(Mandatory = $true)][string]$InputFile,
[Parameter(Mandatory = $true)][string]$OutputFile
)
$ErrorActionPreference = 'Stop'
& sgprotect_con $InputFile -o $OutputFile
if ($LASTEXITCODE -ne 0) {
throw "Sugo protection failed with exit code $LASTEXITCODE"
}
Write-Host "Protected: $OutputFile"
CI 注意事项
- 构建机需要能访问授权服务,首次使用前完成登录与授权绑定。
- 每次构建使用干净的工作目录,避免旧
.sugo配置影响结果。 - 把保护后的产物与原始产物分开存放,便于回滚。
- 对保护产物执行冒烟测试,不要只检查退出码。
- 记录客户端版本,保护引擎升级后重新验证。
FAQ
为什么保护前提示没有授权?
需要同时满足:
- 至少存在一条“已激活”的授权。
- 该授权已绑定到本机。
- 授权类型覆盖当前文件类型(试用 / Native / .NET / Android)。
--license-refresh 为什么没有效果?
它只在 --license-list 流程中生效,必须一起使用:
sgprotect_con --license-list --license-refresh
没有 .sugo 文件时函数保护会生效吗?
不会。CLI 不会交互式选择函数。没有 .sugo 时只能使用默认选项,函数级规则为空。请先在 GUI 中配置并保存。
相对路径为什么输出到了输入文件旁边?
相对输出路径以输入文件所在目录为基准,而不是当前 shell 的工作目录。需要固定位置时使用绝对路径。
可以在 Linux 上运行 CLI 吗?
当前发布形态为 Windows 客户端。Linux ELF 产物可以在 Windows 上保护;如果需要在 Linux 构建机上运行,请联系技术支持确认可用版本。