在运行时重写已编译的函数

时间:2013-11-18 18:00:55

标签: c

在具有与此类似的预编译二进制文件的系统中:

int foo(int bar) {
 // do something wrong
  return ...;
}

在运行时,是否有一种方法可用于将调用该函数的效果更改为:

int foo(int bar) {
  return fixedFoo(bar);
}

不改变其他二进制文件?即我可以做一些内存hackery来改变调用foo的功能吗?

遗憾的是,我不能预先修补二进制文件,因为foo的正确行为取决于运行时启动的结果。

1 个答案:

答案 0 :(得分:0)

如果您有权访问源代码,可以将foo设为函数指针,然后在“运行时启动”之后将foo设置为您想要的例程。

#include <stdio.h>

int (*foo)(int);

int bar(int a) { printf("bar %d\n", a); return 0; }
int baz(int a) { printf("baz %d\n", a); return 0; }

int main(void) {
        // do start up here
        foo = bar;
        foo(23);
        return 0;
}

打印

bar 23