首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定ELF文件是否为Go ELF文件?

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

Stack Overflow用户
提问于 2021-11-03 08:52:18
回答 3查看 460关注 0票数 1

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

代码语言:javascript
复制
$ readelf -a traefik.stripped | grep "\.note\.go\.buildid"

这在任何方面都比传统的方式低劣吗?

代码语言:javascript
复制
$ go tool buildid traefik.stripped
oPIWoPjqt1P3rttpA3ee/ByNXPhvgS37nIoJY-HYB/8b25JYXrgktA-FYgU5MU/0Posfq41xZW9BEPEG4Ub

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-03 12:06:47

我需要确定给定的ELF文件是否源自Go。

一般来说,这是不可能的。什么是和不是一个Go二进制没有很好的定义,一个充分优化的Go二进制可能最终只包含几个指令。例如,在x86_64上,您可能会得到一条HLT指令。

为什么脱衣舞本身不移除这部分?

这个部分(实际上每个部分)并不是执行所必需的--您可以删除所有部分,并且二进制文件仍然可以工作。

本节仅用于帮助开发人员识别特定的构建。默认情况下,strip不会删除它,因为这将违背本节的目的,但它当然可以这样做。

一个无辜的go开发人员可以建立一个golang并意外地删除这个(冗余吗?)部分

好的。开发人员可以运行一个坏版本的strip,或者他可以使用strip --strip-all别名strip,或者他可以使用其他的ELF后处理工具,或者他可以使用UPX,或者.

票数 2
EN

Stack Overflow用户

发布于 2021-11-03 10:08:06

上述部分是一个NOTE部分:

代码语言:javascript
复制
$ readelf -a traefik.stripped | grep "\.note\.go\.buildid" | sed -n "1,1p"
  [11] .note.go.buildid  NOTE             0000000000400f9c  00000f9c

显然,为了减少大小( NOTE ),有时可能会删除相关部分:

代码语言:javascript
复制
objcopy --remove-section=.note.go.buildid traefik.stripped traefik.super.stripped

删除上述部分似乎不会损害整个二进制文件的完整性。

票数 1
EN

Stack Overflow用户

发布于 2021-11-03 10:28:59

至于使用标准的go工具,部分应该在这里,但是有一种方式可以隐藏二进制代码的go性质,而不存在任何恶意意图。使用upx减少二进制文件的大小将完全隐藏二进制文件的go性质,因为upx与二进制文件一起工作,不受任何语言的影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69821995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档