研究

Go 防破解:哪些保护值得做——2026 年 7 月实验

Go 防护的价值,在于让定位、理解和复用多花多少功夫。十四种制品的比较支持先清理发布信息、对敏感包采用 Garble,再谨慎评估控制流与商业虚拟化;同时保留运行、诊断和更新能力,并把联网高价值权限留在服务端。

暖纸调查工作台上,一个蓝色程序舱依次经过四层机械保护与测量仪器,到达本地决策拨杆,最后通向隔墙后的蓝色保险库。
文章导航

1 保护增加的是哪一种成本

给 Go 程序加壳,最容易看到的效果是文件变了、字符串搜不到了、分析工具打不开了。真正需要问的是,分析者接下来要多做哪一步。在我们的样本中,UPX 压缩一度让 Go 专用解析器退出,官方解包后,原来的函数和类型信息又出现了;Garble 则改变了名称与字面量本身,让按旧名字查找的路线失效。两者都改变文件,增加的工作并不一样。

如果目的是提高破解成本,我会先清理发布信息,对自有敏感包尝试 Garble,再决定哪些低频代码值得做控制流变换或虚拟化。同时检查许可证结果在哪里真正被使用:只保护验证函数,可能把更直接的调用侧分支留在外面。联网产品还应把长期权限和关键业务留在服务端;完全离线的产品需要接受最终执行权仍在客户设备上,并用差异化、更新和恢复能力减少一次分析被反复利用的价值。

这个建议来自 2026 年 7 月的固定实验:Go 1.26.5、Windows/amd64、一个 Ed25519 授权程序、14 种制品状态和 140 项授权控制。下面保留当时的工具版本与 7 月 26 日核对的市场状态,用于解释和复现结果;它们不是 9 月的最新安装清单。商业工具尚未完成有许可证的实际保护测试,本文只能推荐先测谁,不能选出一个已经证明适合生产的赢家。

实验记录了名称和字面量能否直接找到、Go 结构能否恢复、原调试流程是否可用、结果能否跨构建复用,也测了体积、启动与热路径成本。我们没有测出“多花几天才能破解”,没有主动修改授权结果,也没有把小样本的行为保证扩大到大型产品。先看这些具体变化,再决定保护是否值得保留。

以付费导出为例,功能名、错误文本、服务 URL 和包路径都可能帮助定位相关代码。名称和字面量变换先处理这些入口;找到调用者以后,需要继续理解的代码范围取决于控制流或虚拟化放在哪里。逐发布更换 seed、按客户构建和水印会改变下一份样本,让已得到的位置更难直接复用。若导出依赖服务端计算,短期 capability、设备绑定、重放检查与撤销还能限制一个已获授权客户端持续取得的结果。

2 从发布文件到运行中的代码

这些保护方法可以归为五层。第一层减少发布件主动泄露的信息。第二层在编译前或编译中改变名称、数据和代码形态。第三层改写已经生成的可执行文件及其装载路径。第四层在运行时观察或响应分析与修改。第五层控制不同发布如何变化、异常如何被发现,以及授权事实最终放在哪里。这些层可以组合,同时各自拥有不同的恢复路线和防守方成本。

本文的十三类依次是:构建卫生、Go 感知元数据、字面量与资源、代码形态、替代代码生成与边界迁移、构建差异化与水印、打包与 loader、二进制变异与虚拟化、反静态、反动态、完整性与自校验、秘密与授权架构,以及发布侦测与恢复。短时代码或数据保护横跨 loader、虚拟化和反动态三类,是一种运行期放置模式,不另造第十四类。PIE、DEP、CFG、CET 和平台代码签名作为相邻安全基线单独验收。这样分类的目的,是让每一种手段都有明确作用阶段、恢复路线、正负控制和生产责任人。

2.1 先减少能直接搜索的信息

构建卫生包括 -trimpath、-s -w、清理意外 VCS 与模块信息、明确 build ID 策略、整理版本资源,以及排除测试端点、调试日志、样例凭据和未使用资产。Go 命令把 -trimpath 定义为移除文件系统路径,把 -toolexec 定义为工具链程序的外部包装入口。Go 链接器把 -s 定义为省略符号表与调试信息,并包含 -w。这些是低风险发布控制,能够减少直接上下文;运行时所需结构仍需另行测量。

平台加固应放在基线旁边,并给出准确标签。PIE/ASLR、DEP、CFG 与 CET 降低内存破坏漏洞的利用能力。Microsoft 对 CFG 的定义是限制间接调用的合法目标。代码签名让平台验证签名后的字节是否改变,并把文件关联到发布者。两者都属于重要产品安全控制,其验收对象是利用缓解、文件身份和执行策略。逆向成本需要独立证据。

Go 感知元数据处理面向 pclntab、moduledata、构建信息、函数与文件表、类型链接、方法名和源码位置。Garble 通过编译链改变名称与路径,gostrip 做范围较窄的链接后处理,私有 linker 或 post-linker 可以执行更贴近产品的策略。反射、导出 API、序列化、插件、堆栈、profiler、崩溃转储和随版本变化的运行时布局会限制安全删除范围。发布系统需要私下保留符号、映射、seed 和精确制品身份。

字面量、常量、资源与数据布局变换包括字符串拆分、运行期重建、密文池、按使用点解码、资源容器和自定义查找表。它们最适合处理廉价静态搜索入口:服务 URL、协议标记、功能名、错误文本和高价值常量。Base64 和固定 XOR 循环会改变文本表示;密钥与解密器一起存放的 AES 具有相同权限上限。OS keystore、TPM 支持的密钥、硬件令牌和白盒技术能够提高提取或克隆成本。本地进程必须消费的值,在运行期间仍会以可用形式出现。

2.2 变换能不能留在机器码里

代码形态方法包括控制内联、函数拆分与合并、outline、间接调用、接口分派、控制流平坦化、不透明谓词、伪分支、基本块重排、常量盲化、混合布尔算术、指令替换、数据编码,以及自定义栈或寄存器布局。垃圾函数、诱饵字面量和伪错误路径试图增加搜索噪声。用私有字节码运行的小解释器属于轻量虚拟化。每一种技术都要落到最终机器码和运行行为上,因为 Go 会内联薄包装、折叠常量、合并字面量和删除不可达工作。

编译器与边界差异化会改变代码生成器本身。定制 cmd/compile 或 linker pass、-toolexec 包装器、汇编、cgo,以及 C/C++/Rust 库,都能让选定逻辑脱离常规 Go 源码编译路径。TinyGo 使用 LLVM,会形成不同的运行时分析面;它当时的兼容表同时表明“可导入”和“通过标准库测试”是两个字段,debug/buildinfo 与 debug/gosym 等包不可用。gccgo 使用 GCC 前端和不同运行时,Go 官方页面还记录了明显的语言与标准库版本限制。改变二进制形态可以让旧定位器失效,也会增加 ABI、GC、交叉编译、依赖、崩溃与升级工作。替代编译器要等真实产品通过兼容性和成本控制后再进入方案。

构建差异化与水印改变 seed、标识符、字面量编码、基本块布局、虚拟指令集和逐客户标记。它主要处理迁移成本,让一个样本的分析结果更难直接变成下个版本或其他客户的自动化。差异化也会降低可复现性和缓存效率,团队需要保存每个 seed、映射、工具链、客户分配与制品哈希。水印要服务于可以解释的取证流程,并经受普通重新打包;一个明文客户 ID 只会提供新的定位器。

2.3 加壳、虚拟化与运行期检查

加壳与 loader 保护会压缩或加密节区、重建导入,并在启动阶段恢复代码或数据。通用压缩器改变磁盘表示和体积,保护型 loader 还可能增加运行期解密、导入隐藏、内存清理与恢复镜像周围的检查。评估时需要同时观察启动前文件、运行内存、官方解包路径和通用 dump/rebuild 路径。恢复底层分析面已经足以重新启用许多旧工具,无需达到逐字节恢复。

短时代码与数据保护会缩短装载后的观察窗口。保护器可以在使用前解密一个函数或资源,改变内存页权限,执行后清除明文,再恢复受保护表示;密钥可以从会话、设备关系或服务端 challenge 派生。验收要测可用字节停留多久、多少线程能够进入该区域、执行期间的 dump 是否包含它,以及 hook 能否在消费点抓到输出。Go 还有额外工程约束:goroutine 调度、栈增长、GC 管理内存中保留的副本、panic 路径与并发调用者都可能延长数据寿命或造成崩溃。这类方法会提高时序和动态插桩工作,也要求每个支持平台补 race、崩溃、挂起恢复与更新测试。

二进制变异与虚拟化位于 Go 源码名称之下。mutation 用替代指令序列和控制流形态表达原逻辑,virtualization 把选定函数翻译成私有指令集,再交给嵌入式虚拟机解释;逐构建虚拟机还能提高迁移成本。保护区域应当小、冷、稳定且高价值。只把 marker 包在内部签名检查周围,可能留下函数入口或调用者的最终决策作为更简洁目标。VMProtect 自身手册也讨论了整函数选择,以及同时保护注册检查和消费结果的业务过程。放置位置是一项必须测量的工程变量。

反静态措施通过隐藏导入、间接分派、表驱动调用、代码与数据布局扰动,以及减少分析器依赖的目录信息,削弱一次离线扫描能够直接得到的结构。验收要分别记录普通字符串与反汇编结果、Go 感知恢复结果和手工可达路径。让某个解析器退出只关闭了一条自动化路线。故意制作畸形文件去击穿解析器会增加兼容与生态风险,不进入推荐集合。

反动态措施检测调试器、断点、hook、动态插桩框架、注入模块、模拟器、虚拟机、沙箱、时间异常和内存 dump;watchdog 与双进程可以重复这些检查。每个信号都有规避和误报路径。企业 EDR、辅助工具、兼容层、CI、崩溃收集和客户合法调试都可能呈现相似特征。生产设计把这些信号用于延迟、风险评分和遥测,并为合法环境保留支持路径;验收同时需要命中控制、无分析环境的负控制、错误恢复和最终发布镜像兼容测试。

完整性与自校验包括平台签名、签名 manifest、节区或函数哈希、资源校验、内存页检查、分布式交叉校验与远端挑战。检查代码、期待值和失败分支总要放在某个位置。客户端实现可以与被测代码一起被研究,分散和冗余会增加工作量,却不会移动最终权限。流水线顺序直接影响正确性:源码变换、编译、链接后元数据处理、商业保护、资源处理与加壳全部稳定后,再做最终平台签名;内部完整性元数据也要绑定它预期的布局阶段。

授权与秘密架构完成最后一层。只要发行方密钥得到保护,签名离线许可证可以阻止未授权声明生成;设备密钥和硬件令牌提高克隆成本;短期租约、nonce 与重放控制、账号和设备绑定、撤销、速率与并发限制、风险遥测,会缩短复制 capability 的寿命和范围。把高级计算、数据集或模型调用留在服务端,就能让这部分价值不进入分发文件。这个方法族改变权限预算,并给客户端延迟层配上可执行的响应手段。

3 删掉调试符号,还留下什么

Go 二进制具有较强自描述性,因为 goroutine 栈、垃圾回收、panic 报告、反射、接口和运行时符号化都需要结构化数据。在 Go 1.26.5 中,pcHeader 保存函数与文件数量,以及函数名、编译单元、文件、PC 表和行号表偏移;moduledata 指向这些表,同时记录代码范围、类型、类型链接、接口链接、模块名、初始化任务和相关运行时状态。传统原生符号视角只覆盖其中一部分。

规范化基线使用 -buildvcs=false -trimpath -ldflags="-buildid=",大小为 3,626,496 字节。七个声明标记中,模块路径、三个决策函数名和三个业务字符串都可见。GoReSym 识别出 Go 1.26.5、373 个用户函数、约 2,361 个标准库函数、11,943 个类型和 1,025 个字符串;Redress 恢复构建与模块上下文;Delve 可以按 main.allowPremium 下断点,进入源码行并读取参数。

增加 -s -w 后,文件缩小到 2,492,928 字节。七个标记仍在,GoReSym 返回相同的 373 个用户函数和 11,943 个类型,Redress 仍保留决策名称与模块信息。Delve 无法再解析同一个源码名断点,坏签名控制仍能在调试器下运行并以状态 3 退出。这里分出了三层分析面:普通调试符号、Go 运行时拓扑和实际运行。删除一条入口路径具有明确价值,验收结论应当直接写出是哪条路径。

三个并列纸档案比较原生或去符号、UPX 解包后、Garble 处理后的分析信息,并提醒分别验证有效与无效授权

左右滑动查看图中说明。

图 1. 三种制品分别比较,不是依次处理。原生与去符号制品仍有 Go 元数据;UPX 解包恢复可用分析面;启用 -literals 的 Garble 改变名称和字面量。信息可见性与授权结果正确性需要分别检查。

3.1 被编译器还原的混淆

第二个受控程序在同一套 go1.26.5 windows/amd64 工具链下测试五种小型源码技巧。一个构建使用正常优化,另一个使用 -gcflags=all=-N -gcflags=all=-l。默认制品 SHA-256 为 5226BC52FEF4186E27D15D0BEDB466F6FD61426F078506E2F9F46CABFFF0C9FF,关闭优化制品 SHA-256 为 096C86C49A97CA72A0C5D6601A98CFFBC1E5D8EED9CE055EDC343D93C5B60D07;两者产生相同的预期运行输出。

一个在源码中拆成两段常量的标记,在可执行文件里直接出现为完整明文 SOSEC-LAB-COMPILE-FOLDED。放在 if false 里的诱饵同时消失在两份制品中,包括关闭普通优化的构建。GoReSym 在正常制品里找不到 main.naiveSplit、main.deadDecoy 和 main.thinWrapper;关闭内联后,三个函数都有记录。Go 固定源码 src/cmd/compile/internal/inline/inl.go 第 5–17 行描述了两轮内联和实验所用的 -l 控制。

带 //go:noinline 的包装函数在两种构建中都保留下来。它保住了预期函数边界,也给分析工具留下一个稳定边界。运行期 XOR 解码让 SOSEC-LAB-RUNTIME-DECODE 不出现在两份文件中,程序可以正确打印它;同一个可执行文件携带字节数组、固定 0x25 key、解码循环和明文使用点。这个方法确实让一次静态字符串查询失效,其安全属性止于静态可见性。

由此得到一条适用于所有源码混淆器的“编译器存活门槛”。先证明变换进入了发布二进制,再证明有效行为仍工作、无效行为仍失败;随后测量旧分析路线中的哪一步失去直接复用,最后计算让变换存活所需的性能、诊断和维护成本。复杂源码 diff 和成功构建属于前置材料,后续问题仍需逐项关闭。

4 同一个程序,保护前后有什么变化

主实验只使用一个 Ed25519 授权程序、固定时间与输入、相互隔离的可写缓存,并为每种制品状态执行十项精确输出控制。证据逐级前进:厂商或仓库声明;固定版本、源码、发布真实性和工具哈希;成功生成输出并检查静态面;有效与无效运行控制;最后补性能、调试、解包、完整性或兼容边界。开源核心对象到达后两级,商业产品停在文档、制品身份或有限输出生成层。

制品或配置测到的变化它实际改变的工作对默认方案的影响
-s -w 发布裁剪3,626,496 降到 2,492,928 字节;七个标记仍在,GoReSym 仍恢复 373 个用户函数和 11,943 个类型;Delve 原名称断点失效。删除普通调试符号入口,保留大部分 Go 运行时结构。作为低风险发布卫生保留;不能替代 Go 原生混淆。
基础 Garble v0.16.02,678,272 字节;模块路径与三个业务函数名不再直接命中,三个业务字面量仍在;GoReSym、Redress 和原名称断点退出;双构建一致。提高按名称、路径和 Go 专用解析器开始定位的成本。本样本的开源首选;真实产品先验证兼容性,再与 Go 工具链一起固定和升级。
Garble -literals七个选定标记全部离开直接匹配;制品增至 5,578,752 字节,运行时仍会重建明文。URL、协议字段、功能名和错误文本不能再直接匹配,需要进一步恢复其值。只给能直接暴露敏感路径的自有包和字面量开启。
Garble -tiny制品为 2,311,680 字节,三个业务字面量仍在;panic、fatal、trace 和更多位置数据被删除。减少诊断和部分名称入口,同时让支持团队失去现场信息。默认排除;只有明确接受诊断损失时进入。
gostrip df648e23621c十项控制通过,七个标记留下四个;GoReSym 退出,Redress 不再恢复模块路径。对既有 Go 可执行文件做窄范围链接后元数据削减。按目标单独 POC,并承担逐 Go 版本、反射、插件和 panic 堆栈回归。
Aurum-OBF 9d703c54c923改写一个 URL 与两个字符串,十项控制通过;GoReSym 仍恢复 376 个用户函数、11,943 个类型、模块路径和三个业务函数名。定向移除少量明文,并试验 overlay manifest。实验候选;错误处理、复现、更新和平台工程完成前不进生产。
UPX 5.2.0stripped 制品压到 828,416 字节,Garble literals 压到 1,647,104;packed 状态隐藏目录,官方解包恢复函数、类型、字符串和决策名。压缩磁盘制品并增加一个可逆解包步骤;启动 p50 明显增加。只为体积目标采用;不计入防破解基线。
实验性 Garble 控制流内部与调用侧两种放置都通过十项控制;扩大到调用者后热路径增量区间更宽,累计构建还出现四个 .rdata 字节漂移。让直达调用侧决策的路线进入变换代码,同时增加性能、诊断和制品身份成本。只进入隔离冷路径 POC;当时不作为发布默认。

基础 Garble 是本次普查中证据最完整的开源选择:发布有签名且可以固定,机制能够直接读源码,制品完成了功能、可见性、调试、性能和可复现性检查。-literals 通过运行期表达式移走静态入口,适合能直接指向付费路径的少量文本;维护者也明确记录了足够投入下的恢复可能,因此它只证明搜索路线发生了变化。

-tiny 与 gostrip 处理不同问题。前者主动换取更少的 panic 与 trace 信息,后者在普通 Go 制品上改写函数名表的部分条目并清除内联构建信息。gostrip 的反射、panic 堆栈、插件、跨平台和大型程序仍需逐版本 POC。Aurum-OBF 的 internal/manifest/overlay.go 第 49–105 行显示普通路径使用无密钥 SHA-256 footer,外部认证 key 才进入 HMAC 路径;实验中一个 CLI 输出模式返回 null,另一路径 panic,生产错误与更新语义仍未闭合。

UPX packed 制品让当时 GoReSym 退出,Delve 启动两个输入时都返回“not an executable file”;本轮调试证据止于这条启动工作流,运行期调试保持未测。对 stripped 样本执行官方 upx -d 后,文件哈希改变,Go 1.26.5、373 个用户函数、11,943 个类型、1,025 个字符串、模块路径和三个决策名重新出现;Garble 样本则回到 Garble literals 的可见边界。UPX 项目明确不提供保护或加密,这组结果把它固定在体积优化角色。

4.1 为什么要连调用者一起测

样本先由 parseAndVerifyLicense 校验 Ed25519 签名和声明,再由 featureGate 计算资格,最后由调用者 allowPremium 决定是否执行付费功能。下面比较的两个位置,就是中间的资格计算与最后消费结果的分支。

这组控制流实验属于 Garble 明确标注的实验功能,构建时显式设置 GARBLE_EXPERIMENTAL_CONTROLFLOW=1,固定 block_splits=4 junk_jumps=16 flatten_passes=2,并与 -literals -tiny 组合。一份制品保护 featureGate,累计制品同时保护 featureGate 与 allowPremium。两者都通过十项控制,选定名称、路径和字面量均失去直接匹配。第二种放置会让针对调用侧决策的直达路线进入变换代码。当时证据只够把它放在隔离 POC 中。

两轮性能实验采用轮转顺序。每个变体先做两次预热,再由 15 个独立进程分别验证 5,000 次有效授权;启动先预热三次,再测量 30 个进程。共享主机上基线热路径 p50 从 59.73 微秒移动到 76.40 微秒。内部控制流增加 6.16% 和 6.27%,内部加调用者增加 29.80% 和 13.20%。稳定的内部增量和更宽的累计区间支持一项受限结论:扩大保护位置提高了这个样本的成本和波动。真实程序需要在自己的冷、热路径上重复同一实验。

两行授权结果传递示意,上行只圈住 featureGate,下行同时圈住 featureGate 与消费其结果的 allowPremium,两个方案都在客户端执行

左右滑动查看图中说明。

图 2. 箭头表示结果传递:许可证解析结果交给 featureGate,资格结果由调用者 allowPremium 消费,不表示左侧函数调用右侧。把保护扩到调用者会改变需要分析的代码范围,也增加热路径与诊断成本;最终判断仍在客户进程里。

UPX 的成本集中在启动。stripped packed 制品的启动 p50 是基线的 5.69× 与 6.10×,Garble literals 加 UPX 是 8.22× 与 8.81×。这些制品的热路径方向在两轮之间变化,当时数据没有稳定的大幅热路径信号。常驻桌面应用可能只支付一次解包,CLI、更新器、serverless 任务和临时 worker 会在每次启动时支付。文件体积、启动、更新、崩溃与端点安全预算需要分开记录。

累计控制流构建还暴露了一条可复现边界。同一 seed、相同 4,985,344 字节大小的两份新缓存输出拥有不同哈希,差异是 .rdata 运行时 PC 表中的四个字节;.text 与其他七个 PE 节一致。五次 debug-directory 构建产生三种生成源码哈希,可见差异是变量类型声明组顺序。固定 Garble internal/ssa2ast/func.go 第 1121–1149 行通过两个 map 形成声明组,组内名称排序,组顺序未排序。这是一项仓库源码推导的定位,尚无上游确认。要求双构建哈希一致的团队,应等该实验参数的漂移得到独立审查修复,或制定明确的制品身份策略后再采用。

5 开源与商业工具怎么选

公开产品与仓库普查截止到 2026 年 7 月 24 日。直接纳入要求公开材料明确支持 Go 源码、Go gc 输出或当时 Go 工具链,并且版本或提交可以固定。相邻对象包括通用 PE/ELF 保护器、替代编译器、压缩器和单项变换。Shellcode 编码器、payload crypter、流量与数据混淆库、只剩文档的仓库、来源不明二进制,以及把解析器漏洞当卖点的工具,都按已记录原因排除。十三类方法构成工程能力图;仓库和产品名称则是一份有日期的公开候选账本。新发现的同类项目可以继续加入账本,方法图、纳入规则和比较口径保持稳定。

GitHub 普查用了十一组名称、描述、语言和 topic 查询,覆盖 Go 混淆、保护器、二进制保护、反调试与 anti-tamper;最宽的 topic 查询返回 53 个仓库。去重和源码阅读后,得到一个成熟 Go 原生基线、若干当时窄工具、遗留改写器、反调试探针,以及大量无关数据或 payload 项目。这个过程形成可重复的搜索边界,小型仓库不会因为命中关键词就自动升级为生产保护器。

Garble 是直接开源基线,有签名 v0.16.0 发布、当时 Go 支持、持续维护和最深本地证据。gostrip 是窄范围链接后元数据处理器。Aurum-OBF 是实验性 Windows 源码与 overlay 工具。alosgarble 声明提供符号、字面量、控制流、完整性、诱饵、ballast 和可选反调试;干净固定提交 7e584f7e91b3 的一次兼容构建因 commandWeb 未定义而失败,来自本地修改快照的结果不归因给上游。go-obfuscation 展示了广泛 PoC 功能,包括字符串池、不透明谓词、控制流、简单 VM、反调试、anti-DBI、anti-VM、完整性和元数据变换。它的源码同时说明文本式变换、简单 VM 与不完整平台测试,因此当时贡献是方法发现和源码审计证据。

遗留与单项项目填充更窄的方法格。gobfuscate 在一次 Go 1.26.5 兼容尝试中停在旧 GOPATH 改写流程。mumbojumbo、gofuscator、monmind、obfuse、Doge-Obf、GoBfuscator 和 obfuscatxor 主要做源码或字符串变换。审计过的 GoBfuscator 输出把编码后的 AES key 与生成解密器一起携带,obfuscatxor 携带本地 XOR key。GoDefender、buggi、SecureX 和小型 anti-debug 仓库实现运行期环境探针,GoDefender 已归档。这些项目帮助枚举字面量、诱饵、反调试、anti-VM 与沙箱方法,其范围不覆盖完整发布保护生命周期。

替代代码生成保留为相邻类别。TinyGo 与 gccgo 会产生明显不同的制品和运行时假设,两者都有维护者记录的兼容边界。汇编和 cgo 可以把小段算法移出 Go 感知名称模式,同时形成普通原生分析面。可移植性与维护成本已经可接受时,它们可以进入产品 POC。“保护器”标签还需要可固定的保护机制、行为控制、分析面变化和发布运营证据。

自研保护器是独立的生产路线,不属于公开工具排行榜。团队可以维护 cmd/compile 或 linker pass、-toolexec 包装器、产品专用 post-linker、小型解释器、逐构建虚拟指令集和水印服务,把保护精确落在自己的协议与决策路径上。它换来的是长期所有权:每个 Go 版本的编译器回归、ABI 与 GC 约束、崩溃符号化、交叉编译、代码签名、端点兼容、构建复现和客户回滚都由团队承担。只有已有编译器/二进制工程能力、公开工具无法满足明确威胁模型,并且年度维护预算高于一次采购 POC 时,这条路线才有合理杠杆。

5.1 商业产品还缺哪些验证

截至七月核对,这些商业产品都还缺少本文要求的生产验证。VMProtect 3.10.6 公开列出 Golang、x86/x64/ARM64、Windows、Linux、macOS 与 Android,并提供 mutation、virtualization、combined、packing、内存保护、授权和水印。其手册说明软件保护上限、packed 代码的运行期恢复、性能分类、marker 与整函数选择,以及在注册检查和消费结果的业务逻辑周围布置保护。本地 3.10.6.2770 demo 安装器签名有效,制品身份保存在公开账本;默认项目生成 wrapper 输出后停在 demo 对话框。函数选择、授权控制与虚拟化性能仍是空白 POC 单元,因此它获得的是通用离线保护的首测位置。

Oreans 当时同时发布 Themida、WinLicense 与 Code Virtualizer 3.2.5.0。三条产品线都列出 Go gc;Themida 和 WinLicense 面向 Windows x86/x64 原生程序,后者增加试用、注册、硬件锁与许可证管理;Code Virtualizer 面向 Windows、Linux、macOS 的 x86/x64/ARM64 选定代码区。官方功能对照把三者的角色分开,发布历史还记录了 Go 字符串加密、macro marker 与启动 marker 修复。本地固定 3.2.4.34 Themida demo 可执行文件签名有效;纯 CLI 尝试要求先通过 GUI 生成项目,未产生受保护目标。这个结果只固定 demo 工作流边界,另外两条产品线也没有本地制品证据。

Virbox Protector Native 文档列出 Go、PE/ELF/dylib、Windows/Linux/macOS/ARM、虚拟化、字符串加密、完整性、GUI 与 CLI。公开下载页列出 3.6.0.22848,日期为 2026 年 6 月 29 日。本轮没有取得同时具备固定版本、哈希、签名者和许可证状态的本地试用制品,证据停在文档层。

Enigma Protector、Obsidium、StarForce Crypto 与 Safengine 保留为通用邻近产品,因为当时公开材料没有给出本矩阵需要的直接 Go 保证。PELock 面向 32 位 Windows,超出 Windows/amd64 范围。UPX 是可逆压缩对照,Pakkero 与 Kiteshield 是 Linux ELF 学术或教育相邻项目。ChaosProtector 的公开定位包含利用 CVE 让分析工具崩溃和绝对抗分析表述,同时没有带签名与固定身份的本地制品进入证据集,因此不做安全实验。

商业采购要达到决策级证据,厂商需要在目标 Go 版本和平台上保护采购方真实程序,交付固定安装器、许可证状态、项目、命令、日志、输入与输出哈希和支持边界。采购方独立运行正负授权、名称与字面量恢复、内部与调用侧两种放置、调试与 dump 观察、启动和热路径、崩溃恢复、安装与更新、最终代码签名,以及实际发布镜像上的端点安全。缺失单元保持空白,功能数量和成功生成输出属于不同证据等级。

七月候选配置、支持范围与退出条件
要完成的工作七月受测配置或首测候选对象与放置当时证据等级通过与退出条件
受测样本的 Go 混淆基线Go 1.26.5 + Garble v0.16.0只处理自有敏感包;先名称、路径和发布信息,再对能直接指向付费路径的字面量开启 -literals;所有后处理结束后做平台签名。受控样本通过;真实产品与版本变化都需另验。签名发布与固定源码可审;本地制品完成 140 项正负授权控制、静态、Delve、性能和复现检查。行为控制全过、seed 可反解堆栈、性能和崩溃信息在预算内才发布;失败时恢复上一版已签名制品,并保留同提交普通对照件。
联网高价值功能的权限控制10 分钟 capability 作为 SOSEC 起始值,本地校准范围为 5–15 分钟服务端保存授权判断、重放窗口、撤销和关键业务执行;客户端只持短期、绑定受众/账号/设备/功能的令牌。架构建议,按产品校准。受控实验验证了签名授权真实性;真实大产品的服务端容量和滥用结果需要本地测量。过期、重放、撤销、并发和断网分支全部验收;服务故障时按承诺退到基础功能、只读或短宽限,不能静默发成长效授权。
高价值离线程序的通用虚拟化VMProtect 3.10.6先保护一段冷路径,同时覆盖内部资格计算和调用者最终决策;跨平台或 ARM64 项目从这里开始。下一证据门槛是有许可证 POC。官方资料直接列出 Go 与目标平台,本地签名 demo 只到 wrapper 工作流,尚无生产级受保护目标。供应方交付固定项目、许可证状态和哈希;任何负控制放行、崩溃不可诊断、更新/签名失败、端点冲突或预算超限都终止评估。
Windows 整体保护、loader 与 packingThemida 3.2.5.0Windows x86/x64 原生 EXE/DLL;先用最小保护配置建立兼容基线,再逐项增加 loader、虚拟化或运行期控制。下一证据门槛是有许可证 POC。官方资料列出 Go gc;本地 demo 只确认 CLI 需要 GUI 创建的项目,没有生成当时受保护目标。厂商项目必须可重复构建、升级和签名;GUI-only 流程无法进入 CI、合法客户路径变化或 final artifact 不可诊断时退出。
保护与厂商许可证/试用管理一体化WinLicense 3.2.5.0Windows x86/x64 应用;只在产品确实需要厂商许可证、试用、硬件锁和注册工作流时进入。下一证据门槛是有许可证 POC。当时公开证据为官方产品与 Go 支持材料,本研究没有本地 WinLicense 制品。用买方现有签名授权做并行对照;迁移、离线恢复、客户支持或密钥治理劣于现有系统时停止采购。
少量跨平台高价值代码区Code Virtualizer 3.2.5.0Windows、Linux、macOS 的 x86/x64/ARM64 选定区域;marker 同时覆盖资格结果和消费结果的调用侧路径。下一证据门槛是有许可证 POC。平台、架构与 Go gc 有官方材料,本研究没有本地受保护制品。只接受小而冷的区域;marker 漏选、ABI/崩溃回归、热路径超预算或跨平台结果不一致时退出。
多平台 native 与 CLI 供应商工作流Virbox Protector Native 3.6.0.22848需要同一家供应商覆盖 Windows、Linux、macOS、ARM 和 CLI 集成的项目;仍从一段真实冷路径开始。下一证据门槛是固定的有许可证 POC。官方文档与下载版本可固定,本研究没有同时固定版本、哈希、签名者和许可证状态的本地制品。先取得可核验安装器和许可边界;无法复现项目、无法关闭高误报 hard-fail、更新或签名流程不稳定时退出。
构建、授权与发布检查的完整说明

实验中的授权路径由 parseAndVerifyLicense 校验 Ed25519 签名与声明,featureGate 计算资格,allowPremium 执行最终调用侧决策。Go 在 go1.26.5/src/runtime/symtab.go 第 376–451 行定义的 pcHeader 与 moduledata 保存函数名、文件、PC、类型、代码区和初始化关系;src/debug/buildinfo/buildinfo.go 第 55–98 行定义可读取的构建信息。普通 strip 留下这张 Go 感知结构图,构建基线因此需要单独处理名称、路径和字面量。

签名版 Garble v0.16.0、提交 60a6019f196ece4da360038f905b6c154426a64a 在 main.go 第 113–128 行暴露 literal、tiny 与 seed 控制,internal/literals/literals.go 第 39–60 行把字面量改写成运行期表达式。控制流是另一条证据等级:固定版 docs/CONTROLFLOW.md把它标为 experimental,要求显式设置 GARBLE_EXPERIMENTAL_CONTROLFLOW=1;internal/ctrlflow/ctrlflow.go 第 100–135 行接收函数级变换指令。以下保留实验采用的参数和发布检查,实际产品应先验证所用 Go 与 Garble 版本是否兼容。

Go 与 Garble 构建:版本、签名与恢复

固定对象
复现实验时固定 Go 1.26.5 与 Garble v0.16.0;发布产品时记录实际通过兼容验证的工具链、源码提交、依赖和构建容器。Garble 使用 PATH 中的 Go;两者作为一组升级。用 GOGARBLE 限定自有私有包,避免无收益地改写全部依赖。
构建命令
基线参数为 -buildvcs=false -trimpath -ldflags="-s -w -buildid="。敏感包使用 garble -seed=<stored-base64-seed> -literals build …;先保留一份同提交普通构建作为行为、性能和崩溃对照。
发布顺序
源码与资源变换、编译、必要的链接后处理、商业保护和安装器处理全部完成后,再做 Authenticode、Apple notarization 或平台签名。任何签名后的字节改写都会产生新制品,必须重新签名和验收。
保留材料
私下保存 seed、反解映射、符号、输入与输出 SHA-256、工具哈希和无保护回滚件。丢失 seed 会让 garble reverse 在事故时失去作用。

付费离线功能:签名授权覆盖调用侧决策

授权结构
客户端只携带 Ed25519 等签名算法的公钥;发行方私钥和长期对称秘密留在受控服务。声明至少绑定产品、功能、客户、期限与授权版本,解析失败、字段缺失和签名失败都进入拒绝路径。
保护位置
把资格计算和真正消费结果的调用侧分支视为一个保护单元。只变换验证 helper 会留下更便宜的最终决策入口。Garble 控制流当时只进入实验性 POC;它和商业虚拟化都优先选择低频、稳定、价值高的小段代码,并在真实工作负载上测 p50/p95。
迁移成本
按发布更换 seed;具备制品治理能力时增加逐客户水印或差异化构建。一个客户样本的定位结果因此更难直接复用于下个版本和其他客户,构建系统同时承担映射、签名、支持与回滚账本。
离线上限
设备最终获得长期本地执行权。高价值产品可增加 TPM、设备证书、硬件令牌和周期续期,并明确断网宽限、换机、时钟异常与客户恢复流程。

联网高价值功能:把可兑现的权限放到服务端

默认令牌
签发 5–15 分钟 capability,绑定 audience、账号、设备、功能、到期时间、会话或 nonce。客户端在到期前刷新;服务端保存重放窗口、并发、速率、撤销与风险状态。
执行位置
高级数据、模型、规则库或关键计算留在服务端。客户端混淆保护协议、缓存与有限离线资产,服务端在每次高价值请求上重新判断权限。
故障方式
连接失败时保留基础功能;高级操作按产品承诺进入短宽限、只读或明确拒绝。宽限 token 也要限定受众、设备和最长寿命,不能静默变成长效万能授权。
事件响应
异常设备、重放、并发漂移或水印泄漏触发限速、挑战、撤销与定向更新。客户端保护由此获得可兑现的响应窗口。

商业 POC 与最终验收:一次只验证一项工作

任务边界
从本章候选资料选定一项工作及其首个 POC;只有该候选不覆盖目标平台、缺失必需能力或触发退出条件时,才让候补进入。供应方必须返回固定安装器、许可状态、项目文件、命令、日志和输入输出哈希。
必测结果
有效授权成功;坏签名、过期、错产品、错功能、损坏编码和缺文件全部拒绝。再测名称与字面量恢复、内部与调用侧两种放置、调试和内存观察、启动与热路径、崩溃、更新、签名和最终制品端点安全。
回滚门槛
任何合法客户路径变化、负控制放行、崩溃不可诊断、启动或热路径越预算、更新失败、签名失效或端点安全冲突,都让该配置退出发布。保留上一版已签名制品和关闭单个保护层的开关。
默认排除
UPX、-tiny、gostrip、Aurum-OBF、全局 anti-debug hard-fail 和整包虚拟化都要由明确目标单独申请进入;上线证据必须来自对应目标的行为、成本与兼容性验收。

每个最终制品都重跑同一组行为控制:有效授权应成功,坏签名、过期、错误产品、错误功能、空客户、三种损坏编码和缺文件应以预定方式失败。再比较普通构建与受保护构建的启动、热路径、崩溃可观测性、安装更新和端点安全。发布先走小流量或单客户 canary;任何保护层关闭后都重新生成、签名和记录新哈希,不能在现场直接修改已签名文件。

6 签名能保护什么,服务端又改变什么

受控 Ed25519 许可证证明了一项强而有用的能力。客户端无需携带发行方私钥,就可以拒绝伪造签名、过期、错误产品、错误功能、客户缺失、损坏授权包和文件缺失,简单编辑无法生成新的有效权利。公钥、解析器、语义检查、资格值、调用侧分支和付费功能代码都随同一个客户可控进程交付,它们的本地位置决定权限上限。

有连接能力的产品可以签发短期 capability,绑定受众、功能、账号、设备上下文、过期时间和 nonce 或 challenge。服务端保存重放窗口、撤销、速率、并发和风险状态。关键请求携带 capability 进入服务端业务逻辑,敏感数据、算法或模型执行留在该边界之后。复制 token 因而只拥有狭窄时间和范围。被修改客户端仍可滥用服务有意开放的接口,所以服务端授权、滥用控制和隐私治理仍需完整设计。

硬件会改变一部分离线问题。TPM 支持的密钥、设备证书、安全执行环境和加密狗会提高提取、复制或换机使用成本,远程证明可以让服务端决策绑定测量过的设备状态。本地代码仍要消费结果并调用能力,重放、调用侧放置、宽限期和恢复路径都需要设计。完全离线、长期有效的高级功能最终会把执行权限交给设备。产品风险接受应当写明这条边界,再配置延迟、差异化、取证与更新节奏。

客户端携短期授权向服务端请求结果,核心逻辑留在服务端,并配合撤销、设备与重放控制及遥测

左右滑动查看图中说明。

图 3. 短期授权随请求交给服务端,结果返回客户端。把核心业务留在服务端,并配合重放与设备控制、撤销和遥测,才能限制被修改客户端持续取得的价值。签名的真实性校验与客户端混淆的作用仍需分别理解。

6.1 一次分析能被复用多久

Garble 可以移除廉价名称和路径搜索;字面量变换会增加恢复明文的步骤;调用侧控制流或虚拟化会扩大需要理解的区域;逐客户构建和水印会降低直接复用并支持泄漏归因;完整性与运行信号能够暴露一部分修改和自动化滥用。它们为服务端撤销、轮换、限速、更新和调查争取时间。当一次客户端失守只能得到有限权限时,这些层的杠杆更高。

弱杠杆设计通常同时具有一个全局离线二进制、一个长期授权、一个稳定调用侧分支、一份所有客户相同的制品和零遥测。大型保护器会提高第一个样本的工作量,稳定制品与权限结构仍让结果容易批量复用。产品团队应先把第一笔架构预算花在权限与分段上,再把客户端保护放到最容易规模化的攻击路线。

7 值得保留的保护,必须能维护

决定保留哪一层保护时,把分析者多做的事与你每次发布多做的事放在一起看。混淆后旧名字找不到了,这是具体收益;同一配置让崩溃无法反解、更新经常失败,也是真实代价。本文没有一个可信的“延缓破解天数”可以填进预算,但已有结果足够排除一些不合算的默认选择,例如只为防破解而压缩整个程序,或没有诊断准备就打开 -tiny。

落到自己的产品,先选一条真实付费路径,保留普通构建作为对照,标出解析许可证、计算资格、消费结果和执行功能的位置。然后只增加一种保护,重跑有效授权、坏签名、过期、错产品、错功能、损坏输入与缺文件控制,并比较启动、热路径、崩溃、安装更新和签名。实验性控制流或商业虚拟化先放在隔离的小段冷路径;合法行为变化、无效授权被接受、签名失效或成本超限,都应停止采用该配置。

发布前还要把恢复方式试一遍。所有字节变换完成后再签名,从单客户或小流量开始,保存上一版已签名制品和逐层关闭开关。关闭保护也要重新构建、签名并记录哈希。联网授权的故障行为与离线产品的宽限、续期、换机同样需要验证,不能等客户断网或升级失败后临时决定。

每份发布 manifest 应绑定 Go 版本、GOOS/GOARCH、构建参数、源码和依赖提交、保护器版本与来源、工具哈希、seed 或项目、适用时的客户身份、输入与输出 SHA-256、签名身份与时间戳、控制结果、静态与调试观察、解包或 dump 边界、启动与热路径、崩溃恢复、端点安全状态和回滚制品。seed、反向映射、符号、私有签名材料和水印分配进入受控存储。丢失 Garble seed,会在事故最需要堆栈恢复时关闭官方支持的反向路径。

端点兼容性必须使用最终制品测量。本次研究只保留一组早期 Defender 按需扫描记录;当时实时、行为、IOAV 和按访问保护均关闭,平台/客户端为 4.18.26060.3008-0,引擎 1.1.26060.3008,签名 1.455.286.0,六次按需扫描没有检出。当时受限进程读取状态时返回拒绝访问,当时运行时兼容性仍未测量。生产台账要在精确最终签名制品上记录引擎、平台、签名版本与时间、实时和行为监控状态、扫描方式、样本哈希与结果。

实验账本与复现材料

公开实验账本(JSON)给出 14 种制品身份、脱敏后的代表性构建与后处理命令模板、十项授权控制定义、分析器与 Delve 观察、性能收据、可复现性结果、十一组市场查询、候选和排除理由。账本 SHA-256 为 22CC8819516358293402FEA685B12304DB944F3FF5552B7D9B832E4BC02A9761。私有样本、许可证、授权修改、补丁位置和可复用机器码签名没有进入公开附件。

候选资料保留产品支持范围和退出条件,实验结果表保留逐制品的静态、调试、性能与复现观察。工具链或保护器版本改变后,应在新版本上重做相同控制,不能沿用七月制品的结果。

我会优先保留那些收益明确、每次发布仍能承担的措施。对这个样本,名称与字面量变换确实改变了廉价定位方式;扩大控制流保护会增加自身运行成本;UPX 解包后原分析结构重新出现。至于商业虚拟化能增加多少工作,还需要买方的真实程序和有许可证的实验。保护做得好,应当让对方更费力,同时让你仍有能力维护、诊断和更新交到客户手里的产品。

8证据与来源

8.1研究范围

受控样本Go 1.26.5 windows/amd64

用于全部十四种构建与后处理状态的 Ed25519 授权验证程序

Garble 源码60a6019f196ece4da360038f905b6c154426a64a

所有 Garble 制品使用签名 v0.16.0 tag 对应提交

UPX 发布包 SHA-256B471EBF1B7F20F4A89150264ED9A008A2A5BFD247F3C6D1184A75BB59CA08F5D

与发布摘要一致的 UPX 5.2.0 官方 Win64 包

控制收据 SHA-25671B8081E12792F290B928CE97756B974AB73AAF5196E007CBF08F6878C7F4EDD

十四种可执行文件状态乘十项精确输出授权控制

性能比较 SHA-256C22CA6F4A12B39FA255D52BBA174DBD9346A7731BC335A6403E95240203A4CA4

绑定两轮轮转顺序性能实验的比较收据

静态分析收据 SHA-256F75E08AE72671D4C10A2E39FCE7F813E399E0004D0A62CAF8DE9FEECE4BD9E2C

所有受测制品状态的固定 GoReSym 与 Redress 结果

Delve 收据 SHA-256ABF467EBE3A404B51D2D591D5B1DC32646EC81973A5750A1A09AB23694AF0718

Delve v1.27.0 名称断点与受控运行观察

可复现收据 SHA-256D6A1E57F602C3666F80E7FE0C958E360D2B8F6A246A6EE0F8DA6C5CBAAD43BF3

新缓存双构建与累计控制流元数据漂移定位

编译器存活制品 SHA-2565226BC52FEF4186E27D15D0BEDB466F6FD61426F078506E2F9F46CABFFF0C9FF

用于源码变换存活检查的正常 Go 1.26.5 构建

公开实验账本 SHA-25622CC8819516358293402FEA685B12304DB944F3FF5552B7D9B832E4BC02A9761

公开的构建、控制、分析、性能、可复现性与市场普查附件

8.2时间线

  1. Oreans 3.2.5.0 产品线发布

    Themida、WinLicense 与 Code Virtualizer 当时公开版本列出 Go gc 支持,发布记录包含 Go StrEncrypt 与 marker 修复。

  2. 固定 Aurum-OBF 源码

    提交 9d703c54 提供本次实验性定向字符串制品所审阅的源码与 overlay 实现。

  3. UPX 5.2.0 发布

    官方 Win64 包与发布摘要成为固定压缩和解包对照。

  4. VMProtect 3.10.6 发布

    当时版本增加整函数 marker,并延续 Golang、跨平台与 ARM64 支持;公开下载于 7 月 23 日更新。

  5. Virbox 3.6.0.22848 列出

    厂商下载页确定当时文档所列 native protection 版本,本矩阵没有纳入固定本地试用制品。

  6. 固定 gostrip 源码

    提交 df648e23 成为实验使用的 Go 链接后元数据处理对象。

  7. SOSEC 方法普查与实验冻结

    十三类方法、公开市场普查、140 项授权控制、编译器存活检查、静态与调试观察、官方解包、两轮性能和可复现性定位均绑定到源码与收据身份。

  8. 商业 POC 顺序与公开账本刷新

    重新核对当时官方版本,按工作确定五条产品线的首测顺序,确认商业候选仍需买方 POC,并发布脱敏复核账本。

8.3来源与材料

  1. Go 命令与构建参数官方文档https://pkg.go.dev/cmd/go
  2. Go 链接器官方文档https://go.dev/cmd/link/?m=old
  3. Go 1.26 发布说明https://go.dev/doc/go1.26
  4. 固定 Go 1.26.5 pcHeader 与 moduledata 源码https://github.com/golang/go/blob/go1.26.5/src/runtime/symtab.go#L376-L451
  5. 固定 Go 1.26.5 嵌入式构建信息读取源码https://github.com/golang/go/blob/go1.26.5/src/debug/buildinfo/buildinfo.go#L55-L98
  6. 固定 Go 1.26.5 内联实现说明https://github.com/golang/go/blob/go1.26.5/src/cmd/compile/internal/inline/inl.go#L5-L17
  7. Go 官方调试指南https://go.dev/doc/gdb
  8. Garble 仓库https://github.com/burrowers/garble
  9. Garble v0.16.0 签名发布https://github.com/burrowers/garble/releases/tag/v0.16.0
  10. Garble issue 984:破坏性与变换性功能https://github.com/burrowers/garble/issues/984
  11. 固定 Garble 实验性控制流文档https://github.com/burrowers/garble/blob/60a6019f196ece4da360038f905b6c154426a64a/docs/CONTROLFLOW.md
  12. 固定 Garble 字面量变换源码https://github.com/burrowers/garble/blob/60a6019f196ece4da360038f905b6c154426a64a/internal/literals/literals.go#L39-L60
  13. 固定 Garble 控制流入口源码https://github.com/burrowers/garble/blob/60a6019f196ece4da360038f905b6c154426a64a/internal/ctrlflow/ctrlflow.go#L100-L135
  14. 固定 Garble 声明组生成源码https://github.com/burrowers/garble/blob/60a6019f196ece4da360038f905b6c154426a64a/internal/ssa2ast/func.go#L1121-L1149
  15. gostrip 仓库https://github.com/idaifish/gostrip
  16. 固定 gostrip 元数据处理源码https://github.com/idaifish/gostrip/blob/df648e23621cec5bf8b01cb6696dd2afd3ef01d3/internal/gostrip.go#L12-L105
  17. Aurum-OBF 仓库https://github.com/adjisoft/aurum-obf
  18. 固定 Aurum overlay 实现https://github.com/adjisoft/aurum-obf/blob/9d703c54c923ea7d313c4a2876387723d3b932a1/internal/manifest/overlay.go#L49-L105
  19. alosgarble 仓库https://github.com/guno1928/alosgarble
  20. go-obfuscation 概念验证仓库https://github.com/lukaszraczylo/go-obfuscation
  21. gobfuscate 遗留源码改写器https://github.com/unixpickle/gobfuscate
  22. UPX 仓库与安全定位声明https://github.com/upx/upx
  23. UPX 5.2.0 发布https://github.com/upx/upx/releases/tag/v5.2.0
  24. TinyGo 标准库兼容矩阵https://tinygo.org/docs/reference/lang-support/stdlib/
  25. gccgo 官方安装与兼容指南https://go.dev/doc/install/gccgo
  26. OWASP MASVS 韧性控制https://mas.owasp.org/MASVS/11-MASVS-RESILIENCE/
  27. Microsoft Control Flow Guard 文档https://learn.microsoft.com/en-us/windows/win32/secbp/control-flow-guard
  28. Microsoft 代码签名与应用控制指南https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/deployment/use-code-signing-for-better-control-and-protection
  29. VMProtect 概览https://vmpsoft.com/vmprotect/overview
  30. VMProtect 用户手册https://vmpsoft.com/vmprotect/user-manual/
  31. VMProtect 版本新闻https://vmpsoft.com/news/
  32. Themida 产品与平台页https://www.oreans.com/index.php/Themida.php
  33. WinLicense 产品与许可证管理页https://www.oreans.com/index.php/WinLicense.php
  34. Oreans 三条产品线、平台与 Go 编译器支持页https://www.oreans.com/index.php/CodeVirtualizer.php
  35. Oreans 产品功能对照https://www.oreans.com/CompareProducts.php
  36. Themida 发布历史https://www.oreans.com/ThemidaWhatsNew.php
  37. Virbox Protector Native 文档https://appshield.virbox.com/native-protect.html
  38. Virbox 发布下载页https://appsec.virbox.com/down.html