C 在没有LD_预加载的情况下拦截用户级别的系统调用
在我的程序中,我希望在同一进程中拦截用户级别的每个系统调用(我不希望使用单独的进程,如C 在没有LD_预加载的情况下拦截用户级别的系统调用,c,linux,gcc,x86-64,system-calls,C,Linux,Gcc,X86 64,System Calls,在我的程序中,我希望在同一进程中拦截用户级别的每个系统调用(我不希望使用单独的进程,如ptrace,或工具,如strace)。我也不想使用LD_预加载。我该怎么做 使用C宏。它的工作原理如下: 创建一个头文件,为要跟踪的每个系统调用定义一个宏。示例:open() 创建一个库,其中包含将调用转发到syscall的mySpecial*()函数。编译没有头文件的库 使用上面的头文件编译您的代码(以及您使用的所有库)。链接到图书馆 使用C宏。它的工作原理如下: 创建一个头文件,为要跟踪的每个系统调用定
ptrace
,或工具,如strace
)。我也不想使用LD_预加载。我该怎么做 使用C宏。它的工作原理如下:
open()
mySpecial*()
函数。编译没有头文件的库使用C宏。它的工作原理如下:
open()
mySpecial*()
函数。编译没有头文件的库我不认为
LD_PRELOAD
可以用来拦截系统调用。我不认为LD_PRELOAD
可以用来拦截系统调用。但是这不会捕获手工编码(即内联汇编)的系统调用,像strace
这样的工具可以捕获。另外,除非您重新编译libc
,否则通过标准库函数进行的所有系统调用也不会被捕获。@作业:正如我所说:“以及您使用的所有库”。你知道更好的解决办法吗?OP不想使用任何官方工具;他们做得很好。是的,我知道,但我只是指出了你的解决方案中的两个缺点。至于更好的解决方案,显然我没有一个,因为我当时会发布它:-)我想用某种技巧来使用ptrace
来跟踪您自己的进程,而不是一个孩子,但我想这是不可能的。是的:-)如果他想跟踪正常的库函数,我建议更改.o文件中的符号名称,或者可能弄乱链接器。请参见如何使用LD_PRELOAD的示例。另一个很好的例子是:但这不会捕获手工编码(即内联汇编)系统调用,而像strace
这样的工具会捕获。另外,除非您重新编译libc
,否则通过标准库函数进行的所有系统调用也不会被捕获。@作业:正如我所说:“以及您使用的所有库”。你知道更好的解决办法吗?OP不想使用任何官方工具;他们做得很好。是的,我知道,但我只是指出了你的解决方案中的两个缺点。至于更好的解决方案,显然我没有一个,因为我当时会发布它:-)我想用某种技巧来使用ptrace
来跟踪您自己的进程,而不是一个孩子,但我想这是不可能的。是的:-)如果他想跟踪正常的库函数,我建议更改.o文件中的符号名称,或者可能弄乱链接器。请参见如何使用LD_PRELOAD的示例。另一个很好的例子是:
#define open(path,flags,mode) mySpecialOpen(path,flags,mode)