web-dev-qa-db-fra.com

Décompiler un programme compilé avec Go

J'ai construit un programme exécutable simple avec Go.

J'ai compilé le code dans un programme binaire statique.

Je veux décompiler le fichier binaire de sortie et obtenir le code source Go.

C'est possible ou pas?

26
Chandra Nakka

Il n'y a aucun outil pour le faire et comme les programmes Go sont compilés en code machine, ils ne contiennent pas suffisamment d'informations pour les retransformer en code Go. Les techniques de démontage standard restent cependant possibles.

43
fuz

Il n'existe aucun outil connu qui décompile actuellement les sources Go.

Go est un compilateur en langage natif, contrairement à Java et les langages similaires, qui s'appuient sur un chargeur de classe, utilisent un éditeur de liens pour produire ses exécutables. Par conséquent, la reconstruction de l'arborescence des appels est, comme dans C et des langues similaires, beaucoup plus difficiles.

Les informations de débogage telles que les symboles sont normalement supprimées de l'exécutable Go.

Il existe très peu même en termes de débogage symbolique du code Golang.

GDB par exemple est AFAIK dans son état actuel non aligné avec l'architecture Go et n'est pratiquement pas fonctionnel en termes de débogage symbolique de Golang. Go GDB a été déposé sur IntelliJ pour cette raison.

Des efforts expérimentaux tentent de récupérer la fonctionnalité GDB par certains utilisateurs, mais ceux-ci nécessitent que les sources Go aient été compilées avec des dispositions spéciales non standard afin de prendre en charge le débogage. par exemple: http://blog.securitymouse.com/2014/10/golang-debugging-turning-pennies-into-gs.html D'autres débogueurs symboliques pour Go nécessitent également l'insertion de code non standard dans afin de prendre en charge le débogueur, par exemple Hopwatch

Par conséquent, si vous avez besoin de désosser un programme Go, vous êtes mieux avec des outils de rétro-ingénierie traditionnels de niveau inférieur tels que IDA PRO. C'est certainement possible, mais tout au plus vous obtiendrez quelque chose qui ressemble à du pseudo-code C, ou ASM, jamais des sources Go.

Certaines fonctionnalités de la langue n'existent pas dans d'autres langues, par exemple canaux, et ceux-ci nécessitent une étude et une approche non triviale. Par exemple: http://jolmos.blogspot.nl/2014/09/inbincible-writeup-golang-binary.html

24