网上已经有不少相关文章,具体可参考:
通过getuid、printf等函数讲解了基本的加钩子的方法:
http://blog.chinaunix.net/u/9577/showart_1195703.html
如果你希望的不仅仅是替换掉原有库函数,而且还希望最终将函数逻辑传递到原有系统函数,那么你可能需要用到RTLD_NEXT。系统可能提示RTLD_NEXT未定义,这里给出了解决方案:
http://xueruini.spaces.live.com/blog/cns!DF086AB717BC7F6F!517.entry
使用dlsym时候可能遇到链接错误,提示找不到dlsym。解决方法是编译的时候加上-ldl编译选项:
http://blog.tianya.cn/blogger/post_show.asp?BlogID=78856&PostID=13635493
我的过程记录
fork.c,最后编译成fork.so
strlen.c,最后编译成strlen.so 。 需要说明的是,最后这个so没有用到,因为我遇到了一个诡异的事情,详细见后文。
测试代码。测试了strlen和fork。
但是,我并没有为strlen加钩子,因为,我发现,无论是否挂钩strlen,这个测试函数总是没有反应,根本没有进入到strlen.c的代码中。不过呢,当我用export LD_PRELOAD="./strlen.so"后,vi、ls等应用程序都能够进入到strlen.c中,唯独我的./hello不能进入strlen.c。诡异!
fork函数测试有效。
编译过程(只涉及到 fork.c 和 hello.c )
gcc -fPIC -shared -ldl -o fork.so fork.c
; note: 如果没有家ldl,则提示找不到符号dlsym,没有家-fPIC,则编译器会提示添加此选项。跟网上的一些资料有点出入。
gcc -o hello hello.c
export LD_PRELOAD="./fork.so"
./hello abcd
abcd length is 4
Fork is called
pid=0
pid=12828
export LD_PRELOAD=""
; clear preload path
上面使用LD_PRELOAD的方法有个问题,它是一个持久的全局设置,可能会影响到./hello之外的程序的正常行为。一个更好的使用方法是直接执行:
LD_PRELOAD="./fork.so" ./hello abcd
后记:
关于dlsym
LD_PRELOAD能够很方便地实现应用层的二进制兼容,值得推广。同时谨记LD_PRELOAD不可滥用,否则会干扰正常系统的功能。一般,用完后需要将LD_PRELOAD的内容清空。
分享到:
相关推荐
Android操作系统,作为...在安全限制之内,开发者可以利用LD_PRELOAD进行函数级别的Hook,用于调试、性能测试或监控应用程序的行为。不过,这一技术应当谨慎使用,避免违反安全原则和隐私政策,以及用户的安全预期。
使用LD_PRELOAD技术的一个重要优势在于它不需要改变原有的二进制文件,也不需要重新编译目标程序,这使得它可以作为一种高效的hook(钩子)技术。 具体来说,当使用LD_PRELOAD环境变量指定共享库时,该库中的函数将...
名称wrapalloc - 包装 glibc 的内存分配和释放 API 函数以简化动态跟踪概要 LD_PRELOAD=/path/to/wrapalloc/wrapalloc.so your_app描述大多数主流 Linux 发行版附带的 glibc 二进制文件通常会受到 gcc 在非常积极的...
本篇文章将深入探讨`openredir`项目,它是如何利用`LD_PRELOAD`来重定向文件打开操作的。 首先,让我们理解`LD_PRELOAD`的概念。`LD_PRELOAD`是Linux环境变量,当程序启动时,它允许我们指定一些动态库(.so文件)...
这里的"PRELOAD:LD_PRELOAD rootkit实用程序"是指利用`LD_PRELOAD`环境变量来加载一个自定义的动态链接库(`.so`文件),从而在系统调用层面进行hook或注入代码,实现对目标程序的控制或监控。这在某些情况下可以...
**免费检查器(Free Checker)**是一个针对C语言程序的简单内存泄漏检测工具,它巧妙地利用了Linux动态链接器的特性——`LD_PRELOAD`。这个工具的主要目的是帮助程序员定位并解决C语言编程中常见的内存泄漏问题。...
使用Go LD_PRELOAD libc挂钩 这是在共享库中使用Go封装libc函数并启动TCP服务器(“后门”)的实验,该服务器允许从客户端(如telnet或netcat)运行任意命令。 这是一款用于教育目的的玩具,可演示Go的某些功能。 ...
每个人都根这是一个很小的LD_PRELOAD垫片,如果找不到请求的用户,它会导致getpwnam()和getpwnam_r()返回 root 的信息。设置$ make$ LD_PRELOAD= ` pwd ` /everybody-root.so /path/to/exe为什么? 我需要它,以便我...
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 声音 通过挂钩 malloc() 和 read() 生成 WAV 输出。 添加对其他调用的支持应该很容易,非常欢迎拉取请求! 此外,它应该不言而喻......但我无论如何都会说......这是实验性的。 钩住内存和读取调用可能...
htim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(htim) != HAL_OK) { // 错误处理 } } ``` 6. **总结** 创建库函数模板是STM32开发中提高效率和代码质量的重要...
用法示例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...
Coverity 静态检查 Travis 构建状态路由器libiorouter 是 LD_PRELOAD 库,它使应用程序可以更好地控制缓存后端文件系统和缓存失效。 它通过挂钩 IO 调用并将它们重定向到 LIBIOR_CACHEDIR 来透明地工作,该 LIBIOR_...
LD_PRELOAD hack可以在sqlite数据库中保存malloc和自由操作。 基于我很久以前在glibc中使用__malloc_hook / __free_hook编写的内容。 由于现在已将这些标记为“已弃用”,因此我使用以下建议重写了这些内容: 构建...
设置 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/...
华为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版本的软件更新内容...
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
- 另一个临时解决方案是使用`LD_PRELOAD`环境变量,强制加载指定版本的`libstdc++.so.6`。但这不是长期解决方案,因为它可能与其他依赖相同库但需要不同版本的应用程序冲突: ``` export LD_PRELOAD=/path/to/...