質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

4708閲覧

リバースエンジニアリングの練習

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2015/04/14 10:58

リバースエンジニアリングに挑戦しているのですが、逆アセンブリしたコードが上手くc言語に訳せません。

何かいい練習方法があれば教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まずは簡単なコンソールのプログラムをCで書いて(最適化なしで)コンパイラがどんなアセンブリコードを吐くのかをCPUのリファレンス見ながら勉強するのがいいかと思います。
VCだと適当にデバッガで止めて逆アセンブリの画面でステップすれば1命令ずつ実行できるのでレジスタとメモリを見ながら動かすと理解しやすいです(僕はそうやって覚えました。初代Pentiumですけど…)

どんな言語であれプログラムをブロック分けして書いているので結果もそれなりにブロックに分かれてきます。
動きとコンパイラの癖がわかればブロックが見えてくるので読みやすくなると思います。

ウィンドウアプリはアドレスが飛びやすいのでなかなか大変です。

投稿2015/04/14 17:36

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

>リバースエンジニアリングに挑戦しているのですが、
>逆アセンブリしたコードが上手くc言語に訳せません。
>何かいい練習方法があれば教えてください
もしかして、すべてを一から十まで変換しようとしていませんか?
また、変換するのが得策ではない場合もあります。
普通は、どういうロジックで動いているか確認できれば良いので、
まるまる、書直しは行わないはずです。
で、デッドコピーもそうですが、
リバースエンジニアリング行為自体や、コードの逆アセンブル行為が、
著作権、使用許諾権にひっかかる可能性が発生します。

1.逆アセンブルしたソースコードから、全体構成を書き出す。
2.UI部や、ファイル入出力など、ロジック部分などの、各部分の目途をつける。
3.各種図表、真理値表、状態遷移図、ロジック系の各種手法で、
全体の見える化を行う。
4.その上で、ロジック部分から、論理や構造を書き起こした図表から、
コードコンバートしていき
ユーザーインターフェースや、ファイル入出力、通信系などは、
構造のみ参考にして、書き直す。
5.著作権に抵触したり、使用許諾に抵触しない方法は、知りません。
過去の、互換BIOSの開発手法が参考になるかも。
’’
普通は、該当CPUのアセンブラと、コンバート言語に精通した方が行う行為です。
学習目的であれば、
1.Cのソースコードから、アセンブリソースを出力する。
この時に、簡単な整数演算程度から始める。
一切のオプティマイズを、使用しないようにする。
2.メモリー上にロードした実行コードを、逆アセンブルして
逆アセンブルしたソースコードから、Cのコード対応を理解する。
不明部分は、先のアセンブリソースと対比してもよい。
3.少し複雑な物で、Cのソースのみで、逆アセンブルのソースコードから
Cのソースコードが、脳内変換できるかどうか、出来なければ、
練習不足、勉強不足なので、1、2を繰り返す。
4.オプティマイズしていない、アセンブリソースコードと、
オプティマイズしてある、アセンブリソースコードを見比べて、
オプティマイザの行っている事を理解する。
オプティマイズは、CPUアーキテクチャ、CPUキャッシュの状態を
考慮しているかいないかで、どうなるかなども、理解する。
GNU-Cと、他の処理系での、アセンブリソースを比較してみたり。
他いろいろ、
いきなり、Windows系、Linux系は、難しいので、
マイコン系、昔のZ80系などから始めると、仕組みが簡単な場合もあるので、
理解しやすいかも。

投稿2015/04/14 12:48

編集2015/04/14 13:01
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問