gpt4 book ai didi

c - 将任意函数挂接到 _exit(2)

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:35 25 4
gpt4 key购买 nike

我感兴趣的是我是否可以在 _exit(2) 调用中调用任意函数,这会绕过其他 Hook 架构,所以这对我来说似乎并不容易。

  • 如果这是一个普通的 exit(3)return 语句,显然可以通过 atexit(3), on_exit (3),或 __attribute__((destructor)) 扩展名为 gcc
  • 可以通过用 LD_PRELOAD 覆盖 _exit(2) 来实现;我希望避免这种情况

有没有办法不用LD_PRELOAD,比如重写_exit(2)


编辑:我面临的问题是使用 CoW fork(2)ed Perl 程序。该程序的子进程在 exit(3) 调用时运行析构函数,其中它们接触许多内存位置,导致大量内存复制,尽管它们将退出。在 Perl 中很难用普通的 exit 调用绕过析构函数,所以一个想法是调用 POSIX::_exit 。但是,有一个带有 LD_PRELOAD 的动态加载库,我想在进程退出时调用其中的一个函数。

最佳答案

AFAIU,如果没有 LD_PRELOAD 技巧,或者 ptrace(2) 根本不可能。使用 PTRACE_SYSCALL 来自另一个 进程(例如运行 gdb 的父进程)。在最低级别,_exit(2)system call使用 SYSENTER 机器指令的“原子”操作也是如此,例如通过 vdso(7) .

请注意,C 程序可以使用一些 asm 来调用 _exit 系统调用(或使用间接 syscall(2) )

假设动态链接可执行文件到 GNU libc 或 musl-libc , 你唯一的办法就是捕获 exit(3)库函数(不是 _exit(2) 系统调用!)使用 atexit(3)

您可以重新定义 _exit 并希望动态链接器调用您的 _exit,而不是 libc 中的那个。我不会玩这种把戏的。

或者,编写一个小的包装 C 程序,forkexecvewaitpid 原始程序。

关于c - 将任意函数挂接到 _exit(2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334602/

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