2011-12-22 92 views

答えて

11

短い回答:できません。

長い回答: C/C++のコンパイルプロセスは非常に損失です。コンパイラは、コードに対する高レベルと低レベルの最適化を大量に行い、生成されたアセンブリコードは元のコードに似ていないよりも頻繁に発生します。さらに、市場にはさまざまなコンパイラがあります(それぞれにはいくつかの異なるバージョンがあります)。それぞれが出力を少しずつ違ったものにしています。どちらのコンパイラが使用されているかを知らなくても、逆コンパイルの作業はもっと無駄になります。最高のところでは、ここではCコードの一部が認識されている部分的な逆コンパイルを行うことができるいくつかのツールについて聞いたことがありますが、まだそれを理解するためにはたくさんのアセンブリコードを読む必要があります。

これは、ソフトウェアのコピープロテクションがクラッキングするのが難しく、特別な組み立てスキルが必要な理由の1つです。

+1

注:.NETとJavaはまったく異なる獣であり、そこでは逆コンパイルが可能です(逆コンパイラを混乱させる可能性のあるコード難読化器があります)。 –

+0

C DLLが特定の '.jar'ファイルにアクセスしていることが分かっていれば、これらはDLLにハードコードされている必要があり、逆コンパイルになるでしょうか? –

+1

難しいです。任意の "リソース"を.DLL/.EXEファイルに追加することは可能です。そのように格納されている場合は、逆コンパイルする必要はありません。リソースビューアのツールがあり、それを解凍できます。その後、Javaである.jarファイルを逆コンパイルすることができます。しかし、.dllファイルにファイルを埋め込む自作の方法もあります。もしそれらのファイルを使用するなら、あなたは不運です。たぶんあなたは、プログラムが実行されている間にこれらのファイルを取得することができ、それらは一時的なフォルダまたは何かに抽出される? –

0

することはできますが、唯一、ある程度まで:

    (DLLではなく、シンボルのインデックスを経由して内部に存在する関数を参照することができます)
  1. シンボルが除去されている可能性のあるコードを変更することができ
  2. 最適化
  3. いくつかの命令の組み合わせはC
  4. と私は忘れるかもしれないいくつかの他のものへの転換ではないかもしれません...
+1

5.コンパイラは関数をインライン化することがあります。 –

3

可能ですが、非常に困難で、C、アセンブリ、そしてこのコードが動作するはずのオペレーティングシステムの複雑さに精通していても、膨大な時間を要します。

問題は、最適化によってコンパイルされたコードが人間にはほとんど認識されないことです。

さらに、逆アセンブラが情報を失うと、あいまいさがあります(同じ命令が異なる方法でコード化され、コードの残りが多くの逆アセンブラ(またはそのユーザ)が取り込まれない特定のコード化結果の逆アセンブルは不完全または不正確になります)。

自己変更コードも同様に問題を複雑にします。

this questionを参照してください。

+1

自己修正コードはC64でヒップしました。現代のプロセッサは、コードが変更されたときにキャッシュやマルチスレッドに問題があります。私はC/C++コンパイラが自己修正コードを生成できるかどうかは分かりません(でもあなたは+1を取得します) – LittleFunnyMan

関連する問題