2016-03-16 259 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