2009-10-25 70 views
2

我正在編寫一個插入庫來跟蹤libc中的一些庫函數的使用,如open(),close(),connect()等。它通常適用於大多數應用程序。但是,當我使用PHP進行嘗試時,特別是使用PHP的MySQL模塊,沒有任何對此模塊內libc的函數調用進行跟蹤(所以沒有connect(),沒有socket()等)。 'strace'告訴我係統調用了socket(),connect()等。在模塊上運行'file'和libmysqlclient.so.16.0.0表示它們都是動態鏈接的。所以它不應該是靜態鏈接造成的問題。可能是什麼問題?圖書館間接與dlsym

我使用的是Fedora 11 64位版本。

謝謝。

回答

0

庫可能由於某種原因直接調用系統調用。在這種情況下,您需要使用strace(或在您自己的程序中使用ptrace())來跟蹤此用法。

+0

通過閱讀mysql客戶端庫的源代碼,它看起來像是調用connect()等。 – 2009-10-25 18:52:07

2

看起來好像它不是由靜態鏈接引起的。事實上,PHP是動態鏈接到其他庫。這個問題依賴於PHP加載擴展的方式。

PHP通過調用帶標誌RTLD_LAZY的dlopen()來加載擴展,這意味着只有在執行引用時纔會解析該符號。這繞過了由LD_PRELOAD指定的插入。

0

我同意上面的答案,這些庫可能會繞過libc中open(),write()等的調用。換句話說,這些庫可能直接使用assembly調用系統調用,而不是使用libc接口..儘管直接看到使用系統調用的應用程序並不常見,但它並不是聞所未聞的.. 如果是這樣的話,那就是爲什麼你在庫插入實驗中看不到任何攔截。兩種方法以後,快速通過一個Strace和更復雜的一個建立一個內核模塊,將在內核級攔截這些調用到任何框架您正在建設情況的報告..
玩得開心.. ErnestoB