最近写了一个主机健康检测和软负载均衡用的软件ZFOR(http://github.com/chaoslawful/zfor
),可以通过LD_PRELOAD预载入的方式拦截系统的域名解析调用(gethostbyname、getaddrinfo等)。但发现对某些发行版的PHP CURL extension光加载zfor动态库没有用,还必须同时加载libcurl.so才能生效。
经过一番搜索,发现原来是PHP编译时让Zend引擎使用了RTLD_DEEPBIND标志来加载扩展,该标志的作用是约束动态符号解析的查找范围为载入的动态库及其依赖项,而不是从所有已加载项的符号表中寻找。PHP启用该选项的原意是避免同时加载多个具有共同依赖库的扩展时产生多版本符号解析冲突的问题,但在这里就影响了zfor的preload拦截过程。因为PHP CURL扩展只依赖libcurl.so而不依赖libzfor.so,故在不预加载libcurl.so时libzfor.so不会列入PHP CURL扩展符号解析的查找范围,这样在libzfor.so中定义的getaddrinfo别名自然无法生效。
在同时预加载libcurl.so和libzfor.so时,由于是系统的动态库加载器ld-linux.so按默认解析策略进行符号解析,故会将libcurl.so中引用的getaddrinfo符号解析到libzfor.so中提供的实现上,而由于动态库都是单实例加载的,这样当PHP CURL扩展被载入时,其依赖的libcurl.so就会用之前预加载的那个实例来解决,不需要再进行符号查找,也就不用受到RTLD_DEEPBIND标志的约束了。
分享到:
相关推荐
安卓挂钩子 hook技术 详细讲解了如何挂钩android api
使用Go LD_PRELOAD libc挂钩 这是在共享库中使用Go封装libc函数并启动TCP服务器(“后门”)的实验,该服务器允许从客户端(如telnet或netcat)运行任意命令。 这是一款用于教育目的的玩具,可演示Go的某些功能。 ...
免费检查器用法./freeChecker.sh描述######使用LD_PRELOAD的简单免费检查程序(用于C程序)。 ######它有助于程序员发现内存泄漏错误!
打开目录 通过 LD_PRELOAD 重定向文件打开操作
LD_PRELOAD=target/debug/libsrvshim.so \ curl _my-service._tcp.domain 您还可以在/etc/ld.so.conf创建一个条目,以使它被加载到系统上的所有进程中。 OSX: DYLD_INSERT_LIBRARIES=/abs/path/to/libsrvshim....
每个人都根这是一个很小的LD_PRELOAD垫片,如果找不到请求的用户,它会导致getpwnam()和getpwnam_r()返回 root 的信息。设置$ make$ LD_PRELOAD= ` pwd ` /everybody-root.so /path/to/exe为什么? 我需要它,以便我...
LD PRELOAD实用程序
Coverity 静态检查 Travis 构建状态路由器libiorouter 是 LD_PRELOAD 库,它使应用程序可以更好地控制缓存后端文件系统和缓存失效。 它通过挂钩 IO 调用并将它们重定向到 LIBIOR_CACHEDIR 来透明地工作,该 LIBIOR_...
ld_preload 声音 通过挂钩 malloc() 和 read() 生成 WAV 输出。 添加对其他调用的支持应该很容易,非常欢迎拉取请求! 此外,它应该不言而喻......但我无论如何都会说......这是实验性的。 钩住内存和读取调用可能...
用法示例LD_PRELOAD='/usr/local/lib/libmemleak.so' ./a.out 可能还需要预加载libbfd和libdl,因此请使用LD_PRELOAD='/usr/local/lib/libmemleak.so /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu...
linux 如何hook 任何一个目标文件中 使用的 第一层函数。在没有目标源码的情形下。对目标进行hook、 亲测,可以用
名称wrapalloc - 包装 glibc 的内存分配和释放 API 函数以简化动态跟踪概要 LD_PRELOAD=/path/to/wrapalloc/wrapalloc.so your_app描述大多数主流 Linux 发行版附带的 glibc 二进制文件通常会受到 gcc 在非常积极的...
设置 LD_PRELOAD 并启动 Sublime Text LD_PRELOAD=./libsublime-imfix.so subl 修改 /usr/share/applications/sublime_text.desktop 为 复制代码 [Desktop Entry] [...] Exec=env LD_PRELOAD=/opt/sublime_text/...
LD_PRELOAD hack可以在sqlite数据库中保存malloc和自由操作。 基于我很久以前在glibc中使用__malloc_hook / __free_hook编写的内容。 由于现在已将这些标记为“已弃用”,因此我使用以下建议重写了这些内容: 构建...
sudo apt-get install build-essential sudo apt-get install libgtk2.0-dev ...Exec=env LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text --command new_file
该库在预加载到的任何游戏中都会产生“子弹时间”效果。 它的下面使函数clock_gettime重载,从而将其报告速度降低了4倍。 这是在《葡萄酒》中运行的《异形射击2》,... 我系统中的示例: LD_PRELOAD="/home/consta
ssl-拦截-ldpreload 用于拦截使用 openssl 建立的 SSL 连接的纯文本的 LD_PRELOAD 库 用法: LD_PRELOAD=./libinterceptssl.so curl https://www.google.com
ELS-N04_hw_la_R2-C605_PRELOAD-10.1.0.1_ReleaseNotes
this is a Google_Preload_Integration_r3_080806.pdf,it very good.
这是POSIX网络API的仿真器,旨在通过LD_PRELOAD与模糊器一起使用。 模糊器通常与执行网络IO的应用程序不兼容。 一些库方便地支持基于缓冲区的IO,例如。 但是,模糊测试人员很少探索应用程序调用的IO功能的完整...