【问题标题】:Conditionally replacing a C function at runtime在运行时有条件地替换 C 函数
【发布时间】:2013-05-15 17:12:15
【问题描述】:

是否可以在运行时有条件地替换 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 函数。最基本的方法是在函数的开头写一个跳转或调用指令。
  • 我想替换操作系统加载的动态库中包含的函数的实现,这样调用该函数的任何东西都会调用我的实现。例如,如果你想拦截 exit() 函数,函数指针就不会这样做。
  • 是的,那么您可能想要挂钩该功能。例如,微软有他们的Detours library 用于创建蹦床和挂钩 Win32 函数。

标签: c dynamic runtime


【解决方案1】:

为此使用函数指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多