Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在没有LD_预加载的情况下拦截用户级别的系统调用_C_Linux_Gcc_X86 64_System Calls - Fatal编程技术网

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()

  • 创建一个库,其中包含将调用转发到syscall的
    mySpecial*()
    函数。编译没有头文件的库

  • 使用上面的头文件编译您的代码(以及您使用的所有库)。链接到图书馆


  • 使用C宏。它的工作原理如下:

  • 创建一个头文件,为要跟踪的每个系统调用定义一个宏。示例:
    open()

  • 创建一个库,其中包含将调用转发到syscall的
    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)