5

これは簡単に (おそらくばかばかしいほど簡単に) 答えられる質問だと思いますが、ほぼ 2 時間 Google を検索した後、私は三振になりました。私の問題は、構文が何をしているのか理解していないためだと確信しています。

IDA で逆アセンブルされたコードを見ていますが、次のコードが何をしているのかわかりません。

mov dl, byte_404580[eax]

にジャンプすると、値が であることがbyte_404580わかります。しかし、これがどのように使用されているかわかりません。.data:00404580 byte_404580 db 69h0x69

このコードが表示されるコンテキストを提供しましょう。

mov eax, 0x73             ; Move hex 73 to EAX
and eax, 0x0F             ; Keep lower half of EAX
mov dl, byte_404580[eax]  ; MAGIC

EAX最初は 0x73 である上記の仮定では、 DL=0x76 が得られます。パターンを見つけるために の値を変えてみましたEAXが、何が起こっているのかわかりませんでした。

4

1 に答える 1

4

この構文は、C の配列構文 ( array[index]) と同様に、メモリ アドレス指定を示すために使用されます。あなたの例は、式を計算し、0x404580 + (eax & 0x0F)それをアドレスとして扱い、このアドレスから1バイトを取得することと同等です。これは、 のデータがバイトの配列であることを示唆しています (マスクに基づく要素で0x404580ある可能性が最も高い)。0x10

それがあなたの質問に答えるなら、ここで読むのをやめることができます.


[Options] > [General] に移動し、[Show Opcode Bytes] をゼロ以外の値に設定すると、命令バイトの実際の値が表示され、プロセッサのドキュメントと相互参照して何が起こっているかを理解できます。これは通常は必須ではありませんが、教育用に使用できます。例えば:

mov dl, byte_404580[eax]

一連のバイトとして表現できます。

8A 14 05 80 45 40 00

Intel の Architecture Manual, Volume 2Aを使用すると、これは次のようにデコードできます。

8A - instruction opcode for MOV r8, r/m8 - determines the operand sizes

14 - the Mod R/M byte:
         | 00010100b
     Mod | 00
     R/M |      100
     Reg |   010

     Mod R/M combination 00-100 is specified as "followed by the SIB byte".
     Reg 010 stands for register DL/DX/EDX, the destination operand.

05 - the SIB byte:
           | 00000101b
     Scale | 00
     Index |   000
     Base  |      101

     This combination is specified as [scaled value of EAX] + a 32 bit displacement.

80 45 40 00 - the displacement itself, 0x404580

これらを合計すると、次のようになります。

この命令は、レジスタから 1 バイトを取得EAX + 0x404580し、レジスタに移動しDLます。


IDA は、この情報を使用して、 にバイト サイズの値の配列があることを推測し、0x404580その場所にまだ名前がない場合はその場所に名前を付けようとし、その場所にある名前付きアイテムのサイズを変更して、適切なバイト数にまたがるようにします (は、この配列に含まれる要素の数を必ずしも認識していないため、実際にはそこに配列を作成しません)、表示された式を に変換しますbyte_404580[eax]

于 2012-08-27T20:20:17.083 に答える