このバイナリが配布されている場合、すべての c プログラムはマシン コードに変換されます。コンピュータの命令セットはよく知られているので、C の元のプログラムを取り戻すことは可能ですか?
9 に答える
コンパイルされたコードで保存されたメタデータがないため、まったく同じソースに戻ることはできません。
ただし、アセンブリ コードからコードを再作成することはできます。
これらのことに興味がある場合は、この本をチェックしてください: Reversing: Secrets of Reverse Engineering .
編集
一部のコンパイラ-101 ここで、「コンパイラ」ほど技術的ではなく、別の単語でコンパイラを定義するとしたら、それは何になりますか?
答え:翻訳者
コンパイラは、記述した構文/フレーズを別の言語に変換し、C コンパイラはアセンブリまたはマシン コードに変換します。C# コードは IL などに変換されます。
あなたが持っている実行可能ファイルは、元のテキスト/構文の翻訳にすぎません。「逆に」したい場合は、「元に翻訳」すると、最初と同じ構造にはならない可能性が高くなります。
より現実的な例として、英語からドイツ語に翻訳し、ドイツ語から英語に翻訳すると、文の構造が異なる可能性が高く、他の単語が使用される可能性がありますが、意味や文脈は変わっていない可能性が高くなります。
CからASMに移行する場合、コンパイラ/トランスレータについても同じことが言えます。ロジックは同じです。それは、それを読み取る方法が異なるだけです(もちろん、最適化されています)。
元のCプログラムが何を意味するかによって異なります。ローカル変数名、コメントなどはバイナリに含まれていないため、バイナリの生成に使用されたものとまったく同じソース コードを取得する方法はありません。IDA Proなどのツールは、バイナリの逆アセンブルに役立つ場合があります。
本当に熟練したハッカーのコンバージョン率は、1日あたり約1キロバイトのマシンコードであると推測します。一般的な欧米の給与では、たとえば100KBの実行可能ファイルの価格は約25,000ドルになります。それだけのお金を費やした後、得られるのは、コメントなどの利点を除いて、あなたがしていることを正確に実行するCコードのチャンクだけです。お使いのバージョンと競合することはありません。アップデートや改善をより迅速に提供できるようになります。これらの更新をリバースエンジニアリングすることも、簡単な作業ではありません。
その値札が印象的でない場合は、コードを追加することで、変換コストを任意に引き上げることができます。このような大規模なプログラムに取り組むことができる熟練したハッカーには、もっと良いことがあることを覚えておいてください。彼らは独自のコードを書きます。
私が知っているこのトピックに関する最高の作品の1つは次のとおりです。
ソーセージから豚?FermaT を介してアセンブラーから C にリエンジニアリングします。
元の asm コードが C で書かれていない場合でも、妥当な C プログラムが返されるという主張です。多くの警告が適用されます。
この手順の一般名は「ハンバーガーを牛に戻す」です。バイナリコードを機能的に同等のCプログラムにリバースエンジニアリングすることは可能ですが、そのCコードが元のコードと非常によく似ているかどうかは未解決の問題です。
これを行うツールに取り組むことは研究活動です。つまり、簡単なケースで何かを取得することが可能です (たとえば、デバッグ シンボルが存在しない限り、ローカル変数名は復元されません)。大規模なプログラムの場合、またはプログラマーがそれを困難にすることを決定した場合、実際にはほとんど不可能です。
hex-rays.com を試すことができます。99% の精度でアセンブリ コードを C に逆コンパイルできる非常に優れた逆コンパイラがあります。
C プログラムとそれが生成する ASM/マシン コードとの間には 1:1 のマッピングはありません。1 つの C プログラムが、異なるコンパイラまたは異なる設定で異なる結果にコンパイルされる可能性があります)。C の 2 つの異なるビットが同じ結果を生成する場合もありますマシンコード。
コンパイルされた EXE から C コードを確実に生成できます。元のコードと構造がどれほど似ているかはわかりません-変数/関数名が失われることを除けば、コードが多くのファイルに分割された元の方法がわからないと思います。