リバースエンジニアリングに挑戦しているのですが、逆アセンブリしたコードが上手くc言語に訳せません。
何かいい練習方法があれば教えてください
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
まずは簡単なコンソールのプログラムをCで書いて(最適化なしで)コンパイラがどんなアセンブリコードを吐くのかをCPUのリファレンス見ながら勉強するのがいいかと思います。
VCだと適当にデバッガで止めて逆アセンブリの画面でステップすれば1命令ずつ実行できるのでレジスタとメモリを見ながら動かすと理解しやすいです(僕はそうやって覚えました。初代Pentiumですけど…)
どんな言語であれプログラムをブロック分けして書いているので結果もそれなりにブロックに分かれてきます。
動きとコンパイラの癖がわかればブロックが見えてくるので読みやすくなると思います。
ウィンドウアプリはアドレスが飛びやすいのでなかなか大変です。
投稿2015/04/14 17:36
総合スコア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総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。