Cat*_*oes 5 x86 assembly ida mov
我认为这个问题很简单(也许是愚蠢的)可以回答,但经过近两个小时的谷歌搜索,我已经被淘汰了.我很确定我的问题是因为我只是不明白语法在做什么.
我正在看IDA中的一些反汇编代码,我不知道以下是做什么的:
mov dl, byte_404580[eax]
Run Code Online (Sandbox Code Playgroud)
如果我跳到byte_404580我发现.data:00404580 byte_404580 db 69h告诉我价值是0x69.但我不知道如何使用它.
让我提供此代码出现的上下文:
mov eax, 0x73 ; Move hex 73 to EAX
and eax, 0x0F ; Keep lower half of EAX
mov dl, byte_404580[eax] ; MAGIC
Run Code Online (Sandbox Code Playgroud)
由于上面的假设EAX最初是0x73,我得到DL= 0x76.我试过改变值EAX找到一些模式,但我还没弄清楚发生了什么.
该语法用于表示内存寻址,类似于 C 的数组语法 ( array[index])。您的示例相当于计算表达式0x404580 + (eax & 0x0F),将其视为地址,并从此地址中取出一个字节。这表明 at 的数据0x404580是一个字节数组(最有可能的0x10元素,基于掩码)。
如果这回答了您的问题,您可以停止阅读此处。
如果进入“选项”>“常规”并将“显示操作码字节”设置为非零值,您将看到指令字节的实际值,并能够将它们与处理器文档交叉引用以了解发生的情况。这通常不是必需的,但它可能具有教育意义。例如:
mov dl, byte_404580[eax]
Run Code Online (Sandbox Code Playgroud)
可以表示为字节序列:
8A 14 05 80 45 40 00
Run Code Online (Sandbox Code Playgroud)
使用英特尔架构手册,第 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
Run Code Online (Sandbox Code Playgroud)
将这些加在一起,您将得到:
该指令从寄存器中取出一个字节EAX + 0x404580并将其移入DL寄存器。
IDA 使用此信息来推断 处有一个字节大小的值数组0x404580,如果该位置还没有名称,则尝试命名该位置,尝试调整该位置处命名项的大小以跨越正确的字节数(它不一定知道该数组中有多少个元素,因此它实际上并不在那里创建数组)并将显示的表达式转换为byte_404580[eax].