使用 Go 反编译已编译的程序

新手上路,请多包涵

我用 Go 构建了一个简单的可执行程序。

我已将代码编译成静态二进制程序。

我想反编译输出的二进制文件并获取 Go 源代码。

这可能吗?

原文由 Temüjin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 8.6k
2 个回答

没有工具可以做到这一点,并且由于 Go 程序被编译成机器代码,它们不包含足够的信息来将它们翻译回 Go 代码。尽管如此,标准的反汇编技术仍然是可能的。

原文由 fuz 发布,翻译遵循 CC BY-SA 3.0 许可协议

目前没有已知的工具可以反编译为 Go 源代码。

Go 是一种本地语言编译器,与依赖类加载器的 Java 和类似语言不同,它使用链接器来生成其可执行文件。因此,就像在 C 和类似语言中一样,仅仅重建调用树要困难得多。

诸如符号之类的调试信息通常会从 Go 可执行文件中剥离。

即使就 Golang 代码的符号调试而言,也很少见。

例如,GDB 在其当前状态下是 AFAIK,与 Go 架构不一致,并且在 Golang 符号调试方面实际上不起作用。出于这个原因,Go GDB 已从 IntelliJ ide 中删除。

有一些用户试图重新获得 GDB 功能的实验性努力,但是这些需要 Go 源代码是用特殊的非标准规定编译的,以支持调试。例如:http: //blog.securitymouse.com/2014/10/golang-debugging-turning-pennies-into-gs.html Go 的其他符号调试器也需要插入非标准代码以支持调试器,例如 跳表

因此,如果您需要对 Go 程序进行逆向工程,最好使用传统的、较低级别的逆向工程工具,例如 IDA PRO。这绝对是可能的,但最多你会得到类似于伪代码 C 或 ASM 的东西,而不是 Go 源代码。

该语言的一些特性在其他语言中是不存在的,例如通道,这些需要一些研究和一个重要的方法。例如:http: //jolmos.blogspot.nl/2014/09/inbincible-writeup-golang-binary.html

原文由 Michele Giuseppe Fadda 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题