gpt4 book ai didi

在运行时有条件地替换 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:41 24 4
gpt4 key购买 nike

是否可以在运行时有条件地替换 C 中的函数(特别是动态加载库中的函数)?

我知道你可以使用 LD_PRELOAD 或者只做一个同名的函数,例如:

// Silly example intercepting exit
typedef void (*exit_func)(int code);

void exit(int code)
{
exit_func orig_exit = (exit_func)dlsym(RTLD_NEXT, "exit");

NSLog(@"EXIT CALLED WITH CODE %d!!!!", code);

orig_exit(code);
}

但是,是否可以在程序加载并运行后在运行时有条件地替换函数?

if(some_condition)
{
swap_impementations(exit, my_exit);
}

编辑:这有点类似于 Is it possible to swap C functions?但具体来说,我试图拦截对操作系统加载的不同库的函数调用。

这意味着,例如,如果我从 stdlib 拦截 exit() 函数,从 ANYWHERE 对 exit() 的任何调用都会调用我的实现而不是原来的实现,就像我上面的例子一样,除了可控的运行时。

有人建议通过用跳转指令覆盖原始指令来 Hook 调用,但我希望有一些不需要占用可执行内存的东西,比如我可以在动态链接器中调用一些东西来“程序启动后重新链接”函数并将其指向其他地方?

最佳答案

为此目的使用函数指针。

关于在运行时有条件地替换 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661476/

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