Php 使用dlsym的库插入
我正在编写一个插入库来跟踪libc中某些库函数的使用情况,如open()、close()、connect()等。它通常在大多数应用程序上都能正常工作。但是,当我尝试使用PHP时,尤其是使用PHP的MySQL模块时,没有跟踪到该模块中对libc的函数调用(因此没有connect()、socket()等)strace’告诉我,系统调用socket()、connect()等。在模块和libmysqlclient.so.16.0.0上运行“file”表示它们都是动态链接的。所以它不应该是由静态链接引起的问题。有什么问题吗 我使用的是Fedora 11 64位版本Php 使用dlsym的库插入,php,mysql,libc,dlsym,Php,Mysql,Libc,Dlsym,我正在编写一个插入库来跟踪libc中某些库函数的使用情况,如open()、close()、connect()等。它通常在大多数应用程序上都能正常工作。但是,当我尝试使用PHP时,尤其是使用PHP的MySQL模块时,没有跟踪到该模块中对libc的函数调用(因此没有connect()、socket()等)strace’告诉我,系统调用socket()、connect()等。在模块和libmysqlclient.so.16.0.0上运行“file”表示它们都是动态链接的。所以它不应该是由静态链接引起的
谢谢。由于某种原因,库可能会直接调用系统调用。在这种情况下,您需要使用
strace
(或在您自己的程序中使用ptrace()
)来跟踪此用法。似乎它不是由静态链接引起的。事实上,PHP是动态链接到其他库的。问题在于PHP加载扩展的方式
PHP通过调用带有标志RTLD_LAZY的dlopen()加载扩展,这意味着只有在执行引用时才会解析符号。这绕过了LD_PRELOAD指定的插入。我同意上面的答案,即这些库可能会绕过对libc中open()、write()等的调用。。换句话说,这些库可能直接使用汇编调用系统调用,而不使用libc接口。。尽管直接使用系统调用的应用程序并不常见,但也并非闻所未闻。。 如果是这样的话,那就是为什么在你的库插入实验中看不到任何截获。。然后有两种方法,一种是通过strace快速生成,另一种是更复杂的方法,用于构建内核模块,该模块将在内核级别拦截这些调用,并向正在构建的任何框架报告。
玩得高兴
ErnestoB通过阅读mysql客户端库的源代码,它看起来像是在调用connect(),等等。