C - 架构独立函数调用插入

时间:2011-06-24 16:11:58

标签: c assembly

我正在写一段代码,我有一个被调用的函数指针。我想做的是插入这个函数调用来做某事,然后用相同的参数调用另一个函数调用。我想知道是否有一些方法可以做到这一点,而无需为我所针对的每个架构编写程序集。也许有一些海湾合作委员会的伎俩?

作为一个例子,我调用我的函数指针,它调用

foo (/*arguments*/) {
  do_something...
  bar(/*same arguments*/);
}

在装配中,这很容易。至少在x86中我只是确保我的堆栈指针被重置到我的堆栈帧的开头并跳转到功能栏(而不是调用)。

编辑:也许这个例子不清楚。用户希望调用功能栏,但我将其重定向到函数foo(我不知道bar需要什么参数)。我想在使用传递的相同参数调用bar之前在foo中执行某些操作。通过这种方式,无论我在foo中做什么,对于认为他们只是称为bar的用户来说都是透明的。

5 个答案:

答案 0 :(得分:2)

查看gcc选项-finstrument-functions

答案 1 :(得分:2)

听起来像gcc特定的___builtin_apply_args。它是捕获传入参数的内在函数,您可以使用__builtin_ apply

使用这些参数调用另一个函数

答案 2 :(得分:1)

libffi完成所有(或至少大部分)源代码插入所需的内容。

另一种选择是使用动态二进制检测工具,例如DynamoRIOPin

答案 3 :(得分:1)

您可以尝试创建一个全局函数指针变量,该变量用作查找以将两个函数调用预绑定到另一个。例如,

typedef void (*bar_type)(int arg1, int arg2);
bar_type function_ptr; //a global function pointer used for binding

//create a bar_type function that is our "actual" function call
void __bar(int arg1, int arg2)
{
    //do something else
}

//create a bar_type function called "foo" that is bound to calling whatever
//function is being pointed to by function_ptr
void foo(int arg1, int arg2)
{
    //do something
    function_ptr(arg1, arg2); //"foo" now calls "__bar"
}

bar_type transform_func(bar_type func_call, bar_type int_call)
{
    function_ptr = func_call; //set the global function ptr variable
    return int_call;
}

//create your function pointer bar that will call "foo" before calling "__bar"
bar_type bar = transform_func(__bar, foo);

//later on in your code
bar(3, 4); //this will call foo() which will then call __bar() internally

您也可以使用此方法为用户创建一个宏,您可以将bar定义为看起来像

的宏
#define bar(arg1, arg2) (*(transform_func(__bar, foo)))(arg1, arg2);

希望这不是太糟糕了......从汇编可以做的事情肯定会受到影响,但使用全局函数指针将是一种重新绑定函数调用的方法。

答案 4 :(得分:0)

你能使用类似函数的宏在调用函数的上下文中实现“做某事”,然后对函数指针进行正常调用吗? (是的,关于宏的标准免责声明,尤其是类似函数的宏...)

例如:

#define CALL_FUNC(fp,ARG1,ARG2) do {<do something>;fp(ARG1,ARG2);} while (0)

然后在应用程序中,替换使用宏取消引用函数指针的位置。

原始问题我不清楚foobar是否是通过函数指针调用的函数,因此您可能需要调整宏,但一般方法保持不变。