- 締切済み
アセンブリ言語と機械語について。
アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。教えていただけないでしょうか?すみません。どういった例が挙げられますか?
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>以下のURLです。教えていただけないでしょうか?すみません。 あなたが知恵袋で質問しているurlなんてたずねていませんが・・・
- wormhole
- ベストアンサー率28% (1626/5665)
>インタープリットやコンパイルをすると元のソースコードが失われるのは本当でしょうか? 誰もそんな回答はしてないはずですけど、いったいどこでそんな事を聞きましたか?(たぶん、あなたの文章解釈間違いなんでしょうけど) それに「インタープリット」って何ですか? 勝手に造語されても、そんなの誰も知りませんよ。
- kaba__san
- ベストアンサー率45% (27/59)
>> 例えば、こういうのであれば逆アセンブルできるのでしょうか? 出来てるじゃないですか。その左から右へが逆アセです。 それはできるとみんな言ってるんです。それ以上何がお望みで? 自分で何を質問しているのかすらわからなくなってる?
補足
インタープリットやコンパイルをすると元のソースコードが失われるのは本当でしょうか?教えていただけないでしょうか?すみません。
- kaba__san
- ベストアンサー率45% (27/59)
なんだ、コピペ補足で回答者全員をおちょくって遊んでるだけか。 いや、自分の用意した望み通りの答えを求めているだけか? 「プログラマの書いた元ソースなんて復元しようが無い」と何人に言われれば信じるんだろう。 プログラムに関する基礎知識がまるで無い・・・・ 知識もないのにそんなこと知ってどうしたんでしょうか。 なにかの製品を不正コピーでもしたいのかな?
補足
例えば、こういうのであれば逆アセンブルできるのでしょうか?教えていただけないでしょうか?すみません。これです。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>出来るものもあるという事でしょうか? あります。 どういうものができないのかは、すでに説明済みですが。 出来るケースは、条件で変化する命令がないこと、 元々のソースがすべて絶対アドレスで記載されているか、 リロケーションも即値で記載されている事。 さらに、コメントや、修飾子を一切使っていない、 リファレンスのみで記載されている事。 などが条件にはなります。 (もちろん方言的な書式を含まないものに限る) >ちなみに、コンパイルやインタープリットをすると元のソースコードが失われるというのは完全に出来ない。という事でよろしいでしょうか?教えていただけないでしょうか?すみません。 よろしくないです!。 インタープリットってインタープリターの事でしょうが、 これは、元々のソースに手を加えずに実行されます。 BASICやPHPなどがその例です。 また、アセンブルやコンパイルだとしても、 >元のソースコードが失われるという いえ、元のソースコードは失われません。 単に実行可能なファイルが増えるだけです。 >アセンブリ言語と機械語は一対一で対応しているので 対応しているという考え方は「間違っています」 対応しているのは、マシン語からニーモニックにするときだけです。 アセンブリ言語からマシン語は、状況に合わせて命令が変化するので、 これは、同じものではない!ということです。 理由は、すでに説明した通り。 なお、マシン語は、機械語と思ってOKですが。 ニーモニックとアセンブリ言語は違うものなので、 ここも、一度概念をリセットしてみたほうが理解が早まるかも しれません。 アセンブラ固有の書式(方言みたいなもの)が多数あり、 A社のアセンブラ言語とB社のアセンブラ言語で 全く同じマシン語バイナリを吐き出しても、 元々のソースは、書式が違う!ということです。 これを、ごちゃごちゃに考えれば、疲れるだけです。 まずは、固定概念を一度捨てたほうが、理解が早まるとは 思いますよ。 これを正しく読んでいれば、逆アセンブラが 「元々のアセンブリ言語」に戻すことが不可能なことは わかると思います。 出来るのは、その時点でのニーモニックになるだけです。 アセンブリ言語で、プローシャーを書いても ニーモニックには存在しないので、変換されない。 変換されないものをマシン語にしても、当然変換されない。 それを逆アセンブルしても、プロシャーにはならない! つまり、違うものだということです。
お礼
実行可能なファイルだ増えるだけとはどういう事でしょうか?教えていただけないでしょうか?すみません。インタープリットやコンパイルの事です。
補足
例えば、こういうのであれば逆アセンブルできるのでしょうか?教えていただけないでしょうか?すみません。これです。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret
- kaba__san
- ベストアンサー率45% (27/59)
アセンブリコードは得られますよ。 でもそれは単純な「機械語」→「ニーモニック」の置き換えです。 小規模なら何とかなりますが、規模が大きくなるほど読めたものじゃありません。 実際のプログラムではマクロやラベルといった、人間にも理解しやすい工夫がなされています。そんなものはアセンブル時に不要な情報として、不可逆に消されていますから復元できません。 そういうのを読み解ける特殊スキルを持った人を「解析職人」と呼んだりしますけどね。
補足
出来るものもあるという事でしょうか?ちなみに、コンパイルやインタープリットをすると元のソースコードが失われるというのは完全に出来ない。という事でよろしいでしょうか?教えていただけないでしょうか?すみません。
- t_ohta
- ベストアンサー率38% (5241/13712)
> というのは間違いでしょうか?教えていただけないでしょうか?すみません。 先の回答に書いたとおり完全に復元できないモノもあります。 なので『完全に元のアセンブリコードが復元できる』は間違いです。
補足
出来るものもあるという事でしょうか?ちなみに、コンパイルやインタープリットをすると元のソースコードが失われるというのは完全に出来ない。という事でよろしいでしょうか?教えていただけないでしょうか?すみません。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
変換が不可能な例を一部 jmp abc 例としてこの位置に3バイトの命令があるとする。 :abc 第1アセンブルでは、 jmp が暫定で命令コードの一部になる (つまりマシン語に変換されるが、命令コードはまだ存在しない) しかし、まだ、その後に3バイトの命令があることを わかっていないので、アドレスが未定。 第2アセンブルでは、 ジャンプ先のアドレスが@+3(現在の位置から3バイト先だとわかる) ので、 jmp @+3と仮展開 なぜかというと、一部の命令は、距離で機械語が変化します。 今回は+3なので、1バイトのプラスマイナス127というオペコードになる。 しかし、これがその範囲を超えると、2バイトの16ビットオフセットになるので、命令コードは変わる。もちろん、4バイト幅32ビットオフセットのこともあれば、セグメントコードの場合もある。 つまり、1体1だが、状況により変化をしているということです。 しかし、最終機械語は、結果だけである「+3」のオペを出力するので、逆アセンブルしても、@+3にしかならず、 ":abc"だのというラベルはもはや存在しないわけです。 なので、1対1なのは、マシン語からニーモニックの場合だけで、 アセンブラで書いたニーモニックが、マシン語になるとは 言えないのです。 なお、なぜ「@」なのかは、命令そのものは自分自身の 番地を持っていないためです。先ほど https://okwave.jp/qa/q9893611.html で言った通り、 実行ファイルは「まだ実行していない物」なので、アドレスは未定。 実行中のメモリを逆アセンブルしたものが、実行可能な物になります。 ここは、リロケーション情報を学習していくと、理解できます。 「どっかから、nバイト先」だけでは、位置はわからないからです。 ファイルにあるだけの状態での、絶対アドレス、相対アドレスと 実行時の絶対アドレス、相対アドレスは全く違うものなので 混在しないようにするとよいでしょう。 つまり、「実行ファイル」で、 1000番地にロードした場合と、 2000番地にロードした場合で、ジャンプ命令が 同じ場所を指していたら、一発で暴走しますから! なので、ロードしないと確定しない情報もある! ここは、忘れず。 なお、逆アセンブルの表記も、ツールにより異なるので、 あまり信じない方がいいかもです。 多くは、 #xxxxは主に即値 @xxxxは主に相対位置を表す $xxxxはレジスタ番地など。 ですが、これらも、逆アセンブラ固有の表現で、 ソフトによって違うので、これは「こうだ!」と決めつけることで より解決を遠くさせますよ。 次回、同じ質問がでているようだったら、ちょっと アプローチを変えてみます。
補足
アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。教えていただけないでしょうか?すみません。どういった例が挙げられますか? というのは間違いでしょうか?教えていただけないでしょうか?すみません。
- t_ohta
- ベストアンサー率38% (5241/13712)
アセンブラで書いたコードの中のコメントは機械語に変換されなので、機械語のプログラムには有りません。 そのため機械語から逆アセンブルしてもコメントは復元できません。 また、ジャンプ命令のラベルは機械語に変換される時にアドレスに変換されるため、機械語から逆アセンブルしてもラベルは復元できず、ジャンプ命令ではアドレスが指定された形に変換されてしまいます。
補足
アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。教えていただけないでしょうか?すみません。どういった例が挙げられますか? というのは間違いでしょうか?教えていただけないでしょうか?すみません。
補足
以下のURLです。教えていただけないでしょうか?すみません。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10244609405