Golang 二进制文件如何以及为何显示有关错误的文件和行信息

how and why Golang binary shows file and line info on the error

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

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

您可以删除 DWARF 信息以提高安全性,如前所述elsewhere on SO and a bunch of ELF sections vanish, but your best bet if you're really worried would probably be to preprocess your sources to obfuscate identifiers and filenames before compile. But there doesn't appear to be a ready-made tool to do so

我不是 Go 的设计者之一,但我猜想走得更远是不切实际的,因为内省之类的事情(例如 C 做不到的事情)。像 upx 这样的压缩器会稍微混淆静态文件(并且似乎可以在编译后的 Go 上工作——可能有一两个警告),但如果你知道它在那里(到任何安全类型都会采取的程度),撤消是微不足道的拿走我的开发者许可证,因为我什至提到过它)。

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