web-dev-qa-db-ja.com

リバースエンジニアリングcプログラム

このバイナリが配布されている場合、すべてのcプログラムはマシンコードに変換されます。コンピュータの命令セットはよく知られているので、Cの元のプログラムを取り戻すことは可能ですか?

15
shreyasva

コンパイルされたコードで保存されたメタデータがないため、まったく同じソースに戻ることはできません。

ただし、アセンブリコードからコードを再作成することはできます。

これらのことに興味がある場合は、この本をチェックしてください: リバース:リバースエンジニアリングの秘密

編集

一部のコンパイラ-101ここでは、「コンパイラ」ほど技術的ではなく、別のWordでコンパイラを定義するとしたら、それは何でしょうか。

回答:翻訳者

コンパイラーは、作成した構文/フレーズを別の言語に変換し、Cコンパイラーはアセンブリーまたは機械語に変換します。 C#コードはILなどに変換されます。

あなたが持っている実行可能ファイルはあなたの元のテキスト/構文の単なる翻訳であり、あなたが「それを逆にする」、したがって「それを元に戻す」ことを望むなら、あなたはおそらく最初に持っていたのと同じ構造を得ないでしょう。

より現実的な例は、英語からドイツ語に翻訳し、ドイツ語から英語に翻訳する場合、センテンス構造が異なる可能性が高く、他の単語が使用される可能性がありますが、意味、コンテキストはほとんど変更されていません。

CからASMに移行する場合、コンパイラー/トランスレーターにも同じことが言えます。ロジックは同じで、読み取り方法が異なります(もちろん最適化されています)。

16
Filip Ekberg

元のCプログラムの意味によって異なります。ローカル変数名やコメントなどはバイナリに含まれていないため、バイナリの生成に使用されたものとまったく同じソースコードを取得する方法はありません。 IDA Pro などのツールは、バイナリの逆アセンブルに役立つ場合があります。

5
Darin Dimitrov

本当に熟練したハッカーのコンバージョン率は、1日あたり約1キロバイトのマシンコードであると推測します。一般的な欧米の給与では、たとえば100KBの実行可能ファイルの価格は約25,000ドルになります。それだけのお金を費やした後、得られるのは、コメントなどの利点を除いて、あなたがしていることを正確に実行するCコードのチャンクだけです。それはあなたのバージョンと決して競争力がありません、あなたはアップデートと改善をはるかに速く提供することができるでしょう。これらの更新をリバースエンジニアリングすることも簡単ではありません。

その値札が印象的でない場合は、コードを追加することで、変換コストを任意に上げることができます。このような大規模なプログラムに取り組むことができる熟練したハッカーには、もっと良いことがあることを覚えておいてください。彼らは独自のコードを書きます。

4
Hans Passant

私が知っているこのトピックに関する最高の作品の1つは次のとおりです。

ソーセージからの豚?FermaTを介してアセンブラーからCにリエンジニアリング

元のasmコードがCで書かれていなくても、妥当なCプログラムを取り戻すことができるという主張です。多くの警告が適用されます。

4
Ira Baxter

これを行うツールに取り組むことは研究活動です。つまり、簡単なケースで何かを取得することが可能です(たとえば、デバッグシンボルが存在しない限り、ローカル変数名を復元することはできません)。大規模なプログラムの場合、またはプログラマーがそれを困難にすることを決定した場合、実際にはほとんど不可能です。

3
Pascal Cuoq

この手順の一般名は「ハンバーガーを牛に戻す」です。バイナリコードを機能的に同等のCプログラムにリバースエンジニアリングすることは可能ですが、そのCコードが元のコードと非常に類似しているかどうかは未解決の問題です。

3
John Bode

Hex-Rays デコンパイラー(IDA Proへの拡張)はまさにそれを行うことができます。それはまだかなり最近であり、今後の予定ですが、大きな期待を示しています。慣れるのに少し時間がかかりますが、逆転プロセスをスピードアップする可能性があります。これは「特効薬」ではありません。c逆コンパイラーはありませんが、すばらしい資産です。

3
joveha

Hex-rays.comを試すことができます。これには、アセンブリコードを99%の精度でCに逆コンパイルできる非常に優れた逆コンパイラがあります。

2

Cプログラムとそれが生成するASM /マシンコードの間に1:1のマッピングはありません-1つのCプログラムは、異なるコンパイラまたは異なる設定で異なる結果にコンパイルできます)、Cの2つの異なるビットが同じものを生成する場合がありますマシンコード。

あなたは間違いなくcanコンパイルされたEXEからCコードを生成します。構造が元のコードとどれほど似ているかを知ることはできません。変数/関数名が失われることを除けば、コードが多くのファイルに分割された元の方法がわからないと思います。

2
Mr. Boy