在C:发送func指针,用它调用func,使用EIP,jmp_buf和longjmp

时间:2010-05-18 08:53:51

标签: c function-pointers longjmp

我需要先确定一些基本的东西:

  1. 如何将函数A作为参数传递给函数B?
  2. 如何从B内部调用函数A?
  3. 现在是大战:

    我正在尝试按照以下方式做点什么:

    jmp_buf buf;
    buf.__jmpbuf[JB_PC] = functionA;
    longjmp(buf,10);
    

    这意味着我想使用longjmp来转到函数。我该怎么办?

2 个答案:

答案 0 :(得分:3)

您需要使用指向函数的指针。声明函数指针的语法是:

rettype (*)(paramtype1,paramtype2,...,paramtypeN)

因此,例如,我们可能会有以下代码:

char functionA(int x)
{
      printf("%d\n",x):
      return 'a';
}

char functionB(char (*f)(int), int val)
{
       return f(val); // invokes the function pointer
}

int main(int argc, char* argv[])
{
       char result = functionB(&functionA,3); // prints "3"
       printf("%c\n",result); // prints 'a'
       return 0;
}

另外,请注意,虽然& functionA取得了functionA的地址,但实际上没有必要在那里使用&符号......我个人这样做,因为我觉得它更清楚它是一个功能指针。使用与调用函数时相同的语法调用函数指针。

至于使用跳转缓冲区,我相信你所做的不是可以依赖的东西。如果你想在调用某个函数之前创建一个跳转缓冲区并调用setjmp,那么稍后调用longjmp以便在调用之前立即返回,然后定义良好。但是,jmp_buf的实际定义和结构是特定于实现的。它必须满足某些要求(例如,它必须是一个数组类型,因为setjmp必须能够按值获取并修改它),但除此之外,specification for setjmp.h没有定义jmp_buf的结构。因此,任何试图直接操作jmp_buf的东西都将特定于特定平台。

答案 1 :(得分:0)

  1. 将functionA作为参数传递给functionB:

    typedef void function_type(void);

    void functionA(void) {     printf(“这是函数A \ n”); }

    int main(int argc,char ** argv) {     functionB(安培;泛函);     return(0); }

  2. 从功能B调用功能A:

    void functionB(function_type * func) {     FUNC(); }

  3. 使用longjmp()转到某个功能。最好的答案是“不要这样做” - 几乎总有一种更好的方法来实现同样的目标。你能解释一下你需要的情况吗?