web-dev-qa-db-ja.com

Goでコンパイルされたプログラムを逆コンパイルする

Goを使用して簡単な実行可能プログラムを作成しました。

コードを静的なバイナリプログラムにコンパイルしました。

出力バイナリファイルを逆コンパイルし、Goソースコードを取得したい。

これは可能ですか?

26
Chandra Nakka

そのためのツールはありません。Goプログラムはマシンコードにコンパイルされるため、Goコードに変換するための十分な情報が含まれていません。ただし、標準の分解技術は依然として可能です。

43
fuz

現在、Goソースに逆コンパイルする既知のツールはありません。

Goはネイティブ言語コンパイラです。Javaおよびクラスローダーに依存する同様の言語とは異なり、実行可能ファイルを生成するためにリンカーを使用します。したがって、Cのように呼び出しツリーを再構築するだけです。そして同様の言語は、はるかに困難です。

通常、シンボルなどのデバッグ情報はGo実行可能ファイルから削除されます。

Golangコードのシンボリックデバッグに関しても、ほとんど存在しません。

たとえば、GDBはGoアーキテクチャと整合していない現在の状態ではAFAIKであり、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