2012-06-24 16 views
7

私のMac上のx86_64のためのいくつかのアセンブリコードを見て、私は次の命令を参照してください。このx86_64アセンブリのオペコードをどのように解釈するのですか?

48 c7 c0 01 00 00 00 movq $0x1,%rax 

しかし、どこにも私は、オペコードを破壊するの参照を見つけることができます。 48c7は移動命令、c0は%raxレジスタなどを定義しているようです。

だからこそ私はすべてのことを教えてくれますか?

私はhttp://ref.x86asm.net/を認識していますが、48個のオペコードを見ると、動きに似たものは表示されません。

+1

私はここで同様の質問を見ました。 Googleでこれを見つけることができたら、私は尋ねなかったでしょう。私が私の質問に載せた参考文献を知っているという事実は、自分自身を捜すのはあまりにも怠惰ではないことを示しています。 – Christoph

+1

@Oded、あなたが探しているものがわからない場合は、 "x86 0x48命令プレフィックス"でグーグルグーグルが非常に難しいです... – Griwes

+0

@Oded私は開発者に固有の質問に言い直しました。 x86asm.netでの(本当に良い!)リファレンスを考えると、私は、そのオペコードがどのように分割されているかを理解する必要があると思います。グリズはそれを助けた。 – Christoph

答えて

10

実際には、mov0xc7です。 0x48は、この場合、ロングモードREX.W prefixです。

コメントでの質問にも回答してください:0xc0はb11000000です。 HereREX.B = 0(REX接頭辞は0x48、.Bビットは設定されていません)、0xc0は "RAXが最初のオペランド"(Intel構文の場合mov rax, 1、RAXが最初、またはmovの場合は出力オペランド)。あなたはModR/M hereの読み方を知ることができます。

+0

ありがとうございました!たぶん私は私の質問に言い直すべきです。 – Christoph

+0

c0はどうですか?それはどこに来るのですか? – Christoph

+0

@Christoph、答えに説明が追加されました。 – Griwes

1

バイナリ

48 c7 c0 01 00 00 00 

を見ると、あなたがその意味を理解するために、それを分解する必要があります。

逆アセンブルのアルゴリズムは難しくありませんが、複雑です。複数のテーブルを検索することを想定しています。

ザ・アルゴリズムは、あなたがINSTRUCTION FORMAT呼ば章から読み始め、インテル・デベロッパ・マニュアルの第2巻に

Intel® 64 and IA-32 Architectures 
Software Developer’s Manual 
Volume 2 (2A, 2B & 2C): 
Instruction Set Reference, A-Z 

に記載されています。

あるいは、全体の章では、バイナリX86を分解に専用されているように

X86 Instruction Set Architecture, Mindshare, by Tom Shanley. 

として、このトピックに全体の章を捧げ良い本が、あります。

それとも、AMD製の同じ言語のマニュアルからの一般的なアルゴリズムを読み始めることができます:あなたはこの命令の言語を定義するオートマトンを見つける章Instruction Encodingで、

AMD64 Architecture 
Programmer’s Manual 
Volume 3: 
General-Purpose and System Instructions 

ここで、そしてからこのグラフィカルスキームでは、簡単にデコーダを書くことができます。

これを実行した後は、第2巻のインテルマニュアルに戻って参考資料として使用することができます。

http://opensecuritytraining.info/からreverse engineering classも有用であることがわかりました。このサイトはCMUのPhd学生によって作成されていますが、そのほとんどはうまくいきませんが、それを勉強して適用するにはもっと時間がかかります。

基本的な考え方を理解したら、アルゴリズムを実装する無料のプロジェクトを見ることができます。私は有用なdistormプロジェクトを見つけました。最初は、(qemuやobjdumpのような)抽象的なプロジェクトを見ないことが重要です。これは、あなたが失ってしまうのと同じコードで多くの言語のdissasemblerを実装しようとします。 Distormは、x86にのみ焦点を当て、正確かつ徹底的に実装しています。 X86言語の定義は正式な言語で、IntelとAMDのマニュアルは自然言語を使用してX86言語を定義しています。

他のプロジェクトはうまく動作しますudis86です。

+0

逆アセンブルのアルゴリズムを意味していますか?あなたは 'mov 'というアルゴリズムを呼んでいるように、最初は聞こえます。 –

+0

が正しく修正されました。 – alinsoar

関連する問題