如何保护(模糊)Go二进制文件不被破解



我想出售Go应用程序。我将向我的客户提供序列号。有没有办法使破解应用程序变得更加复杂?

我说破解C应用程序很复杂,破解Java应用程序很容易。是否有工具可以使Go应用程序破解工作与破解C应用程序一样困难?还是一些教程?至少我可以做一些事情来保护我的项目。我不问超重保护。

一旦你有了二进制文件本身,混淆就非常困难了。人们以前曾尝试过从 Go 二进制文件中剥离符号,但这通常会导致不稳定和不可预测的行为,因为某些反射操作需要符号。

虽然您不一定能混淆静态链接的库,但您当然可以通过在编译之前更改变量、类型和函数名称来混淆您的/own/代码。如果你想更进一步,你可以尝试获取你正在使用的库的源代码(标准库的源代码可用,包含在大多数 Go 安装中),并将此混淆应用于库源代码。

至于编译后的二进制修改,正如我之前提到的,最好远离它。

添加 joshlf13 的答案:虽然不建议剥离 Go 二进制文件,但您可以将一个标志传递给链接器以始终省略调试符号:

将"-s"标志传递给链接器以省略调试信息(例如,go build -ldflags "-s" prog.go)。

(使用 GDB 调试 Go 代码)

这至少应该是一种更好的方法,因为我还没有看到任何警告,例如关于编译后剥离符号的警告。

另一种选择,Go 1.16+(2021 年 2 月:

burrowers/garble

生成一个与常规构建一样工作的二进制文件,但有关原始源代码的信息尽可能少。

该工具旨在:

  • cmd/go相结合,以支持模块和构建缓存
  • 确定性和可重现性,给定相同的初始源代码
  • 给定原始来源可逆,以对恐慌堆栈跟踪进行去混淆

这可能不足以满足您的需求,但这是一个好的开始。

最新更新