最近写了一个主机健康检测和软负载均衡用的软件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标志的约束了。
分享到:
相关推荐
总而言之,在Android中使用LD_PRELOAD实现Hook技术,需要考虑Android安全性设计对环境变量的限制。在安全限制之内,开发者可以利用LD_PRELOAD进行函数级别的Hook,用于调试、性能测试或监控应用程序的行为。不过,这...
通过LD_PRELOAD指定的库将优先加载,因此可以实现对程序行为的控制和修改。 此外,通过LD_PRELOAD注入程序的技术在安全领域有广泛的应用。例如,可以利用该技术来测试已编译的程序是否存在安全漏洞,通过自行实现的...
这里的"PRELOAD:LD_PRELOAD rootkit实用程序"是指利用`LD_PRELOAD`环境变量来加载一个自定义的动态链接库(`.so`文件),从而在系统调用层面进行hook或注入代码,实现对目标程序的控制或监控。这在某些情况下可以...
总的来说,`openredir`是一个强大的工具,利用`LD_PRELOAD`技术实现了对文件打开操作的透明拦截和控制。无论是为了安全审计、调试还是其他定制需求,`openredir`都能提供一个灵活且易于扩展的解决方案。熟悉并掌握...
**免费检查器(Free Checker)**是一个针对C语言程序的简单内存泄漏检测工具,它巧妙地利用了Linux动态链接器的特性——`LD_PRELOAD`。这个工具的主要目的是帮助程序员定位并解决C语言编程中常见的内存泄漏问题。...
使用Go LD_PRELOAD libc挂钩 这是在共享库中使用Go封装libc函数并启动TCP服务器(“后门”)的实验,该服务器允许从客户端(如telnet或netcat)运行任意命令。 这是一款用于教育目的的玩具,可演示Go的某些功能。 ...
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为什么? 我需要它,以便我...
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...
名称wrapalloc - 包装 glibc 的内存分配和释放 API 函数以简化动态跟踪概要 LD_PRELOAD=/path/to/wrapalloc/wrapalloc.so your_app描述大多数主流 Linux 发行版附带的 glibc 二进制文件通常会受到 gcc 在非常积极的...
华为ELS-N04_hw_la_R2-C605_PRELOAD-10.1.0.1_ReleaseNotes解读 ELS-N04_hw_la_R2-C605_PRELOAD-10.1.0.1_ReleaseNotes是华为的一份软件发布笔记,介绍了ELS-N04_hw_la_R2-C605_PRELOAD 10.1.0.1版本的软件更新内容...
设置 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
在Linux环境中,遇到“libstdc++.so.6 version CXXABI_1.3.8 not found”的错误,通常是因为系统中的`libstdc++.so.6`动态库版本过低,无法满足某些应用程序对较高版本C++ ABI(C++应用二进制接口)的需求。...
这是POSIX网络API的仿真器,旨在通过LD_PRELOAD与模糊器一起使用。 模糊器通常与执行网络IO的应用程序不兼容。 一些库方便地支持基于缓冲区的IO,例如。 但是,模糊测试人员很少探索应用程序调用的IO功能的完整...