我想出售 Go 应用程序。我将向我的客户提供序列号。有没有办法让破解应用程序变得更复杂一些?
我说破解C app很复杂,破解Java app很容易。有没有工具可以让 Go 应用破解工作和破解 C 应用一样难?或一些教程?至少我可以做一些事情来保护我的项目。我不问超重保护。
我想出售 Go 应用程序。我将向我的客户提供序列号。有没有办法让破解应用程序变得更复杂一些?
我说破解C app很复杂,破解Java app很容易。有没有工具可以让 Go 应用破解工作和破解 C 应用一样难?或一些教程?至少我可以做一些事情来保护我的项目。我不问超重保护。
一旦你有了二进制文件本身,混淆是非常困难的。人们之前曾尝试从 Go 二进制文件中去除符号,但这通常会导致不稳定和不可预测的行为,因为某些反射操作需要符号。
虽然您不一定会混淆您静态链接的库,但您当然可以通过在编译之前将变量、类型和函数名称更改为无意义的名称来混淆您的 /own/ 代码。如果您想更进一步,您可以尝试获取您正在使用的库的源代码(标准库的源代码可用并且包含在大多数 Go 安装中),并将此混淆应用于库源代码也是如此。
至于编译后的二进制修改,正如我之前提到的,最好远离它。
添加 joshlf13 的答案:虽然不建议剥离 Go 二进制文件,但您可以将一个标志传递给链接器以始终省略调试符号:
将“-s”标志传递给链接器以省略调试信息(例如,go build -ldflags "-s" prog.go)。
这至少应该是一种更好的方法,因为我没有看到任何警告,例如关于在编译后剥离符号的警告。
另一种选择,使用Go 1.16+(2021 年 2 月:
burrowers/garble
生成一个可以像常规构建一样工作的二进制文件,但尽可能少地包含有关原始源代码的信息。
该工具旨在:
- 再加上
cmd/go
, 来支持模块和构建缓存- 给定相同的初始源代码,确定性和可重复性
- 在给定原始来源的情况下可逆,以消除混乱堆栈跟踪
这可能不足以满足您的需要,但这是一个好的开始。