LD_PRELOAD加载动态库

Posted yu121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LD_PRELOAD加载动态库相关的知识,希望对你有一定的参考价值。

LD_PRELOAD,是Linux系统的一个环境变量,用于动态库的加载,动态库加载的优先级最高。它可以影响程序的运行时的链接,它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。

一般情况的加载顺序:

LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。

1. 编写一个fopen函数

    prog.c

#include <stdio.h>
int main(void) {
    FILE *fd = fopen("test.txt","r");
    if (!fd) {
                printf("fopen() returned NULL
");
                return 1;
              }
    printf("fopen() succeeded
");
    return 0;
} 

创建test.txt文件,使其编译成功  

技术图片

 

 2. 编写fopen一个失败的文件, myfopen.c

#include <stdio.h>

FILE *fopen(const char *path, const char *mode) {

    printf("Always failing fopen ");

    return NULL;

}

 

编译为自己的动态库myfopen.so

 

gcc -Wall -fPIC -shared -o myfopen.so myfopen.c

技术图片

 

 注:

替换结束,要还原函数调用关系,用命令unset LD_PRELOAD 解除

查询依赖关系,可以用ldd “程序名称

参考文档:

        https://catonmat.net/simple-ld-preload-tutorial

        https://www.cnblogs.com/saolv/p/9761371.html

 

创建test.txt文件,使其编译成功

 

以上是关于LD_PRELOAD加载动态库的主要内容,如果未能解决你的问题,请参考以下文章

Linux下利用动态链接劫持库函数并注入代码

使用LD_PRELOAD拦截共享函数库的函数调用

一种简单的hook方法--LD_PRELOAD变量

调试LD_PRELOAD注入的代码

Linux函数调用劫持方法

Linux函数调用劫持方法