猿问

如何确定 ELF 文件是否为 Go ELF 文件?

我需要确定给定的 ELF 文件是否来自 Go。根据此链接

$ readelf -a traefik.stripped | grep "\.note\.go\.buildid"

这是否以任何方式不如 Go 的原生方式:

$ go tool buildid traefik.strippedoPIWoPjqt1P3rttpA3ee/ByNXPhvgS37nIoJY-HYB/8b25JYXrgktA-FYgU5MU/0Posfq41xZW9BEPEG4Ub

两种方法都可以保证在剥离的二进制文件上工作吗?


哈士奇WWW
浏览 189回答 3
3回答

摇曳的蔷薇

我需要确定给定的 ELF 文件是否来自 Go这是一般情况下不可能做到的。什么是和不是 Go 二进制文件没有很好的定义,一个充分优化的 Go 二进制文件最终可能只包含几条指令。例如x86_64,您可能会得到一条HLT指令。为什么 strip 本身不会删除此部分?这部分(实际上是每个部分)对于执行不是必需的——您可以删除所有部分,二进制文件仍然可以工作。本节仅用于帮助开发人员识别特定构建。 默认情况下strip不会删除它,因为这会破坏本节的目的,但它当然可以这样做。一个无辜的 go 开发人员可以构建一个 golang ELF 并意外删除这个(冗余??)部分当然。开发人员可以运行一个损坏的版本strip,或者他可以使用别名strip,strip --strip-all或者他可以使用其他一些 ELF 后处理工具,或者他可以使用 UPX,或者......

红颜莎娜

至于使用标准的 go 工具,该部分应该在那里,但是有一种方法可以隐藏二进制文件的 go 特性而没有任何恶意。使用upx来减小二进制文件的大小将完全隐藏二进制文件的 go 特性,因为 upx 可以处理任何语言的二进制文件。

侃侃尔雅

提到的部分是一个NOTE部分:$ readelf -a traefik.stripped | grep "\.note\.go\.buildid" | sed -n "1,1p"  [11] .note.go.buildid  NOTE             0000000000400f9c  00000f9c显然NOTE,有时可能会删除部分以减小尺寸(相关):objcopy --remove-section=.note.go.buildid traefik.stripped traefik.super.stripped删除提到的部分似乎不会损害整个二进制文件的完整性
随时随地看视频慕课网APP

相关分类

Go
我要回答