我正在编写一个插入库来跟踪libc中一些库函数的使用情况,比如open()、close()、connect()等。它在大多数应用程序上都运行得很好。但是,当我在PHP中尝试它时,特别是使用PHP的MySQL模块时,没有跟踪到这个模块中对libc的任何函数调用(所以没有connect(),没有socket(),等等)。‘'strace’告诉我,系统调用了socket()、connect()等。在模块和libmysqlclient.so.16.0.0上运行'file‘时表示它们都是动态链接的。所以这不应该是静态链接造成的问题。可能的问题是什么?
我使用的是Fedora 11 64位版本。
谢谢。
发布于 2009-10-27 10:32:52
它似乎不是由静态链接引起的。实际上,PHP是动态链接到其他库的。问题在于PHP加载扩展的方式。
PHP通过调用带有RTLD_LAZY标志的dlopen()来加载扩展,这意味着只有在执行引用时才会解析符号。这将绕过LD_PRELOAD指定的间隔。
发布于 2009-10-26 02:35:39
由于某种原因,库可能会直接调用系统调用。在这种情况下,您需要使用strace (或在您自己的程序中使用ptrace() )来跟踪这种使用情况。
发布于 2010-05-18 04:28:22
我同意上面的回答,即这些库可能绕过了libc中对open()、write()等的调用。换句话说,这些库可能直接使用汇编而不是libc接口调用系统调用。尽管直接使用syscall的应用程序并不常见,但也并非闻所未闻。如果是这样的话,这就是为什么在库插入实验中看不到任何拦截的原因。然后,您有两种方法,一种是快速通过strace,另一种是构建一个内核模块,该模块将在内核级别拦截这些调用,并向您正在构建的任何框架报告。
玩得开心..。ErnestoB
https://stackoverflow.com/questions/1621654
复制相似问题