ここから本文です

アセンブリ言語も分からないのですがリバースエンジニアリングをしたいです。

アバター

ID非公開さん

2019/7/2120:31:29

アセンブリ言語も分からないのですがリバースエンジニアリングをしたいです。

どのような道のりで学べばいいでしょうか

閲覧数:
54
回答数:
4

違反報告

ベストアンサーに選ばれた回答

gim********さん

2019/7/2122:16:35

.NETアプリならC#やVB.NETに変換できますよ
また、リバースエンジニアリングというと必ずしも逆アセンブルを指すわけではありません
ソフトウェアの通常の操作から仕様書を書き上げる場合も含みます

という能書きは置いておいてアセンブリがやりたいならマイコンがよいかと思います。PICでLEDをチカチカ光らせるなど
次の段階としてLinuxのアセンブラ
さらにチップから実行ファイルを吸い出して解析するなどの段階に入ります

リバースエンジニアリングといっても産業スパイをやりたいのか、ハードウェアの解析なのか、高尚な趣味として世の中をハックしたいのかによってアプローチも変わってくるかと思います

昔はZ80搭載パソコン(当時はマイコンと呼んでいた)で簡単にアセンブリ学習が出来ましたが今は余分な知識がずいぶんと必要になるので結局のところは最初にLinuxを覚えないといけない気がします(もちろんアプローチは星の数ほどありますけども)

そういえば情報処理技術者試験のCASLはよく出来た教材でしたね
あの辺をスタート地点にしてもいいかもしれません

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

dfz********さん

2019/7/2122:25:48

リバースエンジニアリングはアセンブラで行う
アセンブラができないやつはリバースエンジニアリングもできない

プロフィール画像

カテゴリマスター

n2q********さん

2019/7/2121:54:01

アセンブリ言語が分からないとのことで、これには二つの解釈が成り立ちます。


(1)アセンブリ言語だけが分からない

今現実に使用されているアセンブリ言語は意外と難しいものに見えるかもしれません。私も時々使用しますが、若干手さぐり的な面がありましてね。資料等も非常に限られていますから。

Windows 業界的に言うと32ビットの時代はインラインアセンブラが使えました。アセンブリ言語というようなものは知らなくても、特に困らなかったのです。機械語が分かっていれば、もうそれだけで十分という形です。

でも、64ビットになりましてからはインラインアセンブラは廃止されました。(Visual C++ での話です。別のコンパイラでどうなっているのかは知りません。)

このため、実務上、アセンブラを使う機会が結構増えてきています。

それで、手探りとはいうものの、実際にはそれほど困っていません。だいたい推理して、こうじゃないかなって思うと当たってるからです。昔の8ビットや16ビットの時のアセンブラのことを想い出せば結構それだけで十分です。昔はマクロなども作ったりしましたが、今はもうその必要も殆んど無いと言って良いように思います。

リバースエンジニアリングということからしましても、ほんとうに、ごく簡単なアセンブリ言語の知識で十分です。


C++ のコードをコンパイルする際にアセンブリ言語のソースファイルを出力させるようにオプションを設定します。そうすると、アセンブリ言語のコード例が得られるような格好となりますので、これを真似すれば良いのですよ。そういう道のりで十分に対処できる筈です。



(2)機械語自体が分からない

この場合はまずいです。アセンブリ言語特有の記述について知らない場合は(1)ですけれども、そうじゃなくて、本当の命令語のニーモニックコードが分からないとなると、これはもうリバースエンジニアリングに入門できる状態ではないという話なわけです。


CPU のことが分かっていない状態とも言えます。それだと駄目ですよね。C 言語がわかればメモリのことは分かっているかもしれないけど、でも、それでは不十分です。レジスタのことやフラグのこと、それから条件ジャンプのことや call 命令、ret 命令、これらについてよく知っていないと。

実はこのお答えを書いていまして、やはりこの度のご質問としては(2)の可能性が高いのではないかという気持ちになりました。もしも(1)であれば、その点が明確になるようなご質問の文面になっていたであろうと思うからです。


だとして、次のような考え方で勉強なさってみては如何でしょう。


C 言語について完全に理解することを第一目標としてみては。

一般の方々の勉強の仕方では駄目です。完全な理解のためには、コード生成の様子を見ることが大事です。C 言語でこう書いたら機械語コード列はこう出てくるというのをよく見て、その中で各命令語の意味合いについて十分に理解することですね。いわゆるスタックフレームのこともきちんと把握して、引数の何番目をアクセスするには、ebp から数えて何番地先なのか(64ビット版の場合はrcx, rdx, r8, r9 の各レジスタと rsp レジスタを直接使います。第5引数以降は rsp レジスタの番地から何番地先なのかです)、というものを見ながら、C 言語の完全理解に努めるということになります。

昔の C 言語プログラマの場合、これは常識でした。デバッグの時は機械語になるので当然だったのです。C 言語のソースコードのままでデバッグできるようになったのはいつ頃でしたかね。CodeView とかいうものがありましたが、安定性が悪かったりして使えない場面が結構長く続いたように思います。

今は、リバースエンジニアリングの分野(あるいは、何らかのハックの分野)に関わる人でないかぎり、そういった作業は無くても大丈夫になっています。ですから、もう、こういうのは出来ない人が大半でしょう。今となっては。

このため、関連資料も少ないです。ほとんど誰もやってないからです。誰も読まない資料を用意する意味もないわけで。書籍等も今どういう物があるのかは分かっていませんが、多分、この手の内容について書かれたものは殆んど無いのではないかな。勉強は本当に大変だと思います。

でも、一つの朗報があります。

Visual C++ 2010 以降、アセンブラが使いやすくなっています。(これは Visual C++ 2019 まで一貫しています。2005、2008 でも使えますが少し差異があります。)

どう使うのかはお調べいただくとしまして、ともかく、別途アセンブラを用意する必要が無いということだけは申し上げておきたいと思います。単純に Visual C++ をインストールしたら、もうそれだけで(多少設定を弄る必要はありますけど)、アセンブリ言語を幾らでも取り組める状況にあるということです。


では頑張ってくださいね。

yam********さん

2019/7/2121:23:53

実行ファイルの逆アセンブル結果は、アセンブラのソースが得られる。

なので、まずはアセンブリ言語の勉強を。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる