Memory 在反汇编中查看并实际执行时,调用函数的机器代码地址转换为另一个地址。为什么?

Memory 在反汇编中查看并实际执行时,调用函数的机器代码地址转换为另一个地址。为什么?,memory,x86,memory-address,native-code,disassembly,Memory,X86,Memory Address,Native Code,Disassembly,我在玩一个外壳代码示例,并在堆栈上添加了一些代码。下面是它的一个相关片段,如VS2013的内存视图所示: Memory view: 0x0018FEB4 90 90 90 83 ec 28 eb 0b e8 66 2a 1a 75 50 e8 9d 80 18 75 现在,当我在反汇编视图中看到用x86机器语言解释的相同代码时,除了我看到的调用指令(操作码E8)的地址(以little endian表示)之外,所有代码都按预期进行: 如果我将视图更改为带代码字节的反汇编,我将在写入内存的地址和

我在玩一个外壳代码示例,并在堆栈上添加了一些代码。下面是它的一个相关片段,如VS2013的内存视图所示:

Memory view:
0x0018FEB4  90 90 90 83 ec 28 eb 0b e8 66 2a 1a 75 50 e8 9d 80 18 75
现在,当我在反汇编视图中看到用x86机器语言解释的相同代码时,除了我看到的调用指令(操作码E8)的地址(以little endian表示)之外,所有代码都按预期进行:

如果我将视图更改为带代码字节的反汇编,我将在写入内存的地址和调用的地址之间获得相同类型的增量:

Disassembly view, with code bytes as well:
0018FEBC E8 66 2A 1A 75       call        75332927
我想我可能遗漏了一些重大的理论事实,但有人能解释一下吗?
我想调用的地址是来自kernel32.dll的特定函数地址,但我必须对它们进行一些运算,以使代码实际执行并调用正确的地址。

非常不清楚,我猜您没有意识到调用指令使用了相对偏移量。0x18fec1+0x75a1a266==0x75332927谢谢,就是这样,我没有考虑相对于调用使用的下一条指令的偏移量!检查此问题[函数地址不是实际代码地址][1][1]:
Disassembly view, with code bytes as well:
0018FEBC E8 66 2A 1A 75       call        75332927