実行可能ファイルをCソースコードに戻す


14

残念ながら、ソースコードを紛失し、Linuxのgccで作成された出力ファイルがあり、PCにアクセスできません。出力ファイルをソースファイルに変換する方法はありますか(LinuxのCでは)?


必要なものは逆コンパイラと呼ばれます。あなたはこの答えでいくつかの助けを見つけるかもしれません:stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf

デコンパイラモジュールを備えたIDA Proは、実際に大きな実行可能ファイルで機能する唯一の実用的なソリューションです。
fpmurphy 2017

@ fpmurphy1ホッパーを入手しました。品質はIDA Proに匹敵し、価格のほんの一部です。
ルイF・リベイロ

@ fpmurphy1まだ32ビットプラットフォームを使用しているAvastによって生成されたコードの品質を確認できませんでしたか?その上、私は何十年もWintelを使っていません。unix.stackexchange.com/questions/418354/…を参照してください。価格の違いは非常に重要ですが、Hex-rays / IDAプロは個人ライセンスの1500USDから、5000USD以上の商用ライセンスの恐喝値まで、AFAIK、ホッパーは100USDです。単一ユーザーの場合、および単一コンピュータの場合は130。
ルイFリベイロ

@RuiFRibeiro。私が調べた多くのマルウェアの地獄はまだ32ビットです。
fpmurphy 2018年

回答:


25

牛を飼っていたが、うっかりそれをハンバーガーに変えてしまい、牛を元に戻したいと思った。

申し訳ありませんが、この方法では機能しません。

バックアップからソースファイルを復元するだけです。

ああ、バックアップがありませんでした。残念ながら、宇宙はあなたにそのための休憩を与えません。

バイナリを逆コンパイルできます。それはあなたのソースコードを与えることはありませんが、それはあなたにあげるいくつかの同じ動作をするソースコードを。デバッグバイナリでない限り、変数名は取得できません。最適化なしでコンパイルしない限り、まったく同じロジックは得られません。当然、コメントは得られません。

Boomerangを使用して一部のプログラムを逆コンパイルしましたが、その結果はマシンコードよりも読みやすくなりました。それが最高のツールかどうかはわかりません。とにかく、奇跡を期待しないでください。


1
ブーメランはかなりきれいに見えます。ドキュメントがgcc -O4を参照しているのは残念です。メモリが正しく機能している場合、(-O3を超えて)まったく何もしないからです。もちろん、最後の文は最初の5文と同様に非常に有効です。定期的にバックアップすることの重要性について非常に強く主張しているので、残りが有効ではないというわけではありません。+1
プリフタン共和国

6

実行可能ファイルのリバースエンジニアリングでは、いくつかのツールが一般的です。

  1. コマンド「file」は、ファイルパスを最初のパラメーターとして取るため、(ほとんどの場合)所有している実行可能ファイルのタイプを判別できます。
  2. 実行可能ファイルの動作を正確に示していますが、その特定のアーキテクチャでアセンブリコードを記述していないか、逆アセンブルの経験がない場合は、逆アセンブラ。
  3. Boomerang、Hex-rays、Snowmanなどの逆コンパイラは、読みやすさは向上しますが、実際の変数名や元のプログラムの構文を復元できず、特に、実行可能ファイルを作成したエンジニアがこれらのパッケージは、セキュリティをさらに難読化しようとしました。
  4. データフロー図または表。私はこれを自動的に行う無料のツールがないことを知っていますが、(sedまたはPerlで記述できる)アセンブリ出力のテキストパーサーの上にあるPythonまたはBashスクリプトが役立つ場合があります。
  5. フローとアイデアを書き留めるための鉛筆と紙、信じられないかもしれません。

私が見たほとんどの場合、コードは最初から書き直すか、アセンブリ言語プログラムとして維持するか、古いバージョンに変更要求を再適用することによって再構築する必要がありました。


1
#1:欠点もあるが真。#3:商業用でしょうか?私は学問的に興味があります(私は冗長なバックアップを持っているので、そのようなことは必要ありません)。#4:cflow(ソースを使用していますが、バイナリで動作するものもあります-もちろんいくつかの注意点があります)が思い浮かびます。あなたが何を求めているかに応じて、そこには他にもいます。グラフィカル出力については、そのタイプのものに対してグラフィック出力が好きではない、または必要としないので、私はそこで助けることができません(実際には、もっと気が散ります)。#5:とてもそうです。もちろん、ここでテキストファイルを使用することもできます。
プリフタン

3

やりたいことを「逆コンパイル」といいます。そこには多くの逆コンパイラがあり、それらすべてをここでカバーすることは現実的ではありません。

ただし、一般的な注釈として、Cソースから実行可能マシンコードへの変換は不可逆です。例えば:

  • コメントは不可逆的に失われます
  • 変数名がなくなった
  • パフォーマンスのためにループが展開される場合がある
  • 関数は再配置される場合があります

コードが記述どおりにコンパイルされることはまれです。最近のほとんどのコンパイラーは、コードを大幅に変更して最適化します。したがって、逆コンパイルすると、コンパイラーはソースコードがどのように見えるはずであるかを推測できるだけでありコードがなくなったことを知る方法はありません。デコンパイラーが優れている場合、取得したコードは少なくとも同等の実行可能ファイルにコンパイル可能であり、読み取り可能になるようにゆっくりとリファクタリングを開始できます。しかし、おそらくデコンパイラーは絶対に読めないスパゲッティコードを生成し、それを解読することは大きな頭痛の種になるでしょう。場合によっては、プログラムを最初から書き直すだけで済むこともあります。


コメントに関して、私が最近気づいたことは-これが逆コンパイラによってコメントを読み取れるかどうか、また逆コンパイラがこのタイプのものを探すことを期待しないかどうかはわかりません-これ:-Cコメントを破棄しません。すべてのコメントは出力ファイルに渡されますが、処理されたディレクティブのコメントは例外であり、ディレクティブとともに削除されます。副作用だけでなく、-CCオプションの副作用も強調表示されます(これはgccの場合ですが、おそらくcppです)。私はそれがOPに適用されることを期待しているわけではありませんが、いくつかに興味があるかもしれません。
プリフタン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.