关闭

【Linux】LD_PRELOAD用法

标签: LD-PRELOAD
7658人阅读 评论(3) 收藏 举报
分类:

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。程序中我们经常要调用一些外部库的函数,以malloc为例,如果我们有个自定义的malloc函数,把它编译成动态库后,通过LD_PRELOAD加载,当程序中调用malloc函数时,调用的其实是我们自定义的函数,下面以一个例子说明。

// test.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 0;
    for (; i < 5; ++i) {
        char *c = (char*)malloc(sizeof(char));
        if (NULL == c) {
            printf("malloc fails\n");
        }
        else {
            printf("malloc ok\n");
        }
    }

    return 0;
}

编译运行,结果如下:

$gcc -o test test.c
$./test
malloc ok
malloc ok
malloc ok
malloc ok
malloc ok

可以看出,程序运行没有问题,我们稍作修改,自定义malloc。

// preload.c
#include <stdio.h>
#include <stdlib.h>

void* malloc(size_t size)
{
    printf("%s size: %lu\n", __func__, size);
    return NULL;
}

然后把自定义的malloc打包为动态库。

$gcc -shared -fpic -o libpreload.so preload.c

接着使用LD_PRELOAD加载libpreload.so,看看情况如何:

$LD_PRELOAD=./libpreload.so ./test
malloc size: 1
malloc fails
malloc size: 1
malloc fails
malloc size: 1
malloc fails
malloc size: 1
malloc fails
malloc size: 1
malloc fails

看到了吧,5次malloc都失败了,如果不知道是 LD_PRELOAD在作怪,那可能分析很长时间都找不出原因所在。这个 LD_PRELOAD就是把双刃剑,用好了可以帮助我们,如果别有用心,那可能会有意外的惊喜。

3
0
查看评论

警惕UNIX下的LD_PRELOAD环境变量

 警惕UNIX下的LD_PRELOAD环境变量 陈皓 前言        也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久。不过,在这里,我还是想讨论一下这个环境变量。因为这个环境变...
  • haoel
  • haoel
  • 2007-05-09 17:40
  • 44885

linux--函数劫持--基于LD_PRELOAD

最近在网上看到了一篇利用LD_PRELOAD实现函数拦截的文章,感觉受益匪浅(I'm new),就翻译了出来。里面除了介绍基础的使用方法外,还介绍了相关的使坏技术。
  • u012301943
  • u012301943
  • 2014-05-31 13:01
  • 3346

【Linux】LD_PRELOAD用法

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。程序中我们经常要调用一些外部库的函数,以malloc为例,...
  • iEearth
  • iEearth
  • 2015-11-20 21:13
  • 7658

Linux Tips 之 狸猫换太子:LD_PRELOAD

$ cat 1.cvoid *malloc ( unsigned sz ) { return 0; }$ gcc -shared 1.c -o libmyc.so$ cat 2.c#include int main () {  void *p = malloc ( 3 );  r...
  • Wolf0403
  • Wolf0403
  • 2005-06-07 06:29
  • 3479

Linux下入门级导出函数截获-使用LD_PRELOAD环境变量

博文篇首要感谢我的同事zxb,他曾经提示我有这种简便的截获方法。     近期要做Linux下libvirt事件审计,原计划是分析libvirt的通信数据从而进一步分析libvirt事件。尼玛,这怎么看都觉得工作量浩大,第一反应就是能不能偷懒。对于一般的审计事件,首先...
  • lixiangminghate
  • lixiangminghate
  • 2015-03-10 09:37
  • 876

linux平台LD_PRELOAD及其机制的一种技术

在Unix操作系统的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入Unix操作系统不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程...
  • aganlengzi
  • aganlengzi
  • 2014-03-22 20:55
  • 69076

linux下采用LD_PRELOAD机制动态修改方法和注入代码

LD_PRELOAD是linux下的一个环境变量,动态链接器在载入一个程序所需的所有动态库之前,首先会载入LD_PRELOAD环境变量所指定的动态库。运用这个机制,我们可以修改/替换已有动态库中的方法,加入我们自己的逻辑,从而改变程序的执行行为。不过该方法只对动态链接的程序有效,对静态链接的程序无效...
  • weiyuanke
  • weiyuanke
  • 2016-04-27 10:59
  • 1753

小心环境变量-浅谈LD_PRELOAD

/* author:少仲 blog:   http://blog.csdn.net/py_panyu weibo: http://weibo.com/u/3849478598 欢迎转载,转载请注明出处. */ 0x0 前言   在Windows平台,各种Hook技术已经被玩的...
  • py_panyu
  • py_panyu
  • 2015-04-18 16:44
  • 2359

解决LD_PRELOAD无法截获printf的问题

前面博文 Linux下入门级导出函数截获-使用LD_PRELOAD环境变量 中说道用LD_PRELOAD的方法截获动态库中的函数,有人问我不能截获printf,我就在此文中回答这个问题吧。     首先看下他写的用于拦截的代码和测试代码 拦截代码 #include...
  • lixiangminghate
  • lixiangminghate
  • 2015-06-06 19:52
  • 913

LD_PRELOAD

前言          也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久。不过,在这里,我还是想讨论一下这个环境变量。因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注意。   在开始讲述为...
  • lmxmimihuhu
  • lmxmimihuhu
  • 2015-12-02 13:40
  • 989
    个人资料
    • 访问:384145次
    • 积分:6678
    • 等级:
    • 排名:第4235名
    • 原创:263篇
    • 转载:0篇
    • 译文:5篇
    • 评论:52条
    Make Others Better.
    博客专栏
    文章分类