网上已经有不少相关文章,具体可参考:
通过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的内容清空。
分享到:
相关推荐
安卓挂钩子 hook技术 详细讲解了如何挂钩android api
名称wrapalloc - 包装 glibc 的内存分配和释放 API 函数以简化动态跟踪概要 LD_PRELOAD=/path/to/wrapalloc/wrapalloc.so your_app描述大多数主流 Linux 发行版附带的 glibc 二进制文件通常会受到 gcc 在非常积极的...
使用Go LD_PRELOAD libc挂钩 这是在共享库中使用Go封装libc函数并启动TCP服务器(“后门”)的实验,该服务器允许从客户端(如telnet或netcat)运行任意命令。 这是一款用于教育目的的玩具,可演示Go的某些功能。 ...
免费检查器用法./freeChecker.sh描述######使用LD_PRELOAD的简单免费检查程序(用于C程序)。 ######它有助于程序员发现内存泄漏错误!
打开目录 通过 LD_PRELOAD 重定向文件打开操作
每个人都根这是一个很小的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='/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...
ld_preload 声音 通过挂钩 malloc() 和 read() 生成 WAV 输出。 添加对其他调用的支持应该很容易,非常欢迎拉取请求! 此外,它应该不言而喻......但我无论如何都会说......这是实验性的。 钩住内存和读取调用可能...
LD PRELOAD实用程序
Coverity 静态检查 Travis 构建状态路由器libiorouter 是 LD_PRELOAD 库,它使应用程序可以更好地控制缓存后端文件系统和缓存失效。 它通过挂钩 IO 调用并将它们重定向到 LIBIOR_CACHEDIR 来透明地工作,该 LIBIOR_...
linux 如何hook 任何一个目标文件中 使用的 第一层函数。在没有目标源码的情形下。对目标进行hook、 亲测,可以用
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/...
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
这是POSIX网络API的仿真器,旨在通过LD_PRELOAD与模糊器一起使用。 模糊器通常与执行网络IO的应用程序不兼容。 一些库方便地支持基于缓冲区的IO,例如。 但是,模糊测试人员很少探索应用程序调用的IO功能的完整...
ELS-N04_hw_la_R2-C605_PRELOAD-10.1.0.1_ReleaseNotes
vlany是Linux LD_PRELOAD rootkit 。 正在安装 vlany的脚本是最快/最简单的安装方法。 root@vlany:~# wget ...