2016-03-16 187 views
1

我想挂钩函数调用在Linux中使用库插件。我捕获了很多很好,但有一些我缺少的情况下...这种情况之一是nanosleep()。我正在使用这个函数每秒钟挂钩的二进制文件...如果我使用任何其他工具像strace我可以挂钩的调用没有问题...我可能会错过什么?这里是我使用的共享库中的定义...图书馆interposition nanosleep

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)); 
} 

回答

0

我找到了答案。为了能够捕获函数调用,我在终端中以root身份运行应用程序......最重要的是,我使用的是sudo,这是问题所在。我删除了sudo,现在我捕获了所有的函数调用......在它非常有限且结果每次都是一样的情况下...

0

工具strace的说明你只能通过用户空间/ OS-边界的电话。所以,如果你看到这样

nanosleep({1, 0}, 0x7ffd50e5acf0)  = 0 

你拦截呼吁可能已经调用glibc的功能nanosleep()直接(这会导致又在系统调用nanosleep()程序行。在这种情况下,你的拦截应该是工作作为预计。

但它也可能是可行的,该程序调用

sleep(1); 

在这种情况下,glibc的功能sleep()(你没截取)调用nanosleep() -syscall。因此,在这种情况下,您将不得不拦截对sleep()的呼叫。

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

+0

其实是的,我试图拦截nanosleep,sleep并且还睡着了。 .maybe库插入对主线程中运行的进程有一些限制吗? – Memo

+0

有一件有趣的事情是,我注意到我的库在应用程序执行开始时拦截了很多系统调用,并且在发送停止信号后终止,但是我在中间没有看到任何内容。 ..lets说我正在运行1分钟的二进制文件:我看到只有系统调用在进程的第一个和最后一秒发生......一旦主线程启动,我什么也没有,但沉默...... – Memo