gpt4 book ai didi

c - 指向函数的指针指向c中的jmp指令

转载 作者:太空宇宙 更新时间:2023-11-04 06:52:56 25 4
gpt4 key购买 nike

我查看了我的c代码的反汇编,发现指向函数的指针实际上指向了jmp指令,并没有指向内存中函数的真正开始(不指向push ebp 指令,表示函数帧的开始)。

我有以下功能(基本上什么都不做,这只是一个例子):

int func2(int a, int b)
{
return 1;
}

我尝试打印函数的地址 - printf("%p", &func2);

我查看了我的代码的反汇编,发现打印的地址是汇编代码中jmp指令的地址。我想获得代表函数帧开始的地址。有什么方法可以从 jmp 指令的给定地址计算出来吗?此外,我有代表 jmp 指令的字节。

011A11EF E9 CC 08 00 00       jmp         func2 (011A1AC0h)  

我怎样才能得到代表内存中函数帧开始的地址(在那种情况下是011A1AC0h),只能从jmp指令的地址和从表示 jmp 指令本身的字节?我看了一些相关资料,发现它是相对jmp,这意味着我需要将jmp持有的值添加到的地址>jmp 指令本身。不确定这是否是解决方案的好方向,如果是,我怎样才能获得 jmp 持有的值(value)?

最佳答案

E916 是带有 rel32 偏移量的 jmp 指令的 Intel 64 和 IA-32 操作码。接下来的四个字节包含偏移量。您的反汇编程序将它们显示为“CC 08 00 00”,但这是相反的;偏移量为 000008CC16,即 225210。偏移量是一个带符号的 32 位值,添加到 EIP 寄存器以获得跳转目标的地址。 EIP包含下一条要执行的指令的地址。

因此,在这种特定情况下,取跳转指令之后的字节地址并加上 32 位偏移量。

但是:

  • 我在 Intel 64 和 IA-32 手册中统计了 11 种形式的 jmp 指令。当您对源代码或编译器开关进行轻微更改并重新编译时,谁知道编译器可能会使用什么?您需要准备解码任何形式的 jmp 指令,或者编译器可能使用的其他指令。

  • 英特尔在其架构中有一些传统的 segmentation 市场特征。您系统上的代码段可能是一件大事,因此您不必担心,但我不能提供保证。

  • 您的编译器可能已将此 jmp 指令用作为指针创建值的便捷方法,而不是使用例程的入口点(函数执行通常开始的指令的正确术语,而不是帧),因为它使链接器进行重定位工作,而不是要求编译器在运行时插入指令来完成该工作(具体来说,在必须评估函数地址时,以便将其分配给指针)。这有点像猜测,但编译器下次可能会做其他事情。您在正常计算之外进行了大量工作。

关于c - 指向函数的指针指向c中的jmp指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com