C言語で組んだ実行ファイルについて質問ですが、

逆アセンブラとかいう手法で、ソースファイルが裸状態になるという噂を耳にしましたが、それは本当でしょうか?もしそれが事実ならどのようにして、
解析するのでしょうか?
具体的な方法に必要な道具など教えていただきたく宜しくお願いします。
(Wikiは必要ないです。)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/06/22 17:42:03
  • 終了:2007/06/27 23:54:38

ベストアンサー

id:noocyte No.3

noocyte回答回数21ベストアンサー獲得回数32007/06/22 20:08:33

ポイント100pt

> アセンブラからCに変換するツール

そういうのを「逆コンパイラ (decompiler)」といいます.

(アセンブラからではなく,実行ファイル (機械語) からですが.)


Java は言語仕様上,逆コンパイルされやすいので,

1996(?)年以降,Java の逆コンパイラはすでにたくさん出回っています.

一方,逆コンパイルを困難にするためのツール

(obfuscator,曖昧化ツール,難読化ツールなどという) も出回っています.


これに対し,C/C++ の逆コンパイラははるかに実現困難です.

逆コンパイルのしやすさは,構文要素によって大きく異なると思います.

例えば,式や OS の API (システムコール) の呼び出しなどは比較的簡単に

逆コンパイルできるはずです.逆に共用体や,キャストしたポインタまたは

ポインタ演算を行ったポインタを使ったメモリアクセスなどは非常に

逆コンパイル困難になるのではないかと考えています.


詳しくは↓ (私が日頃,逆コンパイル技術について色々考えていることを書いたものです.)

OKWave QNo.3043962:デコンパイル?について

http://okwave.jp/qa3043962.html


↓これはまだ書きかけですが….

Cの逆コンパイラはどこまで実現可能か,Javaはなぜ逆コンパイルされやすいか?

http://www5d.biglobe.ne.jp/~noocyte/Programming/Decompile.html


Boomerang:オープンソースの逆コンパイラ

http://boomerang.sourceforge.net/

 そのスクリーンショット

 http://sourceforge.net/project/screenshots.php?group_id=48519&am...


REC 2.1 - Reverse Engineering Compiler

http://www.backerstreet.com/rec/rec.htm


他にもリバースエンジニアリングや逆コンパイル技術の情報サイトなどがありますが,

Wiki は必要ないということなので割愛します.

id:harunoharuno

noocyteさん。

回答ありがとうございます。

逆コンパイルするためには

開発者が使用したコンパイラを特定し、

アセンブラコードを読みながら、

ソースを推測し修正していくのですね。

また、100%の解読は不可能で

解読出来る場所と出来ない場所が存在することが解りました。

JAVAはキャストや、ポインタなどの表現がない点から

解読しやすいとのことでしたが、

これについても、ソースファイルに戻す作業は人間が

アセンブラコードを読みながら行わないと行けないのですね。

アセンブラの読み方くらいは知っていたほうがいいかなぁ

と考えさせられました。

ちなみにWikiを敬遠したのは、

サーチエンジンでトップにでたリンクをただ

貼り付けるだけの回答をなくすためのものです。

勉強に良いサイトなどあるのでしたら、むしろ

教えてください。宜しくお願いします。

2007/06/26 11:36:56

その他の回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/06/22 18:04:40

ポイント60pt

まったくうそというわけではありませんが、元のソースファイルに復元できるわけではありません。


逆アセンブルにより、プログラムのバイナリコードをアセンブルコードに変換することは可能で、これはプログラムにより実現します。


ただし、復元されるのはここまでで元のCソースが復元されるわけではありません。

最適化を行うことでプログラミングの構造も初期の状態から変わることもありますし、if,switch などの分岐や for, while などのループはアセンブラのコードとしては等価なので、元の構文も簡単には判別できません。


変数名や、関数名はラベルとして残ることがありますが、得られる情報はその程度で、コメントはプログラム中には残っていません。

逆アセンブラ

id:harunoharuno

アセンブラからCに変換するツールなどがあれば、実行ファイルからソースを

作成することも可能そうですね。

もしアセンブラからCソースを作成するツールなどありましたら再度教えていただけるとうれしいです。

2007/06/22 18:24:30
id:studioes No.2

studioes回答回数522ベストアンサー獲得回数612007/06/22 18:09:16

ポイント60pt

 逆アセンブルは、Cのソースが出るわけではありません。 アセンブラのソースが出るだけです。

 そして、アセンブラの命令と実行命令はほぼ1:1で対応するので、単純に実行コードを読んでいってASMを吐き出すだけです。

 Cのレベルまでソースを戻すことはほぼ無理です(目指すツールはありますが、完全にはなりません)

 また、吐き出されたソースは、実行に最適化されたソースですので、慣れていなければ読めないと思いますが・・・(int i=0は、xor eax,eaxとかになります)

 必要な道具は、逆アセンブラですね。 フリーもありますし、商用ソフトもあります。 IDA Proが高機能で便利ですね。

http://www.datarescue.com/idabase/index.htm

 方法は、IDA Proを立ち上げて、実行ファイルを入れて、形式を設定するだけです。

id:harunoharuno

回答ありがとうございます。

いろいろ便利な道具があるようですね。

興味があるのですが、アセンブラがわからないと検証できないな・・。

>>Cのレベルまでソースを戻すことはほぼ無理です(目指すツールはありますが、完全にはなりません)

そうなんですか、、、だれかに

中を見られるのではないかと思っていましたが、恐怖が薄らぎました。

2007/06/22 18:28:29
id:noocyte No.3

noocyte回答回数21ベストアンサー獲得回数32007/06/22 20:08:33ここでベストアンサー

ポイント100pt

> アセンブラからCに変換するツール

そういうのを「逆コンパイラ (decompiler)」といいます.

(アセンブラからではなく,実行ファイル (機械語) からですが.)


Java は言語仕様上,逆コンパイルされやすいので,

1996(?)年以降,Java の逆コンパイラはすでにたくさん出回っています.

一方,逆コンパイルを困難にするためのツール

(obfuscator,曖昧化ツール,難読化ツールなどという) も出回っています.


これに対し,C/C++ の逆コンパイラははるかに実現困難です.

逆コンパイルのしやすさは,構文要素によって大きく異なると思います.

例えば,式や OS の API (システムコール) の呼び出しなどは比較的簡単に

逆コンパイルできるはずです.逆に共用体や,キャストしたポインタまたは

ポインタ演算を行ったポインタを使ったメモリアクセスなどは非常に

逆コンパイル困難になるのではないかと考えています.


詳しくは↓ (私が日頃,逆コンパイル技術について色々考えていることを書いたものです.)

OKWave QNo.3043962:デコンパイル?について

http://okwave.jp/qa3043962.html


↓これはまだ書きかけですが….

Cの逆コンパイラはどこまで実現可能か,Javaはなぜ逆コンパイルされやすいか?

http://www5d.biglobe.ne.jp/~noocyte/Programming/Decompile.html


Boomerang:オープンソースの逆コンパイラ

http://boomerang.sourceforge.net/

 そのスクリーンショット

 http://sourceforge.net/project/screenshots.php?group_id=48519&am...


REC 2.1 - Reverse Engineering Compiler

http://www.backerstreet.com/rec/rec.htm


他にもリバースエンジニアリングや逆コンパイル技術の情報サイトなどがありますが,

Wiki は必要ないということなので割愛します.

id:harunoharuno

noocyteさん。

回答ありがとうございます。

逆コンパイルするためには

開発者が使用したコンパイラを特定し、

アセンブラコードを読みながら、

ソースを推測し修正していくのですね。

また、100%の解読は不可能で

解読出来る場所と出来ない場所が存在することが解りました。

JAVAはキャストや、ポインタなどの表現がない点から

解読しやすいとのことでしたが、

これについても、ソースファイルに戻す作業は人間が

アセンブラコードを読みながら行わないと行けないのですね。

アセンブラの読み方くらいは知っていたほうがいいかなぁ

と考えさせられました。

ちなみにWikiを敬遠したのは、

サーチエンジンでトップにでたリンクをただ

貼り付けるだけの回答をなくすためのものです。

勉強に良いサイトなどあるのでしたら、むしろ

教えてください。宜しくお願いします。

2007/06/26 11:36:56
  • id:noocyte
    > 勉強に良いサイトなどあるのでしたら、むしろ教えてください。

    「締切」期間中は書き込めませんでしたが,「終了」したので書き込みます.

    回答 #3 の2番目の URL (書きかけのページ) のリンク集をご覧ください.
    (今後も随時追加しますので,たまに覗いてみてください.)

    逆コンパイル関連情報が最も多いのは,
     Program-Transformation.Org
     (http://www.program-transformation.org/Transform/WebHome)
    だと思います.

    日本語では,逆コンパイル技術に関する有益な情報は非常に少ないと思いますが,
    たまに大学の研究論文などが見つかります.
     Javaバイトコードをデコンパイルする効果的なアルゴリズム
    (http://www.openjit.org/publications/pro1999-06/decompiler-pro-199906.htm)
    は,具体例で逆コンパイル (制御構造の復元) 手順を示したスライドショーで,
    結構面白いと思います.

    逆コンパイル技術は,コンパイラの最適化技術と非常に共通する部分が多いので,
    "コンパイラの最適化技術","データフロー解析","制御フロー解析" など
    で検索すると,日本語でもたくさん参考になる情報が見つかると思います.

この質問への反応(ブックマークコメント)

トラックバック

  • C言語の逆アセンブラ 人力検索 はてな ピックアップ 質問集 2007-06-28 16:25:38
    C言語で組んだ実行ファイルについて質問ですが、 逆アセンブラとかいう手法で、ソースファイルが裸状態になるという噂を耳にしましたが、それは本当でしょうか?もしそれが事実なら
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません