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

56

我使用 Go 编写了一个简单的可执行程序。

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

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

这是否可能?


9
在某种意义上,Go 是图灵完备的,但是因为没有相应的工具,所以又不是。 - Paul Hankin
1
这是一个对于一门如此年轻的编程语言来说非常有趣的地方。人们想要反编译用它编写的代码。这意味着,关键任务的代码正在使用golang编写。向年轻的1.4.2版本的golang致敬。 - Supreet Sethi
3个回答

62

目前没有相应的工具来实现这一点,因为Go程序被编译成机器码后,它们不包含足够的信息以将其翻译回Go代码。但标准的反汇编技术仍然是可行的。


1
仅仅因为机器码中没有编译足够的信息,并不意味着不能从中生成一个等效的golang程序。 - Jimmy R.T.
3
JEB 反汇编器的网站上有一篇关于如何将 Golang 转换成伪 C 代码的博客文章。这并不是制造 Golang 代码,但它可以让你了解应用程序内部的情况。 - Tony Maro

38

目前没有已知的工具可以将程序反编译成Go源代码。

与Java等语言不同,Go是一种本地语言编译器,使用链接器生成其可执行文件,而不是依赖于类装载器。 因此,仅仅重构调用树就像C和类似语言一样更难。

调试信息,例如符号通常从Go可执行文件中剥离。

几乎没有关于Golang代码的符号调试方面的信息。

例如,据我所知,GDB在其当前状态下与Go架构不对齐,实际上在符号调试方面在Golang上几乎无法正常工作。正因为这个原因,在IntelliJ ide中取消了对Go GDB的支持。

有些用户正在进行实验性的努力,试图通过一些特殊非标准规定编译Go源代码以支持调试功能。例如: http://blog.securitymouse.com/2014/10/golang-debugging-turning-pennies-into-gs.html 其他针对Go的符号调试器也需要插入非标准代码以支持调试器,例如Hopwatch

因此,如果您需要反向工程一个Go程序,最好使用传统的低级别反向工程工具,例如IDA PRO。 这是绝对可能的,但最多只能得到类似C或ASM的伪代码,而不是Go源代码。

语言的某些特性在其他语言中不存在,例如通道,这需要一些学习和非平凡的方法。例如:http://jolmos.blogspot.nl/2014/09/inbincible-writeup-golang-binary.html


5
这些东西在2022年还有效吗?即:没有已知的工具可以反编译已编译的Go二进制文件? - aquaman
1
显然现在可以从剥离的二进制文件中恢复函数名称(https://cujo.com/reverse-engineering-go-binaries-with-ghidra/)。 - Michele Giuseppe Fadda

4
现在有一种逆向工程的方法,但是在此之后仍需要付出很多努力。参考:GoTools。这个工具与[Ghidra](https://github.com/NationalSecurityAgency/ghidra/releases)一起使用,它是一个用于逆向工程的NSA工具。此外,GoLang Renamer是一个Python脚本,可以帮助完成某些反汇编后的重命名任务。请注意:在尝试任何操作之前,请查阅当地法律,以确保您不会涉及任何专有软件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接