我正在编写一个插入库来跟踪libc中某些库函数的用法,例如open(),close(),connect()等。它通常适用于大多数应用程序。但是,当我尝试使用PHP时,特别是使用PHP的MySQL模块,没有跟踪此模块中的libc函数调用(因此没有connect(),没有socket()等)。 'strace'告诉我系统调用了socket(),connect()等等。在模块上运行'file'和libmysqlclient.so.16.0.0表示它们都是动态链接的。所以它不应该是静态链接引起的问题。可能是什么问题?
我正在使用Fedora 11 64位版本。
谢谢。
答案 0 :(得分:2)
似乎它不是由静态链接引起的。事实上,PHP动态链接到其他库。问题依赖于PHP加载扩展的方式。
PHP通过使用标志RTLD_LAZY调用dlopen()来加载扩展,这意味着只有在执行引用时才会解析符号。这绕过了LD_PRELOAD指定的插入。
答案 1 :(得分:0)
由于某种原因,库可能会直接调用系统调用。在这种情况下,您需要在自己的程序中使用strace
(或ptrace()
)来跟踪此用法。
答案 2 :(得分:0)
我同意上面的答案,这些库可能绕过libc中对open(),write()等的调用。换句话说,这些库可能是使用程序集直接调用系统调用而不是使用libc接口..虽然看到直接使用系统调用的应用程序并不常见,但这并不是闻所未闻的..
如果是这种情况,那就是为什么你不会在你的库插入实验中看到任何拦截。你有两种方法,快速通过strace和更复杂的方法来构建一个内核模块,它将在内核级别拦截这些调用并报告你正在建设的任何框架。
玩得开心..
ErnestoB