使用 dlsym 进行库插入

发布于 2024-08-09 17:39:36 字数 325 浏览 12 评论 0原文

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

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

谢谢。

I'm writing an interposition library to track the usage of some library functions in libc, such as open(), close(), connect(), etc. It works generally well on most of the applications. However, when I try it with PHP, using PHP's MySQL module in particular, none of the function calls to libc inside this module is been tracked (so no connect(), no socket(), etc.). 'strace' told me that the system calls socket(), connect(), etc., took place. Running 'file' on the module and libmysqlclient.so.16.0.0 said that they are all dynamically linked. So it shouldn't be a problem caused by static linkage. What might be the problem?

I'm using Fedora 11 64-bit version.

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

找回味觉 2024-08-16 17:39:36

看起来这不是由静态链接引起的。事实上,PHP 是动态链接到其他库的。问题在于 PHP 加载扩展的方式。

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

It seems like that it was not caused by static linkage. In fact, PHP is dynamically linked to other libraries. The problem relies in the way PHP loads extensions.

PHP loads extensions by calling dlopen() with flags RTLD_LAZY, which means that the symbol will only be resolved when the reference is executed. This bypasses the interposition specified by LD_PRELOAD.

暮色兮凉城 2024-08-16 17:39:36

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

It's possible that the library may be invoking system calls directly for some reason. In this case you'd need to use strace (or ptrace() in your own program) to track this usage.

℉絮湮 2024-08-16 17:39:36

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

I agree with the answer above that these libraries may be bypassing the calls to open(), write(), etc in libc.. In other words, those libraries may be calling the system calls directly using assembly and not using the libc interface.. although it is not all that common to see applications using the syscalls directly, it is not unheard of..
If that's the case, that's why you would not see any interception in your library interposition experiment.. You have two ways then, the quick one through strace and the more complex one in building a kernel module that will intercept these calls at the kernel level and reporting to whatever framework you are building..
Have fun..
ErnestoB

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文