【问题标题】:library interposition with dlsym使用 dlsym 进行库插入
【发布时间】:2009-10-25 18:33:18
【问题描述】:

我正在编写一个插入库来跟踪 libc 中一些库函数的使用情况,例如 open()、close()、connect() 等。它通常在大多数应用程序上运行良好。但是,当我使用 PHP 进行尝试时,特别是使用 PHP 的 MySQL 模块时,没有跟踪该模块内对 libc 的任何函数调用(因此没有 connect()、没有 socket() 等)。 'strace' 告诉我系统调用了 socket()、connect() 等。在模块和libmysqlclient.so.16.0.0上运行'file'表示它们都是动态链接的。所以这应该不是静态链接引起的问题。可能是什么问题?

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

谢谢。

【问题讨论】:

    标签: php mysql libc dlsym


    【解决方案1】:

    好像不是静态链接造成的。事实上,PHP 是动态链接到其他库的。问题在于 PHP 加载扩展的方式。

    PHP 通过调用带有 RTLD_LAZY 标志的 dlopen() 来加载扩展,这意味着只有在执行引用时才会解析符号。这绕过了 LD_PRELOAD 指定的插入。

    【讨论】:

      【解决方案2】:

      库可能出于某种原因直接调用系统调用。在这种情况下,您需要使用strace(或在您自己的程序中使用ptrace())来跟踪此使用情况。

      【讨论】:

      • 通过阅读mysql客户端库的源码,貌似在调用connect()等
      【解决方案3】:

      我同意上面的回答,这些库可能会绕过 libc 中对 open()、write() 等的调用。换句话说,这些库可能是直接使用程序集调用系统调用,而不是使用libc 接口.. 虽然直接使用系统调用的应用程序并不常见,但并非闻所未闻.. 如果是这种情况,这就是为什么您在库插入实验中看不到任何拦截的原因。那么您有两种方法,一种通过 strace 快速,另一种更复杂的是构建将在内核级别拦截这些调用的内核模块并向您正在构建的任何框架报告..
      玩得开心.. 埃内斯托B

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多