2012-03-30 16 views
9

私はアセンブリを学んでおり、動機付けはリバースエンジニアです。私はまずアセンブラを見つけようとしているので、チュートリアルを見つけてアセンブリを書くことができます。NASMは純粋なアセンブリですが、MASMは高レベルアセンブリですか?

MASMにはたくさんの構造が組み込まれていることがわかりました。そのため、NASMを選択した場合、私はそれらをコーディングする代わりに主に使用します。

私の質問は..それは本当ですか?そうであれば、リバースエンジニアの視点からアセンブリを学習するためにどのようなアセンブラを提案し、そのための良いチュートリアルがあります。

また、逆転に関する他の提案がありますか?代替アプローチか何か?

P.S:ここでは多くの記事や質問を読んでいますが、まだ混乱しています。

+4

逆転の場合は、主にアセンブリの読み取りを行います。だから、あなたは高水準の構成から恩恵を受けません。 – CodesInChaos

+0

少し話題にはなりますが、リバースエンジニアリングに興味があるので、リバースエンジニアリングサイトの提案をここに記入してください:http://area51.stackexchange.com/proposals/26607/reverse-engineering – teukkam

+0

否定的な有権者?何らかの理由? – questions

答えて

7

純粋に "リバースエンジニアリング"の観点からは、コンパイラが高水準の概念をアセンブリ言語の命令に変換する方法を理解することをお勧めします。さまざまなコンパイラでどのようにレジスタの割り当てが行われるか、様々な最適化がネストされたループの高レベル表現を非表示にする方法の理解は、アセンブリ入力の特定の方言を書くことができるよりも重要です。

あなたが書いたソースコードからアセンブリ言語の中間ファイルを開始するのが最善の方法です(this question for more information参照)。その後、ソースを変更して、中間ファイルにどのように影響するかを確認することができます。もう1つは、対話式逆アセンブラIDA Proのように使用することです。

実際にアセンブリ言語プログラムを作成し、NASM、MASM、gasasの構文を学ぶのが最も簡単な部分です。ソース言語の構文は非常に基本的であるため、これらは非常に似ています。逆アセンブルとプログラムが何をしているのかを理解することを計画しているなら、翻訳中にマクロが完全に消滅し、逆アセンブラの出力を見てもマクロアセンブラは表示されません。アセンブリ言語を学ぶ学習の組み立て上の

非難

は、より高いレベルのプログラミング言語を学ぶとは異なります。マクロアセンブラを無視すると構文構造が少なくなります。問題は、すべてのコンパイラチェーンが少し異なる表現をしているため、サポートされているアドレスモードやレジスタの制限などの概念に集中する必要があるということです。これらはハードウェアによって決まりますので、言語そのものの一部ではありません。

私が取ったアプローチ(大学の一部であるため)は、ハードウェア自体(たとえば、レジ​​スタの数、レジスタのサイズ、サポートされている分岐命令のタイプなど)を調べたり、アセンブリ言語プログラムの作成を開始する前に、割り込みなどの学術的な概念や整数一致のビット単位の操作を使用することです。これははるかに長いルートですが、アセンブリの豊富な理解と高性能プログラムの作成方法をもたらします。

興味深いのは、アセンブリとコンパイラの構築(本質的に関連しています)の学習に費やした時間に、実際にはアセンブリプログラムをほとんど作成していないことです。しばしば、私はインラインアセンブリーのスニペットをあちこちに書く必要があります(例えば、ランタイムローダーがそうしなかった場合にインデックスレジスタを設定するなど)。私は、メモリ位置、ローダーマップファイル、およびアセンブラの出力リストからクラッシュダンプを解読するのに膨大な時間を費やしました。私は正直言って、各アセンブラの構文が劇的に異なっているというだけでなく、さまざまなコンパイラが高速または小規模なコードに意図を混乱させるために何をするかと言うことができます。

アセンブリプログラムの作成方法を学ぶことは、教育プロセスの中で最も価値のない部分でした。コンピュータが実行するビットとバイトにソースがどのように変換されるかを理解する必要がありましたが、本当に生のバイナリからリバースエンジニアリングする必要はありませんでした(逆アセンブラ→アセンブリリスト→高レベルインテントのベスト推測)またはメモリダンプ。私は後者のことをもっとしますが、仕事の要件は同じです。

  1. あなたは本当にアーキテクチャの制約が何であるかを理解する必要があります。
  2. あなたが問題になっているアセンブラの非常に基本的な構文は知っている必要があります - アドレスモードが表示されるか、レジスタが示されているかを、にif (a > 0)から行くにはないコンパイラを変換何move
  3. の引数の順序は何ですかその後、コンピュータアーキテクチャについて学習することによりmov.b r0,d0 ... bnz $L

スタート(例えば、Andrew Tanenbaumから何かを読んで)、どのOSが実際にロードし、プログラム(レヴァインのLinkers & Loaders)を実行し、その後、C/C++で簡単なプログラムをコンパイルしてアセンブリを見て言語リスト。

+3

しかし、分解を理解するため...私はアセンブリを学ぶ必要はありませんか? – questions

+2

@questions:アセンブリを学ぶ最も良い方法は、逆アセンブルされたコードを見て、それが何であるかを理解することです。しかし、それは私の個人的な意見です。 – hirschhornsalz

関連する問題