使用文档

CLI 使用文档

sgprotect_con 的命令语法、授权管理、输出路径规则、返回码与流水线集成示例。

最后更新于 2025-06-06预计阅读 6 分钟

概述

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=nativeNative(PE/ELF)参数帮助
--help=dotnet.NET 参数帮助
--help=apk / --help=aabAndroid 参数帮助
-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 PEWindows x86 / x64 / ARM / ARM64 可执行文件或 DLL
Native ELFLinux x86 / x64 / ARM / ARM64 可执行文件或共享库
.NET.NET Framework / .NET 程序集(x86 / x64 / AnyCPU)
Android APKAPK 包
Android AABApp Bundle

识别失败时输出:

Unsupported file type

如果文件已经被保护过,输出:

File is already protected

此时应使用原始未保护产物重新执行,不要重复保护。

输出路径规则

输出路径按以下优先级解析:

优先级来源
1命令行 -o <output_path>
2<input_path>.sugo 配置文件中的输出路径
3默认命名 <basename>.protected<ext>

补充规则:

  • 相对路径以输入文件所在目录为基准转换为绝对路径。
  • 建议提前创建输出目录,避免因目录不存在或权限不足导致失败。
  • 建议输出到新文件,不要覆盖原始未保护产物。

示例:

输入指定输出实际结果
D:\work\a.exeout\a.protected.exeD:\work\out\a.protected.exe
D:\work\a.exeD:\release\a.exeD:\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

配置文件保存以下内容:

  • 输出路径
  • 压缩、导入表保护、反调试、虚拟机检测、内存校验等开关
  • 函数保护规则(混淆 / 虚拟化 / 加密)

推荐流程:

  1. 在 GUI 中加载同一份输入文件。
  2. 配置保护选项和函数保护。
  3. 点击“开始保护”前,GUI 会自动保存 .sugo。
  4. 在流水线中用 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 环境中建议:

  1. 在构建机上手动执行一次带 --phone / --password 的命令完成登录。
  2. 后续命令不再传明文密码,直接执行保护。
  3. 定期检查凭据是否失效。

在命令行中传 --password 会让密码出现在进程列表和 shell 历史中。生产流水线应使用受控的构建机,并通过密钥管理工具注入,不要写进公开仓库。

执行保护

Native(PE / ELF)

sgprotect_con D:\work\app.exe -o D:\release\app.exe

执行流程:

  1. 分析文件结构。
  2. PE 文件会尝试加载同目录同名的 .pdb,用于函数级保护。
  3. 按 .sugo 中的选项执行压缩、导入表保护、反调试、函数混淆/虚拟化等策略。
  4. 输出保护后的文件。

需要函数级保护时,务必保留与二进制匹配的 .pdb,否则只能按地址或导出符号选择函数。

.NET

sgprotect_con D:\work\Client.dll -o D:\release\Client.dll

执行流程:

  1. 解析程序集元数据。
  2. 按配置执行压缩、JIT 加密、反调试、内存校验和函数加密/混淆。
  3. 输出保护后的程序集。

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

执行流程:

  1. 识别 APK / AAB 结构。
  2. 按配置执行 Dex 加密、反调试、反注入、Root/模拟器检测等策略。
  3. 输出保护后的包。

如果加固过程改变了包内容,发布前需要使用原签名证书重新签名。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 构建机上运行,请联系技术支持确认可用版本。

这份文档有帮助吗?欢迎反馈文档问题或补充场景。提交文档反馈