用Go反编译已编译的程序

问题描述 投票:0回答:4

我用

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

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

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

这可能吗?

compiler-construction go decompiling
4个回答
60
投票

没有工具可以做到这一点,并且当 Go 程序被编译成机器代码时,它们不包含足够的信息来将它们翻译回 Go 代码。不过,标准拆卸技术仍然是可能的。


37
投票

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

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

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

即使在 Golang 代码的符号调试方面也很少。

例如,据我所知,GDB 目前的状态与 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


3
投票

现在有一种方法可以进行逆向工程, 但之后仍然需要付出很多努力。

参考:GoTools

这适用于 [Ghidra](https://github.com/NationalSecurityAgency/ghidra/releases),NSA 的逆向工程工具。

GoLang 重命名器

此 Python 脚本有助于某些反编译后任务重命名。

注意:在尝试任何此操作之前,请参阅当地法律,确保您不会弄乱任何专有软件。


0
投票

有一个项目,您可以使用它来获取有关剥离的二进制文件的一些详细信息: https://github.com/goretk/redress

© www.soinside.com 2019 - 2024. All rights reserved.