web-dev-qa-db-ja.com

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

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

14
mahsa

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

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

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

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

decompile バイナリを使用できます。それはあなたのソースコードを与えることはありませんが、同じ振る舞いのsomeソースコードを与えるでしょう。デバッグバイナリでない限り、変数名は取得できません。最適化なしでコンパイルしない限り、まったく同じロジックは得られません。もちろん、コメントは得られません。

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

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

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

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

5
Douglas Daseeco

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

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

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

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

3
Bagalaw