Ответ 1
Нет никакого инструмента для этого, и поскольку программы Go компилируются в машинный код, они не содержат достаточной информации, чтобы перевести их обратно в код Go. Стандартные методы разборки все еще возможны.
Я создал простую исполняемую программу с Go
.
Я скомпилировал код в статическую двоичную программу.
Я хочу декомпилировать выходной двоичный файл и получить исходный код Go.
Возможно ли это или нет?
Нет никакого инструмента для этого, и поскольку программы Go компилируются в машинный код, они не содержат достаточной информации, чтобы перевести их обратно в код Go. Стандартные методы разборки все еще возможны.
Не существует известного инструмента, который в настоящее время декомпилирует источники Go.
Go - это компилятор на родном языке, в отличие от Java и подобных языков, которые полагаются на Class Loader, использует компоновщик для создания своих исполняемых файлов. Поэтому просто восстановление дерева вызовов, как и на C и подобных языках, намного сложнее.
Отладочная информация, такая как символы, обычно удаляется из исполняемого файла Go.
Существует очень мало даже в терминах Symbolic отладки кода 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 также нуждаются в вставке нестандартного кода для поддержки отладчика, например. Hopwatch
Поэтому, если вам нужно перепроектировать программу Go, вам лучше использовать традиционные инструменты для обратного проектирования на нижнем уровне, такие как IDA PRO. Это определенно возможно, но в лучшем случае вы получите что-то похожее на псевдокод C или ASM, а не на источники Go.
Некоторые особенности языка не существуют на других языках, например. каналов, и для этого требуются некоторые исследования и нетривиальный подход. Например: http://jolmos.blogspot.nl/2014/09/inbincible-writeup-golang-binary.html