一个适用于 x64 Linux 的简易无 ptrace 共享库注入器。
linux_injector <mode> <pid> <file>
mode(模式)
pid
目标进程 ID。必须拥有对该进程的 ptrace 权限(访问 /proc/$pid/mem 时需要)。不会对其使用 ptrace,因此其他进程可以自由地 ptrace 该目标进程。
file
模式 1:要注入的模块,将在远程进程中被 dlopen。最好使用完整路径,否则远程进程会使用其自身的 LD_LIBRARY_PATH 进行解析。
模式 2:要注入的模块,将从 memfd 中在远程进程内被 dlopen,模块内容会被复制到该 memfd 中。
模式 3:要注入的原始 shellcode。你将被映射到一个 16 字节对齐的地址,并在一个随机劫持的线程上开始执行。放置钩子或创建线程后,即可返回。
为了实现控制流劫持,本程序需要一个劫持候选函数。此处给出的代码使用 malloc,可通过修改 FUN_NAME 并重新编译来更改。请确保被钩住的函数能在 100ms 内运行完毕,以免在其执行过程中被覆盖。这意味着 sleep 或 wait 之类的调用不适合作为初始 shellcode 的候选。所选的函数长度还必须大于 0x50 字节,以免 shellcode 覆盖其他函数。
目标进程和源进程均支持 Glibc 和 musl。目标进程可以运行在容器中,并且可以使用不同的 libc。模式 2 和 3 不需要目标进程可访问的任何路径。
模式 2 需要 Linux 3.17。
已在 Oracle Linux 7(不支持模式 2)、Fedora 37 和 Alpine Linux 3.17 上测试。