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

C 在运行时重写已编译的函数,c,C,在具有类似以下内容的预编译二进制文件的系统中: int foo(int bar) { // do something wrong return ...; } 是否有一种方法可用于在运行时将调用该函数的效果更改为: int foo(int bar) { return fixedFoo(bar); } 不改变其他二进制文件?也就是说,我可以做一些内存黑客来改变调用foo的功能吗 遗憾的是,我无法预先修补二进制文件,因为foo的正确行为取决于运行时启动的结果。如果您可以访问源代码,可以将

在具有类似以下内容的预编译二进制文件的系统中:

int foo(int bar) {
 // do something wrong
  return ...;
}
是否有一种方法可用于在运行时将调用该函数的效果更改为:

int foo(int bar) {
  return fixedFoo(bar);
}
不改变其他二进制文件?也就是说,我可以做一些内存黑客来改变调用foo的功能吗


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

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


您可以将foo设置为函数指针,然后在“运行时启动”后将foo设置为所需的例程。您可以通过调用一个固定函数来“预修补”二进制文件,该固定函数调用另一个依赖于“运行时启动”的函数。哪个平台/体系结构?总体思路:编写指令(Windows:)以推送所有寄存器(x86:
PUSHAL
),调用
fixedFoo
(x86:
call
),弹出所有寄存器(x86:
POPAL
)到
foo
的地址。假设那里有足够的空间,并且记住这是依赖于架构的,而且非常可怕。您还可以直接使用
JMP
而不是到处乱搞
调用
。您跳转到的代码必须确保返回到正确的位置不过,这是后来的事。
#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