图书馆介入nanosleep

时间:2016-03-16 02:35:50

标签: c shared-libraries

我试图在Linux中使用库插入来挂钩函数调用。我捕捉得非常好,但有些情况我不知道......其中一个案例是nanosleep()。我挂钩的二进制文件每隔一秒就使用这个函数来休眠线程...如果我使用任何其他工具如strace我可以挂钩调用而不会出现问题...我能错过什么?这是我在共享库中使用的定义...

int nanosleep (const struct timespec *rqtp, struct timespec *rmtp)
{
    static int (*my_nanosleep)(const struct timespec *, struct timespec *) = NULL;
    if (!my_nanosleep)
       my_nanosleep = (int(*)(const struct timespec *, struct timespec *)) dlsym(RTLD_NEXT, "nanosleep");
    printf("\n\n nanosleep() is called and hooked with my_nanosleep() \n\n");

    FILE *f = fopen("/home/user/Desktop/Test.txt", "a");    
        if (f==NULL)
    {
                printf("error opening file\n");
        exit(0);
    }
    char *text1 = "nanosleep()";
    fprintf(f, "%s\n", text1);
    fclose(f);  

        return(my_nanosleep(rqtp, rmtp));
}

2 个答案:

答案 0 :(得分:0)

工具 strace 仅显示通过userspace / os-boundary的调用。所以,如果你看到像

这样的行
 nanosleep({1, 0}, 0x7ffd50e5acf0)       = 0

你正在拦截调用的程序可能直接调用了glibc-function nanosleep()(这导致了系统调用nanosleep()。在这种情况下,你的拦截应该按预期工作。

但也有可能,程序调用

sleep(1);

在这种情况下,glibc-function sleep()(你做拦截)调用nanosleep() - 系统调用。因此,在这种情况下,您必须拦截对sleep()的调用。

工具ltrace可以帮助您找出您检查的程序所调用的库函数。

答案 1 :(得分:0)

我找到了答案。为了能够捕获函数调用,我在终端中运行应用程序作为根...最重要的是,我使用的是sudo,这就是问题所在。我删除了sudo,现在我正在捕获所有的函数调用......在它非常有限之前,结果每次都是相同的......