-1

我在玩 go 同步组,我只是尝试了如果我添加的组多于我标记完成会发生什么。我得到了我在下面发布的运行时错误。 所以这里的问题是,如果 go 被编译成真正的机器代码,不像 java 或 c#,为什么我的文件甚至行信息可以显示在运行时错误中。如果文件信息保存在二进制文件中,我认为它可以很容易地反编译。我做错了什么我是否需要为产品构建添加一些 env 变量,或者它就像 c# 没有真正的方法来隐藏你的代码

4

1 回答 1

1

所以为了好玩,我写了一个简单的 Go 程序,它只是 panic()s 并尝试使用 objdump 和 objcopy 来查看这些信息在哪里。在 Linux(可能还有其他)上,Go 将相关信息粘贴在 ELF 部分 .gopclntab 中。如果删除它,对实际程序源的引用就会消失,但运行时会崩溃。并且在该部分中引用了更多运行时。* 内容(可能用于链接和内省)。我认为您不太可能在完全没有这些信息的情况下真正运行 Go 程序。

您可以删除 DWARF 信息以获得某些安全性,如SO 上其他地方提到的,并且一堆 ELF 部分消失,但如果您真的担心,您最好的选择可能是在编译之前预处理您的源代码以混淆标识符和文件名。但似乎没有现成的工具可以这样做

我不是围棋设计师之一,但我猜想走得更远是不切实际的,因为内省之类的事情(例如 C 不能做的事情)。像 upx 这样的压缩器会稍微混淆静止的文件(并且似乎可以在编译的 Go 中正常工作——可能会有一两个警告),但如果你知道它在那里,那么撤销它是微不足道的(以至于任何安全类型都需要甚至因为我提到它而放弃了我的开发人员许可证)。

现实情况是,您实际上能做的最好的事情就是那些真正有兴趣弄乱您的代码的人。混淆来源,如果你真的有这样做的动机,那将是你最好的选择(尽管对于足够坚定的攻击者最终仍然是徒劳的)。

于 2016-09-15T22:57:14.737 回答