【发布时间】:2012-09-03 11:03:28
【问题描述】:
我正在尝试将参数传递给EIP 寄存器作为跳转指令到EBX 寄存器。
【问题讨论】:
我正在尝试将参数传递给EIP 寄存器作为跳转指令到EBX 寄存器。
【问题讨论】:
JMP EBX 表示指示CPU 跳转到EBX 寄存器值所指向的地址。如果EBX 是12345678h,它将跳转到地址12345678h。所以指令被解释为JMP 12345678h。
JMP DWORD PTR DS:[EBX] 表示指示 CPU 跳转到从EBX 寄存器值和DS 选择器指向的内存地址读取的DWORD 值指向的地址。如果EBX 是11111111h,CPU 将从内存地址DS:11111111h 处读取DWORD 值,然后跳转到DWORD 值所指向的地址(内存中的值)。如果内存中的DWORD 值为22222222h,它将跳转到地址22222222h。所以指令被解释为JMP DWORD PTR DS:[11111111h]。读取内存后,会被解释为JMP 22222222h。
【讨论】:
JMP EBX 将跳转到当前代码段内EBX 寄存器中存储的地址。JMP DWORD PTR DS:[EBX] 将跳转到@987654326 指向的代码段内内存偏移EBX 处存储的地址@。
例如让DS = 0x0440,EBX = 0x00006200,以及地址0x00006200的内存的前四个字节是 0x00003500(在 little-endian 机器上将存储为 00 35 00 00)。JMP EBX 变为 JMP 0x00006200。
@987654331 @变成JMP 0x0440:0x00003500
JMP EBX 具有以下签名:
JMP r/m32
在这种情况下,跳转地址存储在 32 位寄存器中(您的情况)或作为 32 位变量存储在内存中。处理器通过将值加载到EIP 中,在操作数指定的地址处执行近跳转(在同一代码段中)。
另一方面,JMP DWORD PTR DS:[EBX] 具有以下签名:
JMP ptr16:32
这里的跳转地址分两部分提供。第一个值(在冒号之前)给出了要跳转到的代码段的地址,第二个值(在冒号之后)给出了该代码段内的偏移量。跳转可能是到与当前不同的代码段,因此是远跳转。处理器通过加载第一个
值进入CS,第二个进入EIP。
此外,第二条指令使用[EBX],而不是第一条中的EBX。这意味着它将读取存储在EBX 中的偏移量处的内存并使用该值。DWORD PTR 是一个 size 指令,它告诉汇编器内存应该被视为 32-位整数。
Here 是使用中的第二个跳转示例。
【讨论】:
jmp ptr16:32。那是 jmp r/m32,其内存操作数使用默认段 (DS),OP 的反汇编程序显式放入该段以使输出混乱并使其更难阅读。